C语言51-100套试题答案及详解

2019-08-17 12:04

第 51套试题答案及详解

一、程序填空题

【答案】

难度指数★★★

(3)i+1

(1)*a (2)2 【审题分析】

本题中函数的功能是将数组中的元素下标为偶数的元 素按照从大到小排序,下标为奇数的元素按照从小到大排 序,相当于 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]、 a[5]…升序排序,故第二空应为“2”。

第三空:选择排序法中的升序排序,首先从数组中挑选 一个最小的元素,把它和第一元素交换,接着从剩下的 n-1 个元素中再挑出一个最小的元素,把它和第二个元素交换, 不断重复以上过程,直到比较完最后两个元素。故内层循环 变量 j应该从 i+1开始,因此第三空处应为“i+1”。

【考点链接】数组;循环结构。

double ave=0.0; *n=0;

for(i=0; i

if(a[i].s

9 (*n)++; /*人数加 1 */ 10 }

11 return ave; /*返回平均值 */

【审题分析】 该程序功能是把低于平均分的学生数据放在 b所指的 数组中,低于平均分的学生人数通过形参 n传回,平均分通 过函数值返回。

【解题思路】 (1)首先,通过循环求总分,然后求得平均分。

(2)在循环中,进行平均分与每个成绩进行比较,并将 满足条件的数据存入数组及对其进行累加。

【考点链接】数组操作;结构体。

2 3 4 5 6 7

第 52套试题答案及详解

一、程序填空题

【答案】 难度指数★★★

(1)n/2 (2)i (3)a[n-i-1] 【审题分析】

本题中函数 fun的功能是将数组中的元素倒置,即第一 个元素和最后一个元素交换,第二个元素和倒数第二个元素 交换,依此类推,总共交换 n/2次,n为数组的长度。

【解题思路】

第一空:由审题分析可知,总共交换 n/2次,故循环的 终止条件为 i等于 n/2,故第一空处应为“n/2”。

第二空:a[0]和 a[n-1]交换,a[1]和 a[n-2]交换…,因此 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)sum=0.0;

(2)if((i+1)%5==0) 【审题分析】

本题函数的功能是对每五个元素求一个平均值。首先要 依顺序读取每五个元素,并对这五个元素取平均值。

【解题思路】 (1)在第一标识下“sun=0.0;”,根据题意,这是给 sum 赋值,而 sun没有定义编译时会提示错误,应改为 “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)n=*p-'0'; (2)n=n*8+*p-'0'; 【审题分析】

(1)该题中函数功能是实现八进制到十进制的转换。其 中,八进制与十进制之间的转换关系是:八进制就是逢 8 进 1。八进制数采用 0~7这 8个数来表达一个数。八进制 数第 1位的权值为 8的 0次方,第 2位权值为 8的 1次方, 第 3位权值为 8的 2次方,等等。

(2)从已给定源程序的 main主函数开始入手,首先通 过 if语句判断串是否过长,是否符合题干要求;然后循环 判断串中的每一位是否都在 0~7之间,是否符合八进制要 求,最后调用 fun(s)实现八进制到十进制的转换。

三、程序设计题

【答案】

1 int i;

难度指数★★★

1

【解题思路】

(1)第一个标识下面:语句“n=*p-'o';”中的'o'不是数

因此第二空处为“k”。

第三空:此处是将字符串长度不超过 k的字符串 ss[i] 拷贝到 ss[j++]中,故第三空处为“ss[i]”。

【考点链接】函数功能;指针。

字零,而是字母'o',根据前面的分析因此改为:“n=*p-'0';”。 (2)第二个标识下面:语句“n=n*8+*P-'o'”,首先进行 同(1)相同的修改,变量 P没有定义,根据题意要求这里 应该是“*p-'0'”,所以此句改为:“n=n*8+*p-'0';”。

【考点链接】字符;数制。

二、程序修改题

【答案】 难度指数★★★

(1)int k=0; (2)while(*p||*q) 【审题分析】

该程序功能是逐个比较两数组对应字符的 ASCII值大 小。从已给定源程序的 main主函数开始入手,调用函数 “fun(a,b,c);”,对字符串 a、b进行比较,生成字符串 c。

【解题思路】

(1)第一个标识下面的“int k=1;”在题目中要求将字

