printf("%4d",b[i]);
printf("\n");
}
34
分析:
题目要求在fun函数中分类统计传入的字符串str中元音字母和其它字符的个数(不区分大小写),然后将这些个数作为bb数组的成员。
元音字母一共有五个,分别是A、E、I、O、U。
由于不区分大小写,所以小写的a、e、i、o、u和A、E、I、O、U中对应的字符算一个字符。
例如A和a被看成同一个字符。
为了实现题目要求,程序设置指针p指向str字符串第一个字符,然后通过往后移动p指针逐一判断p当前指向的指针是否为元音字母或者非元音字母。
当发现某元音字母的时候将该元音字母的个数加一即可。
程序注解如下:
#include
#include
#defineN100
/*str字符串统计元音字母和其它字符的个数的字符串*/
/*bb数组存放找到的元音字母和其他字符的个数*/
voidfun(char*str,intbb[])
{
/*将p指针指向str字符串的第一个字符*/
char*p=str;
inti=0;
/*存放字符个数的bb数组每一个成员初始化为0,因为下面需要进行个数累加*/
for(i=0;i<6;i++)
bb[i]=0;
/*while(*p)是while(*p!
='\0')的简写方式*
/*while循环的循环条件是p指针当前指向的字符不是结束标记符'\0'*/
while(*p)
{
/*判断p指针当前指向的字符是否为元音字符*/
switch(*p)
{
/*判断p指针当前指向的字符是否为'A'或者'a'*/
/*bb第一个成员记录'A'或者'a'的个数*/
case'A':
case'a':
bb[0]++;break;
/*判断p指针当前指向的字符是否为'E'或者'e'*/
/*bb第二个成员记录'E'或者'e'的个数*/
case'E':
case'e':
bb[1]++;break;
/*判断p指针当前指向的字符是否为'I'或者'i'*/
/*bb第三个成员记录'I'或者'i'的个数*/
case'I':
case'i':
bb[2]++;break;
/*判断p指针当前指向的字符是否为'O'或者'o'*/
/*bb第四个成员记录'O'或者'o'的个数*/
case'O':
case'o':
bb[3]++;break;
/*判断p指针当前指向的字符是否为'U'或者'u'*/
/*bb第五个成员记录'U'或者'u'的个数*/
case'U':
case'u':
bb[4]++;break;
/*p指针当前指向的字符不是元音字符的时候*/
/*bb第六个成员记录非元音字符的个数*/
default:
bb[5]++;
}
/*p指针移动到str字符串中下一个字符*/
p++;
}
}
main()
{
charstr[N],ss[5]="AEIOU";
inti;
intbb[6];
/*clrscr函数用于清除输出窗口中已经显示的内容*/
/*clrscr函数定义在conio.h,所以需要#include*/
clrscr();
printf("Inputastring:
\n");
/*gets函数用于接收键盘输入的字符串,将其放入参数中*/
/*gets函数定义在stdio.h,所以需要#include*/
gets(str);
printf("thestringis:
\n");
/*puts函数用于将参数中包含的字符串输出在输出窗口*/
/*puts函数定义在stdio.h,所以需要#include*/
puts(str);
fun(str,bb);
/*输出元音字母和对应的个数*/
for(i=0;i<5;i++)
printf("\n%c:
%d",ss[i],bb[i]);
/*输出其他字符的个数*/
printf("\nother:
%d\n",bb[i]);
}
35
分析:
题目要求在fun函数中统计字符串str中的单词数,结果由变量num传回。
str是全部由小写字母字符和空格字符组成的字符串,每个单词之间都由空格隔开,并且字符串str开始不存在空格。
而要统计单词数,需要逐一检查str字符串中每一个字符。
(1)如果某一个位置的字符是小写字母而紧接着的后一个字符为空格,则说明发现一个单词。
(2)第一种方法不能发现最后一个单词,例如str字符串为"howareyou",最后一个单词"you"不符合以上要求,所以需要单独判断。
方法是判断某一个字符紧接着的后一个字符为字符串结束标记'\0'。
如果是则说明该字符位于字符串最后一个单词。
程序注解如下:
#include
#defineN80
/*num指针指向的地址里的内容为s字符串中字符的个数*/
voidfun(char*s,int*num)
{
/*n记录在s字符串中单词的个数*/
inti,n=0;
/*逐一检查s字符串中的字符,由于num是指针类型*/
/*所以需要用*运算符取num指针指向的地址里的内容,即s字符串中字符个数*/
for(i=0;i<*num;i++)
{
/*判断是否发现一个新的单词,判断方法依循以上分析*/
if(s[i]>='a'&&s[i]<='z'&&s[i+1]==''||s[i+1]=='\0')
/*当发现一个新的单词,记录单词个数的n需要加一*/
n++;
}
/*将单词数覆盖num指针指向的地址中的内容,以便main函数能接收到*/
*num=n;
}
main()
{
charstr[N];
intnum=0;
printf("Enterastring:
\n");
/*gets函数用于接收键盘输入的字符串,将其放入参数中*/
/*gets函数定义在stdio.h,所以需要#include*/
gets(str);
/*while(str[num])是while(str[num]!
='\0')的简写方式*/
/*以下while循环作用是逐个检查str字符串的字符是否为结束标记'\0'*/
/*所以当循环结束时,num则保存了str字符串的字符个数*/
while(str[num])
num++;
/*采取传地址方式传入num变量的地址*/
fun(str,&num);
/*输出单词的个数*/
printf("Thenumberofwordis:
%d\n\n",num);
}
36
分析:
题目要求在fun函数中把字符串str中的数字字符转换成数字并存放到整型数组bb中,函数返回数组bb的长度。
在程序中,需要判断某一个字符是否是非数字字符还是数字字符。
判断方法就是检查该字符的ASCII码是否大于"0"字符的ASCII码而小于"9"的ASCII码。
也就是说只要某字符的ASCII码值在"0"字符和"9"字符两个ASCII码值之间,该字符就是数字字符。
ASCII全称是美国标准信息交换码(AmericanStandardCodeforInformationInterchange)。
在这张表中,小写字母"0"的ASCII码值为48,小写字母"1"的ASCII码值为49,小写字母"2"的ASCII码值为50,后面的数字字符的ASCII码值依次类推,最后的"9"的ASCII码值为57。
所有的数字字符在ASCII码表中是按顺序排列的,它们在ASCII表的码值开始于48,结束于57。
而根据C语言的语法,判断两个字符之间的大小实际上是比较两个字符在ASCII表中的码值大小。
例如"7"字符大于"6"字符,因为"7"的ASCII码值为55,"6"的ASCII码值为54,"7"的ASCII码值大于"6"的ASCII码值。
使用C语言描述就是'7'>'6'这个表达式成立。
综上所述,判断某个字符是否为数字字符只要判断该字符的ASCII码值是否在"0"和"9"之间即可。
如果在这范围之内,该字符就是数字字符,否则不是。
程序采用for循环一个个检查str字符串中的每一个字符。
如果字符的ASCII码值位于'0'和'9'之间,则说明该字符是一个数字字符。
程序将它从char类型转换为int类型,然后将转换得到的值放入bb数组中。
程序将char类型的数字字符转换为int类型的数字采用了ASCII表中数字字符的ASCII码是连续的这个特性。
任何char类型的数字字符x减去'0',即x-'0'都将执行x的ASCII码值减去'0'的码值,由于数字字符的ASCII码是连续的,所以x-'0'的直接后果就是得到了和x对应的int类型的值,也就达到了将char类型的数字字符x转化为int类型的数值。
程序将str字符串中的数字字符从char类型转换为int类型之后放入bb数组,而放入bb数组的位置需要由n变量来决定。
由于数组从0开始,所以n初始值设置为0。
然后每一次在bb数组中放入一个数字之后n都必须增加一,以便下一次放入数字的时候能使用n指示放入的位置。
程序注解如下:
#include
#defineN80
intbb[N];
intfun(chars[],intbb[],intnum)
{
/*n指示数字放入bb数组的位置,由于数组从0开始,所以初始值设置为0*/
inti,n=0;
for(i=0;i{
/*当s[i]的ASCII码值在'0'和'9'之间的时候,即s[i]为数字字符的时候*/
if(s[i]>='0'&&s[i]<='9')
{
/*将s[i]的ASCII码值减去'0'的ASCII码值,得到s[i]与'0'的差距*/
/*作用就是将s[i]从char类型转换成int类型*/
bb[n]=s[i]-'0';
/*n变量加一,指示下一个数字放入bb数组的位置*/
n++;
}
}
/*以上for循环结束的时候n变量的值则为bb数组中的数字个数*/
returnn;
}
main()
{
charstr[N];
intnum=0,n,i;
printf("Enterastring:
\n");
/*gets函数用于接收键盘输入的字符串,将其放入参数中*/
/*gets函数定义在stdio.h,所以需要#include*/
gets(str);
/*以下while循环作用是逐个检查str字符串的字符是否为结束标记'\0'*/
/*所以当循环结束时,num则保存了str字符串的字符个数*/
while(str[num])
num++;
n=fun(str,bb,num);
printf("\nbb=");
/*输出保存在bb数组中的数字*/
for(i=0;iprintf("%d",bb[i]);
printf("\n");
}