【审题分析】
该程序功能是删除字符串中下标为偶数的字符。解题过
三、程序设计题
程利用 if判断表达式选择下标为奇数的字符,然后将符合 条件的字符放入指定的字符串,这样就实现了函数功能。
【解题思路】 (1)判断一个字符串中的某一字符下标 i是否为偶数, 可用“i%2==0”来判断;也可以从下标 0开始,每次增 2。
(2)对串 s中各个字符逐个进行考查,下标为奇数的字 符就顺序放在新串 t中,否则就不存放。
(3)所有字符处理完后,记得在新串 t的末尾加上结束 符“'\\0'”。
【考点链接】数组操作。
第 91套试题答案及详解
一、程序填空题
【答案】 难度指数★★★
(1)next (2)0或 NULL (3)r 【审题分析】
函数 fun的功能是将带头结点的单向链表逆置,从第二 个结点开始,分别将结点的指针指向前一个结点便可完成单 项链表的逆置。
【解题思路】
第一空:“p=h->__1__;”对结点 p进行初始化,由审题 分析可知,p初始化为链表的第二个结点,即 p->next,故 第一空处应为“next”。
第二空:“ if (p==__2__) return;”如果链表只有一个结点, 无需逆置,即第二空处为“0”或“\\0”或“NULL”。
第三空:循环内完成结点的指针指向前一个结点, “r=q->next;”已经指向 q的下一个结点, q->next=p;”将 q r“
结点指向链表的前一个结点,“p=q;”是将 p结点往后移动 一个结点位置,第三空处是 q结点往后移动一个结点位置, 即第三空处为“r”。
【考点链接】链表。
【答案】难度指数★★★ 1 int i,j,k=0;
2 for(i=0;i 4 for(j=0;j 8 b[k]=*(*(a+i)+j); 9 //将行中的值赋值给数组 b 10 k++; //数组下标加 1 11 } 12 else //如果指向尾,则跳出这一行 13 break; 14 b[k]='\\0'; //数组加尾符 15 } 【审题分析】 该程序功能是将放在字符串数组中的 M个字符串(每 串的长度不超过 N),按顺序合并组成一个新的字符串。其 中,存储在二维字符数组中的每一行,都是一个字符串;在 每个字符串的结尾处,各有一个字符串结束符'\\0'。 【解题思路】 (1)二维字符数组第 i行 j列元素 a[i][j],就是指针形 式的*(*(a+i)+j)。因此,如果字符*(*(a+i)+j)是串的结束符, 则说明该字符串已经结束。 (2)当一维字符数组存放完字符串中各字符后,必须在 一维字符数组的尾字符处加一个结束符'\\0',才能把字符数 组变成字符串。否则,字符数组就只能是非字符串的一般字 符数组。 【考点链接】数组操作;指针操作。 第 92套试题答案及详解 【答案】 难度指数★★★★ (1)x (2)p (3)s 【审题分析】 函数 fun的功能是把形参 x的值放入一个新结点并插入 到链表中,插入后各结点数据域的值仍保持递增有序。利用 循环搜索链表,找到插入位置,将新结点插入到链表当中。 【解题思路】 第一空:“s=(SLIST *)malloc(sizeof(SLIST));”显然 s是 一个新结点,第一空处是给新结点的数据域赋值 x,因此第 一空处应该是“s->data=x;”。 第二空:循环“while(p!=NULL&&x>p->data)”是用来 寻找插入位置,当链表没有结束且 x仍然大于 p所指向的结 点的数据时,就不断的向链表后面搜索。在循环体内,语句 “p=p->next;”是找到下一个结点的地址,变量 q用来保存当 前结点的地址,因此第二空处应该是“q=p;”。 第三空:“s->next=p;”将 s插入链表当中,s指向 p, 此时 s结点已经指向需要插入位置的下一个节点,因此在需 二、程序修改题 【答案】 难度指数★★ (1)r=t; (2)if(*r==0) 【审题分析】 本题中函数的功能是计算字符串中含有某子串的数目。 本题的解题思路是利用两个指针分别指向主串和子串,然后 利用循环进行判断,如果子串正常结束,就证明子串在主串 中出现。 【解题思路】 (1)根据“while(*r) if(*r==*p){r++; p++;}”可知该循环 是比较 r和 p指向的字符串是否相等,本题的要求是计算字 符串中含有某子串的数目,p指向的源字符串 s,所以 r应 指向的是字符串 t,故第一标识下应改成“r=t;”。 (2)根据题意第二标识下“if(*r=0)”应该是判断 r是否 指向字符串尾,在 C语言中,等于是用“==”标识,因此 第二标识下应改成“if(*r==0)”。 【考点链接】赋值;指针传值。 一、程序填空题 26 要插入 s结点的位置的上一个结点需要指向 s结点,故第三 处应该为“q->next=s;”。 【考点链接】链表;指针。 二、程序修改题 【答案】 难度指数★★ (1)long k=1; (2)num/=10; 【审题分析】 (1)本题中函数的功能是计算正整数 num各个位上的 数字之积。首先要对正整数进行截取,取得该正整数的各个 位上的数字,然后对求得的数进行累积。 (2)从已给定源程序的 main主函数入手,通过键盘输 入一个正整数 n,语句“printf(\”调用 fun 函数求得 n各个位上的数字之积。 【解题思路】 (1)第一个错误标识下的 k是函数的返回值,子函数 fun 中在执行“k*=num ;”之前,只进行了定义,却没有赋 初值,编译时会警告变量在使用之前没有初始化 k。k代表 了各个位上的数字之积,其初值应为 1。因此,第一个标识 下的“long k;”改为“long k=1;”。 (2)第二个标识下的符号“\\”是非法字符,根据题意, 这里应该是进行除法运算,所以“num \\=10;”应该改为“num /=10;”。 【考点链接】变量初始化;算术表达式语法。 故第一空处循环变量每次增 1,共循环 N次,完成对 N行 的移位操作,因此第一空处应为“i++”。 第二空:循环“for(j=N-1-m; j>=0; j--)”是进行行元素 中的值右移 m个位置,即把 t[i][j]元素放置在 t[i][j+m]上, 因此第二空应为“m”。 第三空:循环“for(j=0; j<___3___; j++)”是对空出来的 位置补 0,每行元素的前 m位数据已经移动到后面,每行空 处 m个元素,因此第三空为“m”。 【考点链接】数组;循环结构。 二、程序修改题 【答案】 难度指数★★ (1)while((2<=high)&&(n<10)) (2)yes=0; break; 【审题分析】 本题中函数的功能是计算并输出 high以内最大的 10个 素数之和。其中,素数是只能被 1和本身整除的正整数(>1), 所以判别 n是否为素数,只要用 2、3、…、n/2这些数逐个 去除 n,观察余数是否为 0即可,只要有一次相除余数为 0, n就不是素数,否则 n为素数。 【解题思路】 (1)C语言中左右括弧必须成对出现,在第一个标识下 “while ((high>=2)&&(n<10)”中,显然缺少一个右括弧,应 改为“while((2<=high)&&(n<10))”。 (2)在判断素数的循环过程中,只要被判断的数能被某 数整除就不是素数,就会跳出判断循环,在 C语言中使用 break语句跳出循环,并且 C语言中的语句使用分号为结尾。 所以“break”应改为“break;”。 【考点链接】C语言基本语法。 三、程序设计题 【答案】 难度指数★★ 1 int i; 2 float ave=0.0; 3 for(i=0; i 【审题分析】 该程序功能是计算 n门课程的平均分,求解过程首先统 计 n门课的总分,然后根据总分求得平均分。 【解题思路】 (1)在函数中首先定义平均分的变量,并将其初始化值 置为 0。 (2)然后在 for循环中,求得所有成绩的总分,并在总 分的基础上求得平均分。 【考点链接】数组操作;函数传值。 三、程序设计题 【答案】 难度指数★★★ 1 float x0, x1=0.0; 2 do { 3 x0=x1; 4 x1=cos(x0); 5 } while(fabs(x0-x1)>0.000001); 6 return x1; 【审题分析】 该程序功能是利用简单迭代方法求方程的一个实根。牛 顿迭代法的求解思想是从一个初始值开始,逐步逼近所求方 程的根。 其具体过程是:将初始值代入迭代公式,得到一个迭代 第 93套试题答案及详解 输出值。再次迭代时,将上一次的迭代输出值当作本次的迭 代输入。不断重复以上过程,直到满足题目要求为止。 一、程序填空题 牛顿迭代公式为:Xn+1=Xn-f(x)/f(x)。 其求解过程在题干中已经给出。 【答案】 难度指数★★★ 【解题思路】 (1)i++ (2)m (3)m 进入 fun函数,根据前面的分析: 【审题分析】 根据题中给出的求解步骤,首先 x1初值为 0.0;若 x0-x1 函数 fun的功能是将每行元素中的值均右移 m个位置, 对每行元素,首先移动 m个位置,然后将空出来的位置补 0。 的绝对值大于 0.000001就循环进行迭代,即“ x0=x1; x1=cos(x0);”直到满足题目中的要求,返回 x1,即实根。 【解题思路】 【考点链接】do-while循环语法。 第一空:题目要求对每行元素中的值均右移 m个位置, 27 5 a[j]=i; 6 j++; 7 } 8 *n=j; 【审题分析】 该题是求某范围内能被 7或 11整除的数。该程序的解 第 94套试题答案及详解 一、程序填空题 【答案】难度指数★★★★ (1)q(2)next(3)next 【审题分析】 函数 fun的功能是删除链表中数据域值相同的结点,只 保留一个。利用循环搜索整个队列,对比相邻的两个结点, 如果结点的数据域值相同,删除其中一个,不同则继续往下 搜索。 【解题思路】 第一空:p和 q是两个 SLIST结构体指针,分别指向两 个相邻的结点。“if (p->data==q->data)”成立则应该删除其 中一个结点,“p->next=q->next;”p指向 q的下一个结点, 那么 q结点就可以删除了,因此第一空处应该为“free(q);”。 第二空:在第一空处,q指向的结点已经被删除,如果 要继续循环搜索数据域值相同的结点,那么 q需要重新指向 p的下一个结点,因此第二空处应该为“q=p->next;”。 第三空:如果“if (p->data==q->data)”不成立,那么 p 和 q都向结点尾移动一个结点位置,因此第三空处应该是 “q=q->next;”。 【考点链接】链表;指针;循环结构。 题思路可以分解为以下几步:判断是否被 7整除→判断或者 是否被 11整除→按要求返回计算结果。 【解题思路】 进入 fun函数,根据前面的分析: (1)数 i能否被 7或 11整除,它的逻辑表达式为 “(i%7==0||i==0)”。 (2)其中满足被 7或 11整除的数的个数,可以用累加 器 j来计数。 【考点链接】指针操作;for循环语句;数组操作。 第 95套试题答案及详解 一、程序填空题 【答案】 难度指数★★★ (3)fname (1)fp (2)fclose(fp) 【审题分析】 题目要求将自然数 1~10以及它们的平方根写到名为 myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。 主要是文件操作以及 fopen、fprintf和 fscanf函数的使用。 【解题思路】 第一空:fprintf函数的调用形式是 fprintf(fp,格式字符 串,输出列表),其中 fp是指向将要写入文件的文件指针, “fprintf(___1___,\”是将 i和 i的平 方根写入文件,因此( 1)应该填入文件指针,由 “if((fp=fopen(fname, \”可知,这里 fp是文件 指针。 第二空:由“if((fp=fopen(___3___,\”可知 文件再次被打开,在再次打开文件之前需要将文件关闭,因 此第二空处应该是将 fp文件指针指向的文件关闭,文件关 闭使用 fclose函数,fclose函数的调用形式是 fclose(文件指 针),因此第二空应该是“fclose(fp)”。 第三空:考察 fopen函数的使用,fopen函数的调用形 式是:fopen(文件名,文件使用方式),文件名通过函数参数 fname传递过来,因此第三空处应该是“if((fp=fopen(fname, \”。 【考点链接】文件操作;指针。 二、程序修改题 【答案】 难度指数★★★ (1)p=j; (2)p=i; 【审题分析】 (1)该题根据题目用选择法实现数组中的 n个元素从小 到大的排序。其中,选择排序法中的升序排序,首先从数组 中挑选一个最小的元素,把它和第一元素交换,接着从剩下 的 n-1个元素中再挑出一个最小的元素,把它和第二个元素 交换,不断重复以上过程,直到比较完最后两个元素。 (2)从已给定源程序的 main主函数开始入手,语句 “fun(a,m)”调用函数“void fun(int a[], int n)”实现数组的 排序。 【解题思路】 (1)第一个标识下面“p=j”,根据 C语言的语法,不难 发现语句结束缺少分号,因此改为“p=j;”。 (2)第二个标识下面的“p=j;”上两句是以 i作为循环 和判断条件,其中语句“for(i=j;i 二、程序修改题 【答案】 难度指数★★ (1)for(i=j+1;i 本题中函数的功能是将 n个无序整数从小到大排序。题 目中利用 for循环对无序数进行比较排序。 【解题思路】 (1)排序功能是要对 n个无序数进行比较排序,内层 for 三、程序设计题 【答案】 难度指数★★★ 1 int i,j=0;*n=0; 2 for(i=1;i<=m;i++) 3 if(i%7==0||i==0) 4 { 28 循环中的循环限制应该是小于 n,所以第一个错误标识下的 “for(i=j+1;i (2)“for(j=0;j 【考点链接】函数关系;逻辑关系。 三、程序设计题 (2)从已给定源程序的 main主函数开始入手,从键盘 获得输入的参数 n,然后通过“printf(\fun(n));”语句调用 fun函数,计算公式的值。 【解题思路】 (1)定义函数 fun时,形参 n并没有指定参数类型,因 此,“int fun(n)”改为“int fun(int n)”。 (2)根据题目要求,原题中的“if(n=1)”应该是用于判 断 n是否等于 1,但是被错误表示成赋值表达式。因此, 【答案】 难度指数★★ “if(n=1)”应该改为“if(n==1)”。 *c=(b)*1000+(a)*100+(b/10)*10+a/10; 【考点链接】函数定义;逻辑表达式。 【审题分析】 该程序功能是将正整数 a、b合并形成一个新整数。本 类型题首先要考虑整数的数位分离,然后要进行数位合成, 也就是先将数字的各位数拆开,改变排列顺序后,再组合成 新的数字。 【解题思路】 (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构成四位 数。本题最多只考虑四位数。 【考点链接】逻辑关系;运算符。 三、程序设计题 第 96套试题答案及详解 一、程序填空题 【答案】 (1)a[i]%2 【审题分析】 难度指数★★★ (2)a[j] (3)j 【答案】 难度指数★★★ 1 int i=0,j=0; 2 char *p,*t; 3 p=t=a; 4 while(*t) //让指针 t指向串尾 5 t++; 6 t--; //t指向串中的最后一个字符 7 while(*t=='*') 8 //当 t指针当前指向的字符是“*”号时 9 { 10 j++; //对“*”号计数的累加器加 1 11 t--; //指向前一个字符 12 } 13 t++; //跳出“*”号统计后,指针 t继 续指向字符串的下一个字符 14 if(j>n) //对统计的“*”号数目大于给定 的“*”号总数 n 15 { 16 while(*p&&p 17 //当超出给定的“*”号数目,则开始进行 截取 18 { 19 a[i]=*p; //截取 n个“*”号 20 i++; 21 p++; 22 } 23 a[i]='\\0'; //对新生成的串加尾符 24 } 【审题分析】 该程序功能是使字符串中尾部的“*”号不得多于 n个 “*”号,若多于 n个,则删除多余的“*”号;若少于或等 于 n个,则什么也不做。解题过程首先确定字符串尾,然后 由串尾开始对字符进行判断,同时对“*”字符进行统计, 如果大于 n,就进行截取。 【解题思路】 (1)首先确定字符串的尾,然后判断“*”号字符,并 对字符串中的字符进行判断,如果字符是符号“*”则对“*” 号进行统计。 (2)根据统计的“*”号数目结合题目中对“*”号个数 函数 fun的功能是:把形参 a所指数组中的偶数按原顺 序依次存放到 a,把奇数从数组中删除,奇数和偶数的判断 可用取余的方法来实现,a[i]%2等于 0那么 a[i]是偶数,否 则是奇数。 【解题思路】 第一空:由“___2___=a[i]; j++;”是将偶数元素保存起 来并且计数变量加 1,可知 j记录了偶数元素的个数,第一 空处是判断 a[i]是否是偶数,因此第一空处应为“a[i]%2”。 第二空:a所指数组中的偶数按原顺序依次存放到 a[0]、 a[1]、a[2]…,j初始化为 0,a[j]就可以将偶数元素存放在 a 中,故第二空处应为“a[j]”。 第三空:fun函数的返回值是偶数个数,故第三空处应 为“j”。 【考点链接】函数逻辑。 二、程序修改题 【答案】难度指数★★ (1)int fun(int n)(2)if(n==1) 【审题分析】 (1)该题中函数功能是按题目中给出的递归公式求函数 值。其中,递归是指函数直接或者间接调用函数本身的一种 方法。 29 的要求,判断是执行对“*”号的截取操作,还是什么都不 用做。 (3)所有字符处理完后,记得在新串 s的末尾加上结束 符“'\\0'”。 【考点链接】数组操作;指针操作。 接到 t字符串的工作,最后是确定字符串的结尾,即字符串 应该以“\\0”结束。此时,字符串 t的长度是 2*sl,显然 t[sl]='\\0' 的话字符串长度仍然是 sl,故第二个标识下是将 t[sl]='\\0'改 成 t[2*sl]='\\0'或者 t[sl+sl]='\\0'。 【考点链接】函数功能;逻辑关系。 三、程序设计题 第 97套试题答案及详解 一、程序填空题 【答案】 难度指数★★ (1)STYPE (2)FILE (3)fp 【审题分析】 本题要求调用 fun函数建立班级通讯录,将结构体数组 s的内容存储到文件 myfile5.dat中。文件操作首先是打开文 件,然后向文件中写入内容。 【解题思路】 第一空:在 main()函数中,观察 fun()函数调用:k=fun(s), 由 s的定义可知 s是 STYPE结构体数组,即传入 fun函数 的参数是 STYPE结构体数组的首地址,因此 fun()函数的参 数是 STYPE结构体指针,故(1)处应该为 int fun(STYPE *std)。 第二空:在 C语言中,fopen函数的调用形式是:FILE fp=fopen(文件名,文件使用方式),在 fun()函数体内部,由 if((fp=fopen(\可知,fp是一个指 向 FILE类型的指针变量,因此(2)处是指针变量 fp的定 义,即 FILE *fp。 第三空:fwrite函数的调用形式是:fwrite(buffer, size, count, fp),buffer是一个指针,指向输入数据存放在内存区 的起始地址,size是要输入的字节数,count是要输入大小 为 size个字节的数据块的个数,fp是文件指针。因此(3) 处应该添加文件指针,由前面的定义可知,fun函数内的文 件指针是 fp,即(3)处是 fwrite(&std[i], sizeof(STYPE), 1, fp)。 【考点链接】结构体指针;文件操作。 【答案】难度指数★★★ *c=(a/10)*1000+(b/10)*100+(a)*10+(b); 【审题分析】 该程序功能是将正整数 a、b合并形成一个新整数。本 类型题首先要考虑整数的数位分离,然后要进行数位合成。 也就是先将数字的各数位拆开,改变排列顺序后,再组合成 新的数字。 【解题思路】 (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构成四位 数。本题最多只考虑四位数。 【考点链接】逻辑关系;运算符。 第 98套试题答案及详解 一、程序填空题 【答案】难度指数★★★ (1)s[i](2)k(3)0或 '\\0' 【审题分析】 本题中函数 fun的功能是将形参 s所指字符串中的所有 字母字符顺序前移,其他字符顺序后移。在 fun函数中,定 义了两个数组指针 t和 p分别存储字母字符和其他字符,把 s所指的字符串中的字符字符和其他字符分别存储在 t和 p 中,然后将 p字符串中的字符按照题干要求的顺序存储在 t 字符串的后面。 【解题思路】 第一空:此处是将字母字符 s[i]存储在 t字符串中,j 记录 t字符串的长度,故第一空处应为“s[i]”。 第二空:“ for(i=0; i<__2__; i++) t[j+i]=p[i];”循环变量 i从 0开始,“t[j+i]=p[i];”是将 p字符串中的 k个字符保存 在 t字符串的后面,p字符串的长度为 k,故循环的终止条 件是 i>=k,因此第二空处应为“k”。 第三空:在 C语言中,字符串以“'\\0'”结束,故第三 处应为“'\\0'”或“0”。 【考点链接】函数功能;指针操作。 二、程序修改题 【答案】 难度指数★★★ (1)for(i=0; i<=s1; i++)应改为 for(i=0; i<= sl; i++) (2)t[sl]='\\0'应改为 t[2*sl]='\\0'或 t[sl+ sl]='\\0' 【审题分析】 本题中函数的功能是先将字符串 s中的字符按正序存 放到 t串中,然后把 s中的字符按逆序连接到 t串的后面。 首先由字符串的第一个标识正序取 s中的字符串存放到 t串 中,然后由 s串尾开始,逆序取字符并存放到 t串中。 【解题思路】 (1)编译程序后可知,for( i=0; i<=s1; i++)这一行有错 误,原因是 s1变量没有定义,显然这个循环的目的是将 s 字符串的内容拷贝至 t字符串,这里的循环变量 i的最大值 是 s字符串的长度 sl,因此第一个标识下是将 s1改为 sl。 (2)题目要求将 s中的字符拷贝至 t字符串之后,还需 将 s按逆序连接到 t串的后面,第二个循环已经完成了逆序 二、程序修改题 【答案】难度指数★★★ (1)while(*w )(2)if(*r==*p) 【审题分析】 本题中函数的功能是将 s所指字符串中最后一次出现 30