数字字符分别存储在数组 t1和 t2中,然后将数组 t2和 t1按 照非数字字符在前、数字字符在后的方式放在字符串 s中。
【解题思路】
第一空:如果 s[i]是数字字符,则将 s[i]保存在 t2数组 中,同时变量 j自增,准备下次保存数字字符,故第一空处 应为“j++”。
第二空:语句“for(i=0; i 第三空:循环“for(i=0; i<___3___; i++)”是将数字字符 保存在 s字符串的后面,数字字符的个数为 j,因此这里是 将 j个数字字符保存在 s字符串的后面,故第三空处应为“j”。 【考点链接】字符串处理。 件,那么对统计计数变量进行加 1操作。 【考点链接】数组操作;指针操作。 第 76套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)i+1 (2)k=j (3)t 【审题分析】 函数 fun的功能是用是选择排序对 M个字符串由短到 长进行排序,是选择排序法降序排序,首先从字符串中挑选 一个最短的字符串,把它和第一个字符串交换,接着从剩下 的 M-1个字符串中再挑出一个最短的字符串,把它和第二 个字符串交换,不断重复以上过程,直到比较完最后一个字 符串。 【解题思路】 第一空:由审题分析可知,外循环 i=0时,内循环变量 从 i+1到 M-1(下标从 0开始),从 M-1个字符串中再挑出 一个最短的字符串,故第一空处应为“i+1”。 第二空:k记录最短字符串的下标,内循环开始前 k赋 初值 i,内循环从剩下的 M-i个字符串里面找最短的,比较 k字符串和 j字符串的长度大小,如果 n[k]>n[j],则把 j赋 给 k,即第二空处应为“k=j”。 第三空:if(k!=i)说明找到了新的更短的字符串,那么把 它和第 i个字符串交换,因此第三空处应为“t”。 【考点链接】循环结构,二维数组。 二、程序修改题 【答案】难度指数★★★ (1)for(j=i+1; j<6; j++) (2)*(pstr+i)=*(pstr+j); 【审题分析】 本题中函数的功能是用冒泡法对 6个字符串按由小到 大的顺序进行排序。其中,冒泡排序法的过程是从数组的首 元素开始,依次对相邻的两个元素进行比较,当发现前面的 数字大于后面时就进行依次交换,从头到尾比较完一遍就挑 出一个最大的数,将其排在最后面,n个数要比较 n-1遍, 其中第 j遍要两两相比 n-j次。 【解题思路】 (1)C语言中,for语句形式是:for(表达式 1;表达式 循环体语句。 2;表达式 3) 因此第一个标识下,for使用错误,应该为“for (j=i+1; j<6; j++)”。 (2)if语句后的复合语句的功能是把“*(pstr+i)”中和 “*(pstr+j)”中的地址进行交换,而“*(pstr+i)=pstr+j;”中 “ pstr+j;”并不是字符串的地址,所以第二个标识下 “*( pstr+i)=pstr+j;”改为“*( pstr+i)=*( pstr+j);”。 【考点链接】函数定义;指针操作。 二、程序修改题 【答案】 难度指数★★ (1)void fun(char *str, char ch) (2)if(*str !=ch) (3)str[1]='\\0'; 【审题分析】 该题中函数功能首先是查找子串再判断,最后是实现将 符合条件的字符串进行连接。从已给定源程序的 main主函 数开始入手,通过“fun(s,c);”语句调用 fun函数,实现题 干的要求。 【解题思路】 (1)第一个标识下,“ void fun(char str, char ch)”根据主函 数中的 fun函数的调用“fun(s,c)”,知道 s为数组名,传的应 该是数组地址,所以应改为“void fun(char *str, char ch)”。 (2)while循环中对 ch与 str进行匹配检查,第二个标 识下,是当不同时执行连接操作,那么判断*str与 ch是否 不同的表达式应该是“if(*str !=ch)”。 (3)第三个标识下,连接后的新串要添加结尾符,所以 正确的表达是将“str[1]='0';”改为“str[1]='\\0';”。 【考点链接】函数定义语法;数组操作。 三、程序设计题 【答案】 难度指数★★★★ 1 int cnt=0; 2 char *p=ss; 3 4 while(*p){ 5 if(*p==c)cnt++; 6 p++; 7 } 8 return cnt; 【审题分析】 该程序功能是统计字符串中指定字符的个数。解题思路 是在循环过程中,对字符进行判断,如果符合题干要求,对 其个数进行统计。 【解题思路】 如果不是串尾就进入 while循环,在循环过程中利用 if 条件表达式判断当前字符是否为指定的字符,如果符合条 三、程序设计题 【答案】难度指数★★ 1 char b[N]; 16 【解题思路】 (1)根据题干中求得除了头结点之外的结点数据域中的 memset(b, 0, N); 最大值,头指针 h,工作指针 p指向头结点的下一个结点, for(j=strlen(s)-1; j>=0; j--)b[i++]= 所以第一个标识下的“p=h;”指向头结点应该改为指向下一 s[j]; 个结点“p=h->next;”。 6 strcpy(s, b); (2)工作指针 p,利用 p实现对链表的遍历,p表示指 【审题分析】 向链表的当前结点,所以指向下一个结点应该是“p=p-> 该程序功能是字符串中的内容逆置。把字符串中字符 next;”。 逆置,就是把字符串中的第一个元素和最后一个元素交换, 【考点链接】链表操作;函数功能。 第二个元素和倒数第二个元素交换,直到所有元素交换完 三、程序设计题 成为止。 【解题思路】 【答案】难度指数★★★★ 进入 fun函数,根据前面的分析: 1 int i,n=0,flag=1; //初始设置标识位 首先求得字符串的长度,然后通过循环进行字符交换。 flag=1 要注意的是,如果字符串长度是奇数,则最中间的元素在逆 2 char *p=str; //设置工作指针 置前后的位置是没有改变的。 3 while(*p) //取字符串大小 【考点链接】数组操作;指针操作;while语句。 4 { 5 n++; 6 p++; 7 } 8 for(i=0;i 9 //循环判断字符串 s是否为回文 10 if(str[i]==str[n-1-i]); 11 //设置比较位 j为 n-1-i 12 else 13 //若不符合条件,标识位设为 0,跳出循环 14 { 15 flag=0; 16 break; 17 } 18 return flag; 【审题分析】 该程序功能是判断字符串是否为回文。其中,回文是指 顺读和倒读都一样的字符串。解题过程首先利用 while循环 取得字符串的长度 n,然后循环判断正序第 i个字符和其对 应的逆序字符 n-1-i个是否相等,也就是判断是否是回文。 【解题思路】 进入 fun函数,根据前面的分析: 主要思路是: (1)首先用整型变量 i表示所判断的字符串中前面对应 元素的下标。i初值为 0,n是字符串的长度,通过循环来求 得 n。 (2)然后,把下标为 i的字符与下标为“n-1-i”的字符 比较,如果相同,i加 1,继续进行一对一的字符比较。不 断重复此过程,直到 i≥n/2为止。在此过程中,如果下标为 i的字符与下标为“n-1-i”的字符不相同,则可以断定字符 串不是回文,立即退出函数。 (3)如果正常结束循环,就说明字符串符合回文条件。 【考点链接】数组操作;指针操作;函数传值。 2 3 4 5 int i=0, j; 第 77套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)double(2)f1(3)f2 【审题分析】 本题中函数 fun的功能是用函数指针指向要调用的函 数,并进行调用,主要考察函数的指针的使用。存放函数的 入口地址的指针是指向函数的指针,简称函数的指针。 【解题思路】 第一空:由“f=__2__; /* point fountion f1 */”和“r1= f(a);”可知 f是一个函数的指针,且 f指向的函数的返回值 为 double型,函数的指针的定义方式是:类型标识符(*指针 变量名)(),故第一空处的函数的指针的定义为“double”。 第二空:“f=__2__; /* point fountion f1 */”和“r1=f(a);” 可知 f指向的函数只有一个参数 a,因此 f指向 f1函数,即 第二空处为“f1”。 第三空:“ f=__3__; /* point fountion f2 */”和 “r2=(*f)(a,b);”,f指向的函数有两个参数,因此 f是指向 f2 函数,故第三空处应为“f2”。 【考点链接】函数的指针。 二、程序修改题 【答案】 难度指数★★★★ (1)p=h->next; (2)p=p->next; 【审题分析】 (1)该题中函数功能是单向链表结点(不包括头结点) 数据域为偶数的值累加起来,并且作为函数值返回。对单向 链表进行遍历,并在遍历过程查找数据域为偶数的结点,并 将数据域为偶数的元素累加起来。 ( 2)从已给定源程序的 main主函数开始入手, “head=creatlink(12);”语句生成随机数的链表,“ outlink(head , stdout);”输出输出该链表,“ even=fun(head);”语句调用函数 fun 求得链表中的数据域为偶数的值的累加和。 17 第 78套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)k(2)len(3)ss[i][j] 【审题分析】 函数 fun的功能是求出形参 ss所指字符串数组中最长 字符串的长度,并其余字符串左边用字符*补齐,因此首先 找到长度最长的字符串,然后逐个对其他字符串的开始位置 添加“*”,直至长度等于最长字符串的长度。 【解题思路】 第一空:第一 for循环寻找最长的字符串,变量 n记 录字符串的长度,k记录最长字符串的下标位置。i=0时, 将 n赋值第一个字符串的长度,假设第一个字符串长度最 长,以后其他字符串和 n比较,如果比 n大,则把新的字 符串长度赋给 n,k记录新的字符串下标位置,因此第一空 处应为“k”。 第二空:“ss[i][m--]=ss[i][j];”是将字符串 ss[i][j]的字符 往后移动,腾出左边位置补“*”。字符串的长度为 len,字 符串的最后一个字符 ss[i][len-1]移动到 ss[i][n-1],ss[i][len-2] 移动到 ss[i][n-2],直到全部字符都往后移动 len位,因此第 二空处应为“len”。 第三空:此处的循环是把空处来的位置补上“*”,因此 第三空处应为“ss[i][j]”。 【考点链接】循环结构;数组。 8 s[i]='\\0'; 【审题分析】 该程序功能是删除字符串中指定的字符。解题过程,首 先利用循环在字符串中查找指定的字符,然后对其进行删除 操作。 【解题思路】 进入 fun函数,根据前面的分析: (1)首先,设置一个指针变量指向字符串的头位置,并 使用循环,依次查找字符串中的指定字符。 (2)若找到指定字符,则将后面位置的第一个非指定字 符移到当前位置,并将其后的字符也依次前移。 (3)最后将处理的字符串输出。 【考点链接】指针操作。 第 79套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)h->next (2)p->next (3)>= 【审题分析】 本题中函数 fun的功能是将带头节点的单向链表结点数 据域中的数据从小到大排序,在 fun函数内采用的是选择法 排序。 选择排序法中的升序排序,首先从数组中挑选一个最小 的元素,把它和第一元素交换,接着从剩下的 n-1个元素中 再挑出一个最小的元素,把它和第二个元素交换,不断重复 以上过程,直到比较完最后两个元素。 【解题思路】 第一空:由审题分析可知,q从 h的下一个元素开始寻 找最小值,故第一空为“h->next”。 第二空:由审题分析可知,while循环是在剩下的元素 当中找最小值,剩下的结点是由 q指向的链表,q从 p的后 一个结点开始,故第二空处应为“p->next”。 第三空:“ if (p->data __3__ q->data)”是比较 p结点和 p 结点数据的大小,如果 p结点的数据比 q结点的数据大,那 么应该将 p结点和 q结点的数据进行交换,故第三空处应为 “>=”。 【考点链接】链表。 二、程序修改题 【答案】难度指数★★★ (1)result*=n--; (2)return result; 【审题分析】 本题中函数的功能是计算整数 n的阶乘。其中,阶乘的 计算公式分为参数 n是 1和大于 1两种情况,例如,1的阶 乘 1!=1;5的阶乘 5!=5×4×3×2×1。 【解题思路】 (1)第一个标识下 while循环过程实现 n的阶乘,根据 阶乘的算法 n!=n*(n-1)*…*1,题干中的语句“result *=--n;” 先对 n进行减 1操作,结果就少乘了 n,所以将“result *=--n;” 改为“result *=n--;”。 (2)根据 fun函数的定义,fun函数应该返回阶乘结果, 所以第二个标识下填空为“return result;”。 【考点链接】函数功能;函数返回值。 二、程序修改题 (1)p=h->next; (2)p=p->next; 【审题分析】 (1)该题中函数功能是求单向链表结点(不包括头结 点)数据域中的最大值。其中,单链表查找最大值及最小 值的方法主要是对单链表的遍历,并在遍历过程中将初始 化的最大值、最小值与链表中的每一个结点的数据域进行 比较。 ( 2)从已给定源程序的 main主函数开始入手, “head=creatlink(12,100);”语句生成随机数的链表,“outlink (head,stdout);”输出输出该链表,“m=fun(head);”语句调用 函数 fun求得链表中的最大值。 三、程序设计题 【答案】 难度指数★★★ 1 char *p=s; 2 int i=0; 3 4 while(*p){ 5 if(*p !=c)s[i++]=*p; 6 p++; 7 } 18 【解题思路】 (1)根据题干中求得除了头结点之外的结点数据域中的 最大值,头指针 h,工作指针 p指向头结点的下一个结点, 所以第一个标识下的“p=h;”指向头结点应该改为指向下一 个结点“p=h->next;”。 (2)工作指针 p,利用 p实现对链表的遍历,p表示指 向链表的当前结点,所以指向下一个结点应该是“p=p-> next;”。 【考点链接】链表操作;函数功能。 故第二空处应为“<”。 第三空:变量 k记录了最小字符串的下标位置,函数的 返回值是最短的字符串所在的行下标,故第三空处应为“k”。 【考点链接】字符串处理,排序。 二、程序修改题 【答案】难度指数★★ (1)if(('a'<=tt[i])&&(tt[i]<='z')) (2)tt[i]-=32; 【审题分析】 本题中函数的功能是将字符串中的小写字母改为对应 的大写字母。首先判断字母是否为小写字母,如果是小写字 母则进行转换。 【解题思路】 (1)第一个错误标识下的 if判断语句中的逻辑有误, 应该是与(&&)的关系,不是或(||)的关系,所以 if判断 语句改为“if(('a'<=tt[i])&&(tt[i]<='z'))”。 (2)第二个标识下小写字母转换为大写字母的转换算法 有误,小写转换为大写应该是减去 32,而不是加上 32,所 以“tt[i]+=32;”改为“tt[i]-=32;”。 【考点链接】大小写字符之间的转换。 三、程序设计题 【答案】 难度指数★★★★ 1 int i,j; 2 for(i=0;i 5 b[*n]=*(*(s+i)+j); 6 *n=*n+1; 7 } 【审题分析】 该程序功能是将 M行、N列的二维数组中的数据,按 行的顺序依次放到一维数组中。本题中首先要清楚数组元素 在通常情况下是按行存放的,而如果要实现按行存放,其对 应关系应为: s[0][0],s[0][1],s[0][2],…,s[0][M-1],s[1][0], s[1][1],…,s[N-1][M-1]。 【解题思路】 (1)利用两重循环,依次取矩阵中的元素。 (2)其中注意指针数组与数组指针的区别,其中数组指 针 s,它指向包含 4个元素的一维数组。其数据元素的表示 方式为:“*(*(s+i)+j)”。 【考点链接】指针操作。 三、程序设计题 【答案】 难度指数★★★ 1 int i,j; 2 int t=0; //初始化数组个数 3 for(i=2;i 数是否为素数 4 { 5 j=2; 6 while(j 8 if(i%j==0) //如果 i不是素数 9 { 10 xx[t]=i; 11 t++; 12 break; 13 } 14 j++; 15 } 16 *k=t; 17 } 【审题分析】 该程序功能是将所有大于 1小于整数 m的非素数存入 xx所指数组中。求素数的常用方法是:从 2到 m-1去除 m, 如果中间的任何数被整除,则不是素数。 【解题思路】 (1)根据求素数的方法判断数 i是否为素数。 (2)把不是素数的数留下来,其方法是:如果该数是素 数则不处理;如果不是素数则放到数组 xx中,并且把数组 的下标加 1,为下一个不是素数的数放在数组中做准备。 (3)返回个数,把 xx数组中已经写入的数的个数返回 即可,即把数组 xx的最大下标加 1返回即可。 【考点链接】数组操作;指针操作;函数传值。 第 80套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)M (2)<(3)k 【审题分析】 函数 fun的功能是求 ss所指字符串数组中长度最短的 字符串所在的行下标。求最短字符串所在的下标,一般假设 第一个字符串的长度最短 min,用 k记录最长字符串的下标 的话,开始时 min=strlen(ss[0]),k=0,然后逐个比较其他字 符串长度,如果字符串 ss[i]长度比 min小,则将 min赋值为 这个字符串长度,k=i,如此便可求得最短字符串和最短字 符串所在的下标位置。 【解题思路】 第一空:循环的目的是在 M个字符串中寻找长度最短 的字符串,因此循环变量 i从 0变化到 M-1,故第一空处应 为“M”。 第二空:*n记录最小字符串的长度,由审题分析可知, 字符串 ss[i]长度比 min小,则交换最小长度值和下标位置, 19 第 81套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)fp (2)==(3)fp 【审题分析】 函数 fun的功能是从指定文件中找出指定学号的学生数 据,读入此学生数据,对该生的分数进行修改,修改后存储 到原文件当中。 【解题思路】 第一空:“while (!feof(__1__))”是在文件没有达到文件 尾的情况不断读取文件内容,文件状态检测函数 feof的调 用形式为:feof(fp),其中 fp为文件指针,故第一空处应为 “fp”。 第二空:题干要求找到指定学号的学生数据,“ if (n.sno__2__sno)”是比较读取出来的 n学生的学号和指定的 学好 sno是否相等,故第二空处应为“==”。 第三空:此处是补充 fseek函数的参数,fseek的调用形 式是:fseek(fp, offset, position),其中第一个参数是文件型指 针,故第三空处应填文件型指针变量“fp”。 【考点链接】文件操作;函数功能。 【审题分析】 该程序功能是求出链表中的最大值。其中,对于链表中 最大值的主要算法是遍历链表中的每个节点,在访问过程中 对各节点进行比较,找出数据域的最大值。 【解题思路】 进入 fun函数,根据前面的分析: (1)设置一个工作指针,指向头节点。设置一个变量存 放最大值,初值为头节点数据域的值。 (2)移动工作指针到后一个节点,并将数据域的值与 max比较,将较大的值存入 max。 (3)移动工作指针,指向下一个节点,直到指针指向链 表尾。 【考点链接】指针操作;do while循环语法。 第 82套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (1)*std (2)PERSON (3)std 【审题分析】 fun函数的功能是将形参指针所指结构体数组中的三个 元素按 num成员进行升序排列,在函数体内部,利用 3个 if语句来进行判断排序。 【解题思路】 第一空:fun函数的功能是将形参指针所指结构体数组 中的三个元素进行排序,可知 fun函数的参数是指针,由 “if(std[0].num>std[1].num)”可知形参名为 std,故第一空处 应为“void fun(PERSON *std)”。 第二空:temp变量用来进行交换时临时保存变量值, 由“temp=std[0];”可知 temp是 PERSON结构体变量,故第 二空处的 temp结构体定义应为“PERSON temp;”。 第三空:这里是调用 fun函数,fun函数的参数是结构 体变量指针,std是结构体数组,数组名相当于数组的首地 址,故第三空处应为“fun(std);”。 【考点链接】结构体;指针。 二、程序修改题 【答案】 难度指数★ (1)n=strlen(aa); (2)ch=aa[i]; 【审题分析】本题中函数的功能是根据题干中的算法对 字符串进行排序。其中,插入法的基本算法是:先对字符串 中的头两个元素进行排序。然后把第三个字符插入到前两个 字符中,插入后前三个字符依然有序;再把第四个字符插入 到前三个字符中…… 【解题思路】 (1)strlen是求字符串长度的函数,函数调用的形式是: strlen(字符串地址),故第一标识下应改成“n=strlen( aa );”。 (2)程序调试时会提示“c=aa[i];”中的 c未定义,insert 函数中定义的是变量 ch作为存放 aa字符串中字符的临时变 量,然后对其与其他字符进行比较。所以将“c=aa[i];”改 为“ch=aa[i];”。 【考点链接】插入排序法;变量应用。 二、程序修改题 【答案】 难度指数★★★ (1)int k, q, i; (2)pt[i]=str[k][i]; 【审题分析】 本题中函数的功能是将 m(1≤m≤10)个字符串连接 起来,组成一个新串。解题思路对 m个字符串取长度,然 后对其长度值进行选择判断。本题函数的实现思路是以输入 的字符串个数为外循环,以每一个字符串为内循环,依次将 字符串中的字符赋值到指定的字符串。 【解题思路】 (1)第一标识下是整型变量 k、q和 i的定义,根据 C 语言中整型变量的定义方式,第一标识下应为“int k, q, i;”。 (2)第二个标识下的“pt[i]=str[k,i];”语句应该将 str中 的字符依次拷贝到 pt中,根据 C语言中对二维数组每一位 的取值,应该是 str[k][i],所以“ pt[i]=str[k,i];”改为 三、程序设计题 【答案】 难度指数★★★★ 1 double max=h->s; 2 STREC *p; 3 p=h->next; 4 while(p) 5 {if(p->s>max) 6 max=p->s; 7 p=p->next; 8 } 9 return max; 20