C语言51100套试题答案及详解.docx
- 文档编号:4295696
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:161
- 大小:219.49KB
C语言51100套试题答案及详解.docx
《C语言51100套试题答案及详解.docx》由会员分享,可在线阅读,更多相关《C语言51100套试题答案及详解.docx(161页珍藏版)》请在冰豆网上搜索。
C语言51100套试题答案及详解
2
doubleave=0.0;
第51套试题答案及详解
一、程序填空题
3
4
5
6
*n=0;
for(i=0;i ave/=N;/*计算平均值*/ for(i=0;i 【答案】 难度指数★★★ 7 if(a[i].s (1)*a (2)2 (3)i+1 记录存放到b所指的数组中*/ 【审题分析】 本题中函数的功能是将数组中的元素下标为偶数的元 素按照从大到小排序,下标为奇数的元素按照从小到大排 序,相当于2个排序过程。 在fun函数中,采用选择排序 法进行排序,分别用max和min存储每次寻找的最大值和 最小值,px和pn记录每次查找到的最大值和最小值的下 标位置。 【解题思路】 第一空: 主函数内fun函数的调用“fun(b,N);”,其中b 为整型数组名,故fun函数的第一参数为整型指针,又根据 “max=a[j]”可知第一个参数名为a,故第一空处为“*a”。 第二空: 根据题意a所指数组中的最大值放在a[0]中, 接着求出a所指数组中的最小值放在a[1]中;再把a所指数 组元素中的次大值放在a[2]中,把a数组元素中的次小值放 在a[3]中,升序排序和降序排序的下标变化是每次在前一次 的基础上+2,即a[0]、a[2]、a[4]…降序排序,a[1]、a[3]、 8b[*n]=a[i]; 9(*n)++;/*人数加1*/ 10} 11returnave;/*返回平均值*/ 【审题分析】 该程序功能是把低于平均分的学生数据放在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-'0'; “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';”中的'o'不是数 字零,而是字母'o',根据前面的分析因此改为: “n=*p-'0';”。 (2)第二个标识下面: 语句“n=n*8+*P-'o'”,首先进行 同 (1)相同的修改,变量P没有定义,根据题意要求这里 因此第二空处为“k”。 第三空: 此处是将字符串长度不超过k的字符串ss[i] 拷贝到ss[j++]中,故第三空处为“ss[i]”。 【考点链接】函数功能;指针。 二、程序修改题 应该是“*p-'0'”,所以此句改为: “n=n*8+*p-'0';”。 【考点链接】字符;数制。 【答案】 (1)intk=0; 难度指数★★★ (2)while(*p||*q) 三、程序设计题 【答案】难度指数★★ 1STRECc; 2inti; 3c.num[0]='\0';/*置初始空串*/ 4c.s=-1;/*置成绩为-1*/ 5for(i=0;i 6if(strcmp(a[i].num,b)==0){/*判 断学号是否相等*/ 7strcpy(c.num,a[i].num);/*相 等,则对学号进行赋值*/ 8c.s=a[i].s;/*相等,则对成绩进行 赋值*/ 9break;/*退出循环体*/ 10} 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;i<__1__;i++)”补充循环的结束条件, fun的参数(*ss)[M]是指向N行M列的字符串数组,循环是 逐行查找字符串的长度是否超过k,因此循环次数是N次, 故第一空处应为“N”。 第二空: if(len<=__2__)strcpy(ss[j++],__3__);”可知在 循环当中是将长度没有超过k的字符串保存在ss所指的字 符串数组的前面,j记录满足长度不超过k的字符的个数, 2 18a[i]='\0'; 【审题分析】 该程序功能是除了字符串前导的“*”号之外,将串中 其他“*”号全部删除。 本题的解题过程首先确定由串起始 位置开始的第一个非“*”位置,然后对由第一个非“*”开 始的字符到串尾的字符进行判断,如果不是“*”的字符拷 贝到字符串。 【解题思路】 (1)首先,使用一个指针p指向串的起始位置,然后对 指针p指向的字符进行判断,并且如果是“*”,将其拷贝到 字符串,这样确定了由头开始的第一个非“*”的位置。 (2)然后,在循环过程中对由第一个非“*”字符起始 “ “ 到串尾的字符进行判断,如果不是“*”就将其拷贝到字符 串a,否则跳过。 (3)最后,在新生成的字符串尾加'\0'。 【考点链接】指针操作。 第54套试题答案及详解 一、程序填空题 5p++; 6} 7a[j]='\0'; 【审题分析】 该程序功能是删除字符串中所有的*号。 解题思路是在 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;a=b;b=t;”。 (2)算法到循环结束,最后余数为0的时候,b中所存 的数即为最大公约数,也就是函数要返回的值。 因此,第二 个标识下面的“return(a);”改为“return(b);”。 【考点链接】函数实现的逻辑关系。 三、程序设计题 【答案】难度指数★★★ 1intj=0; 2char*p=a; 3while(*p){ 4if(*p! ='*')a[j++]=*p; (2)在循环中利用if判断表达式,判断是字符是否为 “*”,如果不是“*”将其拷贝到字符串,否则跳过“*” 字符。 (3)所有字符处理完后,记得在新串s的末尾加上结束 符“'\0'”。 【考点链接】指针操作。 第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 在累加过程中把那些被4除后余2的当前累加值放入数组 中,符合此条件的累加值的个数作为函数值返回主函数。 【解题思路】 (1)根据题意第一标识下“sum=j==0;”是给sum和j 3 赋初值0,故应改成“sum=0;j=0;”。 (2)第二个标识下的if语句是根据题干要求,累加和 被4除后余2,而原题是将2赋值给sum%4。 所以,第二个 标识下“if(sum%4=2)”应该改为“if(sum%4==2)”。 【考点链接】变量初始化;if条件语句;逻辑表达式。 三、程序设计题 【答案】难度指数★★ 1inti; 2doublesum=0.0; 3if(n>1&&n<=100){ 4for(i=1;i<=n;i++) 5sum+=1.0/(2*i-1)-1.0/(2*i); 6} 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分支语句。 三、程序设计题 【答案】难度指数★★★★ 1inti; 2for(i=0;i 3a->ave=a->ave+a->s[i]; 4a->ave/=N; 【审题分析】 该程序功能是计算结构体中某一成员的平均值。 这类题 主要考查是对结构体的操作,关于平均分数的求解过程首先 统计成员的总分,然后计算平均分。 【解题思路】 (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; 4 【考点链接】结构图;文件操作。 二、程序修改题 【答案】难度指数★★★★ (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 2for(i=0;i 3//小于字符串长度进行字符循环判断 4{ 5if(s[i]>='a'&&s[i]<='z'&&s[i+1] ==''||s[i+1]=='\0')//单词判断条件 6n++;//单词统计计数器加1 7} 8returnn;//返回统计值 【审题分析】 该程序功能是统计一行字符串中单词的个数,作为函数 值返回。 单词之间以空格为分割,所以对单词个数的统计可 以理解为对空格字符的统计,其中最后一个单词以字符串的 结尾符为分割。 【解题思路】 (2)while(fabs(n-m)>0.001) 【审题分析】 (1)该题中函数功能是二分法求方程根。 其中,二分法 的求根过程,是将含根区间平均分为两个小区间,然后判断 哪个区间是含根区间。 在此基础上,将这里的小含根区间进 一步划分为两个更小的区间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 51100 试题答案 详解