59
题目:
下列给定程序中,函数fun的功能是:统计字符串中各元音字母(即:A、E、I、O、U)的个数。注意:字母不分大、小写。例如:若输入THIs
is a boot,则输出应该是1、0、2、2、0。
请改正modi.c程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
fun ( char*s,intnum[5] )
{
int k, i=5;
for ( k = 0; k
num[i]=0;
for (; *s; s++)
{
i=-1;
switch ( s )
{
case 'a':
case 'A':
{
i=0;
break;
}
case 'e':
case 'E':
{
i=1;
break;
}
case 'i':
case 'I':
{
i=2;
break;
}
case 'o':
case 'O':
{
i=3;
break;
}
case 'u':
case 'U':
{
i=4;
break;
}
}
if (i >=0)
num[i]++;
}
}
main()
{
chars1[81];
int num1[5], i;
clrscr();
printf("\nPlease enter a string: " );
gets( s1 );
fun ( s1,num1 );
for ( i=0; i < 5; i++ )
printf ("%d ",num1[i]);
printf("\n");
}
59
分析:
题目要求在fun函数中统计字符串中各元音字母(即:A、E、I、O、U)的个数。注意:字母不分大、小写。例如:若输入THIs is a
boot,则输出应该是1、0、2、2、0。
为了实现以上要求,程序首先将num数组五个元素初始化为0,因为这五个元素分别记录了各元音字母(即:A、E、I、O、U)在字符串中的个数。然后程序使用循环逐个地检查s字符串中每一个字符,检查过程中首先设置i变量为-1。这个i变量为什么要设置为-1呢?这是因为在检查当前字符是否为元音字母(即:A、E、I、O、U)的时候,如果的确是,则将i设置为num数组中记录对应元音字母个数的下标位置。如果不是元音字母,i变量则保持-1的值。这样只要判断i是否不为-1,如果i等于-1,就知道当前检查的字符不是元音字母,否则就应该将num[i]加一。
程序第一处改错处将fun ( char*s,intnum[5] )修改为void fun (
char*s,intnum[5]
)的原因是按照标准C语言的语法,函数必须存在返回类型,如果没有返回值必须声明函数返回类型为void。由于程序中fun函数没有任何返回值的语句,也就是说没有return语句,所以fun函数没有返回值,所以需要声明fun函数的返回类型为void。
程序第二处改错处将num[i]=0;修改为num[k]=0;的原因是该语句位于for循环中,作用是将num数组每一个元素初始化为0以便下面的程序进行累加。
程序第三处改错处将switch ( s )修改为switch ( *s
)的原因是*s表示s指针指向的字符,而s是指针,所以switch(*s)就是判断s指针当前指向的字符是否为下面的字符之一。
程序注解如下:
#include
#include
void fun ( char*s,
intnum[5])
{
int k, i=5;
for ( k = 0;
k
num[k]=0;
for (; *s; s++)
{
i=-1;
switch ( *s )
{
case 'a':
case 'A':
{
i=0;
break;
}
case 'e':
case 'E':
{
i=1;
break;
}
case 'i':
case 'I':
{
i=2;
break;
}
case 'o':
case 'O':
{
i=3;
break;
}
case 'u':
case 'U':
{
i=4;
break;
}
}
if (i >=0)
num[i]++;
}
}
main()
{
chars1[81];
int num1[5], i;
clrscr();
printf("\nPlease enter a
string: " );
gets( s1 );
fun ( s1,num1 );
for ( i=0; i
< 5; i++ )
printf ("%d ",num1[i]);
printf("\n");
}