符放在数组 c,如果数组中有 n个元素,应该从 c[0]到 c[n-1]。 所以,应将 k的初始化定义改为从 0开始,即“int k=0;”。 (2)第二个标识下面的判断条件,是根据题目要求逐个 比较两个数组对应字符的 ASCII值的大小,所以判断条件 应该是直到两个字符数组所有元素比较完毕,而不是数组对 应元素不相等。

其中,该题主要考查变量的初始化,逻辑关系。 【考点链接】函数逻辑。

三、程序设计题

【答案】难度指数★★ 1 STREC c; 2 int i;

3 c.num[0]='\\0'; /*置初始空串 */ 4 c.s=-1; /*置成绩为-1 */ 5 for(i=0; i

6 if(strcmp(a[i].num, b)==0){ /*判

断学号是否相等 */

7 strcpy(c.num, a[i].num); /*相

等,则对学号进行赋值 */

8 c.s=a[i].s; /*相等,则对成绩进行

赋值 */

9 break; /*退出循环体 */ 10 }

11 return c; /*返回结构体变量 */

【审题分析】 该程序功能是函数返回指定学号的学生数据,指定的学 号在主函数中输入。解题思路是在循环过程中,使用 if判 断表达式,将输入的学号与所有的学号进行比较,如果找到 该学号,将其赋值到指定变量,否则将空格赋值到指定变量, 表明没有查找到该学号。

【解题思路】

在 for循环中,利用 C语言自带字符串比较函数 strcmp, 对输入的学号与所有的学号进行比较,以求出指定学号。

【考点链接】结构体;函数传值。

三、程序设计题

【答案】 难度指数★★★ 1 int i=0; 2 char *p=a;

3 while(*p&&*p=='*') 4 {

5 a[i]=*p; 6 i++; 7 p++; 8 }

9 while(*p) 10 {

11 if(*p!='*') 12 {

13 a[i]=*p; 14 i++; 15 } 16 p++; 17 }

18 a[i]='\\0';

【审题分析】

该程序功能是除了字符串前导的“*”号之外,将串中 其他“*”号全部删除。本题的解题过程首先确定由串起始 位置开始的第一个非“*”位置,然后对由第一个非“*”开 始的字符到串尾的字符进行判断,如果不是“*”的字符拷 贝到字符串。

【解题思路】 (1)首先,使用一个指针 p指向串的起始位置,然后对 指针 p指向的字符进行判断,并且如果是“*”,将其拷贝到 字符串,这样确定了由头开始的第一个非“*”的位置。

(2)然后,在循环过程中对由第一个非“*”字符起始

第 53套试题答案及详解

一、程序填空题

【答案】 难度指数★★★ (1)N (2)k (3)ss[i] 【审题分析】

本题中函数 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

到串尾的字符进行判断,如果不是“*”就将其拷贝到字符

串 a,否则跳过。

(3)最后,在新生成的字符串尾加'\\0'。 【考点链接】指针操作。

5 p++; 6 }

7 a[j]='\\0';

【审题分析】

第 54套试题答案及详解

一、程序填空题

【答案】 难度指数★★★

