2012年9月全国计算机考试二级C语言最新上机题库(打印版)

更新时间:2023-04-26 04:32:01 阅读量: 外语学习 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2012年9月全国计算机考试二级C语言最新上

机题库

上机考试题库

(打印版)

1

1

【参考答案】(1) a[i](2) a[j](3) a[j]

【考点分析】本题考查:数组的引用;if语句条件表达式,如果表达式的值为真,则执行下面的语句,如果该值为假,则不执行下面的语句。

【解题思路】填空1:for循环语句循环体中将数组元素a[i]赋值给变量max和变量min。

填空2:通过一次for循环,找到数组中的最大值,if语句的条件表达式是max

填空3:同理,此处if语句的条件表达式是min>a[j]。

【解题宝典】求最大值或者最小值的题目,一般都是假设一个元素最大或最小,然后通过if条件语句将该元素和其他元素进行比较操作来完成。

【参考答案】(1) 去掉分号(2) case 1:case 2:return 1;【考点分析】本题考查:switch语句,其一般形式为:switch(表达式){

case常量表达式1: 语句1;

case常量表达式2: 语句2;

……

case常量表达式n: 语句n;

default: 语句n+1;

}其中switch(表达式)后不应该带有";",同时case语句常量后应该是":"。

【解题思路】C语言中,switch语句之后不能有分号,并且case语句常量后应用的是冒号。

【参考答案】

oid fun(STREC *a)

