2012年9月全国计算机考试二级C语言最新上机题库(打印版)
更新时间:2023-04-26 04:32:01 阅读量: 外语学习 文档下载
- 2023年全国计算机推荐度:
- 相关推荐
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(max 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 【解题宝典】要实现字符串转整数操作,而且不允许使用相应的字符串函数,因此我们需要通过字符减去′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
正在阅读:
2012年9月全国计算机考试二级C语言最新上机题库(打印版)04-26
仙客来种子的选购及育苗技术02-09
日进斗金的商贸古村05-25
网络信息安全论文:网络信息安全浅析12-23
湖南省邵阳市重点学校2020届高三综合模拟考试文科综合地理试题05-05
2011年中国人民大学管理综合考研专业课真题及答案04-19
2018年西南民族大学计算机导论之数据结构(C语言版)复试实战预测04-26
自航甲板驳船 有限元 全船 结构强度论文06-12
- 奶牛焦虫病的诊断与防治 - 医学期刊频道--首席医学网
- 外包工程发包流程
- 管理信息系统(路晓丽版)课后题答案(1-12章全)
- 小学语文课题研究方案
- 企业内部培训师管理制度
- 《史记》拓展阅读设计
- 入口广场铺装施工方案
- 附录B塔式起重机安装验收记录表
- 云南省昆明三中2014-2015学年高二下学期期中考试物理试卷 (Word版含答案)
- 郑州大学毕业设计附件
- 民俗学视野下的中国百年歌谣研究
- 巩固练2020统编版(2019)高二选择性必修上册第一单元阶段复习 第一单元仿真模拟训练
- 量化研究学习书单
- 给尾注编号加方括号超级简单方法
- 第1课《放大镜》
- 定价的步骤及新产品定价策略(1)
- 八年级英语下册第六单元基础知识
- 全省地方志工作会议综述
- An Investigation of Tightly Coupled Time Synchronous Speech Language Interfaces Using a Uni
- 新目标英语八年级(上)单元测试题(Units6-7)
- 上机
- 题库
- 二级
- 语言
- 计算机
- 打印
- 考试
- 全国
- 最新
- 2012
- 2016年北京化工大学文法学院公共行政学复试笔试最后押题五套卷
- 2017年西南交通大学信息科学与技术学院924信号与系统一考研题库
- 数学大师启示录_5莱布尼兹(1646-1716)
- 油墨稀释剂MSDS安全技术说明书
- 江西省2016年上半年临床助理医师精神神经系统:神经病及癔症考试
- 2018年西南民族大学计算机导论之数据结构(C语言版)复试实战预测
- 2015-2016学年江西省上饶市铅山一中、横峰中学高一下学期第一次
- Altium Designer10详细使用教程
- 考研数学一(概率论与数理统计)模拟试卷77.doc
- 2018年西北民族大学历史文化学院846中国古代史考研冲刺五套模拟
- BookShop系统项目详细设计说明书
- 刹车片背板项目可行性研究报告(技术工艺+设备选型+财务概算+厂区
- 乌拉特后旗代理发表职称论文发表-协同文化产业融资复杂系统论文
- 钢铁公司130吨高炉配25MW机组工程
- PLC实验报告交通灯控制系统
- 河南省周口市西华县第一高级中学2020-2021学年高一上学期第一次
- 数控车床安全操作规程(通用版)
- 汕尾市最新5年事业单位招聘考试笔试真题及答案完美版通用能力测
- PEP四年级英语上册期末复习计划
- 申请香港留学所需的三个步骤