我必须编写一个程序来计算文本和文本中的所有元音。给出整个文本的每个元音的百分比。 无论出于何种原因,我们都不允许使用数组,而是应该使用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;
}
欢呼声
答案 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
,您可能会溢出。