2016-10-04 76 views
0
int main (void) 
{ 
    char input[99999]; 

    int times=0; 
    int words=0,a=0; 

    while ((input[a]=getchar()) != EOF) // get input 
     { 
     a++; 
     } 
    for (int n=0;n<=a;n++) 
    { 
     if(input[n]<='z' && input[n]>='a'){words++;}  
    } 
    float freq=times/words; 

    for(char letter ='a'; letter<='z'; letter++) 
    { 
     for (int n=0;n<=a;n++) 
     { 
      if(input[n]==letter){times++;} 
     } 
     printf("%c %.4f\n", letter, freq); 
    } 
} 

和我得到的结果:如何检查'a'显示多少次?

asdf a 
a 0.0000 
b 0.0000 
c 0.0000 
d 0.0000 
e 0.0000 
f 0.0000 
g 0.0000 
h 0.0000 
i 0.0000 
j 0.0000 
k 0.0000 
l 0.0000 
m 0.0000 
n 0.0000 
o 0.0000 
p 0.0000 
q 0.0000 
r 0.0000 
s 0.0000 
t 0.0000 
u 0.0000 
v 0.0000 
w 0.0000 
x 0.0000 
y 0.0000 
z 0.0000 
+0

写,计算字母出现在文本中的频率的程序。 –

+0

我不知道为什么| if(input [n] == letter){times ++;} | does not work –

回答

1

你在你的代码三大问题:

  1. 你计算错了地方freqtimes仍为0时,你的服用times/words(自初始化以来,你还没有分配任何东西)。这需要在for循环的末尾进行。
  2. 您在for循环的每次迭代中都没有将times设置回0,因此它是累积的。 (如果你有3 a秒和4个b S,timesb迭代后为7。)
  3. 您使用整数除法,但你需要的分子转换为浮动第一:(float)times/words

我做了一些其他的清理,如重命名wordslettersalength,因为这些似乎是什么样的变量正在做更好的反射。下面是一个完整的工作版本:

#include <stdio.h> 

int main (void) 
{ 
    char input[99999]; 

    int letters = 0, length = 0; 

    while ((input[length++] = getchar()) != EOF); 

    for (int n = 0; n < length; n++) 
    { 
     if (input[n] >= 'a' && input[n] <= 'z') 
     { 
      letters++; 
     }  
    } 

    for(char letter = 'a'; letter <= 'z'; letter++) 
    { 
     int times = 0; 
     for (int n = 0; n < length; n++) 
     { 
      if (input[n] == letter) 
      { 
       times++; 
      } 
     } 

     float freq = (float)times/letters; 
     printf("%c %.4f\n", letter, freq); 
    } 
} 

示例输出当字符串 “hello” 被管道输送到程序:

a 0.0000 
b 0.0000 
c 0.0000 
d 0.0000 
e 0.2000 
f 0.0000 
g 0.0000 
h 0.2000 
i 0.0000 
j 0.0000 
k 0.0000 
l 0.4000 
m 0.0000 
n 0.0000 
o 0.2000 
p 0.0000 
q 0.0000 
r 0.0000 
s 0.0000 
t 0.0000 
u 0.0000 
v 0.0000 
w 0.0000 
x 0.0000 
y 0.0000 
z 0.0000 

UPDATE

请注意,您的解决方案是相当低效的。您需要读取输入的每个字符26次(每个字母一次)。

您可以改为使用26个数的数组,并在输入中一次性更新它们。这里有一个可能性,该解决方案:

包括

包括

int main (void) 
{ 
    char input[99999]; 
    int counts[26] = { 0 }; 
    int length = 0, total = 0; 

    while ((input[length++] = getchar()) != EOF); 

    for (int i = 0; i < length; i++) { 
     char c = tolower(input[i]); 
     if (c >= 'a' && c <= 'z') { 
      counts[c - 'a'] += 1; 
      total += 1; 
     } 
    } 

    for (int i = 0; i < 26; i++) { 
     if (counts[i] > 0) { 
      printf("%c %.4f\n", 'a' + i, (float)counts[i]/total); 
     } 
    } 
} 
+0

wt if'A'and'a'for once'a'?仍然可以使用这种方法? –

+0

然后统计[input [i] - 'A']? –

+0

@BEIXIN正是。先将其转换为小写,或者检查它所处的范围并减去适量。 – smarx

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main (void) 
{ 
    char input[99999]; 
    int a=0; 
    float words=0.0,times=0; 

    while ((input[a]=getchar()) != EOF) // get input 
     { 
     a++; 
     } 
    for (int n=0;n<=a;n++) 
    { 
     if(input[n]<='z' && input[n]>='a'){words++;}  
    } 
    float freq=0; 

    for(char letter ='a'; letter<='z'; letter++) 
    { 
     for (int n=0;n<=a;n++) 
     { 
      if(input[n]==letter){times++;} 
     } 
     freq=times/words; 
     if(freq!=0){printf("%c %.4f\n", letter, freq); } 
     times=0; 
    } 

}