2016-10-04 28 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; 
    } 

}