C语言程序设计题答案.docx

上传人:b****5 文档编号:7605400 上传时间:2023-01-25 格式:DOCX 页数:16 大小:23.45KB
下载 相关 举报
C语言程序设计题答案.docx_第1页
第1页 / 共16页
C语言程序设计题答案.docx_第2页
第2页 / 共16页
C语言程序设计题答案.docx_第3页
第3页 / 共16页
C语言程序设计题答案.docx_第4页
第4页 / 共16页
C语言程序设计题答案.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

C语言程序设计题答案.docx

《C语言程序设计题答案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计题答案.docx(16页珍藏版)》请在冰豆网上搜索。

C语言程序设计题答案.docx

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])/*将从第

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1