Eliminazione di duplicati

di Anonimizzato31893 il
7 risposte
Titolo dell'esercizio:

(Eliminazione di duplicati) Usate un array unidimensionale per risolvere il seguente proble-
ma. Memorizzate 20 numeri, ognuno dei quali compreso tra 10 e 100, estremi inclusi. Quan-
do un numero viene letto, stampatelo solo se non è un duplicato di un numero già letto.
Tenete conto del “caso peggiore”, in cui tutti i 20 numeri sono differenti. Usate l’array più
piccolo possibile per risolvere questo problema.


#include <stdio.h>
#include <stdbool.h>
#define MAX 20

int main() {

    unsigned int a[MAX] = {0}; //array per input dell'utente
    unsigned int k = 0; //numero di valori immessi correttamente

    printf("Enter 20 integers between 10 and 100:\n");

    //ricevi 20 interi dall'utente
    for(unsigned int i = 0; i<=MAX-1; ++i){
        bool duplicate = false;
        unsigned int value; //valore corrente
        scanf("%u",&value);

        //verifica se l'intero è un duplicato
        for(unsigned int j = 0; j<k; j++){
            //se è un duplicato, imposta il flag è interrompi il ciclo
            if(value == a[j]){
                duplicate = true;
                break;
            }
        }

        //se il numero non è un duplicato, inseriscilo nell'array
        if(!duplicate){
            a[k++]=value;
        }
    }
    puts("\nThe nonduplicate values are:");

    //stampa l'array di non duplicati
    for(unsigned int i = 0; a[i] != 0; ++i){
        printf("%u", a[i]);
    }
    puts("");
}


Il primo ciclo for ha al suo interno un altro ciclo for ed ha anche un if(!duplicate)

Nel primo ciclo for si ha scanf() ed è concesso inserire i 20 numeri.

Adesso mi chiedo..., quando nel terminale vengono inseriti i 20 numeri, ovviamente si ha la possibilità di inserirne 20 e quando si arriva al ventesimo, automaticamente, viene fuori l'output!

Ma è il primo ciclo for che conta quante volte inseriamo i numeri nel terminale, giusto?
Cioè, è questo il ciclo for che conta le volte che inseriamo i numeri?
for(unsigned int i = 0; i<=MAX-1; ++i){
        bool duplicate = false;
        unsigned int value; //valore corrente
        scanf("%u",&value);

7 Risposte

  • Dalla domanda che poni, deduco che la soluzione non è opera tua e stai cercando di capirla, giusto?
  • Sì, quindi?
  • Confermo che la risposta non è mia, ed in effetti cerco di capirla!
  • oregon ha scritto:


    Sì, quindi?
    Ok, visto che ho compreso che è il primo ciclo for a fare la conta ...
    Allora sempre nello stesso ciclo, mentre fa la conta, con la seguente
    bool duplicate = false;

    verifica se è falso, giusto?
  • MT09_full ha scritto:


    Confermo che la risposta non è mia, ed in effetti cerco di capirla!
    Premesso che quella soluzione presenta margini di miglioramento, non pensi che sia arrivato il momento di cimentarti tu stesso nella soluzione degli esercizi? Saresti in grado di farlo?
    Se sì, ti consiglio vivamente di cominciare a farlo, in quanto sarebbe un approccio di studio molto più proficuo, in caso contrario domandati qual è il problema.
  • MT09_full ha scritto:


    bool duplicate = false;

    verifica se è falso, giusto?
    No. La verifica la fa la if. Quella linea assegna il valore false alla variabile.

    Questi concetti (assegnazione, test con la if, ciclo con la for) dovresti averli chiarissimi. E dovresti scriverla tu la soluzione dell'esercizio o almeno provarci. All'esame ti chiederanno di scriverlo da zero il codice, non di commentarlo.
  • oregon ha scritto:




    No. La verifica la fa la if. Quella linea assegna il valore false alla variabile.



    Ok oregon, ti ringrazio, stavo facendo confusione, per il resto ti ringrazio per i consigli, sono cose che già sto facendo!
Devi accedere o registrarti per scrivere nel forum
7 risposte