PDA

Visualizza la versione completa : [C] Moda di un vettore


guylmaster
18-10-2004, 12:25
Ho un vettore chiamato "frequenze_ass" di tipo int che raccoglie 26 frequenze.
Di queste 26 frequenze devo trovare la moda quindi la frequenza più alta. Per farlo dovrei fare un semplice for che scorre in un for e confronta i caratteri in questo modo:



moda = frequenze_ass[0];

for(i=1; i<26; i++)
{
if(frequenze_ass[i] > frequenze_ass[i-1])
{
moda = frequenze_ass[i];
}
}
printf("\nLa moda e' uguale a %d \n\n",moda);


Ora però il programma a qualche problema, probabilmente avrò sbagliato qualcosa io in quanto come frequenza mi da sempre il valore 7 anche se tra i valori c'è anche il 102.

Se potete darmi una mano provandolo questo è il programma per intero:




//#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <math.h>
int main()
{
FILE *testo;
int frequenze_ass[26], moda, vettore;
float frequenze_rel[26],media, varianza,dev;
char carattere;
int i,k, conta_caratteri;

for(k=0; k<26; k++)
frequenze_ass[k] = 0;
conta_caratteri = 0;

testo = fopen("input.txt","r");

if(testo == NULL)
printf("\n Errore! Il file non esiste");
else
{
while (! feof(testo))
{
carattere = toupper(getc(testo));
if (isalpha(carattere))
{
(frequenze_ass[(carattere - 'A')])++;
conta_caratteri++;
}
}
fclose (testo);

int totale_ass = 0;
float totale_rel = 0.0;

for(k=0; k<26; k++)
{
frequenze_rel[k] = (frequenze_ass [k] *100.0 )/ conta_caratteri;
printf("\n Lettera %1c -- F.A. = %6d -- F.R. = %10.5f",
'A'+k,
frequenze_ass[k],
frequenze_rel[k]);
totale_ass += frequenze_ass[k];
totale_rel += frequenze_rel[k];
}
printf("\n\n TOTALI F.A. = %6d -- F.R. = %10.5f",
totale_ass, totale_rel);
media = totale_ass / 26.0;
printf("\nLa media delle frequenze assolute e' = %6.2f ", media);
varianza = pow(totale_ass - media,2)/26;
printf("\nLa varianza delle frequenze assolute e' = %6.2f ",varianza);
dev = sqrt (varianza);
printf("\nLa deviazione standard e' = %6.2f",dev);
moda = frequenze_ass[0];

for(i=1; i<26; i++)
{
if(frequenze_ass[i] > frequenze_ass[i-1])
{
printf ("\n\nF.A: %d\n",frequenze_ass[i-1]);
moda = frequenze_ass[i];
}
}
printf("\nLa moda e' uguale a %d \n\n",moda);

}

system("PAUSE");
return 0;
}


E questo è input.txt su cui il programma lavora:

Cambridge nel quarto inverno di guerra: una città fantasma. Un vento siberiano incessante, senza nulla che ne smorzasse la crudezza per milleseicento chilometri, soffiava dal mare del Nord e spazzava i Fens. Faceva tremare i cartelli che indicavano i rifugi antiaerei in Trinity New Court e batteva contro le finestre sprangate della cappella del King's College. Spirava nei cortili e sulle scale e confinava nelle loro camere i pochi insegnanti e studenti che ancora restavano. A metà del pomeriggio, le strette vie selciate erano deserte. Al cadere della notte non si scorgeva una sola luce e l'università ritornava a un buio che non aveva più conosciuto dal Medioevo. Una processione di monaci che fosse avanzata lentamente sul Magdalene Bridge per andare ai vespri non sarebbe apparsa fuori posto. L'oscuramento del tempo di guerra aveva disperso i secoli.


Se potete darmi una mano, perchè ci sto veramente impazzendo sopra e sarà sicuramente una cavolata.

anatroccolo
18-10-2004, 13:11
Prova in questo modo dovrebbe funzionare.

Ciao




int moda = 0;
for(i=1; i<26; i++) {
if (frequenze_ass[i] > moda) {
moda = frequenze_ass[i];
}
}
printf("\nLa moda e' uguale a %d \n\n",moda);

guylmaster
18-10-2004, 13:27
Originariamente inviato da anatroccolo
Prova in questo modo dovrebbe funzionare.

Ciao




int moda = 0;
for(i=1; i<26; i++) {
if (frequenze_ass[i] > moda) {
moda = frequenze_ass[i];
}
}
printf("\nLa moda e' uguale a %d \n\n",moda);


Ottimo funziona.. ma giusto per sapere, dov'è che ho errato? :fagiano:

anatroccolo
18-10-2004, 14:13
Nel tuo metodo confrontavi sempre l'ultimo numero con il penultimo e non con il valore più alto in assoluto.

Ciao

guylmaster
18-10-2004, 15:35
Originariamente inviato da anatroccolo
Nel tuo metodo confrontavi sempre l'ultimo numero con il penultimo e non con il valore più alto in assoluto.

Ciao

Ecco lo dicevo io che avevo sicuramente fatto un errore da stupidi :fagiano:

Loading