后移动一个结点位置,故第三空处为“r”。
【考点链接】链表。
二、程序修改题
【答案】难度指数★★★
(1)if(i%2||s[i]%2==0)或 if(i%2!=0||s[i] %2==0)
(2)t[j]='\\0'; 或 t[j]=0; 【审题分析】
本题中函数的功能是将字符串中位于奇数位置的字符 或 ASCII码为偶数的字符依次放入新字符串中。解题思路 基本上分为判定字符是否为奇数位置或者 ASCII码是否为 偶数,然后根据判定结果对其进行操作。
【解题思路】
(1)第一个错误标识下的 if条件应该是判定字符是奇 数位置或者 ASCII码是偶数,原题中给出的是字符是奇数 位置并且 ASCII码为偶数,逻辑关系表达式不对,应该是 或的关系,所以“if(i%2&&s[i]%2==0)”改为“if(i%2||s[i]%2== 0)”或“if(i%2!=0||s[i]%2==0)”。
(2)第二个标识符下应该是新生成的串尾加尾符标志, 新串的位置标志变量是 j,原题给出的 i是原串的位置标志 变量,所以“t[i]='\\0';”改为“t[j]='\\0';”或“t[j]=0;”。
【考点链接】if条件语句;数组语法。
现的次数,数字字符的判断是 s[i]>='0'且 s[i]<='9',满足该 条件后,计数变量加 1,搜索整个字符串便得到数字字符出 现的次数。
【解题思路】
第一空:循环终止条件是达到了字符串的尾部,字符串 以“\\0”(或 NULL)结束,故第一空处应为 s[i]。
第二空:数字字符的判断是 s[i]>='0'且 s[i]<='9',故第 二空处应为“'9'”。
第三空:这里是将数字字符出现的次数存放在形参 t里, n记录了数字字符的个数,而形参 t是指针变量,故第三处 应为“*t=n”。
【考点链接】if语句;循环条件。
二、程序修改题
【答案】 难度指数★★ (1)t=*x; *x=y; (2)return(t); 【审题分析】
本题中函数的功能是通过某种方式实现两个变量值的 交换。题干中采用的是利用临时变量作为交换媒介来实现变 量的交换。
【解题思路】 (1)根据 fun中 x变量的定义,x为指针型变量,所以 第一个错误标识下的“t=x;x=y;”改为“t=*x;*x=y;”。
(2)交换之后 t中存放原来 x的值,x存放原来 y的值, 这里应该是返回原来 x的值,所以第二个标识下的“return (y);”应该改为“return (t);”或者“return t;”。 【考点链接】指针操作;函数功能。
三、程序设计题
【答案】难度指数★★★★ 1 int i,j;
2 for(j=0;j 5 b[*n]=*(*(s+i)+j); 6 *n=*n+1; 7 } 【审题分析】 该程序功能是将 M行、N列的二维数组中的数据,按 列的顺序依次放到一维数组中。本题中首先要清楚数组元 素在通常情况下是按行存放的,而如果要实现按列存放, 其对应关系应为:s[0][0],s[1][0],s[2][0],…,s[M-1][0],s[0][1], s[1][1],…,s[M-1][N-1]。 【解题思路】 (1)利用两重循环,依次取矩阵中的元素。 (2)其中注意指针数组与数组指针的区别,其中数组指 针 s,它指向包含 4个元素的一维数组。其数据元素的表示 方式为:“*(*(s+i)+j)”。 【考点链接】数组操作;指针操作。 三、程序设计题 【答案】 难度指数★★★ 1 int i; 2 *n=0; 3 for(i=7; i<1000; i++) 4 if(((i%7)==0||(i)==0)&&(iw)!= 0) a[(*n)++]=i; 【审题分析】 (1)该程序的解题思路,可以分解为以下几步:判断是 否被 7整除→判断是否被 11整除→并且不被 77整除→按要 求返回计算结果。 (2)从已给部分源程序的 main主函数开始入手,核心 函数“fun (aa, &n);”,其中 n返回这些数的个数,aa传给函 数中的参数,存放计算结果的数组 a。 【解题思路】 进入 fun函数,根据前面的分析: 首先,*n置 0,设置为累计器,计算符合条件的数的 个数。 然后,通过循环,判断小于 1000的每一个整数是否符 合题干中的要求。其中的判断条件能否被 7或者被 11整除 为 i%7==0||i==0,不能被 11和 7同时整除为 iw!=0, 它们之间的并关系就用&&连接,最后结果即为 (i%7==0||i==0)&&iw!=0。 第 68套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)s[i] (2)'9' (3)*t=n 【审题分析】 函数 fun的功能是统计形参 s所指字符串中数字字符出 11 最后,将符合条件的整数存入数组 a中,同时对*n进 行自加,返回结果。 【考点链接】数组操作;函数传值;if条件语句;for循 环语句。 3 4 for(i=0; i<26; i++) pp[i]=0; 5 while(*p){ 6 if(*p>='a'&&*p<='z')pp[*p-'a']+=1; 7 p++; 8 } 【审题分析】 第 69套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (3)c (1)1 (2)s[k] 【审题分析】 函数 fun的功能是移动下标为奇数位置的字符,将其右 移到下一个奇数位置,奇数的判断可用除以 2求余的方法, 如果 n%2==1则 n是奇数,否则 n是偶数。 【解题思路】 第一空:“ for(i=0; s[i]!='\\0'; i++) n++;”n记录了数组 s 的长度,“if(n%2==0)”如果长度 n是偶数,那么最右边被 移出的字符的下标是在 n-1,如果 n是奇数,那么最右边被 移出的字符的下标是 n-2,因此第一空处应为“1”。 第二空:题目要求最右边被移出字符串的字符绕回放到 第一个奇数位置,因此最右边被移出的字符是 s[k],在 s[k] 被替换之前必须先把 s[k]保存在其他变量中,故第二空处应 为“s[k]”,将 s[k]保存在 c中。 第三空:此处是把最右边被移出字符串的字符绕回放到 第一个奇数位置,最右边被移出字符保存在 c,第一奇数位 置是 s[1],故第三处应为“c”。 【考点链接】数组操作;循环结构。 该程序功能是统计字符串中 26个字母各自出现的次数。 解题思路,从已给部分源程序的 main主函数开始入手,函数 形参指针 tt接受主函数中字符数组 aa的起始地址,形参 pp 接受主函数中的 bb数组的起始地址,bb数组的每一个元素 都是计数器,bb[0]中统计字母“a”的个数,bb[1]中统计字 母“b”的个数,依此类推,bb[25]中统计字母“z”的个数。 【解题思路】 进入 fun函数,根据前面的分析: 首先,因为数组 pp的每一个元素都用作计数器,因此, 需要使数组 pp的每一个元素都置初值 0,通过“for(i=0; i<26; i++) pp[i]=0;”来实现。 然后,用指针依次指向字符串的每一个字符直到字符串 结束标志。 最后,在循环中根据*p的值不同,将累加器中的对应 元素加 1。 【考点链接】条件语句;数组操作;指针操作。 第 70套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)0或'\\0'(2)0(3)c 【审题分析】 函数 fun的功能是在形参 s所指字符串中寻找与参数 c 相同的字符,然后在其后插入一个与之相同的字符。在 fun 函数中,首先寻找与 c相同的字符,然后将其后面的字符往 后移动一个位置,在该字符的后面插入一个相同的字符。 【解题思路】 第一空:“ for(i=0; s[i]!=___1___; i++)”循环从第一个字 符到最后一个字符逐个搜索,字符串以“\\0”结束,因此循 环的结束条件是 s[i]!='\\0',故第一空处应为“0”或'\\0'。 第二空:显然“while(s[i+1+n]!='\\0')n++;”n是记录 s[i+1] 后面的字符数量,在 n计数之前,需要对 n赋初值,即第二 空处应为“0”。 第三空:在“for(j=i+n+1; j>i; j--)s[j+1]=s[j];”循环结束 时 j=i,即 s[j+1]是 s[i]之后的字符,在此位置插入字符 c, 所以第三空是“c”。 【考点链接】字符串处理。 二、程序修改题 【答案】 难度指数★★★ (1)long s=0, t=0; (2)t=t/10; 【审题分析】 本题中函数的功能是求 s=aa… aa -…- aaa - aa – a,此 处 aa…aa表示 n个 a,a和 n的值在 1~9之间)。本题解 题过程中首先利用循环求得每一项的值,然后再生成整个 数列。 【解题思路】 (1)当进入第一循环,“t=t*10+a;”语句,如果输入的 a是 3,并且利用题目中给出的初始化值 1,计算得出 t的值 为 13,而实际应该是 1,由此可知 t的初值设置不正确,不 应该是 1。所以将“long s=0,t=1;”改为“long s=0,t=0;”。 (2)循环中通过语句“t=t;”来获得每一项,每循 环一次,t的值应缩小 10倍,这里应该用除以 10来实现, 而不能用“%”求余数。所以将“t=t;”改为“t=t/10;”。 【考点链接】函数功能;循环条件;逻辑关系。 二、程序修改题 【答案】 难度指数★★ (1)double sum=0.0; (2)sum /=c; 【审题分析】 本题中函数的功能是计算数组元素中值为正数的平均 值(不包括 0)。首先选择数组中为正数的值,然后求这些 数的平均值。 三、程序设计题 【答案】难度指数★★★ 1 char *p=tt; 2 int i; 12 【解题思路】 (1)fun函数的返回值是 double型,返回值 sum的定义 类型原题定义为 int型,与 fun的定义类型不符,所以将“int sum=0.0;”改为“double sum=0.0;”。 (2)第二个标识下的“sum\\=c;”语句中的“\\”符号是 非法符号,这里应该是除号。所以,第二个标识下“sum\\=c;” 应该改为“sum/=c;”。 【考点链接】变量定义;C语言基本语法。 二、程序修改题 【答案】难度指数★★ (1)s[j++]=s[i];(2)s[j]='\\0'; 【审题分析】 三、程序设计题 【答案】 难度指数★ 1 int k; 2 float str=1.0,sum=1.0; 3 for(k=2;k<=n;k++) 4 { 5 sum=sum+k; //求得每一项的分母 6 str=str+1/sum; //级数累加求和 7 } 8 return str; 【审题分析】 本题中函数的功能是从字符串 s中删除所有小写字母 “c”。实现删除字符串中某字符的功能,首先就是对指定字 符的判定,然后将后面的字符依次向前移动或是将非指定字 符复制到另一个字符串。 【解题思路】 (1)fun函数中 for循环过程是把 s中不是字母“c”的 字符 s[i]复制到 s[j],j指向重新排序后的数组下标。j的初 值为 0,且在循环过程中一直没有变,所以将“s[j]=s[i];” 改为“s[j++]=s[i];”。 (2)操作字符串 s结束后,要在 j所指位置添加尾符标 志,所以第二个标识下“s[i]='\\0';”应该改为“s[j]='\\0';”。 【考点链接】函数功能。 三、程序设计题 【答案】 难度指数★★★★ 1 int i=0,n=0; //\号统计器 n赋初始 (1)该程序功能是求题目中的级数。解题思路可以分解 值 0 为以下几步:第一步先找出级数一般项和下标的关系,然后 2 char *p; 利用上一项的值累加来表示本项分子、分母,最后将各项的 3 p=a; //工作指针 p指向字符串 s 值累加求和。 4 while(*p=='*') (2)从已给部分源程序的 main主函数开始入手,核心 5 //循环统计前导\号数目 n 函数“s=fun(n);”传递参数 n给函数 fun中的 n。 6 { 【解题思路】 7 n++; 进入 fun函数,根据前面的分析: 8 p++; 9 } 首先,求得每一项分母的值 sum,即利用上一项来表示 10 while(*p) //截取\号字符 “sum=sum+k;”。 11 { 然后,对每一项进行累加“str=str+1/sum;”。 12 a[i]=*p; 最后,返回运算结果“str”。 13 i++; 【考点链接】for循环语句。 14 p++; 15 } 第 71套试题答案及详解 16 while(n!=0) 17 //在串尾开始添加 n个\号 18 { 一、程序填空题 19 a[i]='*'; 【答案】 难度指数★★★ 20 i++; (1)a (2)b.name (3)score[i] 21 n--; 【审题分析】 22 } 23 a[i]='\\0'; 本题中函数 fun的功能是将形参 a所指结构体变量中的 【审题分析】 数据赋给函数中的结构体变量 b,并修改 b中的学号和姓名, 该程序功能是将字符串中的前导“*”号全部移到字 最后输出修改后的数据。 符串的尾部。本题的解题过程首先由字符串起始位开始统 【解题思路】 第一空:fun的功能是将形参 a所指结构体变量中的数 据赋给函数中的结构体变量 b,因此第一空处为“a”。 第二空:“strcpy(__2__, \”是修改 b中的姓名, 因此第二空处为“b.name”。 第三空:“ for (i=0; i<3; i++) printf(\b.__3__);”是输出修改后的数据,因此第三空为“score[i]”。 【考点链接】函数功能;结构图。 计“*”数目 n,并且进行截取,然后在串尾添加 n个“*” 字符。 【解题思路】 (1)首先,设置一个指针变量指向字符串的头位置,并 使用循环,统计从字符串头开始的“*”号数目。 (2)当指针指向由字符串头开始的第一个非“*”号字 符,将指针指向的字符依次赋值给字符串。 (3)最后,当指针指向字符串尾时,开始添加第一步统 13 计的“*”号个数,然后在新生成的字符串尾加'\\0'。 【考点链接】指针操作。 第 72套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)struct student* (2)a->score[i] (3)a 【审题分析】 本题中函数 fun的功能是将形参 a所指结构体变量 s中 的数据进行修改,并把 a中地址作为函数值返回主函数,在 主函数中输出修改后的数据。 【解题思路】 第一空:主函数内 fun函数的调用形式是“t=fun(&s);”, t是 student结构体指针,故 fun函数的返回值是 student结 构体指针,因此第一空为“struct student *”。 第二空:“ for (i=0; i<3; i++) __2__+=1;”是修改 a的 score 数组元素的值,故第二空为“a->score[i]”。 第三空:此处补充返回值,由第一空的分析可知,返回 值是指针,a是指针变量,所以返回值为 a,即第三空为“a”。 【考点链接】结构体;结构体指针。 【解题思路】 (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构成四位 数。本题最多只考虑四位数。 【考点链接】逻辑关系;运算符。 第 73套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)FILE* (2)fp (3)ch 【审题分析】 函数 fun的功能是将形参给定的字符串、整数、浮点数 写到文本文件中,再用字符方式从此文本文件中逐个读入并 显示在终端屏幕上,本题主要考察文件的读写。 【解题思路】 第一空:由“fp=fopen(\”可知 fp是文件 型指针,故第一空处的变量 fp定义类型为“FILE *”。 第二空:“while (!feof(__2__))”是在没有达到文件未尾 的时候执行循环体内容,文件状态检测函数 feof的一般调 用形式是:feof(fp),其中 fp是文件型指针,故第二空处应 为“fp”。 第三空:题干要求从文件当中逐个读入数据并显示在终 端屏幕上,第三空处是将从文件当中读取的字符 ch显示在 屏幕上,故第三空处应为“ch”。 【考点链接】文件操作;函数功能。 二、程序修改题 【答案】 难度指数★★★ (1)char *fun(char (*sq)[M]) (2)return sp; 【审题分析】 本题中函数的功能是从 N个字符串中找出最长的那个 串。解题思路对 n个字符串取长度,然后对其长度值进行选 择判断。 【解题思路】 (1)第一个错误标识下 fun函数的定义根据题目要求, 返回最长的字符串,原题的“fun(char (*sq)[N])”的定义没 有指定返回值,所以“fun(char (*sq)[N])”应该改为“char *fun(char (*sq)[M])”,指定返回值为字符串。 (2)fun函数中定义 sp指针首先指向第一个串,用来存 放最长的那个串,然后在循环中 sp指向的串与 sq指向的其 他串长度进行比较,如果 sp指向的串长度小于 sq指向的串, 则 sq的值替换 sp指向的串,这样保证 sp指向的还是最大 的串,所以返回最长的串应将“return sq;”改为“return sp;”。 【考点链接】函数定义;函数功能。 二、程序修改题 【答案】 难度指数★★★ (1)s[j++]=s[i]; (2)s[j]='\\0'; 【审题分析】 该程序是对字符串中的字符逐个进行判断,判断其是否 为数字字符。从已给定源程序的 main主函数开始入手,调 用函数 fun(item);,对字符串 item中的字符进行判断,求得 该字符串中的数字字符并形成新串。 【解题思路】 (1)第一个标识下面“for(i=0,j=0; s[i]!='\\0'; i++)”语句 以 i为循环参数对字符串 s中的每一个字符进行循环判断, 把是数字的字符从 s[i]移到 s[j]中,j指向 s字符串的数组下 标,j的初始值为 0,且在循环过程中一直没有改变。显然 违背题意。因此“s[j]=s[i];”应改为“s[j++]=s[i];”。其中 三、程序设计题 “if(s[i]>='0'&&s[i]<='9')”为判断条件,判断每一个元素是否 【答案】难度指数★★ 为数字字符。 *c=(b)*1000+(a/10)*100+(b/10)*10+a; (2)第二个标识下面,字符串的结束应以'\\0'作为标志, 【审题分析】 所以程序中的“s[j]=\”语句应改为“s[j]='\\0';”。 该程序功能是将两个正整数合并形成一个整数的题型。 【考点链接】函数逻辑;数组操作。 本题类型首先要考虑整数的位数分离,然后要进行位数合 三、程序设计题 成。也就是先将数字的各位数拆开,改变排列顺序后,再组 【答案】 难度指数★★★★合成新的数字。 14 1 2 int i,j,n=0; for(i=0; i 的查找。 【解题思路】 (1)第一个错误标识下的 if语句应该是判断字符串中 的字符是否是空格,根据“for(; *p; p++)”语句中 for循环 条件中 p的定义应该为字符型指针变量,*p是取 p所指存 取单元的值,所以“if(p==' ')”应该改为“if(*p==' ')”。 (2)题干中要求是将每个单词的最后一个字母改成大 写,所以它的位置应该是挨着空格的前一个字符,应该是指 针 p指向字符的前一个位置,“*p=toupper(*(p-1))”是将改 动的值赋给了 p所指的空格,所以应该改为“ *(p-1)= toupper(*(p-1));”且语句未尾应有分号。 【考点链接】函数功能。 3 { 4 for(j=0; j 9 b[n]='\\0'; 【审题分析】 本题中首先要清楚数组元素在通常情况下是按行存放 的,而如果要实现按列存放,其对应关系应为:s0][0],s[1][0], str[2][0],…,s[M-1][0],s[0][1],s[1][1],…,s[M-1][N-1]。 【解题思路】 (1)利用两重循环,依次取矩阵中的元素。 (2)其中注意指针数组与数组指针的区别,其中数组指 针 b,它指向包含 4个元素的一维数组。 (3)最后,在一维数组字符处理完毕后,一定要使其尾 元素赋值为串结束符'\\0'。 【考点链接】数组操作;指针操作。 三、程序设计题 【答案】 难度指数★★★ 1 char t; 2 int i,j; 3 for(i=1;i 7 //将 str[i]设为最大值,和剩下的 j~ num-1进行比较 8 { 9 t=s[i]; 10 s[i]=s[j]; 11 s[j]=t; 12 } 【审题分析】 该程序功能是对字符的排序。字符的排序有多种方法, 如冒泡排序、选择排序等。本题答案中采用的是选择排序。 其中,选择排序法的降序排序,首先从数组中挑选一个最大 的元素,把它和第一个元素交换,接着从剩下的 num-1个 元素中再挑出一个最大的元素,把它和第二个元素交换,不 断重复以上过程,直到比较完最后两个元素。 【解题思路】 进入 fun函数,根据前面的分析: 选择排序法中的降序排序,首先从数组中挑选一个最大 的元素,把它和第一个元素交换,接着从剩下的 num-1个 元素中再挑出一个最大的元素,把它和第二个元素交换,不 断重复以上过程,直到比较完最后两个元素。 【考点链接】数组操作;函数传值;if条件语句;for循 环语句。 第 74套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)ss[i](2)n+j(3)1 【审题分析】 函数 fun的功能是求出形参 ss所指字符串数组中最长 字符串的长度,将其余字符串右边用字符*补齐,因此首先 找到长度最长的字符串,然后逐个对其他字符串的末尾添加 “*”,直至长度等于最长字符串的长度。 【解题思路】 第一空:第一个循环求最长字符串的长度 len,在第二 个循环内在其他字符串的后面补“*”,使其达到长度 len。 在“for(j=0; j 第二空:循环“for(j=0; j 第三空:字符串以“\\0”结束,因此需在字符串后加结 束符,故第三空应为“1”。 【考点链接】循环结构;字符串处理。 二、程序修改题 【答案】难度指数★★★ (1)if(*p==' ') (2)*(p-1)=toupper(*(p-1)); 【审题分析】 本题中函数的功能是将每个单词的最后一个字母改成 大写。该题的解题思路根据题干中“这里的?单词?是指由 空格隔开的字符串”可以归纳为主要是对字符串中空格字符 第 75套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)j++ (2)s[i]=t1[i] (3)j 【审题分析】 函数 fun的功能是将 s所指字符串中的所有数字字符移 到所有非数字字符之后,在 fun函数中,先将非数字字符和 15