{double ave=0.0;

int i;

for(i=0;i

a->ave=a->ave+a->s[i];

/*求各门成绩的总和*/

a->ave/=N;

/*求平均分*/

}

【考点分析】本题考查:结构体类型成员运算,指向结构体类型的指针变量作函数参数。

【解题思路】本题考查自定义形参的相关知识点,程序流程是这样的:在fun()函数中求出平均分后,返回到主函数时平均分也要带回,所以只能定义一个指针类型的形参STREC*a ,此时,引用成员的方式可以使用指向运算符,即a->ave和a->s[i],当然也可用(*a).ave和(*a).s[i]。

2

【参考答案】(1) char(2) ch<='9'(3)'0'

【考点分析】本题考查:函数定义,注意函数定义的一般形式以及有参函数和无参函数的区别;if语句条件表达式,本题的条件表达式是判断数字字符;函数返回值,其一般形式为"return 表达式;"。

【解题思路】填空1:函数定义时,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型,所以此处应该填入char。填空2:通过if条件语句判断字符串中字符是否是数字字符,既大于等于字符'0',同时小于等于字符'9'。

填空3:return语句完成函数返回操作,要实现字符转换,应填入return ′9′-(ch-′0′)。

【解题宝典】有参函数定义,其一般形式为:

类型标识符函数名(形式参数表列)

{声明部分

语句}

在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参列表中给出类型说明。

【参考答案】(1) b[k]=*p;(2) b[k]=′ ′;k++;

【考点分析】本题考查:指针类型变量作为函数的参数,函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。

【解题思路】(1) 题目中p是指针型变量作函数参数,因此给b[k]赋值时出现错误。(2) 题目要求赋值3个字符后加一个空格,所以应该是先给b[k]赋值空格,然后变量k 再加1。

【解题宝典】C语言中为了表示指针变量和它所指向的变量之间的关系,在程序中用"*"符号表示"指向",例如,pointer代表指针变量,而*pointer是pointer所指向的变量。

【参考答案】

double fun( STREC *h )

{

double ave=0.0;

STREC *p=h->next;

while(p!=NULL)

{ave=ave+p->s;

p=p->next;

}

return ave/N;

}

【考点分析】本题考查:链表的操作,对链表的主要操作有以下几种:建立链表、结构的查找与输出、插入一个结点、删除一个结点。

【解题思路】题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各结点数据域中数值的和,再对和求平均分。遍历链表时应定义一个指向结点的指针p,因为"头结点"中没有数值,所以程序中让p直接指向"头结点"的下一个结点,使用语句STREC *p=h->next。

3

【参考答案】(1) M(2) <(3) k

2

【考点分析】本题考查:for循环语句的循环条件;if语句条件表达式;return语句完成函数值的返回。

【解题思路】填空1:题目指出ss所指字符串数组中共有M个字符串,所以for循环语句循环条件是i

【参考答案】(1)if(( tt[i]>=a′)&&( tt[i] <=′z′)(2)tt[i]-=32;【考点分析】本题考查:if语句条件表达式;小写字母转大写字母的方法。

【解题思路】(1)分析本题可知,要判断字符是否为小写字母,即判断其是否在a~z之间,所以这里需要进行连续的比较,用&&。(2)从ASCII码表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII值大32。将字符串中的小写字母改为大写字母的方法是:从字符串第一个字符开始,根据ASCII码值判断该字母是不是小写字母,若是,则ASCII码值减32即可。

【参考答案】

void fun( int m, int *k, int xx[] )

{

int i,j,n=0;

for(i=4;i

if(i%j==0) break;

if(j

}

*k=n; /*返回非素数的个数*/

}

【考点分析】本题考查:如何判断非素数;循环判断结构;数组的引用。

【解题思路】题目要求将1~m之间的非素数存入数组中,应使用循环判断结构。循环语句用来遍历1~m之间的每个数,判断语句用来判断该数是否素数,若不是素数,则将其存入数组中。这道题目是考查一个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决。【解题宝典】判定一个数是否为素数,即该数除了能被1和它本身外,不能被任何数整除。

代码实现为:

for(j=2;j

if(i%j==0)/*如余数为0,证明i不是素数*/ ……

此语句需要熟记,很多判断素数的题目也可通过此法解决。

4

【参考答案】(1)j++或j+=1或++或j=j+1(2)s[i]=t1[i](3) j 【考点分析】本题考查:指针型变量;数组变量赋值;for

循环语句。

【解题思路】填空1:根据函数fun中的内容可知,数组t1存储了s中的非数字字符,数组t2存储了s中的数字字符,为了存储下一个数字字符,下标j要进行加1操作。填空2:将s串中的数字与非数字字符分开后,要先将非数字字符放入字符串s中,因此填入s[i]=t1[i]。填空3:最后将数字字符加到s串之后,并且i要小于数字的个数j。

【参考答案】(1)for (j = i + 1; j < 6; j++)

(2)*(pstr +i) = *(pstr + j) ;

【考点分析】本题考查:冒泡排序算法;for循环语句格式;指针数组。

【解题思路】(1)此处考查for语句的格式,各表达式之间应用";"割开。(2)此处考查用指针表示数组元素的方法,*(pstr+I)表示pstr所指向数组的第I个元素,同理*(pstr+j)表示pstr所指向数组的第j个元素。

【解题宝典】冒泡排序算法,其基本思想是,将待排序的元素看作是竖着排列的"气泡",较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个"气泡"序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即"轻"的元素在下面,就交换它们的位置。显然,处理一遍之后,"最轻"的元素就浮到了最高位置;处理二遍之后,"次轻"的元素就浮到了次高位置。依次类推,完成排序。用代码实现数组s[N]的升序排列为:

for(i=0; i

for(j=i+1; j

if(s[i]>s[j])

{t=s[i]; s[i]=s[j]

s[j]=to;}

【参考答案】

int fun(char *ss, char c)

{

int i=0;

for(;*ss!='\0';ss++)

if(*ss==c)

i++;/*求出ss所指字符串中指定字符的个数*/ return i;

}

【考点分析】本题考查:for循环语句遍历字符串,并通过if条件语句,判断字符串是否结束。

【解题思路】从字符串中查找指定字符,需要使用循环判断结构,循环语句用来遍历字符串,循环条件为字符串没有结束,即当前字符不是′\0′,判断语句用来判断当前字符是否为指定字符。最后返回指定字符的个数。

5

【参考答案】(1)x(2)p(3)s

【考点分析】本题考查:链表的基本操作。了解链表的

3

基本思想和相关算法,理解有关链表插入及删除时指针移动的先后顺序问题,注意指针的保存和归位。

【解题思路】填空1:将形参x赋值给结点的数据域。

填空2和填空3:将新的结点和原有链表中结点进行比较。【参考答案】(1)long k=1;(2)num /=10;

【考点分析】本题考查:数据类型;保存乘积的变量初始化;除法运算符。

【解题思路】(1)k用来存放各位数字的积,初始值应为1。

(2)这里是一个符号错误,除号用"/"来表示。

【解题宝典】明确C语言中的算术运算符:

加法运算符"+":为双目运算符,即应有两个量参与加法运算。减法运算符"-":为双目运算符。但"-"也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。乘法运算符"*":双目运算,具有左结合性。除法运算符"/":双目运算,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。求余运算符(模运算符)"%":双目运算,具有左结合性。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。

【参考答案】

float fun ( float *a , int n )

{

int i;

float av=0.0;

for(i=0; i

av=av+a[i];

return(av/n);/*返回平均值*/

}

【考点分析】本题考查:如何通过指针来实现计算平均分。【解题思路】本题较简单,只需用一个循环语句就可变成数组元素的求和,再将和除以课程数即可。需要注意的是本题对指针的操作,当指针变量指向一个数组时,用该指针变量引用数组元素,引用方式与数组的引用方式相同。如本题中a指向了score,所以通过a引用score中的元素时可以用下标法,也可以用指针运算法,a[i]和*(a+i)具有相同的作用。下标运算实际上是从当前地址开始往后取出地址中的第几个元素,当前地址下标为0。例如,若有int cc[10],*p=cc+5;,即p指向了cc的第5个元素,则p[0]的作用与cc[5]相同;p[3]的作用是取出从当前地址(即p所指地址)开始往后的第3个元素,它与cc[8]相同;p[-2]的作用是取出从当前地址开始往前的第2个元素,它与cc[3]相同,但不提倡使用"负"的下标。

【解题宝典】计算平均分方法。掌握以下语句:

for(i=0;i

av=av+a[i];

return (av/n);/*返回平均值*/

6

【参考答案】(1)3.0或(double)3(2)>(3) (t+1)

【考点分析】本题考查:基本算术运算时的类型转换,其转换规则为:如果双目运算符两边运算数的类型一致,则所得结果的类型与运算数的类型一致;如果双目运算符两边运算的类型不一致,系统将自动进行类型转换,使运算符两边的类型达到一致后,再进行运算规律见下表。

运算数1,运算数2,转换结果类型

短整型,大整型,短整型 长整型

整型,大整型,整型 长整型

字符型,整型,字符型 整型

有符号整型,无符号整型,有符号整型 无符号整型

整型,浮点型,整型 浮点型while循环语句,一般考查如何根据题意确定循环条件,以及如何通过循环变量变化实现循环操作。

【解题思路】填空1:变量x定义为double类型,而运算符"/"后面是整型数,所以给x赋值时,需要注意数据类型,此处不能将3.0写成3。填空2:while循环语句的循环条件,根据题意确定循环变量应大于1e-3,因此此处应填">"。

填空3:表达式的通项是(2]

【解题宝典】本题填空1还可以运用强制类型转换来实现。

强制类型转换是通过类型转换运算来实现的。其一般形式为:"(类型说明符) (表达式)"。其功能是:把表达式的运算结果强制转换成类型说明符所表示的类型。

例如:

(float) a把a转换为实型

(int)(x+y)把x+y的结果转换为整型

【参考答案】(1)double fun(int n)(2)s=s+(double)a/b;

【考点分析】本题考查:函数定义,函数定义的一般形式为:"类型标识符函数名(形式参数表列)",其中类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。

【解题思路】(1)由语句"return(s)"和变量s定义为double数据类型可知,该函数定义时其类型标识符为double类型。

(2)注意数据类型double的书写格式。

【解题宝典】确定函数类型标识符在填空和改错题中经常考到,如果函数没有返回值,则函数定义为void型;如果函数有返回值,则函数类型应与返回值类型一致;如果不定义函数类型标识符,则系统默认为int型。

【参考答案】

int fun (int a[][M])

{

int i,j,max=a[0][0];

for(i=0;i<2;i++)

for(j=0;j

if(max

max=a[i][j];

return max;

}

【考点分析】题且要求数组的最大值,需要运用循环语句,

4

因为数组是二维数值,所以应使用二层加for循环嵌套。使用for循环语句时需要注意循环变量的取值范围。

【解题思路】此类求最大值或最小值的问题,我们可以采用逐个比较的方式,要求对数组中所有元素遍历一遍,并且从中找出数组最大值或最小值。首先定义变量max存放数组中的第一个元素的值,然后利用for循环逐个找出数组中的元素,并与max比较,如果元素值大于max,则将该值赋于max,循环结后max的值即为数组最大值,最后将该值返回。

【解题宝典】该类题目考查较多,要掌握逐行比较的方法。对于m*n二维数组,如采用逐行查找方法,代码实现为:for(i=0;i

for(j=0;j

……

7

【参考答案】(1) 0(2) n(3) (t*t)

【考点分析】本题考查:变量初始化操作,需要注意该变量是用作累加器还是累乘器;for循环语句。

【解题思路】填空1:程序开始定义了变量s,但没有对其进行初始化,根据公式及后面的程序可知变量s用来存储公式的前n项和,因此该变量应初始化为0。填空2:通过for循环语句将表达式各项进行累加,结果存于变量s中,循环变量i的取值范围为1~n。填空3:根据题目要求确定表达式通项,前面已定义t=2.0]

【解题宝典】程序要求计算表达式值时,一般我们都设定一个变量s,并赋初值,如果s用来存放表达式的和,则赋初值为0;如果s用来存放表达式的积,则赋初值为1。【参考答案】(1)for(i=0;str[i];i++) (2)if(substr[k+1]==′\0′)【考点分析】本题考查:for循环语句的格式,for循环语句使用最为灵活,其一般形式为:for(表达式1;表达式2;表达式3) ,注意表达式之间使用";"相隔;if条件语句的格式,其中if关键字需要区别大小写,这里不能混淆使用。关键字是由C语言规定的具有特定意义的字符串,也称为保留字。用户定义的标识符不应与关键字相同,并且关键字应小写。

【解题思路】我们先看循环条件for(i =0, str[i], i++),不难发现此处for循环语句的格式有误,其中表达式之间应以";"相隔;同时很容易发现if条件语句处的关键字书写错误。

【参考答案】

double fun ( double eps)

{

double s=1.0,s1=1.0;

int n=1;

while(s1>=eps) /*当某项大于精度要求时,继续求下一项*/

{s1=s1*n/(2*n+1); /*求多项式的每一项*/

s=s+s1; /*求和*/

n++;

}

return 2*s;

}

【考点分析】本题考查:迭代法求给定多项式的值,迭代算法:让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。需要注意变量的数据类型以及赋初值操作。

【解题思路】首先应该定义double类型变量,并且赋初值,用来存放多项式的某一项和最后的总和。从第2项开始以后的每一项都是其前面一项乘以n/( 2]

8

【参考答案】(1) s[i](2) '9' (3)*t=n

【考点分析】本题考查:for循环语句;if语句条件表达式;

指针变量。

【解题思路】填空1:通过for循环语句,来判断是否到字符串结尾,变量i用来存放字符串数组下标,则应填入s[i]。

填空2:题目要求判断数字字符,所以此处应填入'9'。填空3:将数字字符个数存入变量t中,这里需注意变量t是指针变量。

【解题宝典】if语句的条件表达式一般会考查三方面的内容:(1) 条件判断,即>与>=、<与<=、==与!=的区别,需要仔细分析题干的意思,确定条件表达式的内容。

(2) 逻辑判断,即&&(逻辑与)与||(逻辑或)的区别,需要

根据题干确定if条件中若干个条件表达式的并存关系。

(3)=(赋值号)与==(等于号)的区别,注意在if条件中不会

出现=(赋值号)。

【参考答案】(1)t = *x ; *x = y ;(2)return(t) ;或return t;

【考点分析】本题考查:指针型变量的使用;通过return 语句完成函数值的返回。

【解题思路】首先,定义变量t作为中间变量,然后进行数据交换,注意参数x是指针变量,交换时应使用*x,最后确定返回值,根据代码b=fun(8a,b)可以知道返回值将赋给变量b,而b中应存放交换前**中的值,所以函数应返回变量t

【参考答案】

void fun (int *a, int *n)

{

int i,j=0;

for(i=1;i<=1000;i++) /*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并放入数组a 中*/

if((i%7==0||i%11==0)&&i%77!=0)

a[j++]=i;

*n=j;

}

【考点分析】本题考查:if语句,用来判断能被7整除或者

5

能被11整除,但是又不能同时被7和11整除的数,在这里充分理解"逻辑与"和"逻辑或"的区别;for循环语句的循环变量用来控制取值范围。

【解题思路】该题需要运用循环判断结构来实现,其中循环语句比较容易,只要确定循环变量的范围即可,下面我们来看判断语句,题目要求找出能被7或11整除,但不能同时被7和11整除的所有整数。能同时被7和11整除的整数一定能被77整除,且不能被77整除的数不一定就是能被7或11整除的数所以可得出程序中的if()语句。注意:(i%7==0||i%11==0)两边必须要有小括号。

9

【参考答案】(1)1(2) j++ (3)j

【考点分析】本题考查:if语句条件表达式;自增/自减运算符;函数返回值。

【解题思路】填空1:根据题目要求,需要进行奇偶数的判定,我们可以通过if条件语句来判断数组元素是否是奇数,如果元素不能被2整除,则为奇数,所以填入if (a[i]%2==1)。填空2:将为奇数的元素重新存放到数组的前面,同时下标增1。填空3:函数返回值需要返回数组中奇数的个数,因此返回变量j。

【解题宝典】奇数和偶数的判定方法,通过if条件语句完成,对2求余运算,结果为0是偶数,结果为1是奇数。自增1、自减1运算符:自增1运算符记为"++",其功能是使变量的值自增1。自减1运算符记为"--",其功能是使变量值自减1。自增1、自减1运算符均为单目运算,都具有右结合性。有以下几种形式:++i:i自增1后再参与其他运算。--i: i自减1后再参与其他运算。i++:i参与运算后,i的值再自增1。

i--:i参与运算后,i的值再自减1。

【参考答案】(1) t=a;a=b;b=t;(2) return(b);或return b;

【考点分析】本题考查:return语句,功能是计算表达式的值,并将其返回给主调函数。

【解题思路】求最大公约数算法一般采用辗转相除法。辗转相除法的算法为:首先将m除以n(m>n)得余数r,再用余数r去除原来的除数,得到新的余数,重复此过程直到余数为0时停止,此时的除数就是m 和n的最大公约数。程序首先判断参数a和b的大小,如果a

【参考答案】

void fun( char *a )

{

int i,j=0;

for(i=0;a[i]!='\0';i++)

if(a[i]!='*')

a[j++]=a[i]; /*若不是要删除的字符'*'则留

下*/

a[j]='\0';

}

【考点分析】要删除字符串中所有*号需要用循环语句遍历字符串,用判断语句判断字符是否为*号,由此可以决定该程序应使用循环判断结构。

【解题思路】用循环操作从字符串的开始往后逐个进行比较,若不是要删除的字符(用if(a[i]!=′*′)来控制)则保留。

变量i和j用来表示原字符串的下标和删除*号后新字符串的下标。注意下标变量j要从0开始,最后还要加上字符串结束标识′\0′。

10

【参考答案】(1)0(2) 10*x (3)n/10

【考点分析】本题考查:已知某数,如何求该数各个位数值,已知各个位数值,如何表示该数;除法运算。

【解题思路】填空1:定义变量t用来存放数值几的各个位数值,此处判断t是否为偶数,即对2求余结果是否为0。

填空2:将t作为x的个位数,原来x的各个位上升1位,即x =10]

【解题宝典】如果知道某数n的各个位,可以得到该数值n,如n的个位为a、十位为b、百位为c,那么n=c*100+b*10+a。如果知道数值n,可以采用求余和除法操作来表示其各个位,如n%10(取个位)、n/10(取十位),读者可以自己考虑一下,如果是三位数,如何提取各个位?四位数呢?

【参考答案】(1)*t=0;(2)if(d%2!=0)或if(d%2==1)

【考点分析】本题考查:指针型变量作为函数参数;if语句条件表达式,结合奇偶数的表示方法来确定该表达式内容。

【解题思路】(1) 由函数定义可知,变量t是指针变量,所以对t进行赋初值0是不对的。因为t指向的是存放新数的变量,所以此处应给新数赋初值0,即*t=0。(2) 变量d 表示数s各个位上的数,此处的if条件应为判断d是否为奇数。

【参考答案】

void fun(char p1[], char p2[])

{

int i,j;

for(i=0;p1[i]!='\0';i++) ;

for(j=0;p2[j]!='\0';j++)

p1[i++]=p2[j];

p1[i]='\0';

}

【考点分析】本题考查:不使用字符串函数实现字符串连接操作。通过for循环语句来完成,不要忘了最后需要加上字符串结束标识'\0'。

【解题思路】本题用两个循环完成操作,第1个循环的作用是求出第1个字符串的长度,即将i指到第1个字符串的末尾。第2个循环的作用是将第2个字符串的字符连到第1

6

个字符串的末尾。最后在第1个字符串的结尾加上字符串结束标识′\0′。

11

【参考答案】(1) n/2(2) i(3) a[n-i-1]

【考点分析】本题考查:for循环语句;变量交换算法。【解题思路】填空1:逆置数组元素中的值,将a[0]与a[n -1]对换位置,依此类推,那么需要对换n/2次。填空2:将a[0]与a[n-1]对换位置,a[1]与a[n-2]对换位置,依次类推,则a[i]=a[n-1-i]。填空3:普通的调换位置程序,显然填入a[n-i-1]。

【参考答案】(1)n= *p-′0′; (2)n=n*8+*p-′0′;

【考点分析】本题考查:数字和字符转换方法;八进制转十进制方法。

【解题思路】(1)"0"和"1"是字符串中的数字字符,为了进行数字运算,必须要将数字字符转换为数字,用数字字符减去字符'0'的ASCII码,就得到对应的数字。题中给出的是"o",不是"0"。(2)要在一个八进制数的最后加上一位,原来各个位上的数上升一位,只需将原数乘以8再加上个位数。

【解题宝典】各种进制之间转换方法需要掌握,二进制数、八进制数、十六进制数转换为十进制数采取按权求和的方法;十进制数转换为二进制数、八进制数、十六进制数采取除2/8/16取余方法来实现。

【参考答案】

STREC fun( STREC *a, char *b )

{

int i;

STREC str={"\0",-1}; /*若没找到指定的学号,在结构体变量中给学号置空串,给成绩置-1*/

for(i=0;i

if(strcmp(a[i].num,b)==0) /*找到指定学号的学生数据*/

str=a[i];

str=a[i];

return str; /*返回学生记录*/

}

【考点分析】本题考查:结构体类型;字符串比较函数strcmp()的应用。

【解题思路】本程序一开始先使结构体变量str中的学号为空串,成绩为-1。循环体的功能是搜索所有学生的学号,并判断是否有学号与b所指字符串相同(即找到),若找到则给str重新赋值(str=a[i]),若没找到则str成员的值还是原有值(即未找到时学号返回空串,成绩返回-1)。

【解题宝典】常见的字符串处理函数总结如下:

调用

形式

作用

说明

puts

(字符数组)

将一个字符串(以′\0′结束)输出到终端设备用该函数输出的字符串中可以包含转义字符gets(字符数组)从终端输入一个字符串到字符数组中,并且得到一个函数值puts()和gets()函数一次只能输入或输出一个字符串,不能写成puts(字符数组1,字符数组2)或gets(字符数组1,字符数组

2)strcpy(字符数组1,字符数组2)把字符数组2所指字符串

的内容复制到字符数组1所指存储空间中。函数返回字符数组1的值,即目的串的首地址为保证复制的合法性,字符数组1必须指向一个足够容纳字符数组2的存储空间strcat(字符数组1,字符数组2)该函数将字符数组2所指字符串的内容连接到字符数组1所指的字符串后面,并自动覆盖字符数组1串末尾的′\0′,该函数返回字符数组1的地址值字符数组1所指定字符串应有足够的空间容纳两串合并后的内容strlen(字符数组)此函数计算出以字符数组为起始地址的字符串的长度,并作为函数值返回这一长度不包括串尾的结束标志′\0′strcmp(字符数组1,字符数组2)该函数用来比较字符数组1和字符数组2所指字符串的大小。

若字符数组1>字符数组2,函数值大于0(正数);若字符数组1=字符数组2,函数值等于0;若字符数组1<字符数组2,函数值小于0(负数)根据字符的ASCII码值依此对字符数组1和字符数组2所指字符串对应位置上的字符两两进行比较,当出现第一对不同的字符时,即由这两个字符决定所在串的大小

12

【参考答案】(1) "r"(2) fs(3) ft

【考点分析】本题考查:打开文件操作,fopen函数用来打开一个文件,其一般形式为"文件指针名=fopen(文件名,使用文件方式);";文件结束检测函数feof函数;写字符函数fputc,功能是把一个字符写入指定的文件中,函数调用的形式为"fputc(字符量,文件指针);"其中,待写入的字符量可以是字符常量或变量,被写入的文件可以用写、读写、追加方式打开。文件一旦使用完毕,需使用关闭文件函数fclose将文件关闭,以避免文件的数据丢失等错误。

【解题思路】填空1:本题考查对文件操作的掌握。打开一个文件的调用方式是,fs=fopen(文件名,使用文件方式),以只读的方式打开文件,所以文件使用方式为"r"。

填空2:while循环语句中,循环条件通过feof()函数来检测是否到文件结尾。填空3:fputc()函数用于将一个字符写到磁盘文件上去,调用形式为:fputc(要输出的字符,文件指针)。

【参考答案】(1)if(d%2==0)(2)s/=10;

【考点分析】本题考查:if语句条件表达式,注意"=="

和"="的区别;除法运算符"/"。

【解题思路】(1)分析程序,在if的条件表达式中,不应该出现赋值运算符"=",应使用"=="运算符。(2)这里是一

7

个运算符的错误,表示除法的运算符是"/"。

【解题宝典】一般情况下,在if条件语句中,很容易出现"=="和"="的混淆错误,这也是经常考查的内容,考生应当注意。

【参考答案】void fun(int a, int b, long *c)

{*c=b%10+(a/10)*10+(b/10)*100+(a%10)*1000;

}

【考点分析】本题考查:如何取出数值n的各个位;知道数值n的各个位,又如何表示该数值;指针型变量的使用。【解题思路】本题中主要的问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b 都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。【解题宝典】知道两位数数值n,需要表示个位和十位,采用求余和除法操作,如n%10 (取个位)、n/10(取十位);

13

【参考答案】(1)i++ (2)m(3)m

【考点分析】本题考查:for循环语句;数组元素的引用。【解题思路】填空1:循环语句中,循环变量i增量为1。填空2:将每行元素中的值均右移m个位置,所以数组元素的下标是t[i][j+m]。填空3:此for循环语句实现左边元素置0操作,所以j的取值范围是0到m。

【参考答案】(1)while((high>=2) && (n<10))(2)yes=0; break;

【考点分析】本题考查:C语言程序的语法格式。

【解题思路】while循环条件丢掉一个括号。另一处是很简单的程序语法错误,没有加分号。

【参考答案】

double fun()

{

double x0,x1;

x1=0.0;

do

{

x0=x1;

x1=cos(x0);

}while(fabs(x0-x1)>=1e-6);

return x1;

}

【考点分析】本题考查:迭代法求方程的实根;do…while 循环语句,其形式为:

do{

语句

}while(表达式);

do…while循环与while循环的不同在于,它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续

循环;如果为假,则终止循环。因此,do…while循环至少要执行一次循环语句。

【解题思路】用迭代方法求方程的一个实根,题目已经给出了算法,只要按照算法用合适的程序表达,就可以解题了。

14

【参考答案】(1) a(2) d2841c49fe4733687e21aaa7(3) score[i]

【考点分析】本题考查:结构体数据类型;strcpy字符串拷贝函数。

【解题思路】填空1:题目要求先将形参a所指结构体变量中的数据赋给函数中的结构体变量b,所以此处b=a。填空2:通过strcpy函数修改b中的学生姓名,注意结构变量成员的表示方法。填空3:printf函数输出结果。

【解题宝典】结构变量成员的一般形式是:

结构变量名.成员名

例如:

student1.num即第一个学生的学号

student2.sex即第二个学生的性别

【参考答案】(1)s[j++]=s[i];或{s[j]=s[i];j++;}(2)s[j]=′\0′;

【考点分析】本题考查:数组元素下标;字符串结束标识′\0′。

【解题思路】由循环条件if(s[i]!=′c′)可知,如果字符串中的字符不是′c′,则将保留该字符到s[j]位置,然后下标j 进行加1操作。循环结束后要在新串的结尾加上′\0′。

【参考答案】

void fun( char *a )

{

int i=0,n=0;

char *p;

p=a;

while (*p=='*') /*判断*p是否是*号,并统计*号的个数*/

{

n++;p++;

}

while(*p) /*将前导*号后的字符传递给a*/ {

a[i]=*p;i++;p++;

}

while(n!=0)

{

a[i]='*';i++;n--;

}

a[i]='\0';

}

【考点分析】本题考查:移动字符串中指定字符的位置,一般采用while循环语句,通过指针型变量来完成。

【解题思路】函数fun的功能:将字符串中的前导*号全部

8

移到字符串的尾部。本题解题思路:(1)定义一个指针并指向字符串的首地址;(2)利用循环语句找出字符串的前导*号的个数n;(3)利用循环语句把剩余的字符拷贝到另一个字符串中;(4)在字符串的末尾接上n个*号。

15

【参考答案】(1) *fw(2) str(3) str

【考点分析】本题考查:函数定义以及文件指针;fputs 函数的功能是向指定的文件写入一个字符串,其调用形式为:fputs(字符串,文件指针)。

【解题思路】填空1:定义函数,函数的形参是一个文件类型的指针。填空2:此处考查fputs函数的形式,应填入str。填空3:依据printf函数的格式,输出字符串内容,即printf("%s",str);。

【参考答案】(1)void fun(long s,long *t)(2)s1=s1*10;

【考点分析】

函数定义,指针型变量;数值n和其各个位如何表示。【解题思路】(1)主函数中调用函数的参数为地址,因此函数fun的形式参数应为指针类型。(2)重新组合一个数,从个位开始,然后十位,依次类推,因此每增加一位数,原数值需乘以10,即s1=s1]

【参考答案】

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可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。

16

【参考答案】(1)1(2) i(3) a[p+i]或*(a+p+i)

【考点分析】条件运算符组成条件表达式的一般形式:"表达式1? 表达式2: 表达式3"。其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。

【解题思路】填空1:该处是判断数组元素的个数是奇数还是偶数,为奇数时要使当前位置加1,以使p指向数组中间位置。填空2和填空3:这里是一个比较常见的数组位置调换程序,应填入i和a[p+i]。

【解题宝典】变量交换算法:如变量a、b互换,需借助第三个变量temp完成,即temp=a;a=b;b=temp。

【参考答案】(1)float k;(2)if(*a< *c)

【考点分析】本题考查:变量定义,根据给定程序语句确定变量类型;if语句条件表达式。

【解题思路】(1) 观察程序中的k,在赋值语句中,k是以

变量的形式进行赋值而非指针,所以将k定义为指针是错误的。

(2) 此处if语句是为了将小于*c的值放入*c中,所以改为

if(*a < *c)z

【参考答案】

int fun( STREC *a, STREC *b )

{

int i,j=0,max=a[0].s;

/*找出最大值*/

for(i=0;i

if(max

for(i=0;i

if(max==a[i].s) b[j++]=a[i];

/*找出成绩与max相等的学生的记录,存入结构体b 中*/

return j;

/*返回最高成绩的学生人数*/

}

【考点分析】本题考查:结构体数组操作。用循环判断结构查找数组中的最大值。

【解题思路】该程序使用两个循环判断语句,第1个循环判断语句的作用是找出最大值。第2个循环判断语句的作用是找出与max相等的成绩(即最高成绩)的学生记录,并存入b中。

【解题宝典】对于如何找出数组中最大值(多个相等)的方法,我们已经不陌生。如果是对结构体数组进行类似操作呢?

掌握以下语句:

for(i=0;i

if(max

17

【参考答案】(1) N(2) k(3) ss[i]

【考点分析】本题考查:for循环语句;if语句条件表达式;

字符串拷贝函数strcpy 的使用。

【解题思路】填空1:for循环语句作用是遍历字符串数组中的每一个字符串,所以循环变量i的循环条件是i

【解题宝典】字符串拷贝函数strcpy ,其格式为:

strcpy (字符数组名1,字符数组名2)功能:把字符数组2中的字符串拷贝到字符数组1中。字符串结束标识′\0′也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。

【参考答案】(1) int k=0;(2)while (*p||*q)

【考点分析】本题考查:变量初始化,需根据题意确定变量含义,然后对其进行初始化操作;while循环语句。

【解题思路】(1) 变量k存放数组c的下标,因此应初始化

9

为0。(2) while循环语句的循环条件是判断两个字符串是否到达结尾。

【参考答案】

void fun( char *a )

{

int i=0;

char *p=a;

while(*p&&*p=='*')

{

a[i]=*p;

i++;

p++;

}

while(*p)

{

if(*p!='*')

{a[i]=*p;i++;}

p++;

}

a[i]='\0';

}

【考点分析】本题考查:指针型变量定义;while循环语句;if语句条件表达式;字符串结束标识'\0'。

【解题思路】函数fun的功能:除了字符串前导的*号之外,将串中其他*号全部删除。解答本题,(1) 定义一个临时指针p,初始指向原串首地址;(2) 利用循环语句把字符串前导*号拷贝到原串;(3) 继续移动指针,把串中和串尾的非*号字符拷贝到原串;(4)为修改后的字符串赋结束字符'\0'。

【解题宝典】要删除字符串中的指定字符,我们通常采用保留非指定字符的方法。可以将非指定字符保留在原串,即将需要保留的字符从原串的起始位置重新赋值;也可以保留到新串,即新建一个字符串,存放要保留的字符。

18

【参考答案】(1) 1(2) s[k]或*(s+k)(3) c

【考点分析】本题考查:指针型变量;if…else语句;赋值语句。

【解题思路】填空1:函数fun中变量n统计字符的长度,假如长度为偶数,则k=n-1;假如长度为奇数,则k=n -2,使得下标为奇数的最后一个元素有效(不是′\0′)。填空2:了解变量k的作用后,则将最右边的奇数位置的数赋值给变量c。填空3:将最后一个下标为奇数的元素移到第一个奇数位置。

【参考答案】(1)long s=0, t=0;(2)t=t/10;

【考点分析】本题考查:变量赋初值操作;求余运算和除法运算的区别。

【解题思路】(1) t用来存放每次循环后的多位数,第一次循环时,t应当是个位数,所以t的初始值应为0。(2)根

据题意,这里不需要求余数,而是要去掉个位数,重新组合一个数,因此应用除法运算。

【解题宝典】去掉数值n的个位的方法是采用除法运算,如果需要取出个位数才使用求余运算,此知识我们不要混淆。

【参考答案】

void fun(char *tt, int pp[])

{

int i;

for(i=0;i<26;i++)

pp[i]=0; /*初始化pp数组各元素为0*/ for(;*tt!='\0';tt++)

if(*tt>='a'&&*tt<='z')

pp[*tt-'a']++;

}

【考点分析】本题考查:for循环语句,注意循环变量取值范围以及循环体语句作用。数组元素初始化和赋值操作。if语句条件表达式,需注意条件表达式的逻辑运算。

字符串结束标识'\0'。

【解题思路】要求统计在tt所指字符串中'a'到'z'26个小写字母各自出现的次数,并依次放在pp所指数组中。首先for循环语句体中初始化pp数组中分别用来统计26个字母的个数。再使用循环判断语句对tt所指字符串中的字符进行逐一比较操作,同时存入相对应的pp数组中。

19

【参考答案】(1)N(2)i(3) -1

【考点分析】本题考查:for循环语句;函数返回值;if语句条件表达式。

【解题思路】填空1:变量i是循环变量,它的取值范围是在0到N之间。填空2:如果ss所指字符串数组中的字符串和t所指字符串相同的话,则返回其下标值,即return N-1;否则返回-1,即return -1。填空3:在main函数中输出最后结果,判断函数返回值n,如果n=0,说明没有找到,否则输出n。

【参考答案】(1)a2=k/10;(2)return i;

【考点分析】

本题考查:取数值n的各个位;return语句,将需要返回的函数值返回给函数main。

【解题思路】

(1) a2存放十位数,所以是a2=k/10,此处是一个书写错误

(2)根据题意,要返回能被3整除的数的个数,从循环体中

可以知道其个数是由i来计算的,所以返回的是i。

【参考答案】

void fun( char *a )

{

while(*a!='\0')

a++;

10

a--;/*指针a指向字符串的尾部*/

while(*a=='*')

a--;/*指针a指向最后一个字母*/

*(a+1)='\0';/*在字符串最后加上结束标志符*/

}

【考点分析】本题考查:删除字符串尾部*号;删除的主要思想是把不删除的字符保留起来。

【解题思路】对于一个字符串要删除其尾部的*号,只需要在最后一个不是*号的字符后面加上结束符号′\0′。具体操作为:首先找到字符串的结尾,然后从最后一个字符开始往前逐个判断是否为*号,直到找到非*号字符为止,最后在该字符后面加上结束符号'\0'。

20

【参考答案】(1)next(2) t->data(3) t

【考点分析】本题考查:链表数据结构,结点的表示方法,掌握链表数据结构的基本思想;释放内存空间函数free()。【解题思路】填空1:因为是链表操作,所以要使t逐一往后移动,语句为t=t->next。填空2:输出链表结点的数据域,即t->data。填空3:使用free函数将t所指向的内存空间释放。释放内存空间函数free调用形式:free(void*p);。功能:释放p所指向的一块内存空间,p是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。

【参考答案】(1)void fun(char *a)(2)printf("%c" ,*a) ;

【考点分析】本题考查:函数定义,本题为有参函数定义。printf()函数,其一般形式为"printf('格式控制字符串',输出表列) ;"。"%d"表示按十进制整型输出;"%ld"表示按十进制长整型输出;"%c"表示按字符型输出等。非格式字符串在输出时原样输出,起提示作用。

【解题思路】(1)定义函数时形参的类型要与调用函数中实参的类型一致,主函数中fun传递的是字符串s的首地址,所以此处形参应为指针类型。(2)根据printf函数格式,很容易找到错误之处。

【参考答案】

char *fun ( char *s, char *t)

{

int i,j;

for(i=0;s[i]!= '\0';i++);/*求字符串的长度*/

for(j=0;t[j]!= '\0';j++);

if(i<=j) /*比较两个字符串的长度*/

return t; /*函数返回较长的字符串,若两个字符串长度相等,则返回第1个字符串*/

else

return s;

}

【考点分析】本题考查:字符串长度比较运算,使用循环语句实现,应注意其循环条件。

【解题思路】本题中,第1个for循环的作用是求出s串的字

符个数i,第2个for循环的作用是求出t串的字符个数j,因为任何循环都要控制一条语句,所以在每一个for循环语句后面加上一个分号以结束循环。

21

【参考答案】(1) 999(2) t/10(3) x

【考点分析】本题考查:while循环语句;数值n各个位的表示方法;if语句条件表达式。

【解题思路】填空1:题目要求找出100~999之间附合要求的数,所以while语句的循环条件是t<=999。填空2:变量s2存放三位数的十位,取出三位数十位数值的方法为s2=(t/10)%10。填空3:题目需要判断各位上数字之和是否为x,所以if语句条件表达式是s1+s2+s3==x。

【解题宝典】三位数数值n各个位的表示方法,个位表示为n%10、十位表示为n/10%10、百位表示为n/100。

【参考答案】(1)void fun(long s,long *t)(2)while(s>0)

【考点分析】本题考查:函数定义,指针型变量作函数参数;while循环语句。

【解题思路】函数的形参类型应与实参类型相同,主函数中函数fun()的调用方式说明其参数应为指针类型,所以形参t应定义为long *t。while循环的功能是,每循环一次就从s中的数上取出一位进行运算,直到取完为止,所以循环条件为s>0。

【参考答案】

void fun( STREC a[] )

{

int i,j;

STREC t;

for(i=1;i

for(j=0;j

if(a[j].s

{t=a[j];a[j]=a[j+1];a[j+1]=t;}/*按分数的高低排列学生的记录,高分在前*/

}

【考点分析】本题考查:排序算法;结构体类型。

【解题思路】对N个数进行排序的算法很多,其中最简单的排序算法是冒泡算法。利用双层for循环嵌套和一个if判断语句来实现,外层循环用来控制需比较的轮数,内层循环用来控制两两比较。

【解题宝典】冒泡法算法思路:如果有N个数,则要进行N-1次比较,在每一次比较中要进行N-1次两两比较(这种算法较好理解但不是最精的)。所谓两两比较就是从头到尾依次将相邻两个数进行比较,并将其中较大的数放在前或在后(若要求从小到大排序,则大的数要放在后面,反之对调),即两两比较后这两个数要形成题中所要求的顺序。由于总是从头到尾进行比较,第1轮比较结束后,最大(或最小)数肯定在最后,第2轮比较结束后,次最大(或

11

次最小)数肯定在倒数第2个,依次类推,所以进行第1轮比较时必须比较到最后一个数,而进行第2轮比较时只要比较到倒数第2个数,进行第i轮比较时只需比较到第N-i -1个数即可(这种算法较难理解,但它是最好的)。选择法算法思路:如果有N个数,则从头到倒数的第2个数逐个向后移动,每移动1个数总是对其后面的所有数进行搜索,并找出它们的最大(或最小)数,然后与该数进行比较,若大于(或小于)该数则进行交换,交换后再移动到下一个数,依次交换到结束。此外,选择法还可用如下思路:如果有N个数,则从头到倒数第2个数逐个移动,每移动一个数总是将这个数与其后的所有数进行两两比较,在比较时按顺序将进行比较的这两个数排序(即交换)。插入法算法思路:先对前两个数进行排序。然后把第3个数插入到前两个数中,插入后前3个数依然有序;再把第4个数插入到前3个数中,插入后前4个数依然有序;依次插完所有的数。具体执行方式(假设从小到大排序):从第2个数开始往后逐个走动直到最后,每走到1个数总是将该数(先将其存到1个临时变量中)与前面的数进行比较(比较的顺序总是从后往前进行),在比较时只要发现该数比被比较的数小,就将被比较的数往后移1位,然后再与前1个数进行比较,直到发现该数比被比较的数大或已比较到头(即第1个数的前面),并将该数存入当前被比较数的后1位(存储空间)。例如,整型一维数组a中有N个元素,要求将其按从小到大排序。注意元素下标是从0开始的。冒泡法:

for(i=1;i

for(j=0;j

if(a[j]>a[j+1])

{t=a[j];a[j]=a[j+1];a[j+1]=a[j];}

选择法:

for(i=0;i

{

p=i;

for(j=i+1;j

if(a[p]>a[j]) p=j;

if(p!=i)

{t=a[i];a[i]=a[p];a[p]=t;}

}

插入法:

for(i=1;i

{

t=a[i];

for(j=i-1;a[j]>t&&j>=0;j--)

a[j+1]=a[j];

a[j+1]=t;

}

22

【参考答案】(1) ->sno(2) ->name(3) &t

【考点分析】本题考查:结构变量成员的表示方法;strcpy

函数;函数调用。

【解题思路】填空1:给b所指结构体变量学生学号赋值。

填空2:通过strcpy字符串拷贝函数修改b所指结构体变量

学生姓名。填空3:由于函数fun的形参是指针型变量,所

以在main中调用函数fun的参数应为指针或地址。

【参考答案】(1)double fun(double a,double x0)

(2)if(fabs(x1-x0)>=0.00001)

【考点分析】本题考查:双精度实型变量定义(double);

if语句条件表达式。

【解题思路】用C语言求平方根的方法一般有两种经典的

算法,分别是迭代法和递归法,本题要求仅用递归法。该

程序采用了if语句,错误在于if语句的判断条件,程序的

含义是当迭代结果差大于误差时进行循环,故正确的答案

应该是if(fabs(x1-x0)>=0.00001)。

【解题宝典】递归算法:一个过程或函数在其定义或说明

时又直接或间接调用自身的一种方法。递归算法一般用于

解决三类问题:(1)数据的定义是按递归定义的。(Fibonacci

函数)(2)问题解法按递归算法实现。(回溯)(3)数据的结构

形式是按递归定义的。(树的遍历)

【参考答案】

double fun( STREC *a, STREC *b, int *n )

{

int i;

double av=0.0;

*n=0;

for(i=0;i

av=av+a[i].s;

av=av/N; /*求平均值*/ for(i=0;i

if(av<=a[i].s)

{ b[*n]=a[i];*n=*n+1;} /*将高于等于平均分

的学生存入b所指存储单元中,并统计人数*/

return av;/*返回平均分*/

}

【考点分析】本题考查:结构体类型;for循环语句和if条

件语句的应用。

【解题思路】本题中第1个循环的作用求出所有分数的总

和,然后进行av=av/N后得到平均值。第2个循环的作用

是将大于等于平均分的学生存入b所指存储单元中。注意

同一结构体变量之间可以互相赋值。本程序中直接用*n

来表示b的下标,注意开始时要给*n赋初值0,且使用时不

能少*号,因为单独的n是一个指针变量,而我们要用的是

它所指向的存储单元中的值。

23

【参考答案】(1) q(2) next(3) next

【考点分析】本题考查:释放内存空间函数free();链表

结点的基本操作。

【解题思路】填空1:使用free函数,释放q所指的内存空

12

间,其一般格式为:free(指针变量)。填空2和填空3:删除链表中符合条件结点后,指针要指向下一个结点。【参考答案】(1)p=j ;(2)p=i;

【考点分析】本题考查:选择法排序。

【解题思路】(1)这里是一个语法错误,缺少一个";"号。

(2)p用来存放进行比较的两个数组元素中,较小元素的下标,因此此处应为p=i。

【参考答案】

void fun ( int m, int *a , int *n )

{

int i,j=0;

for(i=1;i<=m;i++)

if(i%7==0||i%11==0) /*求出1到m(含m)之内能被7或

11整除的所有整数放在数组a中*/

a[j++]=i;

*n=j; /*返回这些数的个数*/

}

【考点分析】本题考查:整除的判定方法;if语句条件表达式中"逻辑与"和"逻辑或"的区别;for循环语句;一维数组的定义与引用。

【解题思路】本题应使用循环判断语句实现,首先要确定循环变量的取值范围,题且要求找到1~m之间附合要求的数,所以循环变量的取值范围为1~m。if条件语句用来对每一个数进行判断,注意题目要求能被7或11整除,因此条件表达式中应使用逻辑或"||"运算符。

【解题宝典】整除用求余运算来实现。某数值n如能被数值m1或m2整除,则代码实现为:if(n%m1==0||n%m2==0)。

某数值n如能被数值m1和m2整除,则代码实现为:

if(n%m1==0&&n%m2==0)。

24

【参考答案】(1)0(2)j--(3)j

【考点分析】本题考查:数组元素的引用;for循环语句。【解题思路】填空1:N×N矩阵,第一列元素表示为t[0][N -j-1],第一行元素表示为t[j][0],将第一列赋值给第一行,因此填入0。填空2:for循环语句中,变量j的变化范围为从N-1递减到0,因此j做自减1操作。填空3:最后将临时数组r中的元素赋值给矩阵最后一列。

【解题宝典】二维数组周边元素的表示方法,通过设定数组下标来完成。我们举个简单的例子来说明,如二维数组a[3][3],我们列出它的所有数组元素:

a[0][0],a[0][1],a[0][2]

a[1][0],a[1][1],a[1][2]

a[2][0],a[2][1],a[2][2]

那么其周边元素有a[0][0],a[0][1],a[0][2], a[1][0], a[1][2] , a[2][0],a[2][1],a[2][2]。如果我们把a[3][3]改为a[i][j],就不难表示出该数组的周边元素:

a[0][0],a[0][i]…a[0][N-i-1]…a[0][N-1]

a[1][0],…a[1][N-1]

a[N-j-1][0],…a[N-j-1][N-1]

a[N-1][0],a[N-1][1]…a[N-1][N-i-1]…a[N-1][N-1]

【参考答案】(1)double f(double x)(2)return s ;

【考点分析】本题考查:函数定义,其一般形式为"类型标识符函数名(形式参数列表)",其中类型标识符指明了本函数的类型,函数的类型实际上就是函数返回值的类型。

【解题思路】该程序的流程是:fun()程序对f(n)项循环累加,fun()程序采用条件选择语句计算函数f(x)的值。第一处错误在于未定义函数f(double x)的类型,因此返回值类型为double型,所以此处函数应定义为double。第二处错误的语法错误。

【解题宝典】我们在做改错题目时候,首先应该检查C语言语法是否有问题,在很多题目中都有类似的错误。

【参考答案】

double fun( int m )

{

int i;

double s=0.0;

for(i=1;i<=m;i++)

s=s+log(i); /*计算s=ln(1)+ln(2)+ln(3)+…

+ln(m)*/

return sqrt(s);/*对s求平方根并返回*/

}

【考点分析】本题考查:计算表达式的值运用for循环语句通过累加操作求和;平方根函数sqrt()的使用。

【解题思路】首先计算从1到m的对数的和,因此循环变量的范围是1~m,每次循环都进行一次累加求和。该题需要注意的是,log()函数的形式参数应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。

在返回的时候求出平方根。

25

【参考答案】(1)fp(2) == (3) fp

【考点分析】

本题考查:文件结束检测函数feof;if语句条件表达式;

fseek函数。

【解题思路】填空1:while循环语句的循环条件是判断文件是否结束,配合feof函数来完成,其一般形式为:feof(文件指针);。填空2:根据题目要求确定if语句条件表达式的内容,满足条件后跳出循环。填空3:文件定位函数fseek(),调用形式;fseek(文件指针,位移量,起始点);,此处文件指针是fp。

【解题宝典】fseek函数用来移动文件内部位置指针,其调用形式为:fseek(文件指针,位移量,起始点);其中:"

文件指针"指向被移动的文件。"位移量"表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB

13

时不会出错。当用常量表示位移量时,要求加后缀"L"。"起始点"表示从何处开始计算位移量,规定的起始点有三种:文件首、当前位置和文件尾。其表示方法如下表。起始点

表示符号

数字表示

文件首

SEEK__SET

当前位置

SEEK__CUR

1

文件末尾

SEEK__END

2

例如:fseek(fp,50L,0)表示把位置指针移到离文件首50个字节处。

【参考答案】(1)n=strlen( aa ) ;(2)ch=aa[i];

【考点分析】本题考查:插入排序法;strlen函数的使用。【解题思路】插入排序算法:先对字符串中的前两个元素进行排序,然后第三个元素插入到前两个元素中,三个元素依然有序,依次类推,完成排序。(1)此处考查strlen函数的格式,应改为strlen(aa)。(2)程序中并没有定义变量c,该语句的作用是将元素a[i]的值赋给中间变量ch,以与其他元素进行比较并交换,所以应改为ch=a[i]。

【参考答案】

double fun( STREC *h )

{

double max=h->s;

while(h!=NULL) /*通过循环找到最高分数*/ {if(maxs) max=h->s;

h=h->next;

}

return max;

}

【考点分析】本题考查:结构体类型;指针型变量;链表的相关知识。

【解题思路】本题使用循环语句遍历链表中的每个结点,用判断语句比较结点数据的域大小。注意,h是一个指向结构体类型的指针变量,若要引用它所指向的结构体中的某一成员时,要用指向运算符"->"。

26

【参考答案】(1)0(2)j--(3)j

【考点分析】本题考查:数组元素的引用;for循环语句。【解题思路】填空1:N×N矩阵,第一列元素表示为t[0][N -j-1],第一行元素表示为t[j][0],将第一列赋值给第一行,因此填入0。填空2:for循环语句中,变量j的变化范围为从N-1递减到0,因此j做自减1操作。填空3:最后将

临时数组r中的元素赋值给矩阵最后一列。

【解题宝典】二维数组周边元素的表示方法,通过设定数组下标来完成。我们举个简单的例子来说明,如二维数组a[3][3],我们列出它的所有数组元素:

a[0][0],a[0][1],a[0][2]

a[1][0],a[1][1],a[1][2]

a[2][0],a[2][1],a[2][2]

那么其周边元素有a[0][0],a[0][1],a[0][2], a[1][0], a[1][2] , a[2][0],a[2][1],a[2][2]。如果我们把a[3][3]改为a[i][j],就不难表示出该数组的周边元素:

a[0][0],a[0][i]…a[0][N-i-1]…a[0][N-1]

a[1][0],…a[1][N-1]

a[N-j-1][0],…a[N-j-1][N-1]

a[N-1][0],a[N-1][1]…a[N-1][N-i-1]…a[N-1][N-1]

【参考答案】(1)double f(double x)(2)return s ;

【考点分析】本题考查:函数定义,其一般形式为"类型标识符函数名(形式参数列表)",其中类型标识符指明了本函数的类型,函数的类型实际上就是函数返回值的类型。

【解题思路】该程序的流程是:fun()程序对f(n)项循环累加,fun()程序采用条件选择语句计算函数f(x)的值。第一处错误在于未定义函数f(double x)的类型,因此返回值类型为double型,所以此处函数应定义为double。第二处错误的语法错误。

【解题宝典】我们在做改错题目时候,首先应该检查C语言语法是否有问题,在很多题目中都有类似的错误。

【参考答案】

double fun( int m )

{

int i;

double s=0.0;

for(i=1;i<=m;i++)

s=s+log(i); /*计算s=ln(1)+ln(2)+ln(3)+…

+ln(m)*/

return sqrt(s);/*对s求平方根并返回*/

}

【考点分析】本题考查:计算表达式的值运用for循环语句通过累加操作求和;平方根函数sqrt()的使用。

【解题思路】首先计算从1到m的对数的和,因此循环变量的范围是1~m,每次循环都进行一次累加求和。该题需要注意的是,log()函数的形式参数应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。

在返回的时候求出平方根。

27

【参考答案】(1) N(2) substr(3) 0

【考点分析】本题考查:for循环语句;strstr()字符串函数的使用;if语句条件表达式。

14

【解题思路】填空1:此处考查for循环语句中循环变量i 的取值范围,题目指出共有N个字符串,所以i的取值范围为0~N-1。填空2:strstr(s1,s2)的功能是在s1串中查找s2子串。题目要求在ss字符串数组中,查找substr所指的字符串,故应填substr。填空3:此处使用if条件语句来判断查找结果,由于printf("\nDon′t found!\n")可知此处需填写没有找到的条件,即是find==0。

【解题宝典】strstr(s1,s2)的功能是在s1串中查找s2子串,若没有找到,则函数值为0,若找到,函数值为非0。

【参考答案】(1)fun(int x,int y, int z)或int fun(int x,int y,int z)(2)return j;

【考点分析】本题考查:函数定义,注意有参函数的参数列表;函数返回值,通过return语句返回给主调函数。【解题思路】(1)定义函数时,必须为每个形参分别定义变量类型。

(2)通过return语句将最小公倍数j返回主调函数。

【解题宝典】几个自然数公有的倍数中最小的一个,叫做这几个数的最小公倍数。求几个数的最小公倍数的方法为:定义一个变量从1开始增加,每增加1即对几个数进行求余运算,直到几个数的余数全部为0,此时该数为这几个数的最小公倍数。

【参考答案】

void fun( char *a, int n,int h,int e )

{

int i,j=0;

for(i=h;i

a[j++]=a[i];

a[j]='\0'; /*在字符串最后加上结束标识*/

}

【考点分析】本题考查:删除字符串前导*号和尾部*号,其主要思想就是把不删除的字符保留起来。

【解题思路】由于程序已经给出前导*号和尾部*号的个数,所以只要用循环语句将中间的字符保留起来。注意循环变量i的初值(h)和终止值(n-e),由于h和e分别表示a中的前导*号和尾部*号的个数,n是字符串的长度,所以从a[h]到a[n-e-1]之间的所有字符都要保留。循环结束后在新串的尾部加上结束符'\0'。

【解题宝典】本题技巧:

1

2

3

void fun(char *a,int n,int h,int e )

{a[n-e]=′\0′;

strcpy(a,a+h);}

a[n-e]的作用是在最后一个字母后加上字符串结束符。本程序采用了strcpy()库函数。

28

【参考答案】(1)data(2) next(3) head

【考点分析】本题考查:链表数据结构,结点的表示方法;

掌握链表数据结构的基本思想。

【解题思路】本题考查的是链表的数据结构,需利用指针变量才能实现,一个结点中应包含一个指针变量,用来存放下一个结点的地址。建立单项链表的一般步骤是:建立头指针→建立第一个结点→头指针指向第一个结点→建立第二个结点→第一个结点的指针与指向第二个结点→……→最后一个结点的指针指向NULL。填空1:变量s 用来累加各结点的数据域,因此该空应为data。填空2:每次循环结束时,指针P指向下一个结点,即p=p ne xt。

填空3:由被调用函数的形参列表可知,此处应为指针类型变量,因为要对链表的数据域求和,所以在将链表的头指针传给被调用函数。

【参考答案】(1)while( *r)

(2){*a=*r;a++;r++;}

【考点分析】本题考查:指针型变量;C语言语法。

【解题思路】while( r)和r++都是简单的逻辑和语法错误,C语言中语句必须以分号";"结尾。只要掌握了C语言的基础知识,发现这样的错误是很容易的。

【参考答案】

void fun(char *s, char t[])

{

int i,j=0,k=strlen(s); /*k为字符串的长度*/

for(i=1;i

t[j++]=s[i];

t[j]='\0';

}

【考点分析】本题考查:删除字符串中指定字符,采用保留非指定字符的方法操作。

【解题思路】本题使用了一种i永远是奇数的循环方法,即for(i=1;i

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 )

(2)t[2*d]='\0';或t[d+i]='\0';或t[2*d]=0;或t[d+i]=0;

【考点分析】本题考查:函数定义;指针型变量的使用;

字符串结束标识符。

【解题思路】(1)从调用函数来看,函数传递的是数组,所以函数的形参应为指针。(2) 循环结束后回文字符的个数为2]

【参考答案】

void fun(char *s, char t[])

{

int i,j=0,n;

n=strlen(s);

for(i=0;i

if(i%2!=0&&s[i]%2!=0)

{

t[j]=s[i];

/*将下标为奇数同时ASCII码值为奇数的字符放入数组t中*/

j++;

}

t[j]='\0';/*最后加上结束标识符*/

}

【考点分析】本题考查:删除指定字符串中下标为偶数和ASCII码值为偶数的字符,只要把字符串中下标为奇数和ASCII码为奇数的字符保留,同时需要掌握奇数的判定方法。

【解题思路】本题要求除了下标为奇数同时ASCII码值也为奇数的字符之外,其余的所有字符都删除。即要留下下标为奇数同时ASCII码值也为奇数的字符。所以if的条件语句中应使用if(i%2!=0&&s[i]%2!=0)。

37

【参考答案】(1) 0(2) i++或++i或i+=1或i=i+1(3)2.0*i 【考点分析】本题考查:变量赋初值;while循环语句;

18

表达式通项的表示方法。

【解题思路】填空1:循环变量1从开始参加运算,但是在每次循环的开始i都进行自加1操作,故i应赋初值为0。填空2:循环变量i自增1运算。填空3:根据公式确定表达式通项。注意x为double类型,故应将i变为double类型再进行运算。

【参考答案】(1)void fun ( char *s , char *t )

(2)t[2*d]='\0';或t[d+i]='\0';或t[2*d]=0;或t[d+i]=0;【考点分析】本题考查:函数定义;指针型变量的使用;字符串结束标识符。

【解题思路】(1)从调用函数来看,函数传递的是数组,所以函数的形参应为指针。(2) 循环结束后回文字符的个数为2]

【参考答案】

void fun(char *s, char t[])

{

int i,j=0,n;

n=strlen(s);

for(i=0;i

if(i%2!=0&&s[i]%2!=0)

{

t[j]=s[i];

/*将下标为奇数同时ASCII码值为奇数的字符放入

数组t中*/

j++;

}

t[j]='\0';/*最后加上结束标识符*/

}

【考点分析】本题考查:删除指定字符串中下标为偶数和ASCII码值为偶数的字符,只要把字符串中下标为奇数和ASCII码为奇数的字符保留,同时需要掌握奇数的判定方法。

【解题思路】本题要求除了下标为奇数同时ASCII码值也为奇数的字符之外,其余的所有字符都删除。即要留下下标为奇数同时ASCII码值也为奇数的字符。所以if的条件语句中应使用if(i%2!=0&&s[i]%2!=0)。

38

【参考答案】(1) &&(2) 0或′\0′(3) s[j]或*(s+j) 【考点分析】本题考查:if语句条件表达式,很多情况下,往往需要配合逻辑运算符的使用;while循环语句循环条件的设定。

【解题思路】填空1:if语句中的条件是判断是否为数字字符,数字字符的条件是既要大于等于"1",同时还需要小于等于"9",因此需要使用逻辑与"&&"来连接。

填空2:while语句判断是否到达字符串的结尾,因此填入0(字符串结束标识'\0')。

填空3:for语句使数字后的字符全都向后移一个单位,那么要使s[j+1]=s[j]。

【解题宝典】如要在字符串中位置i处插入字符,需要将位置为i及其以后的字符后移1个位置,以便进行插入操作。

【参考答案】(1)for(i=2;i<=m;i++)

(2)y+=1.0/(i*i);或y+=(double)1.0/(i*i)

【考点分析】本题考查:for循环语句的循环条件;数据类型的强制转换。

【解题思路】(1)根据公式可以知道for循环语句中变量i的取值范围,应该包括m。(2)变量y是一个double型变量,而i是整型变量,所以要进行类型转换,改为y+=1.0/(i*i)。

【参考答案】

void fun ( int a[3][3], int b[3][3])

{

int i,j;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

b[i][j]=a[i][j]+a[j][i];/*把矩阵a加上a的转置,存放在矩阵b中*/

}

【考点分析】本题考查:矩阵的操作,如何表示矩阵及其转置矩阵的各个元素。

【解题思路】行列数相等的二维数组的转置就是行列互换,即转置后的第i行第j列正好对应原矩阵的第j行第i列。

本题使用双层循环实现矩阵的转置,并将计算结果存入矩阵B中,外层循环控制矩阵的行下标,内层循环控制矩阵的列下标。

【解题宝典】若要将矩阵a转置后还存入a中,可用程序:int i,j,t;

for(i=0;i

for(j=i;j

{t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}

注意第2个循环的初值。

若要将矩阵a转置后存入c中:

int i,j;

for(i=0;i

for(j=0;j

c[i][j]=a[j][i];

注意数组c和a的下标。

39

【参考答案】(1)NODE(2)next (3)r

【解题思路】填空1:本题考查了函数指针变量的函数返回值的类型,* fun(NODE *h)的返回值为p,而p的数据类型为NODE,因此本空应该填写NODE。填空2:从此空的形式p->可知本空应该填写next。填空3:本题要求将不带头结点的单向链表逆置,为了使q的指针向后移,此空应该填写r。

【参考答案】

(1)if(i%2 || s[i]%2==0) 或 if(i%2 !=0 || s[i]%2==0)

(2)t[j]= ′\0′; 或 t[j]=0;

19

【解题思路】(1)根据题意,将字符串s中位于奇数位置的字符或ASCII码值为偶数的字符,依次放入字符串t中,所

以if条件中要使用"或"运算。(2)变量j控制字符串t的下标,所以是t[j]。

【参考答案】

void fun(int (*s)[10],int *b,int *n,int mm,int nn) {

int i,j;

for(j=0;j

for(i=0;i

{

b[*n]=*(*(s+i)+j);

*n=*n+1;/*通过指针返回元素个数*/

}

}

【解题思路】题目要求实现将二维数组元素存入一维数组,需使用for循环语句来控制二维数组元素的下标,同时使用指针变量配合操作。可以用两个循环来处理问题,由于是按列的顺序取出,所以第1个循环用于控制列下标,第2个循环用于控制行下标。

40

【参考答案】(1) struct student (2) d2841c49fe4733687e21aaa7(3) a.score[i] 【考点分析】本考查:函数定义;结构变量成员的表示方法。

【解题思路】填空1:函数定义时,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。该题中,用结构类型定义函数类型。填空2和填空3: 此处考查结构体变量成员的表示方法a、name和a、score[i]分别表示学生的姓名和成绩。

【参考答案】(1)if(p==n) return -1;(2)a[i]=a[i+1];

【考点分析】本题考查:if语句条件表达式;数组元素赋值。

【解题思路】(1)需要确定if条件语句的条件表达式,发现变量p大写,C语言中变量是区别大小写的。(2)删除数列中的元素,删除后,后面的元素依次前移一个位置,因此此处应为a[i]=a[i+1]。

【参考答案】

int fun( STREC *a, STREC *b )

{

int i,j=0,min=a[0].s;

for(i=0;i

if(min>a[i].s)

min=a[i].s; /*找出最小值*/

for(i=0;i

if(min==a[i].s)

b[j++]=a[i]; /*找出成绩与min相等的学生的记录,存入结构体b中*/

return j;

}

【考点分析】本题考查:查找结构体数组中的最小数据,需要通过for循环语句和if条件语句来完成。

【解题思路】本题中第一个循环语句的作用是遍历数组求出最低分数,第二个循环语句的作用是将数组中的元素与最低分比较,查找是否存在与最低分相等的成绩。

41

【参考答案】(1) fp(2) fclose(fp)(3) fname

【考点分析】本题考查:文件的相关操作,fprintf函数与前printf功能相似,区别在于fprintf函数的对象不是键盘和显示器,而是磁盘文件;文件打开和关闭函数fopen和fclose的使用。

【解题思路】填空1:fprintf函数的形式是:fprintf(文件指针,格式字符串,输出表列);,所以填入文件指针fp。填空2:文件一旦使用完毕,应使用关闭函数fclose()将文件关闭,以避免发生文件数据丢失等错误。填空3:fopen函数用来打开一个文件,其一般形式为:文件指针名=fopen(文件名,使用文件方式);因此应填入文件名fname。

【参考答案】(1)for(i=j+1;i

【考点分析】本题考查:for循环语句;需明确各个变量含义。

【解题思路】该程序是对n个无序数实现从小到大的排序,先找出整数序列的最小项,置于指针第1个元素的位置;

再找出次小项,置于第2个元素的位置;之后顺次处理后续元素。(1)数组的长度为n,所以最后一个元素的下标值为n-1,i的取值范围应该包括此下标值。(2)p是中间变量,存放值较小的元素下标。

【参考答案】

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可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。

42

【参考答案】(1) 10(2) 0(3) x

【考点分析】本题考查:求余运算;if语句条件表达式。

【解题思路】填空1:通过t对10求余,取出该数值的各个位。填空2:通过if条件语句实现奇偶数的判定。如果条件表达式对2求余为0即是偶数,反之是奇数。填空3:最后将剩余的数赋给n指问的元素。

20

【参考答案】(1)正确:if( n==0)

(2)正确:result *=n--;或{result *=n; n--;}

【考点分析】本题考查:if语句条件表达式,需注意其格式;计算阶乘的方法。

【解题思路】(1)这里是一个简单的格式错误,if条件应该加括号。(2)根据阶乘的概念,从n开始,n!=n*(n-1)!,直到1,所以应该为result *=n--。

【参考答案】

long fun ( char *p)

{

long n=0;

int flag=1;

if(*p=='-') /*负数时置flag为-1*/

{p++;flag= -1;}

else if(*p=='+') /*正数时置flag为1*/

p++;

while(*p!='\0')

{n=n*10+*p-'0'; /*将字符串转成相应的整数*/

p++;

}

return n*flag;

}

【考点分析】本题考查:字符串转整数算法。

【解题思路】if()语句的作用是判断该字符串应当为正数还是负数,while()循环的作用是将字符串转成相应的整数。注意:*p是一个字符(如'9'、'4'),并不是一个数,要将其转成相应的数字需令其减去′0′ (不是′\0′),即*p-′0′就得到*p这个字符的相应数字,如′0′-′0′=0、′8′-′0′=8等。必须在程序的前面加#include,函数atol()的作用是将字符串p转成长整型数,它是一个库函数。

【解题宝典】要实现字符串转整数操作,而且不允许使用相应的字符串函数,因此我们需要通过字符减去′0′来实现,即*p-′0′就得到*p这个字符的相应数字。

掌握以下语句:

while(*p!=′\0′)

{n=n*10+*p-′0′;

p++;

}

43

【参考答案】(1) N(2) N-1(3) 0

【考点分析】本题考查:for循环语句;如何表示N×N矩阵中各个元素。

【解题思路】填空1:因为是N×N的矩阵,所以行列数是相同的。第一个for循环用来循环行,因此填入一个循环界限N。

填空2:此行语句将移出矩阵的元素暂存,移出矩阵的元素的列下标为N-1,因此填入N-1。

填空3:此行语句将移出矩阵的元素放入最左边,也就是第一列,第一列元素的列下标为0,因此填入0。

【参考答案】(1)s=s +(double)(n+1)/n;(2)return t;

【考点分析】本题考查:变量数据类型,根据题目要求需要进行强制转换;return语句。

【解题思路】(1)在C语言中,整数除以整数得出的结果也是整数,所以此处要转换数据类型。(2)观察while循环,假如返回值是变量s的话,那么返回的是大于q的值,题中所要返回的是小于q的值,所以应该返回变量t。

【参考答案】

int fun( int t)

{

int f0 = 0, f1 = 1, f ;

do {

f = f0 + f1 ;

f0 = f1 ;

f1 = f ;

} while(f < t) ;

return f ;

}

【考点分析】本题考查:变量数据类型及初始化;循环语句。

【解题思路】根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把f看成是前两项之和,而f0始终代表第n-2项,f1代表第n -1项。退出循环时得到的数f,就是大于指定数的最小的数。

44

【参考答案】(1) a[](2) 2(3) i+1

【考点分析】本题考查:函数定义;for循环语句。

【解题思路】填空1:由main中函数调用语句确定函数定义的形式参数。填空2:for循环语句中,循环变量增值为2。填空3:确定for语句循环变量的初值。

【参考答案】(1)sum=0.0;(2)if((i+1)%5==0)

【考点分析】本题考查:if语句条件表达式,需注意其格式是否正确;变量定义和变量使用是否一致。

【解题思路】(1)变量sum书写错误。(2)循环条件if(i+1%5==0)是一个运算逻辑错误,应先计算i+1,再对5求余。

【参考答案】

double fun( STREC *a, STREC *b, int *n )

{

int i,j=0;

double ave=0.0;

for(i=0;i

ave=ave+a[i].s;

ave=ave/N;/*求平均值*/

for(i=0;i

if(a[i].s

21

本文来源:https://www.bwwdw.com/article/ajaq.html

Top