如何检查多少次' a'节目吗?

时间:2016-10-04 01:14:17

标签: arrays for-loop char compare

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

2 个答案:

答案 0 :(得分:1)

您的代码中有三个大问题:

  1. 你在错误的地方计算freq。当times/words仍为0时,您的times即可。(自初始化以来,您尚未为其分配任何内容。)这需要转到for循环的末尾。< / LI>
  2. 您在times循环的每次迭代中都没有将for设置回0,因此它是累积的。 (如果您有3 a和4 b s,times将在b次迭代后为7。)
  3. 您使用整数除法,但您需要先将分子转换为浮点数:(float)times / words
  4. 我做了一些其他的清理工作,比如将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;
    }

}