PDA

Visualizza la versione completa : [C] Frequenze di lettere in un testo


ivan1984z
28-01-2006, 12:48
Prima di tutto ciao a tutti.. :ciauz:

Ho un ennesimo problema da risolvere e chiedo a voi che siete la mia unica speranza.. :zizi:

Stavolta il problema :
Il problema rottura di codice..(il codice crittato)

Ho 4 testi di diversa lingua,io devo calcolare la frequenza delle lettere che compaiono nei diversi testi,poi confrontarli con il testo crittato datomi dall'esercizio per sapere in che lingua scritto il codice.

Io ho cominciato nel aprire i 4 testi in lettura, e poi avevo pensato di calcolare la frequenza
for (i=0; i<256; i++)
{
printf("n=%d, \t %c,\t freq= %f\n", i ,i, frequenza[i] );
getchar();
}

giusto?o c' un metodo pi veloce o pi corretto?

oregon
28-01-2006, 12:59
E dove sta il calcolo?

ivan1984z
28-01-2006, 13:02
dimenticavo anche questo pezzo scusa
for (i=0; i<256; i++)
{
frequenza[i] = frequenza[i] / totale * 100 ;
}

oregon
28-01-2006, 13:08
Intendevo il conteggio delle lettere del testo ... dove sta?

ivan1984z
28-01-2006, 13:43
for(i=0; i<256; i++)
{

ivan1984z
28-01-2006, 13:44
intendi questo??

for(i=0; i<256; i++)
{
frquenza[i]=0;
}

oregon
28-01-2006, 13:47
Stai scherzando? :confused:

Quel codice serve ad azzerare il vettore dei conteggi ... io ti chiedevo il codice che legge dal file e conta la frequenza dei caratteri letti .

Insomma ... fai vedere tutto il codice ...

ivan1984z
28-01-2006, 15:16
Scusa la mia ignoranza!!!
Cmq questo tutto ci che ho fatto...


#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>

int main()
{
int i, temp;
float distanza, frequenza[256];
char file1[]="italiano.txt";
char file2[]="latino.txt";
char file3[]="francese.txt";
char file4[]="tedesco.txt";
long totale;
unsigned char c;

FILE*fp1;
FILE*fp2;
FILE*fp3;
FILE*fp4;
FILE*fp5;

for (i=0; i<256; i++)
{
frequenza[i] = 0 ;
}
totale=0;

fp1=fopen(file1, "r");
if (fp1==NULL)
{
printf("Non trovo il file %s\n", file1);
getchar();
exit(-1);
}
fp2=fopen(file2, "r");
if (fp2==NULL)
{
printf("Non trovo il file %s\n", file2);
getchar();
exit(-1);
}
fp3=fopen(file3, "r");
if (fp3==NULL)
{
printf("Non trovo il file %s\n", file3);
getchar();
exit(-1);
}
fp4=fopen(file4, "r");
if (fp4==NULL)
{
printf("Non trovo il file %s\n", file4);
getchar();
exit(-1);
}
fp5=fopen("fileFrequenze.txt", "w");
if(fp5==NULL)
{
printf("Non trovo il file.\n");
getchar();
exit(-1);
}


/////////////////////////////////
// controllo delle frequenze
while ( fscanf(fp1, "%c", &c)== 1 )
{
/*
if(((c >'a') || (c < 'z'))||((c >'A') || (c < 'Z'))) // e'nella tabella ASCII ?
{

printf("%c", c);

}*/ //NON GUARDARE QUESTO ERA SOLO UNA PROVA CHE
//AVEVO IN MENTE DI FARE
temp = (int) c; // un cast fa solo bene per leggere un carattere
frequenza[temp]= frequenza[temp]+1;
totale = totale + 1 ;
}
for (i=0; i<256; i++) // normalizzazione dei conteggi
{
frequenza[i] = frequenza[i] / totale * 100 ;
}



/////////////////////////
// stampa delle frequenze ottenute sullo schermo
for (i=0; i<256; i++)
{
printf( "n=%d, \t %c, \t freq= %.8f\n", i , i, frequenza[i] );
}


fclose (fp1);
fclose (fp2);
fclose (fp3);
fclose (fp4);
fclose (fp5);

getchar();
exit(0);
}

ivan1984z
29-01-2006, 11:43
Talasciando quello che ho fatto prima...

sono riuscito a scrivere il codice che mi calcola le frequenze delle lettere,solamente che adesso ho un altro problema quando vado a stampare su file le percentuali delle varie lettere mi stampa valori strani del tipo:



a, freq= 3003.000000
b, freq= 313.000000
c, freq= 1299.000000
d, freq= 6061697275592955600000000000000000000.000000
e, freq= 6065774039923289600000000000000000000.000000
f, freq= -1.#QNAN0
g, freq= 6065770236971488900000000000000000000.000000
h, freq= 6065684670555973500000000000000000000.000000
i, freq= 6065725235375180800000000000000000000.000000
j, freq= 3.000000
k, freq= 7915339093589150100000000000000000.000000
l, freq= 1650.000000
m, freq= 6087643548078427000000000000000000000.000000
n, freq= -1.#QNAN0
.
.
.

cosa pu essere? :)

Loading