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

2019-08-17 12:04

三、程序设计题

【答案】难度指数★★★

【解题思路】

(1)首先,设置一个指针变量 q指向字符串的头位置, 并使用循环,将从字符串头开始到第一个字母的“*”拷贝 到字符串 a。

(2)然后对第一个字母到最后一个字母之间的字符进行 循环判断是否为“*”,如果是则跳过,否则拷贝到字符串 a。

(3)最后,将最后一个字母到串尾的“*”拷贝到 a, 然后在新生成的字符串尾加'\\0'。

【考点链接】数组操作;指针操作。

第 59套试题答案及详解

一、程序填空题

【答案】 难度指数★★★ (1)*std (2)std[i].age 【审题分析】

(3)max.name

1 int i,j, min, k; 2 for(i=0; itt[j][i]){ 6 min=tt[j][i]; 7 k=j; 8 }

9 pp[i]=tt[k][i]; 10 }

【审题分析】

该程序功能是求出二维数组每列中最小元素。本题解题 思路基本可以分为两重循环,外重循环为对二维数组的所有 列进行循环,内重循环为对每一列内的元素进行循环求出最 小值。

【解题思路】

进入 fun函数,根据前面的分析:

(1)依次访问每一列的元素。

(2)在对每一列的访问过程中选出最小数。 (3)将选出的最小数依次放到一维数组中。

【考点链接】二维数组;for循环语句;if条件语句。

函数 fun的功能是将形参 std所指结构体数组中年龄最 大者的数据作为函数值返回,查找最大值算法一般是先指定 一个元素,然后对数组中的元素逐个和这个指定值进行比 较,如果指定值小于某元素值,则用这个元素值替换指定值。 【解题思路】

第一空:max变量保存最大值,在循环开始之前,先给 max赋值并假定这个值就是最大值,即“max=*std;”给 max 赋初值。

