C语言二级 考试 上机 试题 编程.docx
《C语言二级 考试 上机 试题 编程.docx》由会员分享,可在线阅读,更多相关《C语言二级 考试 上机 试题 编程.docx(128页珍藏版)》请在冰豆网上搜索。
C语言二级考试上机试题编程
第三部分程序编写题
字符串类:
第1—20题
1、请编写一个函数fun(char*s),函数的功能是把字符串中所有的字母改写在该字母的下一个字母,最后一个字母z改写成字母a。
大写字母仍为大写字母,小写字母仍为小写字母,其他的字符不变。
例如,原有的字符串为:
Mn.123xyZ,则调用该函数后,串中的内容为:
No.123yzA。
注意:
部分源程序存在文件prog.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#defineN81
fun(char*s)
{……}
main()
{chara[N];
clrscr();
printf("Enterastring:
");gets(a);
printf("Theoriginalstringis:
");puts(a);
fun(a);
printf("Thestringaftermodified:
");
puts(a);
}
本题的考核点是c语言中的循环语句和条件判断语句的使用。
提示思路:
从本题的要求来看,我们应该采用外循环内条件判断的算法。
本参考函数使用for循环从头到尾扫描字符串,并在扫描时进行条件判断,对'z','Z'和其它字符进行不同的处理。
本评析仅供参考(计算机培训中心提示:
注意题目要求并请及时存盘)。
{inti,length;
length=strlen(s);/*求得字符串s的长度*/
for(i=0;i{if(!((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))/*判断字符s[i]是否为大小写的英文字母*/continue;switch(s[i]){case'z':/*假如s[i]为小写字母z,则改写成小写字母a*/s[i]='a';break;case'Z':/*假如s[i]为大写字母Z,则改写成大写字母A*/s[i]='A';break;default:/*假如s[i]为除大小写字母Z和z以外字母,则直接改写成该字母的下一个字母*/s[i]=s[i]+1;break;}}}2、请编写函数fun,函数的功能是:在字符串中的所有数字字符前加一个$字符。例如,输入A1B23CD45,则输出为:A$1B$2$3CD$4$5。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includevoidfun(char*s){……}main(){chars[80];printf("Enterastring:");scanf("%s",s);fun(s);printf("Theresult:%s\n",s);}本题的考核点是在字符串中的数字之前加一$字符的算法。提示思路:通过一中间数组和一循环来实现。方法是:从字符串的首字符开始,判断字符是否为数字,若是,将字符$和数字字符赋给中间数组,反之,将字符直接赋给中间数组,直至字符串尾,最后将中间数组赋给原字符串。voidfun(char*s){charp[80];inti=0,j=0;while(s[i]!='\0')/*假如s[i]不为字符串结束符,则继续循环*/{if((s[i]>='0')&&(s[i]<='9')){p[j]='$';p[j+1]=s[i];j=j+2;}/*假如s[i]为数字字符,则将$置于p[j]中,数字字符置于p[j+1]中*/else{p[j]=s[i];j=j+1;}/*否则将s[i]置于p[j]中*/i++;}p[j]='\0';strcpy(s,p);/*将p数组中的字符复制到s数组中*/}3、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串最前面连续的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。例如,字符串中的内容为:*******A*BC*DEF*G****,若n的值为4,删除后,字符串中的内容应当是:****A*BC*DEF*G****;若n的值为8,则字符串中的内容仍为:*******A*BC*DEF*G****。n的值在主函数中输入。在编写函数时,不得使用C语言提供的字符串函数。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(char*a,intn){……}main(){chars[81];intn;printf("Enterastring:\n");gets(s);printf("Entern:");scanf("%d",&n);fun(s,n);printf("Thestringafterdeleted:\n");puts(s);}本题的考核点是删除字符串中字符的算法。解题思路:先统计串前连续的*号个数,与指定的个数进行判断,若小于等于指定的数,什么也不做,若大于指定的数,则删除多余的*,删除的方法是:用一个循环先生成指定个数个*放入到一字符串中,再将从原串中非*字符开始至串尾的字符追加其后,最后用新串覆盖原串。本评析仅供参考。voidfun(char*a,intn){charb[81];inti=0,j=0,s=0,k;while(a[i]=='*'){s++;i++;}/*统计字符串前连续的*号个数*/if(s>n)/*判断字符串前连续的*号个数是否大于n*/{for(k=0;k{b[j]='*';j++;}while(a[i]){b[j]=a[i];j++;i++;}b[j]='\0';i=0;j=0;while(b[j])/*将字符串b中的所有字符复制到a字符串中覆盖原串*/{a[i]=b[j];i++;j++;}a[i]='\0';}}4、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串前面连续的*号全部删除,中间和尾部的*号不删除。例如,字符串中的内容为:*******A*BC*DEF*G****,删除后,字符串中的内容应当是:A*BC*DEF*G****。在编写函数时,不得使用C语言提供的字符串函数。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(char*a){……}main(){chars[81];printf("Enterastring:\n");gets(s);fun(s);printf("Thestringafterdeleted:\n");puts(s);}本题的考核点是在字符串中删除字符的算法。提示思路:从原串中的第一个非*开始的所有字符拷贝到另一字符串数组中,最后将这个字符串数组覆盖原串。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。voidfun(char*a){charb[81];inti=0,j=0;while((a[j]!='\0')&&(a[j]=='*'))j++;/*查找出字符串数组a中第一个不为“*”的字符,并用j返回其下标*/while(a[j]!='\0')/*将字符串a中第一个不为“*”开始的所有字符全部复制到字符串b中*/{b[i]=a[j];j++;i++;}b[i]='\0';i=0;j=0;while(b[i]!='\0')/*将字符串b中的所有字符复制到a字符串中覆盖原串*/{a[j]=b[i];i++;j++;}a[j]='\0';}5、请编写函数fun,函数的功能是:将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母;若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。例如,输入:ABCdXZZZZ,则输出为:AcCdXzZz。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#defineN80voidfun(char*s){……}main(){chars[N];printf("Enterastring:");scanf("%s",s);fun(s);printf("Theresult:%s",s);}_本题的考核点是字符转换算法。解题思路:将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母,若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。判断字符为大写字母的方法是:判断字符的ASCII值是否大于A小于Z。判断下标为奇数,用%2等于1来判断。voidfun(char*s){inti=0;while(s[i]!='\0')/*假如s[i]不为字符串结束符,则继续循环,否则退出循环*/{if((s[i]=='Z')&&(i%2==1))s[i]='z';/*假如s[i]为大写字母Z且在字符串中下标为奇数的位置上,则转换成小写字母z*/elseif((s[i]>='A'&&s[i]<'Z')&&(i%2==1))s[i]=s[i]+33;/*假如s[i]为除大写字母Z以外的字母,则直接转换成该字母的小写字母状态的下一个字母*/i++;}}6、编写一个函数,从传入的num个字符串找出最长的一个字符串,并通过形参指针max传回该串地址。(注意:用****作为结束输入的标志。)注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#include#includefun(char(*a)[81],intnum,char**max){……}main(){charss[10][81],*ps;intn,i=0;clrscr();printf("输入若干个字符串:");gets(ss[i]);puts(ss[i]);while(!strcmp(ss[i],"****")==0){i++;gets(ss[i]);puts(ss[i]);}n=i;fun(ss,n,&ps);printf("\nmax=%s\n",ps);}_本题的考核点是从一组字符串中找出最长串的算法。提示思路:通过求字符串长度函数对一组字符串的字符进行比较,并将地址赋给一指针变量。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。fun(char(*a)[81],intnum,char**max){inti;*max=a[0];/*将第一个字符串赋值给max指针*/for(i=1;i<=num;i++)if(strlen(a[i])>strlen(*max))*max=a[i];/*假如字符串a[i]的长度比指针max中的字符串的长度长,则将a[i]字符串赋值给max指针*/}7、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了前面连续的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:****A*BC*DEF*G******,删除后,字符串中的内容应当是:****ABCDEFG。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(char*a){……}main(){chars[81];printf("Enterastring:\n");gets(s);fun(s);printf("Thestringafterdeleted:\n");puts(s);}_本题的考核点是删除字符串中字符的算法。提示思路:先将原串中的串首连续的*号字符赋给一字符串数组,再从原串中的第一个非*字符开始,将非*号的字符追加其后,最后将新串覆盖原串。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。voidfun(char*a){charb[81];inti=0,j=0;while(a[i]&&(a[i]=='*')){b[j]=a[i];j++;i++;}/*将原串中的串首连续的*号字符赋给一字符串数组b*/elsek++;while(a[i])if(a[i]!='*'){b[j]=a[i];j++;i++;}/*从原串中的第一个非*字符开始,将非*号的字符追加在数组b后*/elsei++;b[j]='\0';j=0;i=0;while(b[j])/*将字符串b中的所有字符复制到a字符串中覆盖原串*/{a[i]=b[j];i++;j++;}a[i]='\0';}8、请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则函数把它转换为整数值-1234。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includelongfun(char*p){……}main()/*主函数*/{chars[6];longn;printf("Enterastring:\n");gets(s);n=fun(s);printf("%ld\n",n);}本题的考核点是指针、ASCII码、循环语句及条件语句的使用。提示思路:通过循环语句移动指针,取出指针所在位置上的字符,先判断其为正负号还是为数字字符,如果为数字字符则将其转化为相应的数值,否则作正负标记。longfun(char*p){longn=0;intflag=0;/*通过循环语句移动指针,取出指针所在位置上的字符*/while(*p!='\0'){if(*p=='-')/*判断其是否为负号*/flag=1;elseif(*p=='+')/*判断其是否为正号*/flag=0;else/*判断其是否为数字字符*/n=n*10+(*p-'0');/*将数字字符转化为相应的数值*/p++;}if(flag==1)n=-n;returnn;}9、请编写函数fun(),该函数的功能是按条件删除一个字符串指定字符一半的数目,具体要求如下:如果该字符串所包含的指定字符的个数是奇数,则不予删除,如果其数目是偶数,则删除原串后半部分的指定字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,c中存放指定的字符。例如:当a输入“abababa”,c=‘a’时,b的输出为“ababb”;如果a的输入为“ababa”,则b的输出为“ababa”。注意:部分源程序给出如下。试题程序:#include#include#defineLEN80voidfun(chara[],charb[],charc){……}main(){chara[LEN],b[LEN];charc;clrscr();printf("Enterthestring:\n");gets(a);printf("Enterthecharacterofthestringdeleted:");scanf("%c",&c);fun(a,b,c);printf("Thenewstringis:%s\n",b);}【答案】fun函数编写如下:inti=0,j=0;intn=0;intm=0;while(a[i]!='\0'){if(a[i]==c)n++;i++;}i=0;if(n%2){while(a[j]!='\0'){b[j]=a[j];j++;}b[j]='\0';}else{while(a[i]!='\0'){b[j++]=a[i];if(a[i]==c)m++;if((m>n/2)&&(a[i]==c))j--;i++;}b[j]=′\0′;}10、编写一个函数voidfun(charp1[],charp2[]),它的功能是:实现两个字符串的连接(不使用库函数strcat)。例如,输入下面两个字符串:FirstString--SecondString程序输出:FirstString--SecondString注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(charp1[],charp2[]){……}main(){chars1[80],s2[40];clrscr();printf("Enters1ands2:\n");scanf("%s%s",s1,s2);printf("s1=%s\n",s1);printf("s2=%s\n",s2);printf("Invokefun(s1,s2):\n");fun(s1,s2);printf("Afterinvoking:\n");printf("%s\n",s1);}本题的考核点是字符串的连接。解题思路:1、定义两个字符型指针point1、point2,分别指向字符串p1和p2;2、point1起始指向字符串p1的第一个字符,通过循环,令其指向p1串尾,为未来的连接工作做好准备;3、point2起始指向字符串p2的第一个字符,通过循环,不断将指针指向p2的下一个字符;4、将point2指向的字符通过指针point1逐一连接在字符串p1末尾;5、连接完毕后,将指向字符串p1末尾的指针point1指向'0',以保证指针不越界。解法一:voidfun(charp1[],charp2[]){char*point1,*point2;/*定义两个字符型指针point1、point2*/point1=p1;/*将字符型指针point1指向字符串p1的第一个字符*/point2=p2;/*将字符型指针point2指向字符串p2的第一个字符*/while(*point1!=NULL)point1++;/*通过循环,令point1指向p1串尾,为未来的连接工作做好准备*//*通过循环将point2指向的字符通过指针point1逐一连接在字符串p1末尾*/while(*point2!=NULL){*point1=*point2;point1++;point2++;}*point1=NULL;/*将指向字符串p1末尾的指针point1指向'0',以保证指针不越界*/}解法二:/*注:第一个for()循环用于让i成为第一个字符串的结束符的下标,要注意在这个for()后要有一个分号否则出错。第二个for()的作用是将第二个字符串一个一个字符依次放到第一个字符串的未尾。此外,还要注意最后一定要有p1[i]='\0';来给字符串加上结束符*/voidfun(charp1[],charp2[]){inti,j;for(i=0;p1[i];i++);for(j=0;p2[j];j++)p1[i++]=p2[j];p1[i]='\0';}11、请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。例如,若输入“abc4EFG”,则应输出“aBc4EFG”。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#include#includevoidfun(char*ss){……}main(){chartt[81];clrscr();printf("\nPleaseenteranstringwithin80characters:\n");gets(tt);printf("\n\nAfterchanging,thestring\n\"%s\"",tt);fun(tt);printf("\nbecomes\n\"%s\"\n",tt);}本题的考核点是指针、ASCII码、数组和循环语句。解题思路:通过循环语句依次判断数组下标为奇数的元素是否为小写字母,如果是则通过字符运算将其转换为大写字母。本评析仅供参考。voidf
{if(!
((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))/*判断字符s[i]是否为大小写的英文字母*/
continue;
switch(s[i]){
case'z':
/*假如s[i]为小写字母z,则改写成小写字母a*/
s[i]='a';break;
case'Z':
/*假如s[i]为大写字母Z,则改写成大写字母A*/
s[i]='A';break;
default:
/*假如s[i]为除大小写字母Z和z以外字母,则直接改写成该字母的下一个字母*/
s[i]=s[i]+1;break;
2、请编写函数fun,函数的功能是:
在字符串中的所有数字字符前加一个$字符。
例如,输入A1B23CD45,则输出为:
A$1B$2$3CD$4$5。
voidfun(char*s)
{chars[80];
");scanf("%s",s);
fun(s);
printf("Theresult:
%s\n",s);
本题的考核点是在字符串中的数字之前加一$字符的算法。
通过一中间数组和一循环来实现。
方法是:
从字符串的首字符开始,判断字符是否为数字,若是,将字符$和数字字符赋给中间数组,反之,将字符直接赋给中间数组,直至字符串尾,最后将中间数组赋给原字符串。
{charp[80];
inti=0,j=0;
while(s[i]!
='\0')/*假如s[i]不为字符串结束符,则继续循环*/
{if((s[i]>='0')&&(s[i]<='9')){p[j]='$';p[j+1]=s[i];j=j+2;}/*假如s[i]为数字字符,则将$置于p[j]中,数字字符置于p[j+1]中*/
else{p[j]=s[i];j=j+1;}/*否则将s[i]置于p[j]中*/
i++;
p[j]='\0';
strcpy(s,p);/*将p数组中的字符复制到s数组中*/
3、规定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
使字符串最前面连续的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。
例如,字符串中的内容为:
*******A*BC*DEF*G****,若n的值为4,删除后,字符串中的内容应当是:
****A*BC*DEF*G****;若n的值为8,则字符串中的内容仍为:
*******A*BC*DEF*G****。
n的值在主函数中输入。
在编写函数时,不得使用C语言提供的字符串函数。
voidfun(char*a,intn)
{chars[81];intn;
\n");gets(s);
printf("Entern:
");scanf("%d",&n);
fun(s,n);
printf("Thestringafterdeleted:
\n");puts(s);
本题的考核点是删除字符串中字符的算法。
解题思路:
先统计串前连续的*号个数,与指定的个数进行判断,若小于等于指定的数,什么也不做,若大于指定的数,则删除多余的*,删除的方法是:
用一个循环先生成指定个数个*放入到一字符串中,再将从原串中非*字符开始至串尾的字符追加其后,最后用新串覆盖原串。
本评析仅供参考。
{charb[81];
inti=0,j=0,s=0,k;
while(a[i]=='*'){s++;i++;}/*统计字符串前连续的*号个数*/
if(s>n)/*判断字符串前连续的*号个数是否大于n*/
{for(k=0;k{b[j]='*';j++;}while(a[i]){b[j]=a[i];j++;i++;}b[j]='\0';i=0;j=0;while(b[j])/*将字符串b中的所有字符复制到a字符串中覆盖原串*/{a[i]=b[j];i++;j++;}a[i]='\0';}}4、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串前面连续的*号全部删除,中间和尾部的*号不删除。例如,字符串中的内容为:*******A*BC*DEF*G****,删除后,字符串中的内容应当是:A*BC*DEF*G****。在编写函数时,不得使用C语言提供的字符串函数。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(char*a){……}main(){chars[81];printf("Enterastring:\n");gets(s);fun(s);printf("Thestringafterdeleted:\n");puts(s);}本题的考核点是在字符串中删除字符的算法。提示思路:从原串中的第一个非*开始的所有字符拷贝到另一字符串数组中,最后将这个字符串数组覆盖原串。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。voidfun(char*a){charb[81];inti=0,j=0;while((a[j]!='\0')&&(a[j]=='*'))j++;/*查找出字符串数组a中第一个不为“*”的字符,并用j返回其下标*/while(a[j]!='\0')/*将字符串a中第一个不为“*”开始的所有字符全部复制到字符串b中*/{b[i]=a[j];j++;i++;}b[i]='\0';i=0;j=0;while(b[i]!='\0')/*将字符串b中的所有字符复制到a字符串中覆盖原串*/{a[j]=b[i];i++;j++;}a[j]='\0';}5、请编写函数fun,函数的功能是:将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母;若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。例如,输入:ABCdXZZZZ,则输出为:AcCdXzZz。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#defineN80voidfun(char*s){……}main(){chars[N];printf("Enterastring:");scanf("%s",s);fun(s);printf("Theresult:%s",s);}_本题的考核点是字符转换算法。解题思路:将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母,若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。判断字符为大写字母的方法是:判断字符的ASCII值是否大于A小于Z。判断下标为奇数,用%2等于1来判断。voidfun(char*s){inti=0;while(s[i]!='\0')/*假如s[i]不为字符串结束符,则继续循环,否则退出循环*/{if((s[i]=='Z')&&(i%2==1))s[i]='z';/*假如s[i]为大写字母Z且在字符串中下标为奇数的位置上,则转换成小写字母z*/elseif((s[i]>='A'&&s[i]<'Z')&&(i%2==1))s[i]=s[i]+33;/*假如s[i]为除大写字母Z以外的字母,则直接转换成该字母的小写字母状态的下一个字母*/i++;}}6、编写一个函数,从传入的num个字符串找出最长的一个字符串,并通过形参指针max传回该串地址。(注意:用****作为结束输入的标志。)注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#include#includefun(char(*a)[81],intnum,char**max){……}main(){charss[10][81],*ps;intn,i=0;clrscr();printf("输入若干个字符串:");gets(ss[i]);puts(ss[i]);while(!strcmp(ss[i],"****")==0){i++;gets(ss[i]);puts(ss[i]);}n=i;fun(ss,n,&ps);printf("\nmax=%s\n",ps);}_本题的考核点是从一组字符串中找出最长串的算法。提示思路:通过求字符串长度函数对一组字符串的字符进行比较,并将地址赋给一指针变量。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。fun(char(*a)[81],intnum,char**max){inti;*max=a[0];/*将第一个字符串赋值给max指针*/for(i=1;i<=num;i++)if(strlen(a[i])>strlen(*max))*max=a[i];/*假如字符串a[i]的长度比指针max中的字符串的长度长,则将a[i]字符串赋值给max指针*/}7、规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了前面连续的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:****A*BC*DEF*G******,删除后,字符串中的内容应当是:****ABCDEFG。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(char*a){……}main(){chars[81];printf("Enterastring:\n");gets(s);fun(s);printf("Thestringafterdeleted:\n");puts(s);}_本题的考核点是删除字符串中字符的算法。提示思路:先将原串中的串首连续的*号字符赋给一字符串数组,再从原串中的第一个非*字符开始,将非*号的字符追加其后,最后将新串覆盖原串。本评析仅供参考(计算机培训中心提示:注意题目要求并请及时存盘)。voidfun(char*a){charb[81];inti=0,j=0;while(a[i]&&(a[i]=='*')){b[j]=a[i];j++;i++;}/*将原串中的串首连续的*号字符赋给一字符串数组b*/elsek++;while(a[i])if(a[i]!='*'){b[j]=a[i];j++;i++;}/*从原串中的第一个非*字符开始,将非*号的字符追加在数组b后*/elsei++;b[j]='\0';j=0;i=0;while(b[j])/*将字符串b中的所有字符复制到a字符串中覆盖原串*/{a[i]=b[j];i++;j++;}a[i]='\0';}8、请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则函数把它转换为整数值-1234。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includelongfun(char*p){……}main()/*主函数*/{chars[6];longn;printf("Enterastring:\n");gets(s);n=fun(s);printf("%ld\n",n);}本题的考核点是指针、ASCII码、循环语句及条件语句的使用。提示思路:通过循环语句移动指针,取出指针所在位置上的字符,先判断其为正负号还是为数字字符,如果为数字字符则将其转化为相应的数值,否则作正负标记。longfun(char*p){longn=0;intflag=0;/*通过循环语句移动指针,取出指针所在位置上的字符*/while(*p!='\0'){if(*p=='-')/*判断其是否为负号*/flag=1;elseif(*p=='+')/*判断其是否为正号*/flag=0;else/*判断其是否为数字字符*/n=n*10+(*p-'0');/*将数字字符转化为相应的数值*/p++;}if(flag==1)n=-n;returnn;}9、请编写函数fun(),该函数的功能是按条件删除一个字符串指定字符一半的数目,具体要求如下:如果该字符串所包含的指定字符的个数是奇数,则不予删除,如果其数目是偶数,则删除原串后半部分的指定字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,c中存放指定的字符。例如:当a输入“abababa”,c=‘a’时,b的输出为“ababb”;如果a的输入为“ababa”,则b的输出为“ababa”。注意:部分源程序给出如下。试题程序:#include#include#defineLEN80voidfun(chara[],charb[],charc){……}main(){chara[LEN],b[LEN];charc;clrscr();printf("Enterthestring:\n");gets(a);printf("Enterthecharacterofthestringdeleted:");scanf("%c",&c);fun(a,b,c);printf("Thenewstringis:%s\n",b);}【答案】fun函数编写如下:inti=0,j=0;intn=0;intm=0;while(a[i]!='\0'){if(a[i]==c)n++;i++;}i=0;if(n%2){while(a[j]!='\0'){b[j]=a[j];j++;}b[j]='\0';}else{while(a[i]!='\0'){b[j++]=a[i];if(a[i]==c)m++;if((m>n/2)&&(a[i]==c))j--;i++;}b[j]=′\0′;}10、编写一个函数voidfun(charp1[],charp2[]),它的功能是:实现两个字符串的连接(不使用库函数strcat)。例如,输入下面两个字符串:FirstString--SecondString程序输出:FirstString--SecondString注意:部分源程序存在文件prog.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(charp1[],charp2[]){……}main(){chars1[80],s2[40];clrscr();printf("Enters1ands2:\n");scanf("%s%s",s1,s2);printf("s1=%s\n",s1);printf("s2=%s\n",s2);printf("Invokefun(s1,s2):\n");fun(s1,s2);printf("Afterinvoking:\n");printf("%s\n",s1);}本题的考核点是字符串的连接。解题思路:1、定义两个字符型指针point1、point2,分别指向字符串p1和p2;2、point1起始指向字符串p1的第一个字符,通过循环,令其指向p1串尾,为未来的连接工作做好准备;3、point2起始指向字符串p2的第一个字符,通过循环,不断将指针指向p2的下一个字符;4、将point2指向的字符通过指针point1逐一连接在字符串p1末尾;5、连接完毕后,将指向字符串p1末尾的指针point1指向'0',以保证指针不越界。解法一:voidfun(charp1[],charp2[]){char*point1,*point2;/*定义两个字符型指针point1、point2*/point1=p1;/*将字符型指针point1指向字符串p1的第一个字符*/point2=p2;/*将字符型指针point2指向字符串p2的第一个字符*/while(*point1!=NULL)point1++;/*通过循环,令point1指向p1串尾,为未来的连接工作做好准备*//*通过循环将point2指向的字符通过指针point1逐一连接在字符串p1末尾*/while(*point2!=NULL){*point1=*point2;point1++;point2++;}*point1=NULL;/*将指向字符串p1末尾的指针point1指向'0',以保证指针不越界*/}解法二:/*注:第一个for()循环用于让i成为第一个字符串的结束符的下标,要注意在这个for()后要有一个分号否则出错。第二个for()的作用是将第二个字符串一个一个字符依次放到第一个字符串的未尾。此外,还要注意最后一定要有p1[i]='\0';来给字符串加上结束符*/voidfun(charp1[],charp2[]){inti,j;for(i=0;p1[i];i++);for(j=0;p2[j];j++)p1[i++]=p2[j];p1[i]='\0';}11、请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。例如,若输入“abc4EFG”,则应输出“aBc4EFG”。注意:部分源程序存在文件prog.c中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#include#includevoidfun(char*ss){……}main(){chartt[81];clrscr();printf("\nPleaseenteranstringwithin80characters:\n");gets(tt);printf("\n\nAfterchanging,thestring\n\"%s\"",tt);fun(tt);printf("\nbecomes\n\"%s\"\n",tt);}本题的考核点是指针、ASCII码、数组和循环语句。解题思路:通过循环语句依次判断数组下标为奇数的元素是否为小写字母,如果是则通过字符运算将其转换为大写字母。本评析仅供参考。voidf
{b[j]='*';j++;}
while(a[i])
{b[j]=a[i];j++;i++;}
b[j]='\0';i=0;j=0;
while(b[j])/*将字符串b中的所有字符复制到a字符串中覆盖原串*/
{a[i]=b[j];i++;j++;}
a[i]='\0';
4、规定输入的字符串中只包含字母和*号。
将字符串前面连续的*号全部删除,中间和尾部的*号不删除。
*******A*BC*DEF*G****,删除后,字符串中的内容应当是:
A*BC*DEF*G****。
voidfun(char*a)
{chars[81];
本题的考核点是在字符串中删除字符的算法。
从原串中的第一个非*开始的所有字符拷贝到另一字符串数组中,最后将这个字符串数组覆盖原串。
while((a[j]!
='\0')&&(a[j]=='*'))j++;/*查找出字符串数组a中第一个不为“*”的字符,并用j返回其下标*/
while(a[j]!
='\0')/*将字符串a中第一个不为“*”开始的所有字符全部复制到字符串b中*/
{b[i]=a[j];j++;i++;}
b[i]='\0';
i=0;j=0;
while(b[i]!
='\0')/*将字符串b中的所有字符复制到a字符串中覆盖原串*/
{a[j]=b[i];i++;j++;}
a[j]='\0';
5、请编写函数fun,函数的功能是:
将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母;若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。
例如,输入:
ABCdXZZZZ,则输出为:
AcCdXzZz。
#defineN80
{chars[N];
%s",s);
_本题的考核点是字符转换算法。
将s所指字符串中下标为奇数位置上的大写字母转换为字母序列中的下一个小写字母,若该位置上是小写字母,则不转换;若该位置上是大写字母Z,则仅转换成小写字母z。
判断字符为大写字母的方法是:
判断字符的ASCII值是否大于A小于Z。
判断下标为奇数,用%2等于1来判断。
{inti=0;
='\0')/*假如s[i]不为字符串结束符,则继续循环,否则退出循环*/
{if((s[i]=='Z')&&(i%2==1))s[i]='z';/*假如s[i]为大写字母Z且在字符串中下标为奇数的位置上,则转换成小写字母z*/
elseif((s[i]>='A'&&s[i]<'Z')&&(i%2==1))s[i]=s[i]+33;/*假如s[i]为除大写字母Z以外的字母,则直接转换成该字母的小写字母状态的下一个字母*/
6、编写一个函数,从传入的num个字符串找出最长的一个字符串,并通过形参指针max传回该串地址。
(注意:
用****作为结束输入的标志。
)
fun(char(*a)[81],intnum,char**max)
{charss[10][81],*ps;
intn,i=0;
printf("输入若干个字符串:
gets(ss[i]);
puts(ss[i]);
while(!
strcmp(ss[i],"****")==0)
{i++;
n=i;
fun(ss,n,&ps);
printf("\nmax=%s\n",ps);
}_
本题的考核点是从一组字符串中找出最长串的算法。
通过求字符串长度函数对一组字符串的字符进行比较,并将地址赋给一指针变量。
{inti;
*max=a[0];/*将第一个字符串赋值给max指针*/
for(i=1;i<=num;i++)
if(strlen(a[i])>strlen(*max))*max=a[i];/*假如字符串a[i]的长度比指针max中的字符串的长度长,则将a[i]字符串赋值给max指针*/
7、规定输入的字符串中只包含字母和*号。
除了前面连续的*号之外,将串中其它*号全部删除。
****A*BC*DEF*G******,删除后,字符串中的内容应当是:
****ABCDEFG。
先将原串中的串首连续的*号字符赋给一字符串数组,再从原串中的第一个非*字符开始,将非*号的字符追加其后,最后将新串覆盖原串。
while(a[i]&&(a[i]=='*')){b[j]=a[i];j++;i++;}/*将原串中的串首连续的*号字符赋给一字符串数组b*/
elsek++;
if(a[i]!
='*'){b[j]=a[i];j++;i++;}/*从原串中的第一个非*字符开始,将非*号的字符追加在数组b后*/
elsei++;
b[j]='\0';j=0;i=0;
8、请编写一个函数fun,它的功能是:
将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
例如,若输入字符串"-1234",则函数把它转换为整数值-1234。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
longfun(char*p)
main()/*主函数*/
{chars[6];
longn;
\n");
gets(s);
n=fun(s);
printf("%ld\n",n);
本题的考核点是指针、ASCII码、循环语句及条件语句的使用。
通过循环语句移动指针,取出指针所在位置上的字符,先判断其为正负号还是为数字字符,如果为数字字符则将其转化为相应的数值,否则作正负标记。
{longn=0;
intflag=0;
/*通过循环语句移动指针,取出指针所在位置上的字符*/
while(*p!
='\0'){
if(*p=='-')/*判断其是否为负号*/
flag=1;
elseif(*p=='+')/*判断其是否为正号*/
flag=0;
else/*判断其是否为数字字符*/
n=n*10+(*p-'0');/*将数字字符转化为相应的数值*/
p++;
if(flag==1)n=-n;
returnn;
9、请编写函数fun(),该函数的功能是按条件删除一个字符串指定字符一半的数目,具体要求如下:
如果该字符串所包含的指定字符的个数是奇数,则不予删除,如果其数目是偶数,则删除原串后半部分的指定字符。
其中,a指向原字符串,删除后的字符串存放在b所指的数组中,c中存放指定的字符。
例如:
当a输入“abababa”,c=‘a’时,b的输出为“ababb”;如果a的输入为“ababa”,则b的输出为“ababa”。
部分源程序给出如下。
试题程序:
#defineLEN80
voidfun(chara[],charb[],charc)
{chara[LEN],b[LEN];
charc;
printf("Enterthestring:
gets(a);
printf("Enterthecharacterofthe
stringdeleted:
scanf("%c",&c);
fun(a,b,c);
printf("Thenewstringis:
%s\n",b);
【答案】fun函数编写如下:
intn=0;
intm=0;
while(a[i]!
='\0')
{if(a[i]==c)
n++;
i=0;
if(n%2)
{
b[j]=a[j];
j++;
b[j]='\0';
else
b[j++]=a[i];
if(a[i]==c)
m++;
if((m>n/2)&&(a[i]==c))
j--;
b[j]=′\0′;
10、编写一个函数voidfun(charp1[],charp2[]),它的功能是:
实现两个字符串的连接(不使用库函数strcat)。
例如,输入下面两个字符串:
FirstString--
SecondString
程序输出:
FirstString--SecondString
voidfun(charp1[],charp2[])
{chars1[80],s2[40];
printf("Enters1ands2:
scanf("%s%s",s1,s2);
printf("s1=%s\n",s1);
printf("s2=%s\n",s2);
printf("Invokefun(s1,s2):
fun(s1,s2);
printf("Afterinvoking:
printf("%s\n",s1);
本题的考核点是字符串的连接。
1、定义两个字符型指针point1、point2,分别指向字符串p1和p2;
2、point1起始指向字符串p1的第一个字符,通过循环,令其指向p1串尾,为未来的连接工作做好准备;
3、point2起始指向字符串p2的第一个字符,通过循环,不断将指针指向p2的下一个字符;
4、将point2指向的字符通过指针point1逐一连接在字符串p1末尾;
5、连接完毕后,将指向字符串p1末尾的指针point1指向'0',以保证指针不越界。
解法一:
{char*point1,*point2;/*定义两个字符型指针point1、point2*/
point1=p1;/*将字符型指针point1指向字符串p1的第一个字符*/
point2=p2;/*将字符型指针point2指向字符串p2的第一个字符*/
while(*point1!
=NULL)point1++;/*通过循环,令point1指向p1串尾,为未来的连接工作做好准备*/
/*通过循环将point2指向的字符通过指针point1逐一连接在字符串p1末尾*/
while(*point2!
=NULL){
*point1=*point2;
point1++;
point2++;
*point1=NULL;/*将指向字符串p1末尾的指针point1指向'0',以保证指针不越界*/
解法二:
/*注:
第一个for()循环用于让i成为第一个字符串的结束符的下标,要注意在这个for()后要有一个分号否则出错。
第二个for()的作用是将第二个字符串一个一个字符依次放到第一个字符串的未尾。
此外,还要注意最后一定要有p1[i]='\0';来给字符串加上结束符*/
{inti,j;
for(i=0;p1[i];i++);
for(j=0;p2[j];j++)
p1[i++]=p2[j];
p1[i]='\0';
11、请编写一个函数fun,它的功能是:
将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。
例如,若输入“abc4EFG”,则应输出“aBc4EFG”。
voidfun(char*ss)
{chartt[81];
printf("\nPleaseenteranstringwithin80characters:
\n");gets(tt);
printf("\n\nAfterchanging,thestring\n\"%s\"",tt);
fun(tt);
printf("\nbecomes\n\"%s\"\n",tt);
本题的考核点是指针、ASCII码、数组和循环语句。
通过循环语句依次判断数组下标为奇数的元素是否为小写字母,如果是则通过字符运算将其转换为大写字母。
voidf
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1