在没有数组的情况下计算文本中的元音(C)

时间:2016-12-21 10:18:29

标签: c

我必须编写一个程序来计算文本和文本中的所有元音。给出整个文本的每个元音的百分比。 无论出于何种原因,我们都不允许使用数组,而是应该使用getchar()。

#include <stdio.h>
#include <ctype.h>

int main() {

    int current;
    int cntAll = 0;
    int cntA = 0, cntE = 0, cntI = 0, cntO = 0, cntU = 0;
    int pA = 0, pE = 0, pI = 0, pO = 0, pU = 0;

    printf("Enter Text: ");         

    while ((current = getchar()) != EOF){
        if (isspace(current)) continue;                     // check for whitespace, if whitespace continue
        else {
            switch (current) {                              // check for vowel & increase vowelcount
            case 'a':
                cntA += 1;
            case 'A':
                cntA += 1;
            case 'e':
                cntE += 1;
            case 'E':
                cntE += 1;
            case 'i':
                cntI += 1;
            case 'I':
                cntI += 1;
            case 'o':
                cntO += 1;
            case 'O':
                cntO += 1;
            case 'u':
                cntU += 1;
            case 'U':
                cntU += 1;
            }
        }

            cntAll++;
    }

    pA = (cntA / cntAll) * 100; 
    pE = (cntE / cntAll) * 100;
    pI = (cntI / cntAll) * 100;
    pO = (cntO / cntAll) * 100;
    pU = (cntU / cntAll) * 100;

    printf("\nLetters: %d\nPercentage A: %d\nPercentage E: %d\nPercentage I: %d\nPercentage O: %d\nPercentage U: %d\n",cntAll,pA,pE,pI,pO,pU);
    system("PAUSE");
    return 0;
}

增加cntAll值没有问题,但它不会因任何原因计算单个元音。 非常感谢任何帮助!

编辑:

   #include <stdio.h>
#include <ctype.h>

int main() {

    int current;
    int cntAll = 0;
    int cntA = 0, cntE = 0, cntI = 0, cntO = 0, cntU = 0;
    double pA = 0, pE = 0, pI = 0, pO = 0, pU = 0;

    printf("Enter Text: ");         

    while ((current = getchar()) != EOF){
        if (isspace(current)) continue;                     
        else {
            switch (current) {                              
            case 'a':case 'A':
                cntA += 1;
                break;
            case 'e':case 'E':
                cntE += 1;
                break;
            case 'i':case 'I':
                cntI += 1;
                break;
            case 'o':case 'O':
                cntO += 1;
                break;
            case 'u':case 'U':
                cntU += 1;
                break;
            }
        }

            cntAll++;
    }

    pA = 100.0 * cntA / cntAll;
    pE = 100.0 * cntE / cntAll;
    pI = 100.0 * cntI / cntAll;
    pO = 100.0 * cntO / cntAll;
    pU = 100.0 * cntU / cntAll;

    printf("\nLetters: %d\nPercentage A: %.2lf\nPercentage E: %.2lf\nPercentage I: %.2lf\nPercentage O: %.2lf\nPercentage U: %.2lf\n",cntAll,pA,pE,pI,pO,pU);
    system("PAUSE");
    return 0;
}

欢呼声

3 个答案:

答案 0 :(得分:3)

您需要在案例之间插入break语句。

否则程序将执行首次输入的所有语句。实际上这是一个很好的功能。它允许您同时考虑多个标签。把它们放在一起你得到:

 switch (current){
 case 'a': case 'A':
    cntA += 1;
    break; // Don't follow through to the other cases.
 case 'b': case 'B': /*etc*/

在此之后,请注意(cntA / cntAll) * 100;将在整数算术中的括号中计算表达式,在大多数情况下会将其截断为0。解决方法是将其写为

100 * cntA / cntAll;

这仍将截断为整数。如果这是不可容忍的,请考虑使用浮点表达式100.0 * cntA / cntAll并相应地更改printf格式化程序。无论如何,使用浮点数可能会更好,因为它可以在评估100 * cntA时避免溢出的可能性。

答案 1 :(得分:1)

case标签通过到达下一个标签而没有break

因此,如果您阅读了'a',那么所有将会执行switch中的案例。

你需要像

这样的东西
switch (current) {                              // check for vowel & increase vowelcount
case 'a':
    cntA += 1;
    break;   // <-- Note break here
...

答案 2 :(得分:1)

我注意到的第一件事是你在每个开关盒上都缺少break。这将导致错误的行为。 第二件事:

pA = (cntA / cntAll) * 100; 

将首先计算cntS/cntAll <0。此值将被解释为整数,因此您始终将0*100设为0.您可以将其重写为

pA = (cntA * 100 ) / cntAll; 

在这种情况下,您不必强制转换为浮点数以获得正确的结果。请注意,对于较大的cntA,您可能会溢出。