第二空:“if(max.age<___2___)”比较 max的 age成员 变量和 std[i]的 age成员变量,如果 max的 age变量小于 std[i] 的 age成员变量,那么将 std[i]赋给 max,即第二空处应为 “if(max.age

第三空:输出年龄最大者的名字和年龄,访问年龄成员 变量的方法是“max.name”,故第三处应为“printf(\%s, Age : %d\\n\”。

【考点链接】结构体;指针。

第 60套试题答案及详解

一、程序填空题

【答案】 难度指数★★★

(1)[N] (2)t[i][j](3)t[j][i] 【审题分析】

函数 fun的功能是将对称元素相加并将结果存放在左下 三角元素中,右上三角元素置为 0,操作顺序是将对称元素 相加存放在左下三角元素中,然后将右上三角元素置 0。

【解题思路】 第一空:在主函数中 fun函数的调用形式是“fun(t);”, t是数组名,故 fun函数的参数是指针,因此第一空处应为 “[N]”。

第二空:“___2___=t[i][j]+t[j][i];”是将对称元素相加存 放在左下三角元素中,左下三角元素可表示为 t[i][j],故第 二空处应为“t[i][j]”。

第三空:“ ___3___=0;”是将右上三角元素置 0,右上三 角元素可表示为 t[j][i],故第三空为“t[j][i]”。 【考点链接】数组;循环结构。

二、程序修改题

【答案】

难度指数★★★

(1)void fun(int *a, int *b) (2)t=*b; *b=*a; *a=t; 【审题分析】

该题中函数功能是实现两个整数的交换。从已给定源程 序的 main主函数开始入手,“fun(&a, &b);”语句调用函数 fun来实现两个整数的交换。

【解题思路】

(1)该题明显是指针类型的错误。主函数传的形参分别 是 a、b的地址,而函数 fun中却定义 a、b为整型,所以第 一个标识下的“void fun(int a, b)”改为“void fun(int *a,int *b)”。

(2)根据上面的修改,第二个标识下,“t=b; b=a; a=t;” 明显应该是“t=*b; *b=*a; *a=t;”。

【考点链接】函数定义;函数传值。

二、程序修改题

【答案】难度指数★★★

(1)#define FU(m,n) ((m)/(n)) (2)return (value); 【审题分析】

本题中函数的功能是计算题干中给出的公式值。本题的 解题过程是利用了定义的宏 FU,实现了函数中给出的公式

6

的求值。

【解题思路】

(1)函数 fun两次调用宏 FU来计算“value=FU(a+b, a-b)+FU(c+b,c-b);”。检查宏的定义是否正确,可以用实参代 入宏进行展开:(a+b/a-b),由此看到,FU(a+b,a-b)进行的计 算不是(a+b)/(a-b),而是(a+b/a-b),因为“/”的优先级高于 “+”或“-”,所以要使用括号限定计算优先顺序。所以将 “#define FU(m,n) (m/n)”改为“#define FU(m,n) ((m)/(n))”。

(2)第二个标识下返回语句的关键字有误。所以,第二 个标识下“Return (value);”应该改为“return (value);”,C 语言中没有“Return”这个关键字。

【考点链接】函数定义;C语言基本语法。

英文字母,当 c为大写英文字母(A-Z)时,返回非零值,否 则返回零。故“if ( isupper(ch) )”是判断 ch是否是大写字符, 如果是大写字符,则将 ch变成小写字符,故第二空处应为 “'A'”。

第三空:ch是经过变换后的字符,故返回值就是 ch, 所以第三空处应为“ch”。 【考点链接】函数逻辑。

二、程序修改题

【答案】 难度指数★★★ (1)void fun(int *a) (2)a[j]=a[j-1]; 【审题分析】

本题中函数的功能是给一维数组 b输入任意 3个整数, 并按题中给出的规律输出。在函数中利用 for循环实现对一 维数组的输出。

【解题思路】 (1)主函数中 a为数组名,传过去的形参应该是数组地 址。因此,fun函数中的形参不能为整型,所以将“void fun(int a)”改为“void fun(int *a)”。

(2)第二个标识下“aa[j]=a[j-1];”变量 aa没有定义, 编译时会提示出错。根据题意,“k=a[M-1];”语句是每一行 的第一个值,第二个标识下的循环过程中的逻辑关系应该是 前一个值赋值给当前值的后一个值。因此第二个标识下 “aa[j]=a[j-1];”应该改为“a[j]=a[j-1];”。

【考点链接】函数定义;函数功能;逻辑关系。

三、程序设计题

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

3 while(*p=='*')p++; 4 while(*p){ 5 a[j++]=*p; 6 p++; 7 }

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

【审题分析】

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

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

(2)然后,在循环过程中将第一个非“*”字符起始到 串尾的字符拷贝到字符串 a。

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

三、程序设计题

【答案】难度指数★★★

1 int s=0, i;

2 for(i=2; i

【审题分析】 该程序功能是计算并输出给定整数 n的所有因子的和。 解题过程,首先求得给出整数的所有因子,然后对求得的因 子累加求和。 【解题思路】 (1)首先,在 for循环过程中,利用 if判断语句判断由 2到 n-1所有数字中,选择为因子的数。

(2)如果是因子,那么对其进行累计求和。 【考点链接】运算符;函数功能。

第 61套试题答案及详解

一、程序填空题

【答案】 难度指数★★★ (1)&&(2)'A' (3)ch 【审题分析】

本题中函数 fun的功能是进行字母转换,若形参 ch中 是小写英文字母,则转换成对应的大写英文字母;若 ch中 是大写英文字母,则转换成对应的小写英文字母。小写字符 的范围是'a'<=ch<='z',大写字符的范围是'A'<=ch<='Z'。

【解题思路】 第一空:“ if ((ch>='a')___1___(ch<='z'))”是判断 ch是否 是小写字符,ch>='a'且 ch<='z',两者是与的关系,故第一空 处应为“&&”。

第二空:isupper(c)函数的功能是判断字符 c是否为大写

第 62套试题答案及详解

一、程序填空题

【答案】 难度指数★★★ (1)struct student (2)n-1

(3)a[i].name,a[j].name 【审题分析】

函数 fun的功能是将存放学生数据的结构体数组按照姓 名的字典序(从小到大)排序,在 fun函数内采用的选择排

7

序法,选择排序法中的升序排序,首先从数组中挑选一个元

素,把它和第一元素交换,接着从剩下的 n-1个元素中再挑 出一个最小的元素,把它和第二个元素交换,不断重复以上 过程,直到比较完最后两个元素。

【解题思路】 第一空:由“t=a[i]; a[i]=a[j]; a[j]=t”可知,t是 student 结构体变量,故第一空的变量定义为“struct student”。

第二空:由“for (j=i+1; j

第三空:“ if (strcmp(__3__)>0)”是比较两个姓名的大小, 由审题分析可知,如果 a[i].name大于 a[j].name,那么需要 交换,故第三空处为“a[i].name,a[j].name”。

【考点链接】结构体数组;函数功能。

第 63套试题答案及详解

一、程序填空题

【答案】 难度指数★★★ (1)0 (2)j--(3)j 【审题分析】

函数 fun操作顺序是:首先将第一行元素的值存入临时 数组 r,然后使第一列成为第一行,最后一行成为第一列, 最后一列成为最后一行,临时数组中的元素成为最后一列。

【解题思路】

第一空:由审题分析可知,此处是使第一列成为第一行, 即把第一列元素移动到第一行,第一列元素是 t[j][0],第一 行元素是 t[0][N-j-1],故第一空处应为“0”。

第二空:第四个循环是最后一列成为最后一行,即将最 后一列移动到最后一行,“ for(j=N-1; j>=0;___2___)”循环变 量 j从 N-1开始,到 0结束,共循环 N次,故 j每次减一, 第三空处是“j--”。

第三空:最后一个循环将临时数组中的元素成为最后一 列,即 t[j][N-1]=r[j],故第三空处应为“j”。

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

二、程序修改题

答案】难度指数★★★

(1)q=p+i;(2)while(q>p) 【审题分析】

该程序功能首先查找 ASCII码值最大的字符,将其放 在第一个位置上;然后将该字符前的原字符向后顺序移动。 从已给定源程序的 main主函数开始入手,调用函数 “fun(str);”,实现题目要求。

【解题思路】

(1)在 C语言中语句以分号“;”结束,在第一个标识 下语句“q=p+i”没有用分号结尾,应改为“q=p+I;”。

(2)根据题意第二标识下是利用循环来将移走的字符前 的原字符向后顺序移动,第二标识下“wihle(q>p)”wihle不 是 C语言关键字,应改成“while(q>p)”,利用 while循环来 实现字符移动。

【考点链接】函数定义语法;函数逻辑。

二、程序修改题

【答案】难度指数★★

(1)double f(double x)(2)return s; 【审题分析】

本题中函数的功能是计算题干中给出的公式值。主函数 main调用 fun函数,fun函数的功能是实现数列的求解。其 中 fun函数中调用实现每一项的 f函数。

【解题思路】

(1)第一个标识下 f函数的定义缺少返回值类型,所以 将“f(double x)”改为“double f(double x)”。

(2)第二个标识下返回语句没有分号结束。所以,第二 个标识下“return s”应该改为“return s;”。

【考点链接】函数定义;C语言基本语法。

三、程序设计题

【答案】难度指数★★★ 1 int i,j=0;

2 for(i=0; i

3 if(a[i].s>=l&&a[i].s<=h)b[j++]=a[i]; 4 return j;

【审题分析】 该程序功能是把指定分数范围内的学生数据放在 b所 指的数组中,分数范围内的学生人数由函数值返回。解题思 路是,在 for循环过程中,利用 if判断语句,依次判断每一 个分数是否满足范围,如果满足条件,将其存入指定数组, 并将统计变量加 1。

【解题思路】

(1)在 for循环过程中,利用 if条件表达式“if(a[i].s>= l&&a[i].s<=h)”逐个判断学生结构体中的成绩元素是否满足 题目中的范围。

(2)将符合条件的结果存入指定数组,并对统计变量进 行加 1操作。

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

三、程序设计题

【答案】

难度指数★★

1 double s=0.0; 2 int i;

3 for(i=1; i<=m; i++)s+=log(1.0*i); 4 s=sqrt(s); 5 return s;

【审题分析】

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

【解题思路】 (1)调用 log(n)函数求 ln(n)。

(2)对调用 log(n)进行累加求和,求得根号里的内容。 (3)最后调用 C语言的库函数 sqrt计算(2)中求得值 的平方根。

【考点链接】逻辑关系;运算符。

8

第 64套试题答案及详解

一、程序填空题

【答案】 难度指数★★★ (1)struct student (2)a.name

(3)a.score[i] 【审题分析】

本题中函数 fun的功能是将形参 a中的数据进行修改, 把修改后的数据作为函数值返回主函数进行输出,本题主要 考察结构体的基本应用。

【解题思路】

第一空:主函数内 fun函数的调用形式是“t=fun(s);”, 其中 t是 student结构体变量,因此 fun函数的返回值为 student结构体,故第一空处应为“struct student”。

第二空:“strcpy(__2__, \”是修改结构体变量 a 的 name成员值,故第二空为“a.name”。

第三空:“for (i=0; i<3; i++) __3__+=1;”是修改 a的成 员变量 score数组元素值,因此第三空为“a.score[i]”。

【考点链接】结构体;函数功能。

和 n/10实现。

(2)设 x0、x1、x2、x3为一位数,则 x0、x1×10、x2 ×100、x3×1000,可以分别使 x0、x1、x2、x3构成个、十、 百、千带权数,而 x0+x1×10+x2×100+x3×1000构成四位 数。本题最多只考虑四位数。

【考点链接】逻辑关系;运算符。

第 65套试题答案及详解

一、程序填空题

【答案】 难度指数★★★

(1)*n (2)next (3)head 【审题分析】

函数 fun的功能是统计出带有头结点的单向链表中结点 的个数,由于链表是单向有限的,可利用循环从头结点开始 计数,计到最后一个结点便得到了链表的长度。

【解题思路】 第一空:*n保存返回值链表长度,在开始计数之前, 应该将*n清零,故第一空处应为“*n=0;”。

第二空:*n在循环 while(p)中计数,p不断指向下一个 结点,因此第二空处应该为“p=p->next;”。

第三空:fun函数的声明为:void fun( SLIST *h, int *n), 第一个参数是头结点地址,第二个参数要存放链表长度的整 型变量地址,故第三空处应为“fun(head, &num);”。

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

二、程序修改题

【答案】难度指数★★★

(1)if(p==n)return -1; (2)a[i]=a[i+1]; 【审题分析】

该程序功能是删除数列中值为 x的元素,同时将其他元 素前移。从已给定源程序的 main主函数开始入手,语句 “n=fun(w,n,x);”调用函数“fun(int *a,int n,int x)”,实现题目 要求。

【解题思路】

(1)第一标识下“if(P==n) return -1;”中变量 P 没有定 义,编译时会提示出错。根据题意,这里是判断 p是否已经 到了字符串的末尾,即是否存在值为 x的元素,如果不存在 则返回-1,故第一标识下应改为“if(p==n) return -1;”。

(2)“for(i=p;i

【考点链接】函数逻辑。

二、程序修改题

【答案】 难度指数★★

(1)a=NULL; (2)if(*r==*p) 【审题分析】

该题中函数功能是求得字符串中某子串最后一次出现 的地址。从已给定源程序的 main主函数开始入手,通过调 用“p=fun(s,t);”语句求得 p的地址,然后通过判断 p,判断 串 s中是否存在子串 t。 【解题思路】

(1)第一个标识下面:语句“a=Null;”中的 NuLL未定 义。NULL代表空值,但程序中写成了 NuLL。所以,改成 “a=NULL;”。

(2)程序的主体是二重循环,其中外循环使指针 s逐个 指向字符串的字符,直到遇到串结束符退出循环,内循环检

查指针 p与 r所指字符串是否匹配。因为这里 p、r是指针,

三、程序设计题 如果使用判断表达式“if(r==p)”,那么比较的是地址,而题

目要求比较它们所指的字符。所以,改为:“if ( *r==*p )”。 【答案】难度指数★★

【考点链接】C语言标识;变量使用。 *c=(b/10)*1000+(a)*100+(b)*10+(a/10);

【审题分析】

该程序功能是将正整数 a、b合并形成一个新整数 c。 本类型题首先要考虑整数的数位分离,然后要进行数位合 成,也就是先将数字的各数位拆开,改变排列顺序后,再组 合成新的数字。

【解题思路】

(1)分解两位数的正整数 n的个位和十位数,可用 n 三、程序设计题

【答案】

难度指数★★

*c=(a)*1000+(b/10)*100+(a/10)*10+(b); 【审题分析】

该程序功能是将正整数 a、b合并形成一个新整数。本 类型题首先要考虑整数的数位分离,然后要进行数位合成,

9

也就是先将数字的各位数拆开,改变排列顺序后,再组合成

新的数字。

【解题思路】

(1)分解两位数的正整数 n的个位和十位数,可用 n 和 n/10实现。

(2)设 x0、x1、x2、x3为一位数,则 x0、x1×10、x2 ×100、x3×1000,可以分别使 x0、x1、x2、x3构成个、十、 百、千带权数,而 x0+x1×10+x2×100+x3×1000构成四位 数。本题最多只考虑四位数。

【考点链接】逻辑关系;运算符。

断的时候发现 s已经大于 q了,此时 while不再执行,而是 执行后面的 printf语句,即 s>t,s>q。题干要求返回级数的 前 N项之和 SN,而 SN+1大于 q,因此只能返回 t,而不是返 回 s。第二标识下应改为“return t;”。

【考点链接】C语言基本语法;循环结构。

三、程序设计题

【答案】 难度指数★ 1 int f0=0, f1=1, f; 2 do {

3 f=f0+f1; 4 f0=f1; 5 f1=f;

6 } while(f

【审题分析】

该程序功能是求 Fibonacci数列中大于 t(t>3)的最小的 一个数。其中,斐波纳契数列是一种整数数列,除第一和第 二元素外,所有的元素是前两个元素之和,其详细的定义如 下所示:

F(0)=0,n=0 F(1)=1,n=1

F(n)=F(n-1)+F(n-2),n≥2 【解题思路】

(1)在循环中求得数列,并对数列的值进行判断,看是 否符合题干要求。

(2)如果求得的数列值不满足题干要求,将当前值赋值 给前一项,将前一项赋给前一项的前一项,继续求下一项的 数列值,直到满足条件。

【考点链接】运算符。

第 66套试题答案及详解

一、程序填空题

【答案】 难度指数★★★ (1)N(2)N-1(3)0 【审题分析】

函数 fun的功能是将 N×N矩阵中元素的值按列右移 1 个位置,右边被移出矩阵的元素绕回左边。对每行元素,保 存最后一个元素,然后将从 0开始的元素往后移动 1个位置, 将保存的元素放在第一个位置实现右边被移出矩阵的元素 绕回左边。

【解题思路】 第一空:题目要求对每行元素中的值均右移 1个位置, 故第一空处循环变量每次增 1,共循环 N次,完成对 N行 的移位操作,因此第一空处应为“N”。

第二空:“ x=t[i][___2___];”保存第 i行元素的最后一个 元素 t[i][N-1],故第二空应为“t[i][N-1]”。

第三空:此处是右边被移出矩阵的元素绕回左边,即将 x内保存的元素放在每行的第一位置,故第三空应为“0”。

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

二、程序修改题

第 67套试题答案及详解

一、程序填空题

【答案】 难度指数★★★

(1)NODE* (2)next (3)r 【审题分析】

函数 fun的功能是将不带头结点的单向链表逆置,链表 的逆置从第二个结点开始,分别将结点的指针指向前一个结 点便可完成单项链表的逆置。

【解题思路】

第一空:主函数内 fun函数调用形式是“ head=

fun(head);”,变量 head是 NODE指针,故 fun函数的返回 值是 NODE指针,即第一空处应为“NODE *”。

第二空:while循环完成链表的倒置,在循环体内,p、 q和 r指针分别指向三个连续的结点,p指针在最前,然后 是 q指针,r指针在最后。将 q指针指向 p结点,p和 q两 个结点倒置,然后 p、q和 r再往后移动一个结点,继续对 其他结点逆置。因此第二空处 r是 q的后面一个结点,故第 二空处为“next”。

第三空:由第二空的分析可知,第三空处是将 q结点往

【答案】 难度指数★★ (1)s=s+(n+1.)/n; (2)return t; 【审题分析】

函数 fun的功能是:计算并输出下列级数的前 N项之和 SN,直到 SN+1大于 q为止。在 fun函数内,利用循环来求级 数和,变量 s记录级数和,当 s大于 q时退出循环。

【解题思路】

(1)注意到 n是整型变量,n+1也是整数,因此(n+1)/n 是两个整数相除,得到的结果也是整数即 1。而

“s=s+(n+1)/n;”是 s和 1转化成 double类型之后的和,相当 于 s=s+1.0,因此计算结果不正确。第一标识下应改为 “s=s+(n+1.)/n;”,n+1.计算结果是浮点数,(n+1.)/n得到的结 果也是浮点数而不是整数。

(2)注意到在循环体内部“t=s;”,即将 s的值赋给 t, 然后 s再累加了下一个级数项。在最后一次进入循环的时 候,t记录 s的值,s再加一个级数项,下次循环进入之前判

10


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

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

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

马上注册会员

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