-1
該項目計算書中字母的平均字母頻率 - 出於某種原因,A,B和Z的數字大幅增加 - 數十億。我在這裏錯過了什麼嗎?我覺得沒有錯誤,但由此產生的代碼是錯誤的。 argv[1]
是書文件,argv[2]
是新文件。字母頻率 - 不成比例的高比率
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NUM_LETTERS 26
int main(int argc, char *argv[])
{
FILE *fp,*fp2;
int ch, totalcounter = 0, i;
int letters[25];
double letterfrequency[25];
if(argc < 2)
{
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
exit(1);
}
for(i=0; i<NUM_LETTERS; i++)
{
letters[i] = 0;
letterfrequency[i] = 0.0;
}
printf("Opening: %s", argv[1]);
fp = fopen(argv[1], "r");
if(!fp)
{
perror("fopen");
exit(1);
}
while((ch=fgetc(fp)) != EOF)
{
ch = toupper(ch);
if('A' <= ch && ch <= 'Z')
{
ch -= 65;
letters[ch]++;
totalcounter++;
}
}
fp2 = fopen(argv[2], "w");
for(i=0; i<NUM_LETTERS; i++)
{
letterfrequency[i] = (double)letters[i]/totalcounter;
}
for(i=0; i<NUM_LETTERS; i++)
{
fprintf(fp2, "\n%c: Times used: %10d\tFrequency Used: %20.20lf", i+65, letters[i], letterfrequency[i]);
}
fclose(fp);
fclose(fp2);
return 0;
}
哪個字母僅具有25個信嗎?你正在寫出你的數組的界限,所以任何事情都會發生。 –
一個快速而髒的測試文件,只包含字母a到z的段落錯誤。你的代碼需要一些工作。 – David
您使用字符常量進行範圍檢查,但爲什麼這樣:'ch - = 65;'?不要使用神奇數字!爲什麼不簡單地使用'isalpha'作爲支票? – Olaf