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);
}
}
我得到了结果:
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 :(得分:1)
您的代码中有三个大问题:
freq
。当times/words
仍为0时,您的times
即可。(自初始化以来,您尚未为其分配任何内容。)这需要转到for
循环的末尾。< / LI>
times
循环的每次迭代中都没有将for
设置回0,因此它是累积的。 (如果您有3 a
和4 b
s,times
将在b
次迭代后为7。)(float)times / words
。我做了一些其他的清理工作,比如将words
重命名为letters
,将a
重命名为length
,因为这些似乎更好地反映了这些变量的作用。以下是完整的工作版本:
#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);
}
}
字符串&#34;你好&#34>的输出示例通过管道输送到该计划:
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
<强>更新强>
请注意,您的解决方案效率很低。您需要读取输入的每个字符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);
}
}
}
答案 1 :(得分: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;
}
}