(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”。

【考点链接】函数逻辑。

该程序功能是删除字符串中所有的*号。解题思路是在 while循环过程中,利用 if判断表达式判断每一个字符是否 为“*”号,如果不是将其拷贝到字符串,否则跳过,这样 就实现了函数功能。

【解题思路】

(1)首先利用工作指针指向字符串,当指针不指向串尾 时,就对字符串进行循环判断。

(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(\to %d\\n\”可知,从 3开始寻找素数,故第一空处应为 “j=3”。

第二空:由审题分析可知,判断 i是否是素数用 2、3、…、 i-1这些数逐个去除 i即可,故第二空处应为“i”。

第三空:由“count++; printf( count? \i);”可知找到一个素数 i了,在 i是素数的时候,变量 j从 2 到 i-1都不能被 i整除,退出 for循环的是 j的值已经变成 i 了,故判断 j是否大于等于 i便可知 i是不是素数,所以第 三空应为“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);”。

【考点链接】函数实现的逻辑关系。

二、程序修改题

【答案】难度指数★★

(1)sum=0;j=0;(2)if(sum%4==2) 【审题分析】

本题中函数的功能是计算前 n(4

(1)根据题意第一标识下“sum=j==0;”是给 sum和 j

三、程序设计题

【答案】难度指数★★★

1 int j=0; 2 char *p=a; 3 while(*p){

4 if(*p !='*')a[j++]=*p;

3

赋初值 0,故应改成“sum=0;j=0;”。

(2)第二个标识下的 if语句是根据题干要求,累加和 被 4除后余 2,而原题是将 2赋值给 sum%4。所以,第二个 标识下“if(sum%4=2)”应该改为“if(sum%4==2)”。

【考点链接】变量初始化;if条件语句;逻辑表达式。

【审题分析】

本题中函数的功能是用递归算法计算斐波拉契级数数

三、程序设计题

【答案】难度指数★★ 1 int i;

2 double sum=0.0; 3 if (n>1&&n<=100){ 4 for(i=1; i<=n; i++)

5 sum+=1.0/(2*i-1)-1.0/(2*i); 6 }

7 return sum; 【审题分析】

该程序功能是计算并输出多项式值。根据题干中给出的 数列,首先推出每一项的表达式,然后再对多项式进行累加 求和。

【解题思路】 (1)根据题干中给出的数列,推出每一项是(1.0/(2*i- 1)-1.0/(2*i))。

(2)在循环中求得每一项,然后对其进行累加求和。 【考点链接】逻辑关系;运算符。

列中第 n项的值。本题主要是对于 switch - case语法的介绍。

【解题思路】

(1)第一个标识下的 switch后用括号括起来的表达式 的标准语法后面是没有“;”的,所以“switch(g);”应该改 为“switch(g)”。

(2)第二个标识下的 case加常量表达式的后面用冒号 连接选择语句,所以“case 1;”改为“case 1:”。“case 1:” 和“case 2:”都是返回 1,应该写两个“return 1”。

【考点链接】switch分支语句。

三、程序设计题

【答案】难度指数★★★★ 1 int i;

2 for(i=0; i

3 a->ave=a->ave+a->s[i]; 4 a->ave /=N;

【审题分析】

该程序功能是计算结构体中某一成员的平均值。这类题 主要考查是对结构体的操作,关于平均分数的求解过程首先 统计成员的总分,然后计算平均分。

【解题思路】 (1)本题中给出的题干中定义了结构体变量 STREC用 来存储学生的记录。

(2)利用 for循环求得总分,然后求得平均分,最后将 平均分放入记录 ave中。其中,结构体成员的引用形式可以 为 a.ave、a.s[i]等。

【考点链接】结构体;for循环。

第 56套试题答案及详解

一、程序填空题

【答案】 难度指数★★★

(1)a[i] (2)a[j] (3)a[j] 【审题分析】 本题中函数的功能是将数组中的元素下标位置为偶数 的元素按照从小到大排序,下标为奇数位置的元素按照从大 到小排序,相当于 2个排序过程。在 fun函数中,采用选择 排序法进行排序,分别用 max和 min存储每次寻找的最大 值和最小值,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]”。

【考点链接】数组;循环结构。

第 57套试题答案及详解

一、程序填空题

【答案】 难度指数★★★

(1)filename (2)fp (3)fp 【审题分析】

本题中函数 fun的功能是重写形参 filename所指文件中 最后一个学生的数据,即用新的学生数据覆盖该学生原来的 数据,本题主要考察文件的读写。

【解题思路】

第一空:“fp=fopen(__1__, \”补充 fopen的参数, fopen的调用形式是:fp=fopen(文件名,文件使用方式),因 此第一空处应填文件名“filename”。

第二空:此处是补充 fseek函数的参数,fseek的调用形 式是:fseek(fp, offset, position),其中第一个参数是文件型指 针,故第二空处应填文件型指针变量“fp”。

第三空:fwrite的调用形式是(buffer,size,count,fp),最后 一个参数是文件型指针,故第三空处应填“fp”,将新的学 生数据写在最后一个学生数据位置。

【考点链接】结构图;文件操作。

二、程序修改题

【答案】 难度指数★★ (1)switch(g)

(2)case 1: return 1; case 2:return 1; 4

二、程序修改题

【答案】难度指数★★★★

(1)p=(NODE *)malloc(sizeof(NODE)); (2)return h; 【审题分析】

该题中函数功能是创建带头结点的单向链表。从已给定

源程序的 main主函数开始入手,首先通过“ head= Creatlink(8,22);”语句调用 Creatlink函数生成单向链表,然 后“outlink(head);”输出该链表。

【解题思路】

(1)第一标识下“p=(NODE )malloc(sizeof(NODE));”, maclloc函数的返回类型是 void*类型,表示未确定类型的指 针,因此需要指针类型转换,而“(NODE )”不是指针类型, 故第一标识下应改成“p=(NODE *)malloc(sizeof(NODE));”。 (2)第二个标识下,最后将单链表返回,应该是返回头 指针 h指向的链表,而不是其中的一个节点 p,所以“return p;”应该改为“return h;”。

【考点链接】函数功能。

【解题思路】

第一空:由“return sum;”可知 sum变量记录了主对角 线元素和反向对角线元素之和,第一空处是在使用 sum变 量之前对其初始化,因此第一空处应为“sum=0;”

第二空:由第二个循环内“sum+=t[i][n-i-___3___];”可 知,第一个循环是主对角元素和,第二个循环求反向对角线 元素之和,因此第二空处应为“t[i][i]”。

第三空:第二个循环求反向对角线元素之和,反向对角 元素为 t[i][n-i-1],故第三空应为“1”。

【考点链接】数组;逻辑关系。

二、程序修改题

【答案】

难度指数★★

(1)double r;

(2)while(fabs(n-m)>0.001) 【审题分析】

(1)该题中函数功能是二分法求方程根。其中,二分法 的求根过程,是将含根区间平均分为两个小区间,然后判断 哪个区间是含根区间。在此基础上,将这里的小含根区间进 一步划分为两个更小的区间,继续判断根所在区间。继续细 分下去,含根区间将划分地越来越小,区间的范围也越来越 小。经过多次细分后,就可以将此很小区间的中点近似为方 程的根了。

(2)从已给定源程序的 main主函数开始入手,通过 “root=fun( m,n );”语句调用 fun函数求得方程根,其中 fun 函数对 funx函数进行调用,对根进行判断。 【解题思路】

(1)fun函数要求返回方程的一个根,由 return语句来 实现,而函数 fun是定义为 double型的,但第一个标识下面 的 r却被定义为 int类型。所以“int r;”改为“double r;”。

(2)检查 while循环的控制表达式“(fabs(n-m)<0.001)”, 知道开始的循环值为 80,必然不会进入循环体,不符合逻 辑,所以应改为:“while(fabs(n-m)>0.001)”。 【考点链接】变量定义;逻辑关系。

三、程序设计题

【答案】难度指数★

1 int i,n=0; //字符统计初始值设置为 0 2 for(i=0;i

5 if(s[i]>='a'&&s[i]<='z'&&s[i+1]

==' '||s[i+1]=='\\0') //单词判断条件 6 n++; //单词统计计数器加 1 7 }

8 return n; //返回统计值

【审题分析】

该程序功能是统计一行字符串中单词的个数,作为函数 值返回。单词之间以空格为分割,所以对单词个数的统计可 以理解为对空格字符的统计,其中最后一个单词以字符串的 结尾符为分割。

【解题思路】

(1)首先,求得字符串的长度。

(2)只要小于字符串的长度,就对字符进行循环判断。 (3)根据题干要求,只要字符是小写字母,并且下一个 紧靠的字符是空格或者尾符,那么单词统计计数器就加 1。

【考点链接】数组操作。

三、程序设计题

【答案】 难度指数★★★ 1 int j=0; 2 char *q=a;

3 while(*q&&q

8 while(*p)a[j++]=*p++; 9 a[j]='\\0';

【审题分析】

该程序功能是除了字符串前导和尾部的“*”号之外, 将串中其他“*”号全部删除。本题的解题过程首先对小于 主函数给出第一个字母的“*”进行拷贝赋值,然后对将小 于最后一个字母内的所有字符进行判断,如果是“*”则删 除,否则拷贝赋值,最后对最后一个字母到串尾的“*”进 行拷贝赋值。

第 58套试题答案及详解

一、程序填空题

【答案】难度指数★★★

(1)sum=0(2)t[i][i](3)1 【审题分析】

函数 fun的功能是计算 N×N矩阵的主对角线元素和反 向对角线元素之和,在 N×N的矩阵 t中,i标识行下标, 对角线元素为 t[i][i],反向对角元素为 t[i][N-i-1]。

5


C语言51-100套试题答案及详解.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:和济医院污水处理调试运维方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: