C语言程序设计题答案.docx
- 文档编号:7605400
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:16
- 大小:23.45KB
C语言程序设计题答案.docx
《C语言程序设计题答案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计题答案.docx(16页珍藏版)》请在冰豆网上搜索。
C语言程序设计题答案
程序题
一、程序改错题
1.评析:
本题的第一个错误:
在函数fun()第一个for循环体中,语句"t=s[k];"只是将t的值不断用不同学生的分数替代,这与计算总分的初衷相逆,这条语句应当书写为"t=t+s[k];",实现学生分数的不断累加;
本题的第二个错误:
语句"*aver=&ave;"是不正确的,*aver代表的是一个float型的变量,而&aver则是函数中存放平均数的那个变量的内存地址,两者不匹配,应当改为"*aver=ave;",这样才可以实现通过aver返回平均分的目的。
本评析仅作参考。
2.评析:
本题的考核点是C语言中函数的入口参数和指针的使用。
函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普通的变量说明不同,函数参数必须同时具有变量类型和变量名,因此应该把程序中"voidfun(doublea,b,doublex,y)"语句改为"voidfun(doublea,doubleb,double*x,double*y)"或相同作用的语句。
从主函数里的"fun(a,b,&c,&d);"语句可以看出,fun函数后两个参数应为长浮点型数据的指针,因此应该把程序中"x=a*b;y=a/b;"语句改为"*x=a*b;*y=a/b;"或相同作用的语句。
本评析仅作参考。
3.评析:
本题着重考察考生对C语言中函数入口参数的用法以及一些简单算法的掌握情况。
从主函数中可以看出,t是一个字串,因此在fun函数的参数表中应将t改为字符指针或字符数组,即把"voidfun(longs,longt)"语句改为"voidfun(longs,long*t)"或相同作用的语句。
根据题面要求从低位开始取出长整型变量s中奇数位上的数来设计功能函数,用*t=s%10取出长整型变量s中的第一个奇数位上的数字,并放在新串t中。
然后利用while循环体依次取出长整型变量s中的其它奇数位,在这里,语句sl=sl*100应改为sl=sl*10或等效语句,否则在原长整型变量s取出的奇数位将在新的数字串中隔0排列!
本评析仅作参考。
4.评析:
本题的考核点是C语言中一些规定的应用。
本题中的第一处错误是:
在C语言中,"{"和"}"应成对出现,所以程序中的语句"while((high>=2)&&(n<10)"应改为"while((high>=2)&&(n<10))"或相同作用的语句。
本题中的第二处错误是:
C语言中,";"是语句的一部分,是语句结束的标志,不可缺少,所以,"if(high%j==0){yes=0;break}"应改为"if(high%j==0){yes=0;break;}"或相同作用的语句。
本评析仅作参考。
5.评析:
本题着重考察考生对C语言中的语法以及一些简单算法的掌握情况。
C语言中,大小写的字母含意不同。
源程序中"For(i=0,t=0;p[i];i++)"是错误的,"For"应为小写,程序应改为"for(i=0,t=0;p[i];i++)"或相同作用的语句。
C语言中,一对双引号括起来的字符序列表示字符串常量,一对单引号括起来的表示字符常量。
转义字符'\0'作为字符串常量的结束标志。
源程序"c[t]="\0";"是错误的,应改为"c[t]='\0';"。
本评析仅作参考。
6.评析:
本题着重考察考生对C语言中一些简单算法的掌握情况。
本题中的第一个错误:
程序中外循环的循环次数少了一次,导致数列不能正确排序,所以应将程序中的语句"for(i=j+1;i 本题中的第二个错误: 程序中变量t是作为中间变量交换数据用的,变量p是用来记录较小值的,所以应将程序中的语句"t=i;"改为"p=i;"。 本评析仅作参考。 7.评析: 本题的考核点是C语言中的函数的入口参数和for循环控制的格式。 函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普通的变量说明不同,函数参数必须同时具有变量类型和变量名;另外,当函数前面的返回数据类型省略时,C语言默认函数返回整型,本题中n是整型数据,由"printf("\nTheresultis%lf\n",fun(n));"可以看出fun函数应该返回浮点型数据,所以fun函数的返回数据类型不能省略。 综上所述,应该把程序中的"fun(intm)"语句改为"floatfun(intm)"或相同作用的语句。 for循环语句的一般形式为: for(表达式1;表达式2;表达式3)语句各表达式之间用分号间隔。 所以,应该把语句"for(i=100,i<=m,i+=100)",改为"for(i=100;i<=m;i+=100)"。 本评析仅作参考。 8.评析: 本题着重考察考生对C语言中基本语法的掌握情况。 首先根据C语言中的语法规定,在定义数组变量时,用变量或不定量说明数组的大小是不对的;其次,语句printf("%4f",xx[i][j])错误,因为根据题意方阵中的数为整型所以这里的语句应为printf("%4d",xx[i][j]);。 本评析仅作参考。 9.评析: 本题的主要解题思路是: 通过一维数组c作为中转点,交换字符串a和字符串b的内容,首先,将串a赋给c,再将串b赋给a,最后将c赋给串b。 根据这个思路,很容易得出,在横线处应填上"c[i]=a[i];"或具有相同作用的语句。 本评析仅作参考。 10.评析: 本题着重考察考生对C语言中一些简单算法的掌握情况。 本题中的第一个错误: C语言中,变量是区分大小写的,p和P是不同的两个变量名,所以程序中语句"if(P==n)return-1;"应改为"if(p==n)return-1;"或相同作用的语句。 本题中的第二个错误: 由题意可知,要删除符合条件的元素,需将该元素后面的数向前移动一个位置,所以程序中语句"a[i+1]=a[i];"应改为"a[i]=a[i+1];"或相同作用的语句。 本评析仅作参考。 11.评析: 本题的主要考核点是: C语言的语法。 解题思路: 使用循环语句的嵌套来统计子字符串在字符串中出现的次数。 C语言中for的语法结构是for(;;),中间以";"号作间隔,在C语言中是区分大小写的。 本评析只作参考。 12.评析: 本题的考核点是C语言中指针的使用。 原程序的横线处应填入"(*n)++"或相同作用的语句。 这是因为: main函数最后输出新数组时,for循环以m作为循环的上界,所以在InSort函数中最后应将*n加1。 程序中的错误: main函数最后输出新数组时,for循环以1作为循环的下界将漏掉数组元素aa[0],且"for(k=1;k 本评析仅作参考。 13.评析: 本题的考核点是C语言的一些基本常识和if语句的使用。 上述"ifk>0"应改为"if(k>0)"或相同作用的语句。 C语言中"="表示赋值,而"=="才表示"等于",由题意看出,"elseif(k=0)"应为"elseif(k==0)"或相同作用的语句。 本评析仅作参考。 14.评析: 本题的考核点是C语言中函数入口参数的使用和文件包含的用法。 C语言提供了#include命令用来实现"文件包含"的操作。 其一般形式为#include"文件名"所以,"include"stdio.h""include前不加"#"是错误的,应改为"#include"stdio.h""或相同作用的语句。 从主函数中可以看出,p是一个字符串,因此在upfst函数的参数表中应将p改为字符指针或字符数组,即把"upfst(charp)"语句改为"upfst(char*p)"或相同作用的语句。 本评析仅作参考。 15.评析: 本题的考核点是C语言的一些基本用法以及if语句的使用。 本题中IsPrime(int,n)是函数的定义,变量与关键字之间不能有逗号。 所以,"IsPrime(int,n)"应改为"IsPrime(intn)"。 根据if语句的语法规则,if后的表达式必须由括号括起来。 由题意看出,n整除i时,也就是说"n%i==0"时,循环才继续进行。 因此,"if! (n%i)"应改为"if(! (n%i))"或相同作用的语句。 本评析仅作参考。 二、程序填空题 1.评析: 本题的考核点是C语言中算术运算符的用法以及输入输出语句和break语句的使用。 题中第一个空填"%": "%"为模运算符,或称求余运算符,%两侧均应为整型数据。 只有当"n%i==0"时,循环才继续执行。 题中第二个空填"break": break语句用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。 题中第三个空填"&k": scanf函数为格式输入函数,其一般形式为: scanf(格式控制,地址表列) "格式控制"是用双引号括起来的字符串,也称"转换控制字符串"。 "地址表列"是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。 本评析仅作参考。 2.评析: 本题的考核点是c语言中的函数的入口参数和类型转换。 本题求二分之一的圆面积,由数学公式得知圆面积公式为: S=πr2,所以: 题中第一个空填"r": 此处是对有参函数的定义,括号内指定形参的类型及形参变量。 题中第二个空填"r*r": 此处是将圆面积公式转化为C程序中的公式,将主函数中输入的圆半径通过形参变量进行传递。 题中第三个空填"&x": scanf函数为格式输入函数,其一般形式为: scanf(格式控制,地址表列) "格式控制"是用双引号括起来的字符串,也称"转换控制字符串"。 "地址表列"是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。 本评析仅作参考。 3.评析: 本题的考核点是循环语句和整除算法。 解题思路: 使用循环语句使循环变量依次从1递增到1000,并将每个值与7和11进行取余比较,将符合条件的值存放入数组中并统计符合条件的值的个数。 本评析仅供参考。 4.评析: 本题考核点为字符串的查找,赋值操作。 题中第一空填"break;": break为跳出循环的语句。 "if(s[i]==t[j])break;"语句是指当s[i]==t[j],即t[j]中的字符已经在字符指针s[j]所指向的字符数组中存在时,循环就结束。 题中第二空填"s[i]": "*u++=s[i];"是将s[i]赋给*u,然后u加1。 题中第三空填"*u": "*u='\0';",字符串的最后一个字符应该是'\0'的。 本评析仅作参考。 5.评析: 本题着重考察考生对C语言中一些简单算法的掌握情况。 解题思路: 先判断输入的字母是否是大写字母,若是大写字母,将其转化为相应的小写字母,方法是该大写字母对应的ASCII码值加上32就是其小写字母的ASCII码值,再判断该小写字母是否是a~u,若是转化为其后的第5个字母。 若该小写字母是v~z,则将其ACSII码值减去21,转换后的小写字母作为函数值返回。 题中第一个空填"5": C语言中,字母从a~z或A~Z的ASCII码值是依次递增的,所以将其转换为其后的第5个字母应该是"c=c+5;"或相同作用的语句。 题中第二个空填"c": 通过return语句将被调用函数中c的值带回主调函数中去。 题中第三个空填"c1": 此句是调用fun()函数,括弧中是其实际参数。 本评析仅作参考。 6.评析: 本题着重考察考生对C语言中函数的调用以及一些简单算法的掌握情况。 题中第一空填"! =": 从题意得知,若字符ch与字符串str中的某个字符相同,什么也不做;若不同,则插在str的最后。 因此fun函数中先设置了一个循环从字符串str中寻找字符ch,如果找到则中断循环并保留字符ch的地址,否则一直循环到串尾。 因此通过判断*str的内容即可判断是否已找到字符ch。 题中第二个空填"str[1]": 如果没有找到字符ch,则在while循环后str指针指向串结束符0x00,此时应将字符ch写入这里并在下一地址写入一个串结束符0x00,所以应该是"str[1]=0;"语句。 题中第三个空填"s,c": 此句是调用fun()函数,括弧中是其实际参数。 本评析仅作参考。 7.评析: 本题主要考查的是函数的递归调用。 题中第一个空填">": 此处为递归调用结束的条件。 题中第二个空填"k-1": 此处为递归调用时返回给调用函数的实参值。 题中第三个空填"==": 此处判断k是否为0,若是则将值返回给主函数。 本评析仅供参考。 8.评析: 本题的考核点是c语言中循环语句的使用。 解题思路: 本程序先通过n%2是否为0判断数组中元素的个数是奇数还是偶数,然后再通过"t=a[i];a[i]=a[p+i];a[p+i]=t;"三个语句对换数组中的前半部分元素中的值和后半部分元素中的值。 本评析仅供参考。 9.评析: 本题的考核点是for循环的使用。 解题思路: 本题通过for循环,使用公式c[i]=(a[i]*b[n-1-i])*(a[i]*b[n-1-i]),求得数组a与数组b逆序之积的平方,将计算结果存在c数组中。 本评析仅供参考。 10.评析: 本题的考核点是c语言中的循环语句和条件判断语句的使用。 解题思路: 从本题的要求来看,我们应该采用循环条件判断的算法。 本参考函数使用while循环从头到尾扫描字符串,并在扫描时进行条件判断,对'z','Z'和其它字符进行不同的处理。 本评析仅供参考。 11.评析: 题中第一个空填"*(pstr+j)": 观察源程序可以发现,在程序中使用strcmp()函数是为了判断字符串str[i]与str[i+1]两者的大小,在fun()函数中只能通过指针来表达各个字符串,所以应当填"*(pstr+j)"。 题中第二个空填"pstr[j]": 对两个字符进行比较后,若pstr[i]中的字符比pstr[j]中的字符大,则将pstr[j]中的字符赋给pstr[i]。 题中第三个空填"p": 对两个字符进行比较后,若pstr[i]中的字符比pstr[j]中的字符大,则将pstr[j]和pstr[i]的内容进行交换。 本评析仅作参考。 12.评析: 本题考核点为: 文件的打开,读写操作。 题中第一个空填””r”“; 题中第二个空填”fs” 题中第三个空填”ft” 本评析仅作参考。 13.评析: 本题考核点为: 文件的打开,关闭和读写操作。 题中第一个空填"fp": 是向文件指针fp所指向的文件中写数据。 题中第二个空填"fclose(fp);": 此语句是文件的关闭操作。 题中第三个空填"fname": fopen函数用于文件的打开操作,其调用形式一般为: fopen(文件名,使用文件方式)。 "fname"为所要打开的文件名。 本评析仅作参考。 14.评析: 本题考核点为结构体和文件的操作等。 题中第一空填"STYPE": typedef可以用来声明新的类型名来代替已有的类型名,此题用"STYPE"来代替未命名的结构体。 题中第二空填"FILE": "FILE"关键字用于声明文件指针。 题中第三空填"fp": fwrite函数的一般调用形式为: fwrite(buffer,size,count,fp); 其中buffer: 是一个指针,是要输出数据的地址;size: 是要写的字节数;count: 要进行读写多少个size字节的数据项;fp: 文件型指针。 本评析仅作参考。 15.评析: 本题的考核点是结构体类型变量的定义和引用。 解题思路: 先从所有的学生数据中找出最低的分值,然后将所有学生分数中与最低分值相等的学生数据放到另一数组中,最后统计分数最低的学生人数并返回。 本评析仅供参考。 三、程序编写题 1.参考答案: 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数组中*/ } 2.参考答案: voidfun(char*tt,intpp[]) { char*p_tt=tt; inti=0; while(i<26){ pp[i]=0; i++;}/*初始化pp数组中的值*/ for(;*p_tt! =NULL;p_tt++)/*判断p_tt指针是否指向空,如果是则已统计完字符串tt中的各个字母的个数并退出循环,否则指针指向字符串tt中的下一个字符*/ { switch(*p_tt){ case'a': pp[0]++;break; case'b': pp[1]++;break; case'c': pp[2]++;break; case'd': pp[3]++;break; case'e': pp[4]++;break; case'f': pp[5]++;break; case'g': pp[6]++;break; case'h': pp[7]++;break; case'i': pp[8]++;break; case'j': pp[9]++;break; case'k': pp[10]++;break; case'l': pp[11]++;break; case'm': pp[12]++;break; case'n': pp[13]++;break; case'o': pp[14]++;break; case'p': pp[15]++;break; case'q': pp[16]++;break; case'r': pp[17]++;break; case's': pp[18]++;break; case't': pp[19]++;break; case'u': pp[20]++;break; case'v': pp[21]++;break; case'w': pp[22]++;break; case'x': pp[23]++;break; case'y': pp[24]++;break; case'z': pp[25]++;break; } } } 另一种解法: voidfun(char*tt,intpp[]) {inti; for(i=0;i<26;i++) pp[i]=0;/*for()循环用于给数组pp[]赋初值0*/ for(;*tt;tt++)/*for()循环用于控制在字符串内从头到尾移动*/ if(*tt<='z'&&*tt>='a') pp[*tt-97]++;/*统计字符串中各个字母出现的次数*/ } 3.参考答案: voidfun(inta,intb,long*c) { inta_up,a_low,b_up,b_low;/*a_up、a_low、b_up和b_low分别存放指针c的千位、十位、百位和个位数上的数字*/ a_up=a/10; a_low=a%10; b_up=b/10; b_low=b%10; *c=a_up*1000+b_low*100+a_low*10+b_up; } 4.参考答案: voidfun(intm,intk,intxx[]) { inti,j,total=0; int*p_xx=xx; for(i=m+1;;i++){ for(j=2;j if(i<=j)/*判断i是否为素数,假如能整除i的整数为其自身j,则i为素数*/ { *p_xx=i; p_xx++; total++; if(total==k){ *p_xx=NULL; break; } } } } 5.参考答案: floatfun(intn) {inti; floats=1.0,h=1; for(i=2;i<=n;i++) {h=h+i;/*h为每一分式的除数,i为前后相邻除数之间的增量*/ s=s+1.0/h; } return(s); } 6.参考答案: intfun(ints) { intx1=0,x2=1,m=0; /*假如当前项的值小于指定值s,但是下一项的值又大于指定值s,即下一项值即为大于s的最小的一个数*/ while(s>m) { m=x1+x2; x1=x2; x2=m; } returnm; } 7.参考答案: doublefun(intm) {inti; doubles=0; for(i=1;i<=m;i++)/*求In (1)~In(m)的和*/ s=s+log(i); s=sqrt(s);/*求s的平方根*/ return(s); } 8.参考答案: voidfun(char*s) { inti,j=0; charstr[100],*p; p=s; while(*p! ='\0'){ if(*p<'0'||*p>'9')/*假如当前指针p所指的字符不为数字字符,则将指针p所指的字符复制到str数组中*/ str[j++]=*p; p++;/*指针p指向字符串s中的下一个字符*/ } str[j]='\0'; p=s; for(i=0;i p[i]=str[i]; p[i]='\0'; } 9.参考答案: voidfun(char*a) {charb[81]; inti=0,j=0,s=0,k; while(a[i]=='*')/*统计原串串首连续*的个数*/ {i++;s++;} while(a[i])/*将从第
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)