Programma con calcolo frequenza con cui compaiono dei numeri
Salve a tutti,
sto scrivendo (in C, su cygwin) un programma che genera N (compreso tra 0 e 3000) numeri casuali tra 1 e 100, li memorizza in un array data, li mette in ordine decrescente, e fino a qui ci sono; poi deve contare quante volte ciascun numero si presenta in data e memorizzare la frequenza in un array freq. Ho provato in mille modi ma il programma mi esegue sempre qualcos'altro. Riporto l'ultimo tentativo che ho fatto:
for (i=0; i<100; i++) {
m = data;
for (j=1; j
if (data[j] == m) {
freq++;
m = data[j];
}
}
}
dove m, i, j sono semplicemente variabili di tipo int (la dichiarazione è all'inizio e non ho riportato la parte precedente del programma perchè non credo sia necessario, ma nel caso lo fosse ditemelo che lo metto tutto).
Non riesco a capire bene che cosa succede in questo modo (visto che mi aspettavo un altro risultato), e volevo chiedervi se qualcuno può pazientemente spiegarmi che cosa ho sbagliato, che cosa ho fatto di preciso così, e se può darmi un suggerimento su come risolvere il problema.
Ringrazio anticipatamente per la gentilezza e la pazienza
Valentina
sto scrivendo (in C, su cygwin) un programma che genera N (compreso tra 0 e 3000) numeri casuali tra 1 e 100, li memorizza in un array data, li mette in ordine decrescente, e fino a qui ci sono; poi deve contare quante volte ciascun numero si presenta in data e memorizzare la frequenza in un array freq. Ho provato in mille modi ma il programma mi esegue sempre qualcos'altro. Riporto l'ultimo tentativo che ho fatto:
for (i=0; i<100; i++) {
m = data;
for (j=1; j
if (data[j] == m) {
freq++;
m = data[j];
}
}
}
dove m, i, j sono semplicemente variabili di tipo int (la dichiarazione è all'inizio e non ho riportato la parte precedente del programma perchè non credo sia necessario, ma nel caso lo fosse ditemelo che lo metto tutto).
Non riesco a capire bene che cosa succede in questo modo (visto che mi aspettavo un altro risultato), e volevo chiedervi se qualcuno può pazientemente spiegarmi che cosa ho sbagliato, che cosa ho fatto di preciso così, e se può darmi un suggerimento su come risolvere il problema.
Ringrazio anticipatamente per la gentilezza e la pazienza
Valentina
Risposte
Non mi è chiaro che cosa stai cercando di fare esattamente. Ma sarebbe stato sufficiente scrivere qualcosa come:
for (i = 0; i < N; ++i) { freq[data[i]]++; }
Ti scrivo il testo del problema, così hai più chiaro quello che cerco di fare:
"Scrivere un programma che:
-legga da tastiera un numero positivo N<=3000, controllandone la validità e richiedendolo di nuovo se non valido
-generi N numeri random interi compresi tra 1 e 100 usando la funzione lrand48() e li memorizzi in un array data
-ordini l'array data in ordine decrescente usando bubblesort
-conti quante volte ciascun numero compare in data(cioè la frequenza dei 100 numeri, es: il numero 17 compare 85 volte, ecc.)
-memorizzi le frequenze calcolate in un array freq
-trovi e stampi il numero più frequente e il numero meno frequente in modo chiaro e infine stampi l'array freq in un formato compatto e facile da leggere"
Questo è il testo. I primi tre punti li ho fatti, l'ultimo credo di sapere come farlo, ma il quarto e il quindo mi rimangono difficili. Nel modo che hai scritto tu non sto soltanto dando il valore di 1 ad ogni posizione dell'array (che all'inizio ho azzerato) senza controllare quante volte si presenta il valore che sta in data?
"Scrivere un programma che:
-legga da tastiera un numero positivo N<=3000, controllandone la validità e richiedendolo di nuovo se non valido
-generi N numeri random interi compresi tra 1 e 100 usando la funzione lrand48() e li memorizzi in un array data
-ordini l'array data in ordine decrescente usando bubblesort
-conti quante volte ciascun numero compare in data(cioè la frequenza dei 100 numeri, es: il numero 17 compare 85 volte, ecc.)
-memorizzi le frequenze calcolate in un array freq
-trovi e stampi il numero più frequente e il numero meno frequente in modo chiaro e infine stampi l'array freq in un formato compatto e facile da leggere"
Questo è il testo. I primi tre punti li ho fatti, l'ultimo credo di sapere come farlo, ma il quarto e il quindo mi rimangono difficili. Nel modo che hai scritto tu non sto soltanto dando il valore di 1 ad ogni posizione dell'array (che all'inizio ho azzerato) senza controllare quante volte si presenta il valore che sta in data?
Siccome ci sono 3000 valori e i valori contenuti sono compresi tra 1 e 100, ci saranno necessariamente delle ripetizioni. Per cui, per ogni \( m \in \{0, 1 \dots 100\} \) ci saranno diversi valori di i per cui m = data[ i ]. freq[ m ] sarà allora incrementato più volte, una volta per ogni i per cui data[ i ] = m. Non è invece per niente chiaro che cosa stai cercando di fare nel tuo codice. In particolare non è chiaro lo scopo della seguente riga:
e della variabile m nel tuo codice. Inoltre sembrerebbe che freq sia lungo N, ma i valori sono sempre compresi tra 1 e 100. L'array delle frequenze dovrebbe essere lungo 100 (o meno).
m = code[i];
e della variabile m nel tuo codice. Inoltre sembrerebbe che freq sia lungo N, ma i valori sono sempre compresi tra 1 e 100. L'array delle frequenze dovrebbe essere lungo 100 (o meno).
In effetti il codice che ho scritto è un po' contorto, penso che ci siano molte operazioni inutili, ma non sapevo come fare a fargli controllare tutti i valori di data, che sono N... poi al momento della dichiarazione ho messo che freq è lungo al massimo 100, quindi c'ero, però nel fare due cicli ho fatto un sacco di confusione e quello che hai scritto è molto più compatto. Ma non capisco, nel tuo codice non hai scritto che la frequenza di data deve essere incrementata ogni volta che data è uguale a m, come lo fa a capire? Dov'è sottinteso? Scusa ma voglio capire bene, e all'inizio entrare in questi meccanismi per chi era completamente digiuno della materia non è facile..
Se dividi la riga all'interno del ciclo in due nel seguente modo dovrebbe forse diventare più chiaro...
for (i = 0; i < N; ++i) { int m = data[i]; freq[m]++; }
Ok, credo di esserci. Grazie mille
