“pt[i]=str[k][i];”。
【考点链接】函数定义;数组操作。
三、程序设计题
【答案】难度指数★★ 1 int i, j;
2 for(i=0; i 该程序功能是使数组左下半三角元素的值全部置成 0。其中左下半三角元素的下标特点是列下标小于或等于行 下标。 【解题思路】 进入 fun函数,根据前面的分析: (1)对二维数组常用双重循环结构来处理:外层循环控 制二维数组的行处理,内层循环控制二维数组的列处理。 (2)左下半三角元素的下标特点是列下标小于或等于行 下标,即 j<=i。 (3)依次访问二维数组,把符合以上条件的元素的值 赋 0。 该题是对矩阵操作的考查。 【考点链接】二维数组。 判断,原题中“m=0;”语句将 m值设置为 0,在循环中 m 值始终是 0,不会改变,根据“for(i=0;i<2;i++)”语句中的 循环条件,“m=0;”改为“m=i;”。 (2)如果“if(a[k]>a[m])”,a[k]比 a[m]大,m记录下下 标值 k,内层循环结束的时候 a[m]值就是本次循环找到的最 大值(如果 m=0,a[m]是数组中的最大值;如果 m=1,a[m] 数组中的次最大值),即 m记录最大值的下标值,因此第二 标识下应该是“if(a[k]>a[m]) m=k;”。 【考点链接】函数定义语法;函数功能。 三、程序设计题 【答案】难度指数★★★★ 1 unsigned t,s=0,s1=1,p=0; 2 t=w; //将无符号数 w赋值给 t 3 while(t>10) //只对大于一位的无符号 数进行操作,否则返回 0 4 { 5 if(t/10) 6 p=t; //截取一位 7 s=s+p*s1; //组成新数 s 8 s1=s1*10; //权数升级,例如级数 10,升级为 100 9 t=t/10; //删除一位 10 } 11 return s; 【审题分析】 该程序功能是求出无符号数 w的后 n-1位的数。其中, 拆分无符号数 w,用表达式“t”可以得到个位数;用 “t=n/10; t”可以得到十位数;依次类推,可以得到其他 位上的数;当 t/10的值为 0时,就可以得出 w的位数。 【解题思路】 进入 fun函数,根据前面的分析: 利用 while循环语句,根据对拆分无符号数的分析取得 每位上的数。如果要截取的数 t大于 10,就说明 t不只有个 位,进入 while循环。每次截取一位 p,然后将 p乘以相应 的权数 s1,加上原有的计算结果 s,形成的新的数,然后将 t中截取的这位删除。其中,截取 t的第一位,那么权数就 是 1,第二位对应的权数就是 10,以此类推。 【考点链接】while;运算操作。 第 83套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)tt(2)tt.score[i](3)std 【审题分析】 函数 fun的功能是输出结构体变量的学生的信息,主要 考察结构体成员变量的访问。 【解题思路】 第一空:由“printf(\tt.name, tt.sex, tt.birthday.year, tt.birthday.month, tt.birthday. day);”可知,tt是 STU结构体变量,故函数 fun的参数是“STU tt”,即第一空处应为“void show(STU tt)”。 第二空:此处是循环输出 score数组中的元素值,访问 score元素的方法是“tt.score[i]”,故第二空处应为“printf (\”。 第三空:调用 fun函数,fun函数的参数是 STU结构体 变量,故第三空处应为“show(std);”。 【考点链接】结构体。 第 84套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)t,s (2)s[i](3)0或'\\0' 【审题分析】 本题中函数 fun的功能是把形参 s所指字符串中最右边 的 n个字符复制到形参 t所指字符数组中,形成一个新串, 若 s所指字符串的长度小于 n,则将整个字符串复制到形参 t所指字符数组中。在 fun函数中,分两种情况,如果 s所 指字符串的长度小于 n,则直接拷贝 s字符串到 t字符串; 反之则将 s所指字符串中最右边的 n个字符逐个复制到形参 t所指字符数组中。 二、程序修改题 【答案】 难度指数★★★ (1)m=i; (2)if(a[k]>a[m])m=k; 【审题分析】 本题中函数的功能是求出数组中最大数和次最大数。解 题思路首先求出数组中最大数和次最大数,然后将最大数和 次最大数分别放到数组的第一位和第二位。 【解题思路】 (1)第二个标识符下 for循环逐个对 m个数据进行选择 21 【解题思路】 第一空:“if(n>=len) strcpy(__1__);”如果 s所指字符串 的长度小于 n,那么直接拷贝 s字符串到 t字符串,使用字 符拷贝函数 strcpy,所以第一空处应为“t,s”。 第二空:“ for(i=len-n; i<=len-1; i++) t[j++]=__2__;”将 s所指的字符的最右边 n个字符拷贝到 t所指的字符串中, 循环变量 i从 len-n开始,即 s[len-n]是最右边 n个字符的一 个字符,i逐渐增大,s字符串逐渐右移,故第二空处应为 “s[i]”。 第三空:字符串以“'\\0'”结束,因此第三空为“0”或 “'\\0'”。 【考点链接】指针;函数功能。 到整数的个数,不断循环此过程,直到 i的值等于 m。 【考点链接】if条件语句;for循环语句。 第 85套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)STU(2)std[i].num(3)std[i] 【审题分析】 函数 fun的功能是找出指定编号人员的数据作为函数值 返回,编号是字符串数组,字符串的比较可使用 strcmp函 数。要找到指定的编号,需要利用循环搜索整个结构体数组。 【解题思路】 二、程序修改题 【答案】 难度指数★★★ 第一空:由“STU p; p=fun(std,n);”,可知 fun函数的 (1)if (i%k==0) (2)if (k>=i) 返回值是 STU结构体,因此第一空处应为“STU fun(STU 【审题分析】 *std, char *num)”。 本题中函数 fun的功能是找出一个大于形参 m且紧随 m 第二空:此处是用 strcmp函数比较两个字符串是否相 的素数,从 m+1开始寻找素数,找到这个素数就是紧随 m 同,参数 std是指向结构体数组的指针,故第二空处应为 且大于 m的素数。 “if( strcmp(std[i].num,num)==0 )”。 素数是指只能被 1和自身除尽的正整数(>1),所以判 第三空:如果“if(strcmp(std[i].num,num)==0)”成立, 别 n是否为素数,只要用 2~n/2这些数逐个去除 n,判断余 则返回值就是 std[i]结构体。 数是否为 0即可。只要有一次余数为 0,n就不是素数,否 【考点链接】结构体数组。 则 n为素数。 二、程序修改题 【解题思路】 【答案】 难度指数★★★ (1)“if (i%k !=0) break;”说明 k是 i的因子的情况,i (1)r++; p++; (2)if(*r=='\\0') 肯定不是素数可直接跳出循环,因此第一标识下应改成“if 【审题分析】 (i%k==0)”。 (1)该题中函数功能是查找字符串中某子串的个数。其 (2)“if (k 向字符串中的每个字符。内循环中,判断 r所指字符串与 p 结束的时候 k=i,说明 k>=i时 i是素数,故第二标识下应改 所指字符开始的串是否完全匹配;若不能匹配,由 break退 为“if (k>=i)”。 出循环;若 r指向串结束标志,退出循环,则表示匹配。 【考点链接】函数功能。 (2)从已给定源程序的 main主函数开始入手,从键盘 三、程序设计题 获得输入的字符串 s, t;然后通过“m=fun(s,t);”语句调用 fun 【答案】难度指数★★★ 函数。 1 int i; 【解题思路】 2 *n=0; (1)C语言中,语句应该以“;”结束,在第二个标识 3 for(i=1; i<=x; i++) 处,“p++”语句没有以“;”结束,因此第一个标识处应该 4 if((x%i==0)&&(i%2))pp[(*n)++]=i; 是“r++; p++;”。 【审题分析】 (2)根据审题分析,要判断指针 r是否指向串尾来结束 (1)功能是:求出能整除形参 x且不是偶数的各整数, 内循环,而判断语句应该是“if(*r=='\\0')”。 并按从小到大的顺序放在 pp所指的数组中。 【考点链接】指针操作。 它的解题思路,可以分解为以下几步:判断是否能整除 三、程序设计题 形参 x→判断是否是偶数→按从小到大的顺序存放到指定 的数组。 【答案】 难度指数★★ (2)从已给部分源程序的 main主函数开始入手,核心 函数“fun(x, aa, &n);”中的参数由题目可知,aa存放找到的 各整数,n为要求的整数的个数。 【解题思路】 进入 fun函数,根据前面的分析: 首先,初始化变量*n;定义 i,作为循环变量。 然后,每判断一次 i的值是否能整除形参 x,且 i不为 偶数,满足题干条件的话存储到 pp所指数组中,*n记录找 1 int i, j=0; 2 for(i=0; i t[j++]=s[i]; 3 t[j]=0; 【审题分析】 该程序功能是将 s所指字符串中 ASCII值为偶数的字符 删除,串中剩余字符形成一个新串放存 t所指的数组中。解 题过程利用 if判断表达式选择 ASClI值为奇数的字符,然 22 后将符合条件的字符放入指定的字符串 s,这样就实现了函 数功能。 【解题思路】 (1)判断一个字符串中的某一字符 ASCII值是否为奇 数,可用“str[i]%2!=0”来判断。 (2)对串 s中各个字符逐个进行考查,ASCII值为奇数 的字符就顺序放在新串 t中,否则就不存放。 (3)所有字符处理完后,记得在新串 s的末尾加上结束 符“'\\0'”。 【考点链接】数组操作。 【解题思路】 (1)第一个标识下面的“IsPrime(int n);”在程序中 显然是一个函数,因此应将后面的分号去掉。 (2)第二个标识下面的 if语句后面缺少括号,因此, if !( n%i)应改为 if(!(n%i))。 该题主要考查标点符号、运算符、基本定义。 【考点链接】if条件语句;函数定义。 三、程序设计题 【答案】 难度指数★★★ 1 int i, max=a[0].s, j=0; 2 for(i=1; i 7 *s=a[j]; 【审题分析】 该程序功能是求最高分数的学生。本题是关于求解结构 体中某些成员的最大值,首先将第一个值设定为最大值,并 在循环中将其他所有值与该值进行比较,求得最大值。然后 将最大值与所有值进行比较,求得所有的最大值。 【解题思路】 (1)首先指定第一个成绩为最高分数。 (2)再使用一个 for循环把所有的成绩进行比较,找出 最高的分数来。 【考点链接】数组操作;结构体。 第 86套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)std[i].year (2)std[i] (3)n 【审题分析】 fun函数的功能是在结构体数组 std中找出指定出生年 份的人员,将其数据放在形参 k所指的数组中。出生年份是 整型变量,可以直接比较。利用循环搜索整个 std数组,逐 个找到满足条件的 STU结构体。 【解题思路】 第一空:比较结构体的出生年份是否等于 year,std是 结构体指针,指向结构体数组的首地址,因此访问一个结构 体的 year成员是 std[i].year,因此第一空处应为 “if(std[i].year==year)”。 第二空:这里是将找到的数据放在形参 k所指的数组 中,k是指针变量,k指向结构体数组的首地址,std[i]是结 构体的地址,因此等号左边也应该是地址,故第二空处应为 “k[n++]=std[i];”。 第三空:fun函数的返回值是满足指定条件的人数 n, 故第三空处是“return (n);”。 【考点链接】结构体数组;循环结构。 第 87套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)STU(2)score[i](3)&std 【审题分析】 fun函数的功能是将该学生的各科成绩都乘以一个系数 a,在 fun函数体内利用了循环对每科成绩都乘以系数 a。 【解题思路】 第一空:由“void modify(___1___ *ss,float a)”可知函 数的第一个参数是个指针,又函数必须完成结构体各科成绩 数据成员都乘以一个系数 a,因此传入的参数是结构体指针, 即第一空处应为“void modify(STU *ss,float a)”。 第二空:对结构体各科成绩数据成员都乘以一个系数 a, 因此第二空处应为“ss->score[i] *=a;”。 第三空:modify函数的第一个参数是指针,故调用该 函数时第一个参数应该是变量 std的地址“&std”。 【考点链接】结构体;指针。 二、程序修改题 【答案】 难度指数★★ (1)IsPrime(int n) (2)if(!(n%i)) 【审题分析】 (1)整数 n的素数因子为整除 n的所有素数,但不含 n 本身。 素数是只能被 1和本身整除的正整数(>1),所以判别 n是否为素数,只要用 2、3、…、n-1这些数逐个去除 n, 观察余数是否为 0即可,只要有一次相除余数为 0,n就不 是素数,否则 n为素数。 因此,求整数 n的素数因子,要从求整数 n的因子和判 断该因子是否为素数的两方面来看。 (2)从已给定源程序的 main主函数开始入手,核心部 分是循环判断 if((!(k%j))&&(IsPrime(j))),“!(k%j)”为判断 j 是否是 k的因子,IsPrime自定义函数的功能是判断 j是否 为素数,&&与逻辑是指当两个判断条件都为真的时候,j 即为 k的素因子。 二、程序修改题 【答案】 难度指数★★★ (1)if (k>0) (2)else if(k==0) 【审题分析】 本题中函数的功能是计算阶乘,其中,阶乘的计算公式 23 分为参数 k是 0和大于 0的两种情况,例如,0的阶乘 0! =1;5的阶乘 5!=5×4×3×2×1。 【解题思路】 (1)第一个标识下的 if语句的条件表达式,根据 C语 言的基本语法条件,表达式应该用括号括起来,所以将“if k>0”改为“if(k>0)”。 (2)第二个标识下“else if ( k=0 )”判断 k是否等于 0, 在 C语言中,“==”表示等于,而“=”表示赋值,故第二 个标识处应为“else if ( k==0 )”。 【考点链接】if条件语句。 二、程序修改题 【答案】难度指数★ (1)for(i=0,t=0; p[i]; i++) (2)c[t]='\\0'; 【审题分析】 本题中函数的功能是删除字符串 s中的所有空白字符。 首先在字符串 s中,确定空白字符,然后对其执行删除操作。 【解题思路】 (1)第一个标识下“For (i=0,t=0; p[i]; i++)”语句是 for 循环语句,而 For不是 C语言的关键字,所示“For (i=0,t=0; p[i]; i++)”应改为“for (i=0,t=0; p[i]; i++)”。 (2)第二个标识下的“c[t]=\”语句是在新生成的串 后面加尾符标志,在 C语言中规定使用单引号把一个字符 括起来作为字符常量,所以“c[t]=\”应改为“c[t]='\\0';”。 【考点链接】数组操作;循环结构。 三、程序设计题 【答案】 难度指数★★ 1 int i,j; 2 for(i=0; i 【审题分析】 该程序功能是使数组左下三角元素中的值乘以 n。本题 中首先要确定左下角半角元素的特点,然后对元素逐个进行 三、程序设计题 【答案】 难度指数★★★ 1 int i; 乘以 n的操作。其中,左下角的元素是行下标大于等于列下 2 for(i=1; i 【解题思路】 4 } ( 1)左下半角的元素是行下标大于等于列下标,即 【审题分析】 该程序功能是将字符串中所有下标为奇数位置上的字 “i>=j”,包括对角线。 (2)依次访问二维数组,把符合条件的元素的值乘以 n。 母转换为大写。其中,同一英文字母的大写和小写的 ASCII 【考点链接】二维数组。 码值相差 32,因此,要将小写字母转换为大写字母,只要 将其对应的 ASCII码值减去 32即可。 【解题思路】 第 88套试题答案及详解 (1)首先取得字符串中下标为奇数的字符。 (2)判断奇数位置的字符是否为小写字母。 一、程序填空题 (3)若(2)中的判断结果是小写字母,则对其进行 【答案】 难度指数★★★ 转换。 (1)0或 NULL (2)n (3)head,ch 【考点链接】数组操作;指针操作。 【审题分析】 函数 fun的功能是查找数据域中值为 ch的结点,在实 第 89套试题答案及详解 现方式上可采用循环来搜索链表当中的每一个结点,比较结 点的数据域是否等于 ch。 【解题思路】 第一空:这里是补充循环结束条件,链表是单向有限的, 最后一个结点的指针域指向 NULL,因此可以用这个来作为 循环结束条件,在 p指向的结点的指针域不是 NULL时表明 还有下一个结点,因此第一空处应该是“while(p!=NULL)”。 第二空:在循环当中 n用来记录顺序号,如果“ if (p->data==ch)”成立,则已经找到数据域中值为 ch的结点, 返回顺序号,即“return n;”。 第三空:fun函数的调用形式是:fun( SLIST *h, char ch),第一个参数是头结点地址,第二个参数是需要寻找的 ch值,因此第三空处应该是“k=fun(head,ch);”。 【考点链接】链表;指针。 一、程序填空题 【答案】 (1)t[][N] 【审题分析】 难度指数★★★ (2)i=0;i (3)s 函数 fun的功能是将 N×N矩阵主对角线元素中的值与 反向对角线对应位置上元素中的值进行交换,在 N×N的矩 阵 t中,i标识行下标,对角线元素为 t[i][i],反向对角元素 为 t[i][N-i-1]。 【解题思路】 第一空:在主函数中 fun函数的调用形式是“fun(t,N);”, t是二维数组名,故 fun函数的第一个参数为指针,因此第 一空处应为“t[][N]”。 第二空:fun函数的第二个参数 n指明了矩阵的大小为 n,对角线元素与反向对角线元素有 n个,故循环有 n次, 因此变量 i从 0开始,到 n-1结束,因此第一空处应为 24 “i=0;i 第三空:循环体内部是对角线元素与反向对角线元素的 交换,“ s=t[i][i];”s保存了对角元素 t[i][i],因此第三处应填 “s”。 【考点链接】数组;循环结构。 二、程序修改题 【答案】 难度指数★★★ (1)int fun(int a[],int m) (2)else if(m>a[mid]) 【审题分析】 (1)该题中函数功能是利用折半查找算法查找整数 m 在数组中的位置。其中,折半查找法是在有序数组中进行的, 过程是先将待找的数和数组中间的元素进行比较,若待找的 数大于数组中间元素的值,就在数组的后一半继续查找,若 待找的数小于数组中间的值,就在数组的前一半继续查找, 然后在取新区间的中间元素进行比较,不断重复以上过程, 直到找到待找的元素为止。 (2)从已给定源程序的 main主函数开始入手,从键盘 输入获得要查找的值 m“scanf(\”,调用函数 fun 来实现折半查找。 【解题思路】 (1)根据主函数中“k=fun(a,m);”,知道函数 fun应该 是返回 int型的函数,所以第一个标识下面定义的“void fun(int a[],int m)”应该改为“int fun(int a[],int m)”。 (2)第二个标识下的“else If(m > a[mid])”是判断 m是 否比 a[mid]大,在 while循环中采用的是 if-else if-else语句, 显然“else If”当中“If”应当小写,故第二标识下“else If(m > a[mid])”应改为“else if(m>a[mid])”。 【考点链接】函数定义;折半查找。 删除后,将尾部的“*”字符往前移动即可。 (3)确定了字符数组的最后一个字符非“*”后,调用 fun函数,在 fun函数中,将原串中由起始位置的字符开始 到最后一个非“*”逐个查询该字符是否是“*”字符,如果 是则删除,并将后面的字符往前移动;然后将 t之后的字符 移动到前面,最后在字符串的后面添加“'\\0'”即可。 【考点链接】数组操作;指针操作。 第 90套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)data (2)next(3)head 【审题分析】 函数 fun的功能是计算出链表中各结点数据域中值之 和,由于链表单向,利用循环从头结点开始搜索直到最后 一个结点,每找到一个结点就把结点的数据域上的数据累 加起来。 【解题思路】 第一空:循环“while(p)”遍历整个链表,在循环体中, s是累加变量,每个结点的数据域上的数据都累加在 s上, 因此第一空处应为“s+=p->data;”。 第二空:p是循环变量,p不断指向下一个结点,故第 二空处应为“p=p->next;”。 第三空:fun函数的声明为:int fun( SLIST *h),参数是 SLIST结构体指针,表示头结点地址,因此第三空处的函数 调用应为“printf(\”。 【考点链接】链表;指针。 二、程序修改题 【答案】难度指数★★★ (1)while(*r) (2)*a=*r; a++; r++; 【审题分析】 该程序功能是将字符串中的某个子串全部替换成某个 子串。从已给定源程序的 main主函数开始入手,语句“fun( s, t1, t2, w);”调用 fun函数,通过 while循环首先比较两个子 串是否相同,然后进行替换,实现题目要求。 【解题思路】 (1)函数通过 while语句比较 r所指字符串是否和 p所 指的子串相同,若有相同,会一直循环到*r是'\\0'才退出循 环。所以第二个标识下的“while(r)”改为“while(*r)”。 (2)C语言中,语句应该以“;”结束,在第二个标识 处,“r++”语句没有以“;”结束,因此第二个标识处应该 是“*a=*r; a++; r++;”。 【考点链接】函数逻辑;指针操作。 三、程序设计题 【答案】 难度指数★★★ 1 char *q=a; 2 int j=0; 3 while(*q&&q 4 if(*q !='*')a[j++]=*q; 5 q++; 6 } 7 while(*p)a[j++]=*p++; 8 a[j]='\\0'; 【审题分析】 该程序功能是除了尾部的*号之外,将字符串中其他“*” 号全部删除。其中,实现删除指定元素的功能,一般是使用 循环语句,通过指针变量在字符串中前后的移动,判断其是 否为要删除的元素。若是,则进行相应的操作。还要注意的 是,删除字符后,要将其后的字符依次移动。 【解题思路】 (1)首先,主函数中使指针移到字符串的最后一个字符, 对字符串由串尾开始进行操作。 (2)然后,指针由尾开始向头移动,查找第一个非“*” 号字符,指针 t指向后一个非“*”,即从最后一个非“*”, 字符开始的字符都不需要删除,将前面的其他“*”号全部 三、程序设计题 【答案】难度指数★★ 1 int i, j=0; 2 for(i=1; i 25