C语言51100套试题答案及详解文档格式.docx
《C语言51100套试题答案及详解文档格式.docx》由会员分享,可在线阅读,更多相关《C语言51100套试题答案及详解文档格式.docx(161页珍藏版)》请在冰豆网上搜索。
/*返回平均值*/
该程序功能是把低于平均分的学生数据放在b所指的
数组中,低于平均分的学生人数通过形参n传回,平均分通
过函数值返回。
(1)首先,通过循环求总分,然后求得平均分。
(2)在循环中,进行平均分与每个成绩进行比较,并将
满足条件的数据存入数组及对其进行累加。
【考点链接】数组操作;
结构体。
第52套试题答案及详解
a[5]…升序排序,故第二空应为“2”。
第三空:
选择排序法中的升序排序,首先从数组中挑选
(1)n/2
(2)i
(3)a[n-i-1]
一个最小的元素,把它和第一元素交换,接着从剩下的n-1
个元素中再挑出一个最小的元素,把它和第二个元素交换,
不断重复以上过程,直到比较完最后两个元素。
故内层循环
变量j应该从i+1开始,因此第三空处应为“i+1”。
【考点链接】数组;
循环结构。
二、程序修改题
本题中函数fun的功能是将数组中的元素倒置,即第一
个元素和最后一个元素交换,第二个元素和倒数第二个元素
交换,依此类推,总共交换n/2次,n为数组的长度。
由审题分析可知,总共交换n/2次,故循环的
终止条件为i等于n/2,故第一空处应为“n/2”。
难度指数★
a[0]和a[n-1]交换,a[1]和a[n-2]交换…,因此
(1)sum=0.0;
(2)if((i+1)%5==0)
本题函数的功能是对每五个元素求一个平均值。
首先要
依顺序读取每五个元素,并对这五个元素取平均值。
a[i]和a[n-i-1]交换,故第二空处应为“i”。
“t=a[i];
a[i]=a[n-1-i];
”所以第三空处是把t值
赋值a[n-1-i],故第三空处应为“a[n-1-i]”。
【考点链接】函数逻辑;
数组操作。
(1)在第一标识下“sun=0.0;
”,根据题意,这是给sum
赋值,而sun没有定义编译时会提示错误,应改为
(1)n=*p-'
0'
;
(2)n=n*8+*p-'
“sum=0.0;
”。
(2)错误标识下的if判断语句是依顺序取五个字符,if
中的逻辑表达式语法有误,由于1%5恒等于1,所以i+1%5
也就等价于i+1了,所以将“if(i+1%5==0)”改为“if((i+1)%5==
0)”,此处主要注意的是运算符的优先级。
【考点链接】if条件语句。
三、程序设计题
(1)该题中函数功能是实现八进制到十进制的转换。
其
中,八进制与十进制之间的转换关系是:
八进制就是逢8
进1。
八进制数采用0~7这8个数来表达一个数。
八进制
数第1位的权值为8的0次方,第2位权值为8的1次方,
第3位权值为8的2次方,等等。
(2)从已给定源程序的main主函数开始入手,首先通
过if语句判断串是否过长,是否符合题干要求;
然后循环
1inti;
判断串中的每一位是否都在0~7之间,是否符合八进制要
求,最后调用fun(s)实现八进制到十进制的转换。
1
(1)第一个标识下面:
语句“n=*p-'
o'
”中的'
不是数
字零,而是字母'
,根据前面的分析因此改为:
“n=*p-'
(2)第二个标识下面:
语句“n=n*8+*P-'
”,首先进行
同
(1)相同的修改,变量P没有定义,根据题意要求这里
因此第二空处为“k”。
此处是将字符串长度不超过k的字符串ss[i]
拷贝到ss[j++]中,故第三空处为“ss[i]”。
【考点链接】函数功能;
指针。
应该是“*p-'
”,所以此句改为:
“n=n*8+*p-'
【考点链接】字符;
数制。
(1)intk=0;
(2)while(*p||*q)
【答案】难度指数★★
1STRECc;
2inti;
3c.num[0]='
\0'
/*置初始空串*/
4c.s=-1;
/*置成绩为-1*/
5for(i=0;
6if(strcmp(a[i].num,b)==0){/*判
断学号是否相等*/
7strcpy(c.num,a[i].num);
/*相
等,则对学号进行赋值*/
8c.s=a[i].s;
/*相等,则对成绩进行
赋值*/
9break;
/*退出循环体*/
11returnc;
/*返回结构体变量*/
该程序功能是逐个比较两数组对应字符的ASCII值大
小。
从已给定源程序的main主函数开始入手,调用函数
“fun(a,b,c);
”,对字符串a、b进行比较,生成字符串c。
(1)第一个标识下面的“intk=1;
”在题目中要求将字
符放在数组c,如果数组中有n个元素,应该从c[0]到c[n-1]。
所以,应将k的初始化定义改为从0开始,即“intk=0;
(2)第二个标识下面的判断条件,是根据题目要求逐个
比较两个数组对应字符的ASCII值的大小,所以判断条件
应该是直到两个字符数组所有元素比较完毕,而不是数组对
应元素不相等。
其中,该题主要考查变量的初始化,逻辑关系。
【考点链接】函数逻辑。
该程序功能是函数返回指定学号的学生数据,指定的学
号在主函数中输入。
解题思路是在循环过程中,使用if判
断表达式,将输入的学号与所有的学号进行比较,如果找到
该学号,将其赋值到指定变量,否则将空格赋值到指定变量,
表明没有查找到该学号。
在for循环中,利用C语言自带字符串比较函数strcmp,
对输入的学号与所有的学号进行比较,以求出指定学号。
【考点链接】结构体;
函数传值。
第53套试题答案及详解
1inti=0;
2char*p=a;
3while(*p&
&
*p=='
*'
)
4{
5a[i]=*p;
6i++;
7p++;
8}
9while(*p)
10{
11if(*p!
='
12{
13a[i]=*p;
14i++;
15}
16p++;
(1)N
(2)k
(3)ss[i]
17}
本题中函数fun的功能是在形参ss所指字符串数组中,
删除所有串长超过k的字符串,函数返回所剩字符串的个
数。
for(i=0;
__1__;
i++)”补充循环的结束条件,
fun的参数(*ss)[M]是指向N行M列的字符串数组,循环是
逐行查找字符串的长度是否超过k,因此循环次数是N次,
故第一空处应为“N”。
if(len<
=__2__)strcpy(ss[j++],__3__);
”可知在
循环当中是将长度没有超过k的字符串保存在ss所指的字
符串数组的前面,j记录满足长度不超过k的字符的个数,
18a[i]='
该程序功能是除了字符串前导的“*”号之外,将串中
其他“*”号全部删除。
本题的解题过程首先确定由串起始
位置开始的第一个非“*”位置,然后对由第一个非“*”开
始的字符到串尾的字符进行判断,如果不是“*”的字符拷
贝到字符串。
(1)首先,使用一个指针p指向串的起始位置,然后对
指针p指向的字符进行判断,并且如果是“*”,将其拷贝到
字符串,这样确定了由头开始的第一个非“*”的位置。
(2)然后,在循环过程中对由第一个非“*”字符起始
“
到串尾的字符进行判断,如果不是“*”就将其拷贝到字符
串a,否则跳过。
(3)最后,在新生成的字符串尾加'
。
【考点链接】指针操作。
第54套试题答案及详解
5p++;
6}
7a[j]='
该程序功能是删除字符串中所有的*号。
解题思路是在
while循环过程中,利用if判断表达式判断每一个字符是否
为“*”号,如果不是将其拷贝到字符串,否则跳过,这样
就实现了函数功能。
(1)首先利用工作指针指向字符串,当指针不指向串尾
(1)1
(2)j++
(3)j
时,就对字符串进行循环判断。
函数fun的功能是把形参a所指数组中的奇数按原顺序
依次存放到a中,把偶数从数组中删除,奇数和偶数的判断
可用取余的方法来实现,a[i]%2等于0那么a[i]是偶数,否
则是奇数。
根据“a[j]=a[i];
”可知,a[i]是奇数,变量j记
录奇数的个数,故第一空处是判断a[i]是否是奇数,故第一
空处应为“1”。
变量j记录奇数的个数,故第二空处j计数应
当加1,因此第二空处应为“j++”或“j=j+1”。
fun函数的返回值是奇数个数,故第三空处应
为“j”。
【答案】难度指数★★★
(1)t=a;
a=b;
b=t;
(2)return(b);
(1)本题中函数的功能是求出两个非零正整数的最大公
约数。
其中,最大公约数是指能最大约去给出的几个数字的
数字,例如15和30能最大约去的数字是15,所以15就是
它们的最大公约数。
(2)从源程序的main主函数开始入手,通过键盘输入
两个正整数,语句“a=fun(num1,num2);
”调用fun函数求得
(1)根据算法分析,首先要确保a、b两个数中a是较
大数,b是较小数,如果不是,则交换a和b。
但是第一个
标识下,交换a和b两个数的算法有误,所以应将“t=a;
b=a;
a=t;
”改为“t=a;
(2)算法到循环结束,最后余数为0的时候,b中所存
的数即为最大公约数,也就是函数要返回的值。
因此,第二
个标识下面的“return(a);
”改为“return(b);
【考点链接】函数实现的逻辑关系。
1intj=0;
3while(*p){
4if(*p!
)a[j++]=*p;
(2)在循环中利用if判断表达式,判断是字符是否为
“*”,如果不是“*”将其拷贝到字符串,否则跳过“*”
字符。
(3)所有字符处理完后,记得在新串s的末尾加上结束
符“'
第55套试题答案及详解
(1)j=3
(2)i(3)j
函数fun的功能是统计所有小于等于n(n>
2)的素数的个
数,素数的个数作为函数值返回,判断一个整数n是否是素
素数是指能被1和本身整除的正整数(>
1),所以判别
n是否为素数,只要用2、3、…、n-1这些数逐个去除n,
观察余数是否为0即可,只要有一次相除余数为0,n就不
是素数,否则n为素数。
n>
2,由“printf("
\nTheprimenumberbetween3
to%d\n"
n);
”可知,从3开始寻找素数,故第一空处应为
“j=3”。
由审题分析可知,判断i是否是素数用2、3、…、
i-1这些数逐个去除i即可,故第二空处应为“i”。
由“count++;
printf(count%15?
"
%5d"
:
"
\n%5d"
i);
”可知找到一个素数i了,在i是素数的时候,变量j从2
到i-1都不能被i整除,退出for循环的是j的值已经变成i
了,故判断j是否大于等于i便可知i是不是素数,所以第
三空应为“j”。
【考点链接】函数功能。
(1)sum=0;
j=0;
(2)if(sum%4==2)
本题中函数的功能是计算前n(4<
n<
50)项的累加和;
在累加过程中把那些被4除后余2的当前累加值放入数组
中,符合此条件的累加值的个数作为函数值返回主函数。
(1)根据题意第一标识下“sum=j==0;
”是给sum和j
赋初值0,故应改成“sum=0;
(2)第二个标识下的if语句是根据题干要求,累加和
被4除后余2,而原题是将2赋值给sum%4。
所以,第二个
标识下“if(sum%4=2)”应该改为“if(sum%4==2)”。
【考点链接】变量初始化;
if条件语句;
逻辑表达式。
2doublesum=0.0;
3if(n>
1&
=100){
4for(i=1;
=n;
5sum+=1.0/(2*i-1)-1.0/(2*i);
7returnsum;
该程序功能是计算并输出多项式值。
根据题干中给出的
数列,首先推出每一项的表达式,然后再对多项式进行累加
求和。
(1)根据题干中给出的数列,推出每一项是(1.0/(2*i-
1)-1.0/(2*i))。
(2)在循环中求得每一项,然后对其进行累加求和。
【考点链接】逻辑关系;
运算符。
第56套试题答案及详解
本题中函数的功能是用递归算法计算斐波拉契级数数
列中第n项的值。
本题主要是对于switch-case语法的介绍。
(1)第一个标识下的switch后用括号括起来的表达式
的标准语法后面是没有“;
”的,所以“switch(g);
”应该改
为“switch(g)”。
(2)第二个标识下的case加常量表达式的后面用冒号
连接选择语句,所以“case1;
”改为“case1:
“case1:
”
和“case2:
”都是返回1,应该写两个“return1”。
【考点链接】switch分支语句。
【答案】难度指数★★★★
2for(i=0;
3a->
ave=a->
ave+a->
s[i];
4a->
该程序功能是计算结构体中某一成员的平均值。
这类题
主要考查是对结构体的操作,关于平均分数的求解过程首先
统计成员的总分,然后计算平均分。
(1)本题中给出的题干中定义了结构体变量STREC用
来存储学生的记录。
(2)利用for循环求得总分,然后求得平均分,最后将
平均分放入记录ave中。
其中,结构体成员的引用形式可以
为a.ave、a.s[i]等。
for循环。
(1)a[i]
(2)a[j]
(3)a[j]
第57套试题答案及详解
本题中函数的功能是将数组中的元素下标位置为偶数
的元素按照从小到大排序,下标为奇数位置的元素按照从大
到小排序,相当于2个排序过程。
在fun函数中,采用选择
排序法进行排序,分别用max和min存储每次寻找的最大
(1)filename
(2)fp
(3)fp
值和最小值,px和pn记录每次查找到的最大值和最小值的
下标位置。
根据“max=min=___1___;
px=pn=i;
”可知,
px和pn初始化为i,max和min初始化为a[i],假定第一个
元素为最大值、最小值,然后逐个和其他的元素比较找出最
大值和最小值,因此第一空应为“a[i]”。
根据“max=a[j];
px=j;
”可知,max保存了a[j]
的值,说明max比元素a[j]小,故第二空处应为“a[j]”。
根据“min=a[j];
pn=j;
”可知,min保存了a[j]
的值,说明min比元素a[j]大,故第三空处应为“a[j]”。
本题中函数fun的功能是重写形参filename所指文件中
最后一个学生的数据,即用新的学生数据覆盖该学生原来的
数据,本题主要考察文件的读写。
“fp=fopen(__1__,"
rb+"
);
”补充fopen的参数,
fopen的调用形式是:
fp=fopen(文件名,文件使用方式),因
此第一空处应填文件名“filename”。
此处是补充fseek函数的参数,fseek的调用形
式是:
fseek(fp,offset,position),其中第一个参数是文件型指
针,故第二空处应填文件型指针变量“fp”。
fwrite的调用形式是(buffer,size,count,fp),最后
一个参数是文件型指针,故第三空处应填“fp”,将新的学
难度指数★★
生数据写在最后一个学生数据位置。
(1)switch(g)
(2)case1:
return1;
case2:
return1;
【考点链接】结构图;
文件操作。
(1)p=(NODE*)malloc(sizeof(NODE));
(2)returnh;
该题中函数功能是创建带头结点的单向链表。
从已给定
源程序的main主函数开始入手,首先通过“head=
Creatlink(8,22);
”语句调用Creatlink函数生成单向链表,然
后“outlink(head);
”输出该链表。
(1)第一标识下“p=(NODE)malloc(sizeof(NODE));
”,
由“returnsum;
”可知sum变量记录了主对角
线元素和反向对角线元素之和,第一空处是在使用sum变
量之前对其初始化,因此第一空处应为“sum=0;
由第二个循环内“sum+=t[i][n-i-___3___];
”可
知,第一个循环是主对角元素和,第二个循环求反向对角线
元素之和,因此第二空处应为“t[i][i]”。
第二个循环求反向对角线元素之和,反向对角
元素为t[i][n-i-1],故第三空应为“1”。
逻辑关系。
maclloc函数的返回类型是void*类型,表示未确定类型的指
针,因此需要指针类型转换,而“(NODE)”不是指针类型,
(1)doubler;
故第一标识下应改成“p=(NODE*)malloc(sizeof(NODE));
(2)第二个标识下,最后将单链表返回,应该是返回头
指针h指向的链表,而不是其中的一个节点p,所以“return
p;
”应该改为“returnh;
【答案】难度指数★
1inti,n=0;
//字符统计初始值设置为0
i<
strlen(s);
i++)
3//小于字符串长度进行字符循环判断
5if(s[i]>
a'
s[i]<
z'
s[i+1]
=='
'
||s[i+1]=='
)//单词判断条件
6n++;
//单词统计计数器加1
7}
8returnn;
//返回统计值
该程序功能是统计一行字符串中单词的个数,作为函数
值返回。
单词之间以空格为分割,所以对单词个数的统计可
以理解为对空格字符的统计,其中最后一个单词以字符串的
结尾符为分割。
(2)while(fabs(n-m)>
0.001)
(1)该题中函数功能是二分法求方程根。
其中,二分法
的求根过程,是将含根区间平均分为两个小区间,然后判断
哪个区间是含根区间。
在此基础上,将这里的小含根区间进
一步划分为两个更小的区间