代码计算辅音不正确.如何解决这个问题



我必须编写一个程序,从字符串中选择辅音并对其进行计数,并显示每个辅音出现的次数。我写了这个代码,但它也计算元音。我不知道为什么。

#include <stdio.h>
int main()
{
char str[100];
int i, consonants;
i = consonants = 0;
int freq[256] = {0};
printf("n Please Enter any String :  ");
scanf("%[^n]", str);
while (str[i] != '')
{
if ((str[i] >= 'a' && str[i] <= 'z') ||
(str[i] >= 'A' && str[i] <= 'Z') &&
(str[i] != 'a' || str[i] != 'A' ||
str[i] != 'e' || str[i] != 'E' ||
str[i] != 'i' || str[i] != 'I' ||
str[i] != 'o' || str[i] != 'O' ||
str[i] != 'u' || str[i] != 'U'))
{
consonants++;
freq[str[i]]++;
}
i++;
}
printf("n Number of Consonants in this String = %d", consonants);
for (i = 0; i < 256; i++)
{
if (freq[i] != 0)
{
printf("nThe frequency of %c is %d", i, freq[i]);
}
}
return 0;
}

这是输出:

Please Enter any String :  We strive to achive peace
Number of Consonants in this String = 21
The frequency of W is 1
The frequency of a is 2
The frequency of c is 2
The frequency of e is 5
The frequency of h is 1
The frequency of i is 2
The frequency of o is 1
The frequency of p is 1
The frequency of r is 1
The frequency of s is 1
The frequency of t is 2
The frequency of v is 2

我只是想让您知道,通过使用ctype.h中定义的标准函数isalpha()strng.h中定义的strchr(),您可以摆脱巨大的if条件。

您可以将整个条件更改为仅

if( isConsonant(str[i]) )

isConsonant()定义如下

int isConsonant( char c )
{
static char vowels[] = "aeiouAEIOU";
if( ialpha(c) && strchr(vowels, c) == NULL ) {
return 1;
}
else {
return 0;
}
}

您的条件的这一部分(由于其他逻辑影响整个结果(将始终为真:

str[i] != 'a' || str[i] != 'A'

这就是为什么所有字母都被算作辅音的原因。

你想要否定";是元音";。

!(str[i] == 'a' ||
str[i] == 'A' ||
str[i] == 'e' ||
str[i] == 'E' ||
str[i] == 'i' ||
str[i] == 'I' ||
str[i] == 'o' ||
str[i] == 'O' ||
str[i] == 'u' ||
str[i] == 'U')

其为";不是(那个或那个或那个(">

逻辑等价"不是那个,不是那个,也不是那个";。

(str[i] != 'a' &&
str[i] != 'A' &&
str[i] != 'e' &&
str[i] != 'E' &&
str[i] != 'i' &&
str[i] != 'I' &&
str[i] != 'o' &&
str[i] != 'O' &&
str[i] != 'u' &&
str[i] != 'U')

注意,我选择讨论您的代码的逻辑,假设它对您来说很有趣,对您的学习也有帮助。然而,我也很喜欢另一个答案,它在方向盘上很强大,而不是发明哲学。我不会解释的,看那边。

全逻辑:

if ( ( (str[i] >= 'a' && str[i] <= 'z') ||
(str[i] >= 'A' && str[i] <= 'Z')
)
/* a letter */
&&
/* not a vowel */
(  str[i] != 'a' && str[i] != 'A' &&
str[i] != 'e' && str[i] != 'E' &&
str[i] != 'i' && str[i] != 'I' &&
str[i] != 'o' && str[i] != 'O' &&
str[i] != 'u' && str[i] != 'U'
)
)

在没有围绕"0"的附加CCD_ 7对的情况下;是一个字母";你会得到
"是小写或是大写辅音";,即仍将计数小写元音。

您只需更改

||(str[i] >= 'A' && str[i] <= 'Z')
&&(str[i] != 'a' || str[i] != 'A' 
||str[i] != 'e' || str[i] != 'E' 
||str[i] != 'i' || str[i] != 'I' 
||str[i] != 'o' || str[i] != 'O' 
||str[i] != 'u' || str[i] != 'U'))

&&(str[i] != 'a'
&& str[i] != 'A' 
&&str[i] != 'e'
&& str[i] != 'E' 
&& str[i] != 'i' 
&& str[i] != 'I' 
&& str[i] != 'o'  
&& str[i] != 'O'
&& str[i] != 'u' 
&& str[i] != 'U'))

我的代码:

#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
int i=0, consonants=0;
int vowels=0,numbers=0;
int freq[256] = {0};
printf("n Please Enter any String :  ");
scanf("%[^n]", str);
vowels=0,numbers=0,i=0;
while (str[i] != '')
{
if((str[i]>= 'a'&&str[i]<= 'z') || (str[i] >= 'A' && str[i] <= 'Z')&&(str[i] != 'a' && str[i] != 'A' &&str[i] != 'e'&& str[i] != 'E' && str[i] != 'i' && str[i] != 'I' && str[i] != 'o' && str[i] != 'O'&& str[i] != 'u' && str[i] != 'U'))
{
consonants++;
freq[str[i]]++;
}
i++;
}
printf("n Number of Consonants in this String = %d", consonants);
printf("nn");
for (i = 0; i < 256; i++)
{
if (freq[i] != 0)
{
printf("nThe frequency of %c is %d", i, freq[i]);
}
}
printf("nn");
return 0;
}

最新更新