29
【参考答案】(1) struct student *(2) a->score[i](3) a
【考点分析】本题考查:函数定义;结构变量成员函数的表示方法;函数返回值。
【解题思路】填空1:函数定义时,类型标识符指明了本函数的类型,我们前面已经多次提到,函数的类型实际上是函数返回值的类型。该题中,用结构指针变量作为函数类型标识符。填空2: 通过循环语句对指针a所指结构体变量中的3门成绩进行修改,所以此处为a score[i]。填空3:通过return语句将形参a返回给主调函数。
【解题宝典】结构变量各个成员的表示方法:
(*结构指针变量).成员名;
15
或:结构指针变量->成员名
【参考答案】
(1)char *fun(char (*sq)[M])(2)return sp;
【考点分析】本题考查:函数定义;return语句;
【解题思路】函数fun的形参为字符串指针数组,每个元素指向一个长度为M的字符串,要找出其中最长的字符串,可先假设指针数组的第1个元素所指的字符串最长,之后对字符串指针数组进行遍历,若遇字符串长度大于待定最长字符串的长度,则令该字符串为待定最长字符串,如此循环直至指针数组末尾,即可得到最长字符串的地址。
(1)此处是函数定义错误,根据返回值类型可知该函数应定义为字符型指针函数。
(2)由for循环体可知,指针sp指向长度最长的字符串,因此应返回sp。
【参考答案】
void fun(int a, int b, long *c)
{
*c=a%10+(b/10)*10+(a/10)*100+(b%10)*1000;
}
【考点分析】
本题考查:如何取出数值n的各个位;知道数值n的各个位,又如何表示该数值;指针型变量的使用。
【解题思路】
本题的主要问题如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数(a/10),分别用10对它们求余可得到它们的个位数(a%10)。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。
30
【参考答案】(1) t[][N](2) i=0;i 【考点分析】本题考查:函数定义;for循环语句;数组元素的引用和赋值;变量值交换算法。 【解题思路】填空1:根据main函数中的函数调用语句,可以填写fun函数定义中的形参内容。填空2:由于是N×N 矩阵,所以for语句中循环变量i的取值范围是0到N。填空3:for循环体中是变量值交换算法。 【参考答案】(1)int fun(int a[],int m)或fun(int a[],int m) (2)else if(m>a[mid]) 【考点分析】本题考查:折半查找算法;函数定义;if…else 语句。 【解题思路】(1)fun(int a[],int m)函数的返回值为int类型,所以定义函数时,函数的返回类型不能是void,而是int 类型。这里int可以省略,若省略函数类型标识符,系统将默认为int型。else If(m > a[mid])中,关键字if需要区别大小写,大写是错误的。 【解题宝典】折半查找算法,将数列按有序化(递增或递 减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。 通过一次比较,将查找区间缩小一半。 【参考答案】 void fun( char *a, char *p ) { char *t=a; for(;t<=p;t++) if(*t!='*') *(a++)=*t; for(;*t!='\0';t++) *(a++)=*t; *a='\0'; /*在字符串最后加上字符串结束标识*/ } 【考点分析】本题考查:删除字符串中非尾部*号,删除的主要思想就是把不删除的字符保留起来。 【解题思路】本题用两个循环语句来实现。第1个循环的作用是将指针p所指字母以前所有非*号的字符保留下来,即删除指针p以前所有的*号。第2个循环的作用是将指针p 以后的所有*号保留下来。最后在新串的结尾加上结束符。 3 【参考答案】(1)next(2)NULL(3)r 【解题思路】填空1:本空考查了为p赋初值,根据题目的要求是将带头结点的单向链表逆置可知,p的初值应该为h->next。填空2:if判断语句表明当p等于什么时就要返回,因此只能当p等于NULL时返回,不用做后面的链表的逆置了。 填空3:把q的指针向后移动,才能实现将带头结点的单向链表逆置。因此本空填写r。 【参考答案】(1)r=t;(2)应填:r=t;或r=&t[0]; 【解题思路】从字符串s中找出子字符串的方法是:从第一个字符开始,对字符串进行遍历,若s串的当前字符等于t串的第一个字符,两字符串的指针自动加1,继续比较下一个字符;若比较至字符串t的末尾,则跳出循环;若s串的字符与t串的字符不对应相同,则继续对s串的下一个字符进行处理。 【参考答案】 void fun(char a[M][N],char *b) { int i,j,k=0; for(i=0;i for(j=0;a[i][j]!='\0';j++) b[k++]=a[i][j]; b[k]='\0'; /*在字符串最后加上字符串结束标记符 16 17 */ /*在字符串最后加上结束标志符*/ } 【解题思路】本题考查:字符串连接操作。本程序中第1个for 循环的作用是对二维数组行的控制,第2个循环的作用是从同一行中取出字符并存放到一维数组b 中,语句是b [k++]=a [i ][j ];。 32 【参考答案】(1)t =i (2) i (3) ′\0′或0 【考点分析】本题考查:变量赋值语句;for 循环语句;数组元素赋值操作;字符串结束标识'\0'。 【解题思路】本题中第一个for 循环的作用是得到字符串的长度,第二个for 循环的作用是对下标为奇数的字符按ASCII 码大小排序,最后将排好序的字符取出。 填空1:取出字符串中下标为奇数的字符,所以将下标i 赋值给中间变量t 。 填空2:此处for 循环语句的作用是实现对下标为奇数的元 素进行排序操作,所以循环变量初值应填入j =i +2。 填空3: 将下标为奇数的字符取出后,存入p 所指的数组中,最后不要忘记在数组最后加入字符串结束标识'\0'。 【参考答案】(1)while(fabs(t)>=num)(2)t =s/n ; 【考点分析】本题考查:while 循环语句;区别求余运算(%)和除法运算(/)。 【解题思路】 (1)函数fun 中while 语句的作用是,当新的一项大于给定参数时,循环累计计算s 的值。而题目要求最后一项的绝对值小于给定参数,因此循环条件应当是while(fabs(t)>=num)。 (2)变量t 用来存放最后一项的值,因为每一项均为1或-1除以一个数,所以此处应使用除法运算符"/"。 【参考答案】 void fun (char a[], char b[], int n) { int i,k=0; for(i=0;a[i]!='\0';i++) if(i!=n) /*将不是指定下标的字符存入数组b 中*/ b[k++]=a[i]; b[k]='\0'; /*在字符串最后加上结束标识*/ } 【考点分析】本题考查:删除字符串中指定字符,我们一般采用保留非指定字符的方法。 【解题思路】本题要求删除字符串中指定下标的字符,即把非指定下标的字符保留,所以if 语句条件表达式的内容是if(i !=n)。字符串最后不要忘记加上字符串结束标识'\0'。 33 【参考答案】(1)p->next (2)q(3)p->next 【解题思路】填空1:从第2个while 循环可知,q 的初值应该为p 的next,故此空应该填写p->next 。 填空2:第2个while 循环表示的是每次从链表剩下的树中 找出最小的数,因此此空应该以q 是否为空来判断循环是否结束,所以此空应该填写q 。 填空3;当找到一个最小的数时p 应该向后移,因此此空应该填写p->next 。 【参考答案】(1)while(*s)或while (*s!='\0')(2)s++; 【解题思路】(1)通过while 语句可对字符串所有字符进 行遍历,循环条件是对当前字符进行判断,若当前字符不是字符串结尾,则对其进行其他操作。(2)因为该循环通 过指针s 的移动遍历字符串,所以每循环一次要使指针向后移动一个位置,而不是将指针所指的元素加1。 【参考答案】 void fun(int *w, int p, int n) {int x,j,ch; for(x=0;x<=p;x++) {ch=w [0]; for(j=1;j { w [j-1]=w [j ]; } w [n-1]=ch; /*将0到p 个数组元素逐一赋给数组w [n-1] */ } } 【考点分析】本题考查:一维数组的应用。 【解题思路】本题要求把下标从0到p (含p,p 小于等于n-1)的数组元素平移到数组的最后,可以根据输入的p 值,通过 for 循环语句,将p+1到n-1(含n-1)之间的数组元素依次向前移动p+1个存储单元,即w [j-1]=w [j ];,同时将0到p 个数组元素逐一赋给数组w [n-1],也就是通过语句w [n-1]=ch;来实现此操作的。 34 【参考答案】(1)FILE*(2)fp (3)ch 【解题思路】填空1:由语句fopen("file1.txt", "r")可知,fp 应该是文件类型指针,因此本空因该填写FILE*。 填空2: feof 函数只能对文件类型数据进行操作,因此本空填写fp 。填空3:putchar()代表输入一个字符,从ch = fgetc(fp)可以看出本题应该填写ch 。 【参考答案】(1)s [j++]=s [i ];(2)s [j ]= '\0'; 【解题思路】题目要求依次取出字符串中所有的数字字符,因此将元素s [i ]存入s [j ]后要使j 加1,为下次存储做准备。s [j ]="\0";是一个语法错误。 【参考答案】 void fun(char (*s)[N],char *b) { int i,j,k=0; for(i=0;i for(j=0;j b[k++]=s[j][i]; b[k]='\0'; } 【解题思路】看到程序后,很容易便能想到用循环嵌套的方法,本题中按列的顺序依次放到一个字符串中,所以列标变化慢,行标变化快。注意第1个循环条件为i 35 【参考答案】(1) '\0'(2) 0(3) c 【考点分析】本题考查:字符串结束标识'\0';变量赋初值操作;数组元素赋值。 【解题思路】填空1:for语句循环条件是判断是否到达字符串结尾,即当前字符是否为'\0'。填空2:while语句用以确定字符串的长度,所以变量n赋初值为0。填空3:题目要求如果找到与参数c相同的字符,就在后面插入一个相同的字符,所以找到后,应该给数组元素赋值,该题目给出参数为c。 【参考答案】(1)double sum=0.0;(2)sum/=c; 【考点分析】本题考查:变量的数据类型,区别int整型和double双精度型;除法运算符"/"。 【解题思路】(1)变量定义错误,变量sum存放所有数据的和,应定义为double型。(2)C语言中的除法运算符是"/"。【参考答案】 double fun(int n) { int i,s1=0; double s=0.0; for(i=1;i<=n;i++) {s1=s1+i; /*求每一项的分母*/ s=s+1.0/s1; /*求多项式的值*/ } return s; } 【考点分析】本题考查:计算给定表达式的值,注意变量数据类型及强制转换操作。for循环语句,return语句。【解题思路】此类计算表达式值的程序,首先需要根据题意分析表达式的规律,得出通项,然后再完成程序语句。本题中表达式的规律是1+2+…+n的倒数之和,那么可以通过for循环语句来实现第1项到第n项的变化。 这里其实就是累加算法,方法是先根据题目要求定义变量,注意该变量的数据类型,然后对其进行初始化操作,因为该变量作用是累加器,所以初始值应为0(或0.0,这里根据变量数据类型来确定),再通过for循环语句来完成累 加过程。 本题中s1用来表示每一项的分母,每一项的分母都是由前一项分母加项数。注意:由于s1定义成一个整型,所以在s=s+1.0/s1中不能把1.0写成1。 36 【参考答案】(1) 0(2) i++或++i或i+=1或i=i+1 (3)2.0*i 【考点分析】本题考查:变量赋初值;while循环语句; 表达式通项的表示方法。 【解题思路】填空1:循环变量1从开始参加运算,但是在每次循环的开始i都进行自加1操作,故i应赋初值为0。填空2:循环变量i自增1运算。填空3:根据公式确定表达式通项。注意x为double类型,故应将i变为double类型再进行运算。 【参考答案】(1)void fun ( char *s , char *t )

