三、程序设计题
【答案】难度指数★★★
【解题思路】
(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; i
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