___3___;
printf("max=%d\n",max);
}
11
题目:
给定程序中,函数fun的功能是:
把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动(注:
字符串的长度大于等于2)。
例如,形参s所指的字符串为:
abcdefgh,执行结果为:
ahcbedgf。
注意:
部分源程序如blank.c给出。
请勿改动主函数main和其他函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include
voidfun(char*s)
{
inti,n,k;
charc;
n=0;
for(i=0;s[i]!
='\0';i++)n++;
if(n%2==0)
k=n-___1___;
else
k=n-2;
c=___2___;
for(i=k-2;i>=1;i=i-2)s[i+2]=s[i];
s[1]=___3___;
}
main()
{
chars[80]="abcdefgh";
printf("\nTheoriginalstringis:
%s\n",s);
fun(s);
printf("\nTheresultis:
%s\n",s);
}
题目:
请补充fun函数,该函数的功能是将字符串tt中的大写字母都改为对应的小写字母,其他字符不变。
例如,若输入"AreyoucomefromSichuan?
",则输出"areyoucomefromsichuan?
"。
注意:
部分源程序如blank.c给出。
请勿改动主函数main和其他函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include
#include
#include
char*fun(chartt[])
{
inti;
for(i=0;tt[i];i++)
{
if((tt[i]>='A')&&(___1___))
___2___;
}
return(___3___);
}
main()
{
chartt[81];
printf("\nPleaseenterastring:
");
gets(tt);
printf("\nTheresultstringis:
\n%s",fun(tt));
}
要实惠上淘宝
个人护理健康危机09夏季男装最后一次大补货试吃节风靡世界的李维斯牛仔裤购物新玩法搭配更便宜炒货节数码,还是国外原产的好在线配镜超低价巨便宜卡哇伊小包大集合时尚中国风
解答
9
分析:
题目要求统计字符串中大写字母和小写字母的个数,所以在main函数中使用gets函数接收从键盘上输入的字符串s,然后将s传入fun函数,在fun函数中统计传入的字符串s中大写字母和小写字母的个数。
这里需要注意的是在main函数中upper、lower变量分别记录大写字母和小写字母的个数。
这两个int类型的变量要在fun函数中统计字符串s中大写字母和小写字母的个数的时候进行增加的,然后退出fun函数回到main函数中upper、lower变量应该分别是大写字母和小写字母的个数。
然而,根据C语言的语法,普通int类型的变量的值在某函数(例如fun函数)中进行变化之后退出该函数,在main函数中该变量将丢失在那个函数(例如fun函数)的变化而直接恢复到进入函数(例如fun函数)之前的值,也就是说在函数(例如fun函数)的变化都是无效的。
这显然不是我们所希望的,因为我们希望在fun函数中统计大小写字母的过程中upper、lower变量的值得到改变,退出fun函数直接输出upper、lower变量就可以看到大小写字母的个数了。
那如何解决这种问题呢?
根据C语言的语法,以上问题可以通过使用指针解决。
以上的问题是由于参数传递方式为传值方式所导致的,可以通过将传入的参数改为指针类型改变参数传递方式为传地址方式。
所以fun函数的函数头为以下:
voidfun(char*s,int*a,int*b)
分别对应upper、lower的a变量和b变量为指针类型,相应的main函数中传入fun函数的参数为&upper,&lower。
这样在fun函数中操作a、b指针才能达到预期效果。
在fun函数中,a指针所指向的内存地址中存放了记录大写字母个数的值,而b指针所指向的内存地址中存放了记录小写字母个数的值。
在fun函数中,我们通过*a、*b引用a、b指针所指向的内存地址中存放的大、小写字母个数的值,当发现大写或者小写字母的时候将*a或者*b加一。
退出fun函数的时候,形式参数a、b由于超出作用域而消失,但是它们指向的内存地址中的值还保留着,这些值在main函数中可以分别通过upper、lower引用,从而解决了函数参数退出函数之后恢复原值的问题。
程序注解如下:
#include
/*s参数表示传入的字符串,a、b参数表示大写字母和小写字母的个数*/
/*s是一个指针,指向传入的字符串的第一个字母*/
voidfun(char*s,int*a,int*b)
{
/*while(*s)是while(*s!
=’\0’)的简写方式*/
/*s指针指向的字母不为’\0’,就是说循环检查到字符串结束符才退出循环*/
while(*s)
{
/*判断s指针指向的字母是否是大写字母,如果是就把*a加一*/
if(*s>='A'&&*s<='Z')
(*a)++;
/*判断s指针指向的字母是否是小写字母,如果是就把*b加一*/
if(*s>='a'&&*s<='z')
(*b)++;
/*s指针往后移动一个字母位置,准备判断下一个字母是否为大小写字母*/
s++;
}
}
main()
{
chars[100];
/*upper、lower变量分别记录大写字母和小写字母的个数*/
intupper=0,lower=0;
printf("\nPleaseastring:
");
/*gets函数定义在stdio.h中,所以需要#include*/
/*gets函数接收键盘输入的字符串,将其放入参数s数组中*/
gets(s);
/*取存放upper变量、lower变量的地址,将其作为指针传入fun函数*/
fun(s,&upper,&lower);
/*输出在fun函数中改变的upper、lower变量,也就是大小写字母个数*/
printf("\nupper=%dlower=%d\n",upper,lower);
}
10
分析:
程序要求从键盘输入3个整数,然后找出最大的数并输出。
实现思路如下:
首先判断前面两个整数,取两者较大者保存在变量max中,然后将max保存的较大者与第三个整数进行比较大小,同样也将两者较大者保存在max变量中,最后max变量记录的值就是3个参加比较大小的整数中最大的一个整数。
程序注解如下:
#include
#include
main()
{
inta,b,c,max;
/*clrscr函数的作用是清屏,将输出窗口的已显示内容全部清除*/
/*clrscr定义在conio.h中,所以需要#include*/
clrscr();
/*在输出窗口上输出提示信息"Inputthreenumbers:
"*/
printf("\nInputthreenumbers:
\n");
/*从键盘上输入3个整数,按照顺序赋值给a、b、c*/
/*由于指定了"%d,%d,%d"输入格式,输入的时候三个整数必须以逗号分隔*/
/*例如输入12、45、43三个整数,输入格式如下:
12,45,43*/
/*三个整数输入之后按回车键即可完成整个输入过程*/
scanf("%d,%d,%d",&a,&b,&c);
/*将输入的三个整数输出*/
printf("Thethreenumbersare:
%d,%d,%d\n",a,b,c);
/*将前两个整数进行比较,将较大者放入max变量中*/
if(a>b)
max=a;
else
max=b;
/*将前两个整数的较大者也就是max与第三个整数进行比较大小*/
/*较大者放入max变量中*/
if(maxmax=c;
/*输出三个整数中的最大值*/
printf("max=%d\n",max);
}
11
分析:
题目要求在fun函数中把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动。
要实现以上功能,我们可以有以下思路:
先计算字符串中包含的字符个数,然后将最右边可能被移出字符串的字符保存在另外一个变量c中,然后从字符串右边第一个奇数位置的字符开始往左边循环,循环体中将奇数位置的字符覆盖右边临近的奇数位置的字符,当到了字符串最左边的时候循环结束,将预先保存在c变量中的右边被移出字符串的字符覆盖左边第一个奇数位置的字符即可。
这里需要注意的是字符串中第一个位置的下标为0,而不是1。
这是因为字符串也是一个char类型的数组,而数组在C语言中第一个元素的下标是0,所以题目中所指的字符串第一个字符的下标是0。
以上所讲的思路为什么不从左边开始向右边循环呢?
关键的问题在于如果从左边开始把下标为奇数的字符右移到下一个奇数位置的话,程序将出现逻辑混乱。
举一个具体的例子,例如字符串为"abcdefgh",第一个奇数位置的字符为"b",第二个奇数位置的字符为"d",第三个奇数位置的字符为"f",依次类推。
当程序从左边开始把下标为奇数的字符右移到下一个奇数位置的时候,我们先从第一个奇数位置开始。
当第一个奇数位置的字符"b"覆盖第二个奇数位置的字符"d"之后,我们想把原来第二个奇数位置的字符"d"右移到下一个奇数位置的时候发现它已经被第一个奇数位置的字符"b"覆盖了,处理不方便。
所以我们选择从右边到左边的处理方式。
程序注解如下:
#include
voidfun(char*s)
{
inti,n,k;
charc;
/*n为存放字符串s字符个数的变量,初始值为0*/
n=0;
/*计算字符串s包含的字符个数,得到的个数存放在n变量中*/
for(i=0;s[i]!
='\0';i++)n++;
/*计算字符串中最后一个奇数位置的下标*/
/*如果字符串字符个数为偶数,最后一个奇数位置的下标k为个数减一*/
/*如果字符串字符个数为奇数,最后一个奇数位置的下标k为个数减二*/
if(n%2==0)
k=n-1;
else
k=n-2;
/*将最后一个奇数位置上的字符先保存在c变量中,准备开始循环*/
c=s[k];
/*从右边最后一个奇数位置开始,将前一个奇数位置的字符覆盖自己*/
for(i=k-2;i>=1;i=i-2)s[i+2]=s[i];
/*以上循环结束后只有原来最后一个奇数位置的字符被丢失*/
/*程序使用预先保存在c变量的值回放到第一个奇数位置*/
s[1]=c;
}
main()
{
chars[80]="abcdefgh";
printf("\nTheoriginalstringis:
%s\n",s);
fun(s);
printf("\nTheresultis:
%s\n",s);
}
12
分析:
题目要求将字符串tt中的大写字母都改为对应的小写字母,其他字符不变。
这里主要的问题是如何实现大写字母转化成小写字母。
在程序设计方法中,大小写字母的互相转换可以使用以下技巧:
在ASCII码表中,大写字母"A"的ASCII码值为65,大写字母"B"的ASCII码值为66,大写字母"C"的ASCII码值为67,后面的大写字母的ASCII码值依次类推,大写字母在ASCII码表中是按顺序排列的,最后的"Z"的ASCII码值为90。
小写字母"a"的ASCII码值为97,小写字母"b"的ASCII码值为98,小写字母"c"的ASCII码值为99,后面的小写字母的ASCII码值依次类推,小写字母在ASCII码表中也是按顺序排列的,最后的"z"的ASCII码值为122。
根据以上情况,我们可以发现所有对应的大写字母和小写字母ASCII码相差32。
例如"B"和"b"的ASCII码相差32,"K"和"k"的ASCII码相差32,"E"和"e"的ASCII码也是相差32。
利用这种特性和C语言的语法,如果要将大写字母都改为对应的小写字母,只要将该字符加上32即可。
同理,如果要将小写字母都改为对应的大写字母,只要将该字符减去32即可。
例如以下程序就可以将字符"D"转化成"d"然后输出。
main()
{
charc1='D';
charc2=c1+32;
printf("%c",c2);
}
程序注解如下:
#include
#include
char*fun(chartt[])
{
inti;
/*开始循环逐一检查tt数组中每一个字符*/
/*for(i=0;tt[i];i++)是for(i=0;tt[i]!
='\0';i++)的简写方式*/
for(i=0;tt[i];i++)
{
/*如果tt数组当前元素的ASCII码在'A'与'Z'之间,说明是大写字母*/
/*如果是大写字母,就加上32转换成对应的小写字母*/
if((tt[i]>='A')&&(tt[i]<='Z'))
tt[i]+=32;
}
/*由于fun函数返回类型为char*类型*/
/*再结合main函数中输出调用fun函数的返回值是转化之后的字符串*/
/*所以判断fun函数应该返回tt数组*/
/*tt虽然是数组名称,但是C语言语法规定数组名同时也是指针*/
/*C语言语法规定数组名代表的指针指向数组第一个元素*/
return(tt);
}
main()
{
chartt[81];
/*在输出窗口显示提示信息"Pleaseenterastring:
"*/
printf("\nPleaseenterastring:
");
/*使用gets函数接收键盘输入的字符串,输入的字符串存入tt数组*/
/*gets函数定义在stdio.h中,所以需要#include*/
gets(tt);
/*输出结果*/
printf("\nTheresultstringis:
\n%s",fun(tt));
}