计算没有数组的文本中的元音(C)

计算没有数组的文本中的元音(C),c,C,我必须编写一个程序,计算文本中的所有元音,并给出整个文本中每个元音的百分比。 无论出于何种原因,我们都不允许使用数组,但应该使用getchar()来实现 #包括 #包括 int main(){ 电流; 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(“输入文本:”); 而((current=getchar())!=EOF){ if(isspace(current)

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

#包括
#包括
int main(){
电流;
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(“输入文本:”);
而((current=getchar())!=EOF){
if(isspace(current))continue;//如果空格继续,请检查空格
否则{
开关(当前){//检查元音和增加元音计数
案例“a”:
cntA+=1;
案例“A”:
cntA+=1;
案例“e”:
cntE+=1;
案例“E”:
cntE+=1;
案例“i”:
cntI+=1;
案例“I”:
cntI+=1;
案例“o”:
cntO+=1;
案例“O”:
cntO+=1;
案例“u”:
cntU+=1;
案例“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(“\n字母:%d\n百分比A:%d\n百分比E:%d\n百分比I:%d\n百分比O:%d\n百分比U:%d\n”,cntAll、pA、pE、pI、pO、pU);
系统(“暂停”);
返回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;
}
#包括
#包括
int main(){
电流;
int cntAll=0;
int cntA=0,cntE=0,cntI=0,cntO=0,cntU=0;
双pA=0,pE=0,pI=0,pO=0,pU=0;
printf(“输入文本:”);
而((current=getchar())!=EOF){
如果(isspace(当前))继续;
否则{
开关(电流){
案例“a”:案例“a”:
cntA+=1;
打破
案例“e”:案例“e”:
cntE+=1;
打破
案例“i”:案例“i”:
cntI+=1;
打破
案例“o”:案例“o”:
cntO+=1;
打破
案例“u”:案例“u”:
cntU+=1;
打破
}
}
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(“\n字母:%d\n百分比A:%.2lf\n百分比E:%.2lf\n百分比I:%.2lf\n百分比O:%.2lf\n百分比U:%.2lf\n”,cntAll、pA、pE、pI、pO、pU);
系统(“暂停”);
返回0;
}

干杯

您需要在案例之间插入
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。解决办法是把它写成

pA = (cntA * 100 ) / cntAll; 
100*cntA/cntAll

这仍将截断为整数。如果这是不可容忍的,那么考虑使用浮点表达式<代码> 100 *CNTA/CNALTHOT/CODE >并相应地更改<代码> Prtff < /Calp>格式化程序。不管怎样,使用浮点可以说是更好的,因为在计算
100*cntA

case
时,它避免了溢出的可能性,标签在不中断
的情况下从下一个标签掉落

因此,如果您读取一个
'a'
,那么
开关中的所有案例都将被执行

你需要像这样的东西

switch (current) {                              // check for vowel & increase vowelcount
case 'a':
    cntA += 1;
    break;   // <-- Note break here
...
开关(当前){//检查元音并增加元音计数
案例“a”:
cntA+=1;

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

pA = (cntA / cntAll) * 100; 

将首先计算
cntS/cntAll
,这是
您忘记了案例之间的
中断;
。您的所有变量都是整数,因此除法将是整数除法。百分比可能最好以浮点形式完成(您可以使用
printf
将其格式化为整数)。好像是家庭作业。我猜我有点笨,完全忘记了。谢天谢地,有点仓促行事。@Bathsheba编辑了这篇文章,介意看一下吗?它仍然只输出0.00’s您的
printf
格式设置程序不正确:第一个是
int
。非常感谢您的帮助;)
pA = (cntA * 100 ) / cntAll;