Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C] Moda di un vettore

  1. #1

    [C] Moda di un vettore

    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:

    codice:
    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:


    codice:
    //#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.

  2. #2
    Prova in questo modo dovrebbe funzionare.

    Ciao


    codice:
    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);

  3. #3
    Originariamente inviato da anatroccolo
    Prova in questo modo dovrebbe funzionare.

    Ciao


    codice:
    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?

  4. #4
    Nel tuo metodo confrontavi sempre l'ultimo numero con il penultimo e non con il valore più alto in assoluto.

    Ciao

  5. #5
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.