您的当前位置:首页正文

C语言二级笔试试题(修订)

2020-02-26 来源:爱go旅游网


全国计算机等级考试

二级C语言程序设计

(满足新的二级考试大纲要求)

黄冈职业技术学院

第 1 章 C语言程序设计概述 .......................................................................................1 第 2 章 C语言的基本数据类型与表达式 ......................................................................2 第 3 章 顺序程序设计..................................................................................................6 第 4 章 选择结构程序设计...........................................................................................8 第 5 章 循环结构....................................................................................................... 12 第 6 章 函数与编译预处理......................................................................................... 17 第 7 章 数组.............................................................................................................. 26 第 8 章 指针.............................................................................................................. 32 第 9 章 结构体数据类型与链表.................................................................................. 43 第 10 章 位运算与文件操作 ....................................................................................... 49 上机考试题..................................................................................................................... 54

目 录

第 1 章 C语言程序设计概述

1.1 程序与程序设计 1.2 算法及其描述 1.3 C语言的发展及特点 1.4 C语言程序的基本结构 1.5 C语言字符集、标识符和关键字 1.6 C语言程序的开发环境

第 2 章 C语言的基本数据类型与表达式

2.1 C语言的基本数据类型 2.2 常量和变量 2.3 运算符与表达式 2.4 数据类型转换

第 3 章 顺序程序设计

3.1 C语言的基本语句 3.2 数据输入与输出 3.3 程序举例

第 4 章 选择结构程序设计

4.1 关系运算符与关系表达式 4.2 逻辑运算符与逻辑表达式 4.3 if语句

4.4 switch语句

第 5 章 循环结构

5.1 while语句 5.2 do-while语句 5.3 for 语句

5.4 break、continue和goto语句 5.5 循环的嵌套

5.6 复合结构程序举例

第 6 章 函数与编译预处理

6.1 模块化程序设计与函数 6.2 函数的定义与调用 6.3 函数的递归调用

6.4 变量的作用域与存储方式 6.5 编译预处理

第 7 章 数组

7.1 一维数组 7.2 二维数组

7.3 数组的应用

7.4 字符数组与字符串

7.5 数组作为函数的参数

7.6 程序举例

第 8 章 指针

8.1 指针与指针变量 8.2 指针与函数 8.3 指针与数组

8.4 指针与字符串

8.5 指针数组与命令行参数 8.6 程序举例

第 9 章 结构体数据类型与链表

9.1 结构体类型的定义 9.2 结构体类型变量 9.3 结构体类型数组

9.4 结构体类型指针

9.5 结构体与函数

9.6 链表

第 10 章 位运算与文件操作

10.1 位运算与位运算符

10.2 位运算举例 10.3 C文件概述 10.4 文件类型指针

10.5 文件的打开与关闭 10.6 文件的定位

第 11

章 上机考试题分析

第 1 章 C语言程序设计概述

第 1 章 C语言程序设计概述

一、选择题

1、以下叙述中正确的是

A)C语言比其他语言高级 B)C语言可以不用编译就能被计算机识别执行 C) C语言以接近英语国家的自然语言和数学语言作为语言的表达形式 D)C语言出现的最晚,具有其他语言的一切优点 2、以下说法正确的是

A)C语言程序总是从第一个的函数开始执行 B)在C语言程序中,要调用函数必须在main()函数中定义 C)C语言程序总是从main()函数开始执行 D)C语言程序中的main()函数必须放在程序的开始部分 3、C语言规定,在一个源程序中,main函数的位置

A)必须在最开始 B)必须在系统调用的库函数的后面 C)可以任意 D)必须在最后 4、以下叙述不正确的是

A)一个C源程序可由一个或多个函数组成 B)一个C源程序必须包含一个main函数

C)C程序的基本组成单位是函数 D)在C程序中,注释说明只能位于一条语句的后面 5、C语言程序的基本单位是

A)程序行 B)语句 C)函数 D)字符 6、以下叙述正确的是

A)在C程序中,每行中只能写一条语句

B)若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数 C)在C程序中,无论是整数还是实数,都能被准确无误地表示 D)在C程序中,%是只能用于整数运算的运算符 7、以下选项错误的是

B)main() A)main()

{ int x,y,z; { int x,y,z;

x=0;y=x-1; x=0,y=x+1; z=x+y;} z=x+y;}

C)main() D)main() { int x;

{ int x,y,z;

int y;

x=0;y=x+1;

x=0,y=x+1;

z=x+y,}

z=x+y;}

8、以下4个选项中,不能看做一条语句的是

A); B)a=5,b=2.5,c=3.6; C)if(a<5); D)if(b!=5)x=2;y=6; 9、字符型数据在机器中是用ASCII码表示的,字符“5”和“7”在机器中表示为

A)10100011和 01110111 B)01000101和01100011 C)00110101和00110111 D)01100101和01100111

二、填空题

1、用高级语言编写的程序称为【源】程序,它可以通过解释程序翻译一句执行一句的方式执行,也可以通过编译程序一次翻译产生目标程序,然后执行。

2、C语言程序的注释可以出现在程序中的任何地方,一个注释以【/**/】作为开始和结束。

三、部分填空题解析

2、解析: C语言程序的注释可以出现在程序基本单词之间的任何地方,C语言程序的注释以′/*′作为开始标记,并以′*/′作为结束标记。 1 仔细答题,认真总结! 二级考试专用

第 2 章 C语言的基本数据类型与表达式

第 2 章 C语言的基本数据类型与表达式

一、选择题

1、C语言中最简单的数据类型包括

A)整型、实型、逻辑型 B)整型、实型、字符型 C)整型、字符型、逻辑型 D)字符型、实型、逻辑型 2、下列各数据类型不属于构造类型的是

A)枚举型 B)共用型 C)结构型 D)数组型 3、C语言中的标识符只能由字母,数字和下划线三种字符组成,且第一个字符

A)必须为字母 B)必须为下划线 C)必须为字母或下划线 D)可以是字母,数字和下划线中任一字符 4、下列可用于C语言用户标识符的一组是

A)void, define, WORD B)a3_b3, _123,Car C)For, -abc, IF Case D)2a, DO, sizeof 5、请选出可用作C语言用户标识符的是

A)void,define,WORD B)a3_b3,_123,IF C)FOR,--abc,Case D)2a,Do,Sizeof 6、以下选项中合法的用户标识符是

A)long B)_2Test C)3Dmax D)A.dat 7、下列是用户自定义标识符的是

A)_w1 B)3_xy C)int D)LINE-3 8、下面四个选项中,均是不合法的用户标识符的选项是

A)A P_0 do B)float la0 _A C)b-a goto int D)_123 temp int 9、下面四个选项中,均是合法整型常量的选项是

A)160 -0xffff 011 B)-0xcdf 01a 0xe C)-01 986,012 0668 D)-0x48a 2e5 0x 10、下面四个选项中,均是正确的8进制数或16进制数的选项是

A)016 0x8f 018 B)0abc 017 0xa C)010 -0x11 0x16 D)0a12 7ff -123 11、下列数据中,不合法的C语言实型数据的是

A)0.123 B)123e3 C)2.1e3.5 D)789.0 12、在C语言中,退格符是

A)\n B)\t C)\f D)\b

13、下列用于printf函数的控制字符常量中,代表“竖向跳格”的转义字符常量是

A)\b B)\t C)\v D)\f 14、若有说明语句:char c='\72';则变量c

A)包含1个字符 B)包含2个字符 C)包含3个字符 D)说明不合法,c的值不确定 15、在C语言中,char型数据在内存中的存储形式是

A)补码 B)反码 C)原码 D)ASCII码 16、若变量已正确定义并赋值,以下符合C语言语法的表达式是

A)a:=b+1 B)a=b=c+2 C)int 18.5%3 D)a=a+7=c+b 17、若变量a,i已正确定义,且i已正确赋值,合法的语句是

A)a= =1 B)++i; C)a=a++=5; D)a=int(i); 18、在16位C编译系统上,若定义long a;,则能给a赋40000的正确语句是

A)a=20000+20000; B)a=4000*10; C)a=30000+10000; D)a=4000L*10L 19、若运行时给变量x输入12,则以下程序的运行结果是

main() {int x,y;

scanf(\"%d\); y=x>12?x+10:x-12; printf(\"%d\n\); } A)0 B)22 C)12 D)10

仔细答题,认真总结! 二级考试专用

2

第 2 章 C语言的基本数据类型与表达式

20、在C语言中,运算对象必须是整型数的运算符是

A)% B)\ C)%和\ D)** 21、C语言中运算对象必须是整型的运算符是

A)%= B)/ C)= D)<= 22、已知各变量的类型说明如下: int k,a,b;

unsigned long w=5; double x=1.42;

则以下不符合C语言语法的表达式是

A)x%(-3) B)w+=-2 C)k=(a=2,b=3,a+b) D)a+=a-=(b=4)*(a=3) 23、若有定义:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是

A)2.500000 B)2.750000 C)3.500000 D)0.000000 24、请选出以下语句的输出结果

printf(\"%d\n\(\"\t\\"\065\xff\n\"));

A)5 B)14 C)8 D)输出项不合法,无正常输出 25、设有数组定义: char array[]=\"China\"; 则数组 array所占的空间为

A)4个字节 B)5个字节 C)6个字节 D)7个字节 26、以下不正确的叙述是

A)在C程序中,逗号运算符的优先级最低 B)在C程序中,APH和aph是两个不同的变量 C)若a和b类型相同,在计算了赋值表达式a=b后b中的值将放入a中,而b中的值不变

D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值 27、sizeof(float)是

A)一个双精度型表达式 B)一个整型表达式 C)一种函数调用 D)一个不合法的表达式 28、若x,i,j和k都是int型变量,则计算表达式x=(i=4,j=16,k=32)后,x的值为

A)4 B)16 C)32 D)52 29、下列程序的输出结果是

main()

{ double d=3.2; int x,y; x=1.2; y=(x+3.8)/5.0; printf(\"%d\n\); } A)3 B)3.2 C)0 D)3.07

30、设变量a是int型,f是float型,i是double型,则表达式10+′a′+i*f值的数据类型为

A)int B)float `C)double D)不确定 31、设以下变量均为int类型,表达式的值不为7的是

A)(x=y=6,x+y,x+1) B)(x=y=6,x+y,y+1) C)(x=6,x+1,y=6,x+y) D)(y=6,y+1,x=y,x+1) 32、若有条件表达式 (exp)?a++:b--,则以下表达式中能完全等价于表达式(exp)的是

A)(exp==0) B)(exp!=0) C)(exp==1) D)(exp!=1) 33、以下选项中,与k=n++完全等价的表达式是

A)k=n,n=n+1 B)n=n+1,k=n C)k=++n D)k+=n+1 34、以下程序的输出结果是

main()

{ int a=21,b=11;

printf(\"%d\n\); }

A)30 B)31 C)32 D)33

35、设x、y均为整型变量,且x=10 y=3,则以下语句的输出结果是 printf(\"%d,%d\n\);

A)10,3 B)9,3 C)9,2 D)10,2 36、表达式aA)|| B)& C)< D)()

3

仔细答题,认真总结! 二级考试专用

第 2 章 C语言的基本数据类型与表达式

37、在C语言中,int,char和short三种类型数据在内存中所占用的字节数

A)由用户自己定义 B)均为2个字节 C)是任意的 D)由所用机器的机器字长决定 38、若有以下定义,则能使值为3的表达式是 int k=7,x=12;

A)x%=(k%=5) B)x%=(k-k%5) C)x%=k-k%5 D)(x%=k)-(k%=5) 39、下面程序的输出结果为

main()

{ int a,b;b=(a=3*5,a*4,a*5); printf(\"%d\);} A)60 B)75 C)65 D)无确定值 40、假定x和y为double型,则表达式x=2,y=x+3/2的值是

A)3.500000 B)3 C)2.000000 D)3.000000

41、以下变量x,y,z均为double类型且已正确赋值,不能正确表示数学式子x÷y÷z的C语言表达式是

A)x/y*z B)x*(1/(y*z)) C)x/y*1/z D)x/y/z 42、以下程序的输出结果是

main()

{ char c=′z′;

printf(\"%c\); } A)a B)Z C)z-25 D)y 43、有以下程序

#include main()

{ char *p=\"abcde\0fghjik\0 \"; printf(\"%d\n \(p)); }

程序运行后的输出结果是

A)12 B)15 C)6 D)5 44、设有int x=11;则表达式(x++*1/3)的值是

A)3 B)4 C)11 D)12 45、若变量a是int类型,并执行了语句:a=′A′+1.6;,则正确的叙述是

A)a的值是字符C B)a的值是浮点型 C)不允许字符型和浮点型相加 D)a的值是字符′A′的ASCII值加上1 46、下列程序运行的结果是

main() {float x; int i; x=3.6;

i=(int)x;

printf(\"x=%f,i=%d \); }

A)x=3.600000,i=3 B)x=3.6,i=3 C)x=3,i=3 D)x=3.600000,i=3.000000 47、以下选项中合法的标识符是(09年3月试题11)

A) 1_1 B)1—1 C)_11 D)1--

48、以下选项中,能用作数据常量的是(09年3月试题13)

A)o115 B) 0118 C)1.5e1.5 D) 115L

49、设有定义:int x=2; ,以下表达式中,值不为6的是(09年3月试题14)

A) x*=x+1 B) x++,2*x C)x*=(1+x) D)2*x,x+=2

二、填空题

1、在C语言中(以16位PC机为例),一个float型数据在内存中所占的字节数为4;一个double型数据在内存中所占的字

仔细答题,认真总结! 二级考试专用

4

第 2 章 C语言的基本数据类型与表达式

节数为【 8 】。

2、以下程序的输出结果是 【8,10】 。

main ()

{int i=010,j=10;

pirntf (\"%d,%d\n\); }

3、已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch=′a′+′8′-′3′的值为 【 102 】 。 4、下列程序的输出结果为 【12】 。

main ()

{int x=3,y=5;

printf (\"%d\(x--)*(--y));}

5、设y是int型,请写出y为奇数的关系表达式 【y%2==1】 。

6、设int a=5,b=6,表达式(++a==b--)?++a:--b的值是【 7 】 。 7、以下程序的输出结果是【 16 】。

main() {int a=0; a+=(a=8);

printf(\"%d\n\);}

8、在计算机中,字符的比较是对它们的【ASCII码】进行比较。

9、在内存中,存储字符′x′要占用1个字节,存储字符串″X″要占用【2】个字节。10、下列程序的输出结果是16.00,请填空。

main()

{int a=9, b=2;

float x=【6.6】, y=1.1,z; z=a/2+b*x/y+1/2;

printf(\"%5.2f\n\); }

11、以下程序段的输出结果是【 28 】。

main ()

{int a=2,b=3,c=4; a*=16+(b++)-(++c); printf(\"%d\);}

12、以下程序段的输出结果是【 5 】 。

int x=17,y=26;

printf (\"%d\(x%=6));

13、将以下程序写成三目运算表达式是【a>b?a:b】 。

if(a>b)max=a; else max=b;

14、下列y的值是 【 8 】。 int y; y=sizeof (2.25*4); 15、下列x的值是 【 8 】 。 int x;x=sizeof 2.25*4;

16、设x和y均为int型变量,且x=1,y=2,则表达式double(1+x/y)的值为【 1.0 】。17、把数学表达式 改写成C语言的表达式是【cos(x)*cos(x)*(m+n)/(m-n)】。 18、若有以下定义: char a;int b;

float c; double d;

则表达式a*b+d-c值的类型为【double】 。 19、若有以下程序段:

int c1=1,c2=2,c3; c3=1.0/c2*c1;

则执行后,c3中的值是【 0 】 。

5

仔细答题,认真总结! 二级考试专用

第 3 章 顺序程序设计

第 3 章 顺序程序设计

一、选择题

1、结构化程序所规定的三种最基本控制结构是

A)输入、处理、输出 B)树形、网形、环形 C)顺序、选择、循环 D)主程序、子程序、函数 2、若说明int *p,n;则通过语句scanf能够正确读入数据的程序段是

A)p=&n;scanf(\"%d\); B)p=&n;scanf(\"%d\); C)scanf(\"%d\); D)p=&n;scanf(\"%d\); 3、以下程序段的输出结果是

int a=1234;

printf(\"%2d\n\); A)12 B)34 C)1234 D)提示出错、无结果 4、已有定义int a=-2;和输出语句 printf(\"%8lx\);以下正确的叙述是

A)整型变量的输出形式只有%d一种 B)%x是格式符的一种,它可以适用于任何一种类型的数据 C)%x是格式符的一种,其变量的值按十六进制输出,但%8lx是错误的 D)%8lx不是错误的格式符,其中数字8规定了输出字段的宽度 5、对下面程序描述正确的一项是 (每行程序前面的数字表示行号)

1 main() 2 {

3 float a[3]={0.0}; 4 int i;

5 for(i=0;i<3;i++)scanf(\"%d\[i]); 6 for(i=1;i<3;i++)a[0]=a[0]+a[i]; 7 printf(\"%f\n\[0]); 8 }

A)没有错误 B)第3行有错误 C)第5行有错误 D)第7行有错误

6、若变量已正确说明为int类型,要通过语句scanf(\"%d %d %d \);给a赋值3,b赋值5,c赋值8,正确的输入形式是

A)3<回车>5<回车> 8<回车> B)3,5,8<回车> C)3<回车>58<回车> D)35<回车>8<回车> 7、以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是

main() { int *p,*q,a,b; p=&a;

printf(\"input a:\"); scanf(\"%d\); }

A)*p表示的是指针变量p的地址 B)*p表示的是变量a的值,而不是变量a的地址 C)*p表示的是指针变量p的值 D)*p只能用来说明p是一个指针变量 8、x,y,z被定义为int型变量,若从键盘给x,y,z输入数据,正确的输入语句是

A)INPUT x、y、z; B)scanf(\"%d%d%d\); C)scanf(\"%d%d%d\); D)read(\"%d%d%d\,&z); 9、执行下列程序时输入:123<空格>456<空格>789<回车> 输出结果是

main()

{ char s[100]; int c, i;

scanf(\"%c\); scanf(\"%d\); scanf(\"%s\); printf(\"%c,%d,%s\n\);} A)123,456,789 B)1,456,789 C)1,23,456,789 D)1,23,456 10、程序段:int x=12; (09年3月试题15)

仔细答题,认真总结! 二级考试专用

6

第 3 章 顺序程序设计

double y=3.141593; printf(“%d%8.6f”,x,y);的输出结果是

A)123.141593 B)12 3.141593 C)12,3.141593 D)123.141593

11、若有定义语句:double x,y,*px,*py,执行了px=&x, py=&y;之后,正确的输入语句是(09年3月试题16)

A)scanf(“%f%f”,x,y); B) scanf(“%f%f”,&x,&y); C) scanf(“%lf%le”,px,py); D) scanf(“%lf%lf”,x,y); 12、(23)有以下程序(09年3月试题23)

#include main()

{ int a1,a2;char c1,c2; scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2); printf(“%d,%c,%d,%c”,&1,c1,a2,c2); }

若想通过键盘输入,使得a1的值为12,a2的是为34,c1的值为字符a,c2的值为字符b,程序输出结果是:12,a,34,b,则正确的输入格式是(以下代表空格,代表回车)

A)12a34b B)12 A 34 b C)12,a,34,b D)12 a34 b

二、填空题

1、以下程序的输出结果是【1234】。

int a=1234;

printf (\"%2d\n\",a)

7

仔细答题,认真总结! 二级考试专用

第 4 章 选择结构程序设计

第 4 章 选择结构程序设计

一、选择题

1、在C程序中,判逻辑值时,用“非0”表示逻辑值“真”, 又用“0”表示逻辑值“假”。 在求逻辑值时,用()表示逻辑表达式值为“真”, 又用()表示逻辑表达式值为“假”。

A)1 0 B)0 1 C)非0 0 D)1 1 2、有如下程序段

int a=14,b=15,x; char c=′A′;

x=(a&&b)&&(c<′B′);

3、执行该程序段后,x的值为

A)ture B)false C)0 D)1 4、若运行以下程序时,从键盘输入 ADescriptor表示回车),则下面程序的运行结果是#include

main() {char c;

int v0=1,v1=0,v2=0;

do{switch(c=getchar()) {case ′a′:case ′A′: case ′e′:case ′E′: case ′i′:case ′I′: case ′o′:case ′O′:

case ′u′:case ′U′:v1+=1; default:v0+=1;v2+=1; } }while(c!=′\n′);

printf(\"v0=%d,v1=%d,v2=%d\n\);} A)v0=7,v1=4,v2=7 B)v0=8,v1=4,v2=8 C)v0=11,v1=4,v2=11 D)v0=13,v1=4,v2=12 5、有如下程序

main()

{ float x=2.0,y; if(x<0.0)y=0.0;

else if(x>10.0)y=1.0/x; else y=1.0;

printf(\"%f\n\);}

该程序的输出结果是

A)0.000000 B)0.250000 C)0.500000 D)1.000000 6、能正确表示逻辑关系:“a≥10或a≤0”的C语言表达式是

A)a>=10 or a<=0 B)a>=0|a<=10 C)a>=10 &&a<=0 D)a>=10‖a<=0 7、有如下程序

main()

{ int a=2,b=-1,c=2; if(aprintf(\"%d\n\); }

该程序的输出结果是

仔细答题,认真总结! 二级考试专用

8

第 4 章 选择结构程序设计

A)0 B)1 C)2 D)3

8、若变量c为char类型,能正确判断出c为小写字母的表达式是

A)′a′<=c<=′z′ B)(c>=′a′)||(c<=′z′) C)(′a′<=c)and(′z′>=c) D)(c>=′a′)&&(c<=′z′) 9、判断char型变量cl是否为大写字母的正确表达式是

A)′A′<=cl<=′Z′ B)(cl>=A)&&(cl<=Z) C)(′A′>=cl)||(′Z′<=cl) D)(cl>=′A′)&&(cl<=′Z′) 10、下列函数的运行结果是-1

main() int f(int a,int b) { int i=2,p; { int c; int j,k; if(a>b)c=1; j=i; else if(a==b)c=0; k=++i; else c=-1; p=f(j,k); return(c); printf(\"%d\); } }

11、设x,y和z都是int型变量,且x=3,y=4,z=5,则下面表达式中,值为0的表达式是

A)x&&y B)x<=y C)x||++y&&y-z D)!(x12、以下程序的输出结果是

main() {int a,i;a=0;

for(i=1;i<5;i++) {switch(i) {case 0:

case 3:a+=2; case 1:

case 2:a+=3; default:a+=5; }

}printf(\"%d\n\); }

A)31 B)13 C)10 D)20 13、以下程序的输出结果是

main()

{ int a=4,b=5,c=0,d; d=!a&&!b||!c;

printf(\"%d\n\);} A)1 B)0 C)非0的数 D)-1 14、设有:

int a=1,b=2,c=3,d=4,m=2,n=2;

执行 (m=a>b)&&(n=c>d)后n的值是

A)1 B)2 C)3 D)4 15、设x,y,t均为int型变量,执行语句: x=y=3; t=++x||++y;

完成后,y的值为

A)不确定 B)4 C)3 D)1 16、若执行下面的程序时,从键盘上输入5和2,则输出结果是

main() { int a,b,k;

9

仔细答题,认真总结! 二级考试专用

第 4 章 选择结构程序设计

scanf(\"%d,%d \); k=a;

if(aprintf(\"%d\n \); } A)5 B)3 C)2 D)0 17、请阅读以下程序:

main()

{ int a=5,b=0,c=0;

if(a=b+c)printf(\"***\n\"); else printf(\"$$$\n\"); }

以上程序

A)有语法错不能通过编译 B)可以通过编译但不能通过连接 C)输出*** 18、以下是if语句的基本形式:(09年3月试题17) if (表达式) 语句

其中“表达式”

A)必须是逻辑表达式 B)必须是关系表达式 C)必须是逻辑表达式或关系表达式 D)可以是任意合法的表达式 19、有以下程序(09年3月试题18) #include main() {int x; scanf(“%d”,&x); if(x<=3); else if(x!=10) printf(“%d\\n”,x); }

程序运行时,输入的值在哪个范围才会有输出结果

A)不等于10的整数 B)大于3且不等于10的整数 C)大于3或等于10的整数 D)小于3的整数 20、有以下程序(09年3月试题19) #include Main() {

int a=1,b=2,c=3,d=0; if(a= =1 &&b++= =2) if(b!=2 || c--!=3) printf(“%d,%d,%d\\n”,a,b,c); else printf(“%d,%d,%d\\n”,a,b,c); else printf(“%d,%d,%d\\n”,a,b,c);} 程序运行后的输出结果是

A)1,2,3 B)1,3,2 C)1,3,3 D)3,2,1 二、填空题

1、若已知a=10,b=20,则表达式!a2、若从键盘输入58,则以下程序输出的结果是 【585858】 。

main() {int a;

仔细答题,认真总结! 二级考试专用

D)输出$$$

10

第 4 章 选择结构程序设计

scanf(\"%d\);

if(a>50)printf(\"%d\); if(a>40)printf(\"%d\); if(a>30)printf(\"%d\);}

3、以下程序输出的结果是【0】。

main()

{ int a=5,b=4,c=3,d; d=(a>b>c); printf(\"%d\n\);

}

4、关系表达式xmain()

{ int x=100, a=10, b=20, ok1=5, ok2=0; if(aprintf(\"%d\n\);}

6、以下程序的输出结果是【9,9,11,】。

#define PR(ar)printf(\"%d,\) main()

{ int j, a[]={1, 3, 5, 7, 9, 11, 15}, *p=a+5; for(j=3; j; j--) switch(j)

{ case 1:

case 2: PR(*p++); break; case 3:PR(*(--p));} printf(\"\n\");}

三、部分填空题解析

1、解析: 计算表达式!a3、解析: 本题的关键在于对变量c的赋值运算:

d=(a>b>c) d=(5>4>3)

先算5>3,为真,得1,即:d=(1>3),此时1>3,为假,得0。

4、解析: x5、程序预置变量x的值为100,a的值为10,b的值为20,ok1为5,ok2为0。程序中给出的if语句可以写成更结构化的形式如下:

if (a由于条件a6、解析: 程序的宏定义PR以d格式输出参数的值和逗号字符。程序给数组a赋初值,并由指针p指向元素a[5]。程序让j从3至1,共循环3次。当j是3时,让p减1,并输出p所指元素的值9;当j是2和1时,输出p所指的数组元素的值,并让p增1,顺序输出9和11。所以程序输出: 9,9,11,

11

仔细答题,认真总结! 二级考试专用

第 5 章 循环结构

第 5 章 循环结构

一、选择题

1、下面有关for循环的正确描述是

A)for循环只能用于循环次数已经确定的情况

B)for循环是先执行循环体语句,后判断表达式

C)在for循环中,不能用break语句跳出循环体

D)for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来 2、对表达式for(表达式1; ;表达式3)可理解为

A)for(表达式1;0;表达式3)

B)for(表达式1;1;表达式3) C)for(表达式1;表达式1;表达式3)

D)for(表达式1;表达式3;表达式3)

3、以下描述中正确的是

A)由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句B)do-while循环由do开始,用while结束,在while(表达式)后面不能写分号 C)在do-while循环体中,是先执行一次循环,再进行判断 D)do-while循环中,根据情况可以省略while 4、C语言中 while 和do-while循环的主要区别是

A)do-while的循环体至少无条件执行一次

B)while的循环控制条件比do-while的循环控制条件更严格 C)do-while允许从外部转到循环体内 D)do-while 的循环体不能是复合语句 5、对下Ⅰ,Ⅱ两个语句描述正确的是 Ⅰ.while(1)Ⅱ.for(;;)

A)都是无限循环 B)Ⅰ是无限循环,Ⅱ错误 C)Ⅰ循环一次,Ⅱ错误

D)以上答案都错

6、下列程序的输出结果是

#include main() { int y=10;

do{y--;}while(--y); printf(\"%d\n\); } A)-1

B)1 C)8

D)0

7、有如下程序

main()

{ int x=23; do { printf(\"%d\);} while(!x); }

该程序的执行结果是

A)321 B)23 C)不输出任何内容

D)陷入死循环

8、执行语句 for(i=1;i++<4;); 后变量 i 的值是

仔细答题,认真总结! 二级考试专用

12

第 5 章 循环结构

A)3

B)4 C)5

D)不定

9、在下述程序中,判断i>j共执行的次数是

main()

{int i=0, j=10, k=2, s=0; for (;;) {i+=k;

if(i>j)

{printf(\"%d\); break;

A)4

}s+=i;}} B)7 C)5

D)6

10、设有程序段

int k=10;

while(k=0)k=k-1; 则下面描述中正确的是

A)while循环执行10次 11、若有如下语句

int x=3;

do{ printf(\"%d\n\);} while(!(--x)); 则上面程序段

A)输出的是1

B)输出的是1和-2 C)输出的是3和0

D)是死循环

12、下面程序的功能是把316表示为两个加数的和,使两个加数分别能被13和11整除,请选择填空。

#include main() { int i=0,j,k;

do{i++;k=316-13*i;}while(______); j=k/11;

printf(\"316=13*%d+11*%d\); }

A)k/11

B)k%11 C)k/11==0

D)k%11==0

B)循环是无限循环 C)循环体语句一次也不执行 D)循环体语句执行一次

13、下面程序的功能是将从键盘输入的一对数,由小到大排序输出,当输入一对相等数时结束循环,请选择填空。

#include main()

{int a,b,t;

scanf(\"%d%d\); while(_______) {if(a>b)

{t=a;a=b;b=t;}

printf(\"%d,%d\n\); scanf(\"%d%d\); }} A)!a=b

B)a!=b C)a==b

D)a=b

13、以下程序的输出结果是

main()

{ int i,j,x=0;

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

13

仔细答题,认真总结! 二级考试专用

第 5 章 循环结构

{ x++;

for(j=0;j<3;j++) { if(j%2)continue; x++;}

x++;}

printf(\"x=%d\n\);} A)x=4

B)x=8 C)x=6

D)x=12

14、设有以下程序段

int x=0,s=0;

while(!x!=0)s+=++x; printf(\"%d\);

A)运行程序段后输出0

B)运行程序段后输出1 D)程序段执行无限次

C)程序段中的控制表达式是非法的 15、下列说法正确的是

int i,x;

for(i=0,x=0;i<=9 &&x!=876;i++)scanf(\"%d\);

A)最多的执行10次 16、已知 int t=0;

while (t=1) {...}

则以下叙述正确的是

A)循环控制表达式的值为0 17、有如下程序:

main()

{int n=9;

while(n>6){n--; printf(\"%d\);}

}

18、该程序的输出结果是

A)987 B)876 C)8765

B)循环控制表达式的值为1 C)循环控制表达式不合法 D)以上说法都不对

B)最多执行9次 C)是无限循环

D)循环体一次也不执行

D)9876

19、在下列选项中,没有构成死循环的是 A)int i=100; C)int k=10000;

while(1) {i=i%100+1;

if(i>100)break; } B)for(;;);

do{k++;}while(k>10000);

D)int s=36; while(s)--s;

二、填空题

1、设i,j,k均为int型变量,则执行完下面的for语句后,k的值为【10】 。 for(i=0, j=10; i<=j; i++, j--)k=i+j;

2、函数fun的功能是:根据以下公式求p的值,结果由函数值返回。m与n为两个正数且要求m>n。

例如:m=12,n=8时,运行结果应该是495.000000。请在题目的空白处填写适当的程序语句,将该程序补充完整。

#include

仔细答题,认真总结! 二级考试专用

14

第 5 章 循环结构

#include

float fun (int m, int n) { int i;

double p=1.0;

for(i=1;i<=m;i++)【p*=i】; for(i=1;i<=n;i++)【p/=i】; for(i=1;i<=m-n;i++)p=p/i; return p;} main ()

{ clrscr();

printf (\"p=%f\n\(12,8));}

3、以下程序的功能是从健盘输入若干学生的成绩,并输出最高成绩和最低成绩,当输入负数时结束。请填空。 main ()

{float x,amax,amin; scanf (\"%f\); amax=x; amin=x; while (【x>=0】) {if (x>amax) amax=x; else

if【xamin=x;

else scanf (\"%f\);

}

printf (\"\n amax=%f\n amin=%f\n\);

}

4、下列程序的功能是输入一个整数,判断是否是素数,若为素数输出1,否则输出0,请填空。

main()

{int i, x, y=1;

scanf(\"%d\); for(i=2; i<=x/2; i++)

if【x%i==0】{ y=0; break;} printf(\"%d\n\);

}

5、若变量n中的值为24,则print()函数共输出【2】行,最后一行有【4】个数。

void print (int n,int aa[]) {int i;

for (i=1; i<10;i++) {printf (\"%6d\[i]); if(!(i%5)) printf (\"\n\"); }

printf (\"\n\"); }

6、以下程序的输出结果是【852】。

main()

15

仔细答题,认真总结! 二级考试专用

第 5 章 循环结构

{ int y=9;

for(; y>0; y--)

if (y%3==0)

{printf(\"%d\); continue;} }

三、部分填空题解析

1、解析: 该for语句以i为0,j为10初始化,循环条件是i<=j,每次循环后i增1、j减1,循环体是将i与j的和赋给k。这样变量k将保存的是最后一次赋给它的值。一次循环后i为1、j为9,二次循环后i为2、j为8,„„,五次循环后i为5、j为5,继续第六次循环,将i与j的和10存于k后,i为6、j为4,结束循环。所以循环执行后k为10。

3、本题先从键盘接受数值,并分别赋给amax(用于保存最高成绩)和amin(用干保存最低成绩),然后通过while循环控制是否结束输入,并且通过if语句来给amax和amin赋值和进行下一次的输入。

4、为判数x是否是素数,预置变量y的值为1(x可能是素数),然后用循环,用2至x/2的整数i测试对x的整除性,若能被其中的某个整数整除,则x是合数,置y的值为0(x不是素数),结束测试循环。若都不能整除,则x为素数。i能否整除x,可用求余运算x%i等于0来判定。所以程序中的空框可填x%i == 0。测试x为素数的代码可写成:y = 1;

for(i=2; i <=x/2; i++)

if(x%i == 0){ y = 0; break; }

5、解析: 语句if(!(i%))printf(\"\n\");是将每5个数输出一行,因为n的值为24,所以共输出5行,最后一行有4个数。

6、解析: 循环前,变量y的值为9,其中的循环语句在y大于0情况下循环,每次循环后y的值减1。循环体是当y能被3整除时输出表达式--y,输出的是减1后的y值。这样,第一次循环因y为9,能被3整除,输出8,y也变成8。又经两次循环,y的值变为6,又让y减1变成5,并输出5;又经两次循环,y的值变成3,让y减1变成2,输出2;再经两次循环后,y的值变成0,结束循环。所以程序输出852。

仔细答题,认真总结! 二级考试专用

16

第 6 章 函数与编译预处理

第 6 章 函数与编译预处理

一、选择题

1、以下叙述中正确的是

A)构成C程序的基本单位是函数 B)可以在一个函数中定义另一个函数 C)main()函数必须放在其他函数之前 D)C函数定义的格式是K&R格式 2、以下正确的说法是

A)定义函数时,形参的类型说明可以放在函数体内 B)return后边的值不能为表达式

C)如果函数值的类型与返回值类型不一致,以函数值类型为准 D)如果形参与实参类型不一致,以实参类型为准 3、一个C语言程序是由

A)一个主程序和若干子程序组成 B)函数组成 C)若干过程组成 D)若干子程序组成 4、下列叙述中正确的是

A)C语言编译时不检查语法 B)C语言的子程序有过程和函数两种 C)C语言的函数可以嵌套定义 D)C语言的函数可以嵌套调用 5、以下叙述中正确的是

A)构成C程序的基本单位是函数 B)可以在一个函数中定义另一个函数

C)main()函数必须放在其他函数之前 D)所有被调用的函数一定要在调用之前进行定义 6、以下对C语言函数的有关描述中,正确的是

A)在C语言中调用函数时,只能把实参的值传给形参,形参的值不能传送给实参 B)C函数既可以嵌套定义又可以递归调用

C)函数必须有返回值,否则不能使用函数 D)函数必须有返回值,返回值类型不定` 7、以下不正确的说法是 C语言规定:

A)实参可以是常量,变量或表达式 B)形参可以是常量,变量或表达式 C)实参可以为任何类型 D)形参应与其对应的实参类型一致 8、C语言规定,函数返回值的类型是由

A)return语句中的表达式类型所决定 B)调用该函数时的主调函数类型所决定 C)调用该函数时系统临时决定 D)在定义该函数时所指定的函数类型所决定 9、以下正确的说法是

A)用户若需调用标准库函数,调用前必须重新定义

B)用户可以重新定义标准库函数,若如此,该函数将失去原有含义 C)系统根本不允许用户重新定义标准库函数

D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动调用 10、调用gets和puts函数时,必须包含的头文件是

A)stdio.h B)stdlib.h C)define D)以上都不对 11、以下正确的函数头定义形式是

A)double fun(int x,int y) B)double fun(int x;int y) C)double fun(int x,int y); D)double fun(int x,y); 12、C语言允许函数类型缺省定义,此时函数值隐含的类型是

A)float B)int C)long D)double 13、以下程序有语法错误,有关错误原因的正确说法是

main() { int G=5,k;

void prt_char(); ...

17

仔细答题,认真总结! 二级考试专用

第 6 章 函数与编译预处理

k=prt_char(G); ...}

A)语句 void prt_char();有错,它是函数调用语句,不能用void说明 B)变量名不能使用大写字母 C)函数说明和函数调用语句之间有矛盾 D)函数名不能使用下划线 14、有如下程序

int func(int a,int b) { return(a+b);} main()

{ int x=2,y=5,z=8,r;

r=func(func(x,y),z); printf(\"%d\n\); }

该程序的输出的结果是

A)12 B)13 C)14 D)15 15、下面函数调用语句含有实参的个数为 func((exp1,exp2),(exp3,exp4,exp5));

A)1 B)2 C)4 D)5

16、下面程序应能对两个整型变量的值进行交换。以下正确的说法是

main()

{int a=10,b=20;

printf(\"(1)a=%d,b=%d\n\); swap(&a,&b);

printf(\"(2)a=%d,b=%d\n\); }

swap(int p,int q) {int t;

t=p;p=q;q=t; }

A)该程序完全正确

B)该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可

C)该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可 D)以上说法都不对 17、下列函数的运行结果是

main() { int i=2,p; int j,k; j=i; k=++i;

p=f(j,k);

printf(\"%d\); }

int f(int a,int b) { int c;

if(a>b)c=1;

else if(a==b)c=0; else c=-1; return(c); }

A)-1 B)1 C)2 D)编译出错,无法运行 18、有以下程序:

void fun(int a,int b,int c)

仔细答题,认真总结! 二级考试专用

18

第 6 章 函数与编译预处理

{a=456,b=567,c=678;} main()

{int x=10,y=20,z=30; fun(x,y,z);

printf(\"%d,%d,%d\n\,z); }

输出结果是

A)30,20,10 B)10,20,30 C)456,567,678 D)678,567,456 19、有以下程序

float fun(int x,int y) {return(x+y);} main()

{int a=2,b=5,c=8;

printf(\"%3.0f\n\((int)fun(a+c,b),a-c)); }

程序运行后的输出结果是

A)编译出错 B)9 C)21 D)9.0 20、有以下程序

fun(int x,int y,int z) { z=x*y;} main()

{int a=4,b=2,c=6; fun(a,b,c); printf(\"%d\); }

程序运行后的输出结果是

A)16 B)6 C)8 D)12 21、在调用函数时,如果实参是简单的变量,它与对应形参之间的数据传递方式是

A)地址传递 B)单向值传递 C)由实参传形参,再由形参传实参 D)传递方式由用户指定 22、有以下程序

int f(int n)

{ if(n==1)return 1; else return f(n-1)+1; }

main() { int i,j=0;

for(i=1;i<3;i++)j+=f(i); printf(\"%d\n\); }

程序运行后的输出结果是

A)4 B)3 C)2 D)1 23、若有以下程序

#include void f(int n); main()

{ void f(int n); f(5); }

void f(int n)

{ printf(\"%d\n\); }

则以下叙述中不正确的是

19

仔细答题,认真总结! 二级考试专用

第 6 章 函数与编译预处理

A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f

B)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数f C)对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明 D)函数f无返回值,所以可用void将其类型定义为无返回值型

24、有如下程序:

long fib(int n)

{ if(n>2)return(fib(n-1)+fib(n-2)); else return(2); }

main()

{ printf(\"%d\n\(3));}

该程序的输出结果是

A)2 B)4 C)6 D)8 25、以下程序的输出结果是

long fun( int n) { long s;

if(n==1||n==2)s=2; else s=n-fun(n-1); return s;} main()

{ printf(\"%ld\n\(3)); } A)1 B)2 C)3 D)4 26、在C语言中,变量的隐含存储类别是

A)auto B)static C)extern D)无存储类别 27、以下叙述中不正确的是

A)在不同的函数中可以使用相同的名字的变量 B)函数中的形式参数是局部变量 C)在一个函数内定义的变量只在本函数范围内有效

D)在一个函数内的复合语句中定义的变量在本函数范围内有效 28、以下程序的输出结果是

main() { int x=1,y=3;

printf(\"%d,\); { int x=0;x+=y*2;

printf(\"%d,%d, \); }

printf(\"%d,%d\n\); }

A)1,6,3,1,3 B)1,6,3,6,3 C)1,6,3,2,3 D)1,7,3,2,3 29、以下程序的输出结果是

int f()

main() { static int i=0;

{ int i,a=0; int s=1;

for(i=0;i<5;i++)a+=f(); s+=i; i++;

printf(\"%d\n\); return s; } }

A)20 B)24 C)25

D)15

30、以下叙述中不正确的是

A)预处理命令行都必须以#号开始

B)在程序中凡是以#号开始的语句行都是预处理命令行 C)宏替换不占用运行时间,只占编译时间

仔细答题,认真总结! 二级考试专用

20

第 6 章 函数与编译预处理

D)在以下定义是正确的: #define PI 3.1415926; 31、#define F(X,Y)(X)*(Y)

main() {int a=3, b=4;

printf(\"%d\n\(a++, b++)); }

程序运行后的输出结果是

A)12 B)15 C)16 D)20 32、有如下程序:

#define N 2 #define M N+1 #define NUM 2*M+1 main() { int i;

for(i=1;i<=NUM;i++)printf(\"%d\n\); }

该程序中的for循环执行的次数是

A)5 B)6 C)7 D)8 33、以下程序的运行结果是

#define MIN(x,y)(x)<(y)?(x):(y) main()

{ int i=10,j=15,k; k=10*MIN(i,j); printf(\"%d\n\); }

A)10 B)15 C)100 D)150 34、有如下定义

#define D 2

int x=5;float y=3.83; char c=′D′;

则下面选项中错误的是

A)x++; B)y++; C)c++; D)D++; 35、以下程序段的执行结果为

#define PLUS(X,Y)X+Y main()

{ int x=1,y=2,z=3,sum;

sum=PLUS(x+y,z)*PLUS(y,z); printf(\"SUM=%d\); }

A)SUM=9 B)SUM=12 C)SUM=18 D)SUM=28 36、(20)以下程序中的变量已正确定义(09年3月试题20)

for(i=0;i<4;i++,i++)

for(k=1;k<3;k++);printf(”*”); 程序段的输出结果是

A)******** B)**** C)** D)* 37、(22)设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是(09年3月试题22)

A)n=0;while((ch=getchar())!=’\\n’)n++; B) n=0;while(getchar()!=’\\n’)n++; C)for(n=0; getchar()!=’\\n’;n++); D)n=0;for(ch=getchar();ch!=’\\n’;n++); 38、(24)有以下程序(09年3月试题24)

#include int f(int x,int y)

21

仔细答题,认真总结! 二级考试专用

第 6 章 函数与编译预处理

{return()(y-x)*x);} main()

{int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c)); printf(“%d\\n”,d); }

程序运行后的输出结果是

A)10 B)9 C)8 D)7 39、(28)以下函数按每行8个输出数组中的数据(09年3月试题28)

void fun( int *w,int n) { int i;

for(i=0;i下划线处应填入的语句是 A)if(i/8==0)print(“\\n”); B) if(i/8==0)continue; C) if(i%8==0)print(“\\n”); D) if(i%8==0)continue; 40、(33)有以下程序(09年3月试题33)

#include int fun(int x,int y)

{ if(x==y) return(x); else return((x+y)/2) }

main()

{ int a=4,b=5,c=6; printf(“%d\\n”,fun(2*a,fun(b,c))) }

程序运行后的输出结果是

A)3 B)6 C)8 D)12 41、(34)设函数中有整型变量n,为保证其在未赋值的情况下初值为0,应选择的存储类别是

A)auto B) register C)static D)auto或register 42、(35)有以下程序 #include int b=2;

int fun(int *k)

{ b=*k+b;return (b);} main()

{ int a[10]={1,2,3,4,5,6,7,8},i;

for(i=2;i<4;i++) {b=fun(&a[i])+b;printf(“%d”,b);} printf(“\\n”); }

程序运行后输出的结果是

A)10 12 B)8 10 C)10 28 D)10 16 43、(36)有以下程序

#include #define PT 3.5;

#define S(x) PT*x*x; mian()

{ int a=1, b=2; printf(“%4.1f\\n”,S(a+b));} 程序运行后输出的结果是

仔细答题,认真总结! 二级考试专用

22

第 6 章 函数与编译预处理

A)14.0 B)31.5 C)7.5 D)程序有错无输出结果 44、(38)设有宏定义:#define IsDIV(k,n) (k%n==1)?1:0且变量m已正确定义并赋值,则宏调用:IsDIV(m,5)&& IsDIV(m,7)为真时所要表达的是

A)判断m是否能被5或者7整除 B)判断m是否能被5和7整除 C)判断m被5或者7整除是否余1 D)判断m被5和7整除是否余1

二、填空题

1、设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的首部【void fun(double b[10][22])】。要求形参名为b。

main()

{double s[10][22]; int n; ┆ ┆

fun(s); ┆ }

2、以下程序运行结果是【5】 。

long fib (int g) { switch (g) { case 0∶return 0;

case 1∶case2∶return 1; }

return (fib (g-1)+fib(g-2));} main () { long k; k=fib (5);

printf (\"k=%d\n\);}

3、调用C语标准库函数时要求用【#include】命令。 4、以下程序的输出结果是【12】。

unsigned fun6(unsigned num) { unsigned k=1;

do{k *=num%10;num/=10;} while (num); return k; } main()

{ unsigned n=26;

printf(\"%d\n\(n));}

5、以下程序的输出结果是 【31】 。

fun (int x,int y,int z) { z =x*x+y*y;} main () {int a=31; fun (6,3,a)

printf (\"%d\)}

6、设有如下宏定义

#define MYSWAP(z,x,y) {z=x;x=y;y=z;}

以下程序段通过宏调用实现变量a,b内容交换,请填空。

float a=5,b=16,c; MYSWAP(【c】,a,b);

7、以下程序的运行结果是【9】。

#define MAX (a,b)(a>b?a:b)+1

23

仔细答题,认真总结! 二级考试专用

第 6 章 函数与编译预处理

main () { int i=6,j=8,k;

printf (\"%d\n\(i,j));}

8、以下程序的输出结果为【9】。

#define JFT(x)x*x main() { int a, k=3;

a=++JFT(k+1); printf(\"%d\);}

9、下面程序的运行结果是【1000 10】。

#define N 10

#define s(x)x*x #define f(x)(x*x) main() { int i1,i2;

i1=1000/s(N); i2=1000/f(N); printf(\"%d %d\n\);}

10、以下程序的输出结果是【70】 。

#define MAX(x,y)(x)>(y)?(x):(y) main()

{ int a=5,b=2,c=3,d=3,t; t=MAX(a+b,c+d)*10; printf(\"%d\n\);}

11、以下程序的输出结果是【246】。

void fun() { static int a=0;

a+=2; printf(\"%d\);} main() { int cc;

for(cc=1;cc<4;cc++)fun(); printf(\"\n\");}

三、部分填空题解析

1、本题中,为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。这系统就保证不使函数带回任何值,二维数组的第一维可以省略。

2、解析: 由题可知fib(0)的值为0,fib (1)和fib (2)的值为1,因此,fib (3)=fib(2)+fib(1)=2;fib(4)=fib(3)+fib(2)=3;fib(5)=fib(4)+fib(3)=5。

3、include命令可调用标准的C语言库函数,可以用一对括号或一对双引号,但要在前面加\"#\"。

4、解析: 函数有一个形参num,循环前变量k置1,循环中,表达式num%10是取num的个位,将num的个位值累乘于k中,然后num除以10。循环直至num为0结束,这是逐一求出num十进制表示的各位数字,并累乘于变量k的循环。函数最后返回k。函数fun6的功能是求整数的各位数字的积。所以程序输出12。 5、解析: 在函数调用时,形参值和改变,不能会改变实参的值。 6、解析: 该题考查两个知识点:

(1)用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为#define 标识符 字符串

(2)在MYSWAP宏定义中,利用中间变量z来交换x和y的值,所以要实现a和b的交换,只需通过中间变量即可,所以,此处应填c。

7、本题考查宏定义与三目运算符的综合用法,宏定义是原样替换,本题中,如果a>b成立,则a+1的值为整个表达式的值,否则为b+1的值为整个表达式的值,(应注意后面的加1)。

8、解析: 宏替换的原则是按原样替换,本题中遇到形参x则以实参k+1替换,其他字符不变。所以JFT(k+1)经替换后为k+1*k+1,所以a=++k+1*k+1,若k+1,若k的值为3,则经过运算为a=4+1*4+1=9。 9、解析: 对于define宏定义语句,系统会在编译前进行替换。

i1=1000/s(N) i1=1000/s(10) i1=1000/10*10 i1=1000

仔细答题,认真总结! 二级考试专用

24

第 6 章 函数与编译预处理

i2=1000/f(N) i2=1000/f(10) i2=1000/(10*10) i2=10

10、本题综合考查带参数的宏以及三目运算符的计算方法,“?”运算符是一个三目运算符,其一般形式是:<表达式1>?<表达式2>:<表达式3>。“?” 运算符的含义是:先求表达式1的值,如果为真,则求表达式2的值并把它作为整个表达式的值;如果表达式1的值为假,则求表达式3的值并把它作为整个表达式的值。注意,在本题中宏替换时可采用逐步求解,最终为7>6?7:6*10,即t=7>6?7:60,其值为t=7。

11、解析: 本题考查静态局部变量的使用。用关键字static声明的局部变量为\"静态局部变量\",其值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。

25

仔细答题,认真总结! 二级考试专用

第 7 章 数组

第 7 章 数组

一、选择题

1、若有说明 int a[3][4];则a数组元素的非法引用是

A)a[0][2*1] B)a[1][3] C)a[4-2][0] D)a[0][4] 2、若二维数组a有m列,则计算任一元素a[i][j]在数组中相对位置的公式为 (假设a[0][0]位于数组的第一个位置上)

A)i*m+j B)j*m+I C)i*m+j-1 D)i*m+j+1 3、在C语言中,引用数组元素时,其数组下标的数据类型允许是

A)整型常量 B)整型表达式 C)整型常量或整型表达式 D)任何类型的表达式 4、以下不正确的定义语句是

A)double x[5]={2.0,4.0,6.0,8.0,10.0}; B)int y[5]={0,1,3,5,7,9};

C)char c1[]={′1′,′2′,′3′,′4′,′5′}; D)char c2[]={′\x10′,′\xa′,′\x8′}; 5、以下不能对二维数组a进行正确初始化的语句是

A)int a[2][3]={0}; B)int a[][3]={{1,2},{0}}; C)int a[2][3]={{1,2},{3,4},{5,6}}; D)int a[][3]={1,2,3,4,5,6}; 6、对以下说明语句的正确理解是int a[10]={6,7,8,9,10};

A)将5个初值依次赋给a[1]至a[5] B)将5个初值依次赋给a[0]至a[4]

C)将5个初值依次赋给a[6]至a[10] D)因为数组长度与初值的个数不相同,所以此语句不正确 7、若有说明:int a[3][4]={0};则下面正确的叙述是

A)只有元素a[0][0]可得到初值0 B)此说明语句不正确

C)数组a中各元素都可得到初值,但其值不一定为0 D)数组a中每个元素均可得到初值0 8、若有说明:int a[][4]={0,0};则下面不正确的叙述是

A)数组a的每个元素都可得到初值0 B)二维数组a的第一维大小为1

C)当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小 D)只有元素a[0][0]和a[0][1]可得到初值,其余元素均得不到确定的初值 9、若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是

A)2 B)3 C)4 D)无确定值

10、假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是

A)3 B)6 C)10 D)20 11、下面程序输出的结果是

main() { int i; int a[3][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++)

printf(\"%d \[2-i][i]);} A)1 5 9 B)7 5 3 C)3 5 7 D)5 9 1

12、已有如下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的正确定义方式为 int a[3][4]; f(a);

A)f(array[3][4]) B)f(int array[3][]) C)f(int array[][4]) D)f(int array[][]) 13、以下程序中函数sort的功能是对a数组中的数据进行由大到小的排序

void sort(int a[],int n) {int i,j,t;

for(i=0;i仔细答题,认真总结! 二级考试专用

26

第 7 章 数组

main()

{int aa[10]={1,2,3,4,5,6,7,8,9,10},i; sort(&aa[3],5);

for(i=0;i<10;i++)printf(\"%d,\[i]); printf(\"\n\");}

程序运行后的输出结果是

A)1,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1, C)1,2,3,8,7,6,5,4,9,10, D)1,2,10,9,8,7,6,5,4,3, 14、以下程序的输出结果是

void reverse(int a[],int n) { int i,t;

for(i=0;i{ t=a[i]; a[i]=a[n-1-i];a[n-1-i]=t;}} main()

{ int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0; reverse(b,8);

for(i=6;i<10;i++)s+=b[i]; printf(\" %d\n \);} A)22 B)10 C)34 D)30 15、执行下面的程序段后,变量k中的值为

int k=3, s[2];

s[0]=k; k=s[1]*10; A)不定值 B)33 C)30 D)10 16、下列程序执行后的输出结果是

void func1(int i); void func2(int i);

char st[]=\"hello,friend!\"; void func1(int i) { printf(\"%c\[i]);

if(i<3){i+=2;func2(i);}} void func2(int i) { printf(\"%c\[i]);

if(i<3){i+=2;func1(i);}} main()

{ int i=0; func1(i); printf(\"\n\");} A)hello B)hel C)hlo D)hlm 17、若有函数内部说明:int a[3][4];则数组a中各元素

A)可在程序的运行阶段得到初值0 B)可在程序的编译阶段得到初值0

C)不能得到确定的初值 D)可在程序的编译或运行阶段得到初值0 18、定义如下变量和数组: int k;int a[3][3]={9,8,7,6,5,4,3,2,1}; 则下面语句的输出结果是

for(k=0;k<3;k++)printf(\"%d\[k][k]);

A)7 5 3 B)9 5 1 C)9 6 3 D)7 4 1 19、下列程序执行后的输出结果是

main()

{ char arr[2][4];

strcpy(arr,\"you\"); strcpy(arr[1],\"me\"); arr[0][3]=′&′; printf(\"%s\n\);} A)you&me B)you C)me D)err 20、若有定义: char *st= \"how are you \"; 下列程序段中正确的是

27

仔细答题,认真总结! 二级考试专用

第 7 章 数组

A)char a[11], *p; strcpy(p=a+1,&st[4]); B)char a[11]; strcpy(++a, st);

C)char a[11]; strcpy(a, st); D)char a[], *p; strcpy(p=&a[1],st+2); 21、下面程序的输出结果是

#include #include main()

{char *p1=\"abc\[50]= \"xyz\"; strcpy(str+2,strcat(p1,p2)); printf(\"%s\n\);} A)xyzabcABC B)zabcABC C)xyabcABC D)yzabcABC 22、main()

{ char a[]={ ′a′, ′b′, ′c′,′d′, ′e′, ′f′, ′g′,′h′,′\0′}; int i,j; i=sizeof(a); j=strlen(a); printf(\"%d,%d\b\);} 程序运行后的输出结果是

A)9,9 B)8,9 C)1,8 D)9,8 23、阅读下列程序,当运行函数时,输入asd af aa z67,则输出为

#include #include #include int fun (char *str) { int i,j=0;

for(i=0;str[i]!=′\0′;i++)

if(str[i]!=′ ′)str[j++]=str[i]; str[j]= ′\0′;} main(){ char str[81]; int n;

printf(\"Input a string : \"); gets(str); fun(str);

printf(\"%s\n\);} A)asdafaaz67 B)asd af aa z67 C)asd D)z67 24、(25)有以下程序(09年3月试题25)

#include void fun(char*s) {while(*s) { if(*s%2==0) printf(“%c”,*s); s++;}} main()

{ char a[]={“good”}; fun(a);printf(“\\n”);}

注意:字母a的ASCⅡ码值为97,程序运行后的输出结果是 A)d B)go C)god D)good

25、(30)设有定义:char s[81];int i=10;,以下不能将一行(不超过80个字符)带有空格的字符串真确读入的语句或语句组是(09年3月试题30)

A) gets(s) B)while((s[i++]=getchar())!=”\\n”;s=”\\0”; C)scanf(“%s”,s); D)do{scanf(“%c”,&s);}while(s[i++]!=”\\n”);s=”\\0”;

26、(32)以下选项中正确的语句组是(09年3月试题32)

A)char s[];s=”BOOK!”; B) char *s;s={”BOOK!”};

仔细答题,认真总结! 二级考试专用

28

第 7 章 数组

C)char s[10];s=”BOOK!”; D) char *s=”BOOK!”;

二、填空题

1、若有如下定义,double a[100];则a数组元素的下标上限是【99】 。 2、设有代码“static int a[3][4]={{1}, {2}, {3}};”,则a[1][1]和a[2][1]的值为【0】 。 3、以下函数的功能是【求数组各元素的平均值】。

float av(a, n) float a[]; int n;

{ int i; float s;

for(i=0, s=0; i4、下列程序的输出的结果是 【-850,2,0】。

main()

{int i,j row,colum,m; static int array[3][3]={{100,200,300},{28,72,-30}{-850,2,6}}; m=array[0][0];for(i=0;i<3;i++) for(j=0;j<3;j++) if(array[i][j]<m) {m=array[i][j];colum=j;row=i;}

printf(\"%d,%d,%d\n\);}

5、当调用函数时,实参是一个数组名,则向函数传递的是【数组的首地址】。 6、以下程序可把输入的十进制数以十六进制数的形式输出,请填空。

main()

{char b[17]={\"0123456789ABCDEF\int c[64],d,i=0,base=16; long n;

printf(\"Enter a number:\n\");scanf(\"%ld\); do{c[i]=【n%base】;i++;n=n/base;} while(n!=0);

printf(\"Transmite new base:\n\"); for(--i;i>=0;--i)

{d=c[i];printf(\"%c\【[d]】);} printf(\"\n\");}

7、strcat函数的作用是【字符串连接】。 8、strcmp函数的功能是【字符串比较】 。 9、以下程序段中,错误的行号是【3】 。

① #include ② main ()

③ { char str [14];str []={\" I love China\④printf (\"%s\); ⑤ }

10、下面程序的功能是输出数组s中最大元素的下标,请填空。

main()

{ int k, p,s[]={1, -9, 7, 2, -10, 3}; for(p =0, k =p; p< 6; p++) if(s[p]>s[k])【k=p;】 printf(\"%d\n\); }

11、以下程序的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 例如,若一维数组中的数据是:

29

仔细答题,认真总结! 二级考试专用

第 7 章 数组

2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10 删除后,数组中的内容应该是: 2 3 4 5 6 7 8 9 10。 请填空。

#include #define N 80

int fun(int a[], int n) { int i,j=1;

for(i=1;i{ int a[N]={ 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10}, i, n=19; printf(\"The original data :\n\");

for(i=0; iprintf(\"\nThe data after deleted :\n\"); for(i=0; i12、下面程序的功能是将一个字符串str的内容颠倒过来,请填空。

#include main()

{ int i,j, 【k】;char str[]={\"1234567\for(i=0,j=strlen(str)【-1】;i三、部分填空题解析

1、解析: 数组的下标是从0 开始存放数据的,而不是1,当数组大小为n时,其下标从0开始,到n-1,所以本题的答案为99。

2、解析: 给两维数组初始化时,可按行给出初值,并且每行可以只给前面部分的元素给出初值。系统规定,对那些未给出初值的部分元素,系统自动置二进制代码全0的值。由于定义语句只给a[0][0]给定初值1、a[1][0]给定初值2、a[2][0]给定初值3。这样,其他元素都为0值。所以,a[1][1]= 0,a[2][1]= 0。

3、解析: 函数有一个数组形参a和一个整型形参n。函数首先用循环求数组a的前n个元素和,然后将和除以n。即求数组元素的平均值。

4、解析: 两个for循环是对数组元素进行扫描,并找是数组中值最小的元素和它的位置。

5、解析: 在函数中,可以通过指针变量来引用调用函数中对应的数组元素,此操作是通过传递数组的首地址来实现。 6、解析: 程序中,字符数组b存储十六进制的16个数字符,整型数组c存储译出的十六进制数的各位数值。从整数n译出它的各位十六进制数值,需采用除16取余的方法,即求n除16的余,得到它的十六进制的个位数,接着将n除以16。在n不等于0的情况下循环,能顺序求出n的十六进制的个位数、十位数、百位数等等。程序中变量base已预置16,所以在第1个空框处可填代码n%base。当n的十六进制数的个位、十位、百位等依次存放于数组c中后,就从最高位至最低位,参照数组c[i]的内容d(以其内容为下标),取十六进制数字符表中的字符b[d]输出。所以在第2个空框处可填入代码[d]。

7、解析: 连接两个字符数组中的字符串

8、解析: strcmp函数的原型是char*strcmp (char*s1,char*s2);功能是对s1和s2所指字符串进行比较,若s1s2 返回正数。 答案:字符串比较。

9、数组可以在定义可以整体赋初值,但不能在赋值语句中整体赋初值因此,可将第3行改为char str [14]={\"I love China!\

10、解析: 为要寻找数组中的最大元素的下标,需先预设1个临时最大元素的下标,并顺序逐一考查数组的元素,当发现当前元素比临时最大元素更大时,就用当前元素的下标更新临时最大元素下标。直至考查了数组的全部元素后,

30 仔细答题,认真总结! 二级考试专用

第 7 章 数组

这临时最大元素下标就是数组的最大元素下标。通常预设的最大元素下标是数组的首元素下标,考查是从首元素开始顺序向后继元素考查。程序中,存储临时最大元素下标的变量是k,变量p控制顺序考查的循环控制变量。当发现当前元素s[p]比临时最大元素s[k]更大时,应该用p更新k。所以在空框处应填入代码“k=p;”。

11、解析: 本题程序的流程是:让i,j都从1开始其中j用于控制删除后剩下的数中的下标,i用于搜索原数组中的元素。j始终是新数组已有元素中最后一个元素的下一个元素的下标,所以if()中的条件是a[j-1]!=a[i],其中a[j-1]就是新数组中的最后一个元素,若条件成立则表示出现了不同的值,所以a[i]要留下到新数组中。注本题中i,j的初值都要从1开始。该算法只能用于数组已排序的题目中。

12、解析: 颠倒一个字符串中的字符,就是首尾对应的元素两两交换。简单地可用两个游标变量i和j,i是前端元素的下标,j是后端元素的下标,交换以这两个变量值为下标的元素str[i]和str[j]。开始时,i的值为0,j的值为字符串末元素的下标(字符串长度减1)。每次交换后,i增1,j减1。继续交换的条件是str[i]还位于str[j]的前面,即i31

仔细答题,认真总结! 二级考试专用

第 8 章 指针

第 8 章 指针

一、选择题

1、有以下程序段

main()

{ int *p,i;char *q,ch; p=&i; q=&ch; *p=40; *p=*q; ...... }

则下面说法正确的是

A)p和q的类型不一致,不能执行*p=*q;语句

B)*p中存放的是地址值,因此不能执行*p=40;语句 C)q没有指向具体的存储单元,所以*q没有实际意义

D)q虽然指向了具体的存储单元,但该单元中没有确定的值,所以执行*p=*q;没有意义,可能会影响后面语句的执行结果

2、请选出正确的程序段

C)int *s, k; A)int *p;

char *p, c; scanf(\"%d\);

„ s=&k;

p=&c; B)int *s, k;

*p=′a′; *s=100;

„ „

D)int *s, k;

char *p, c;

s=&k;

p=&c;

s=p; 3、有如下程序段

int *p,a=10,b=1;p=&a; a=*p+b; *s=1;

„ 执行该程序段后,a的值为

A)12 B)11 C)10 D)编译出错 4、若有语句int *point,a=4;和 point=&a;下面均代表地址的一组选项是

A)a,point,*&a B)&*a,&a,*point C)*&point,*point,&a D)&a,&*point,point 5、若有说明:int *p,m=5,n;以下正确的程序段是

A)p=&n;scanf(\"%d\); B)p=&n;scanf(\"%d\) C)scanf(\"%d\);*p=n; D)p=&n;*p=m; 6、若有以下调用语句,则不正确的fun函数的首部是

main() { …

int a[50],n; „

fun(n, &a[9]); „}

A)void fun(int m, int x[])B)void fun(int s, int h[41]) C)void fun(int p, int *s)D)void fun(int n, int a) 7、有如下说明

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

仔细答题,认真总结! 二级考试专用

32

第 8 章 指针

则数值为9的表达式是

A)*p+9 B)*(p+8) C)*p+=9 D)p+8 8、以下程序执行后a的值是 main()

{ int x,y=252,i=386,*m=&y,*z=&i; x=(z==m);

printf(\"%d\);} A)252 B)1 C)0 D)运行时出错,x无定值 9、下面程序应能对两个整型变量的值进行交换。以下正确的说法是

main()

{int a=10,b=20;

printf(\"(1)a=%d,b=%d\n\); swap(&a,&b);

printf(\"(2)a=%d,b=%d\n\);} swap(int p,int q) {int t;

t=p;p=q;q=t;} A)该程序完全正确

B)该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可

C)该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可 D)以上说法都不对

10、下列程序执行后的输出结果是

void func(int *a,int *b) { b[0]=*a+6; } main() {int a,b[5]; a=0; b[0]=3;

func(&a,b); printf(\"%d\n\[0]);} A)6 B)7 C)8 D)9 11、下面程序段中,输出*的个数是

char *s=\"\ta\018bc\";

for(;*s!=′\0′;s++)printf(\"*\"); A)9 B)5 C)6 D)7 12、下面程序段的运行结果是

char str[]=\"ABC\printf(\"%d\n\(p+3)); A)67 B)0 C)字符′C′的地址 D)字符′C′ 13、下面程序的输出结果是

main()

{ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; printf(\"%d\n\(p+2));} A)3 B)4 C)1 D)2 14、有以下语句,则对a数组元素的引用不正确的是(0≤i≤9) int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;

A)a[p-a] B)*(&a[i]) C)p[i] D)*(*(a+i)) 15、以下程序的运行结果是

sub(int x,int y,int *z) {*z=y-x;} main() { int a,b,c;

sub(10,5,&a); sub(7,a,&b); sub(a,b,&c);

33

仔细答题,认真总结! 二级考试专用

第 8 章 指针

printf(\"%4d,%4d,%4d\n\);} A)5,2,3 B)-5,-12,-7 C)-5,-12,-17 D)5,-2,-7 16、下列程序是用来判断数组中特定元素的位置所在。如果输入如下整数: 876 675 896 101 301 401 980 431 451 777

#include #include

int fun(int *s, int t, int *k) { int i; *k=0;

for(i=0;i{int a[10]={ 876,675,896,101,301,401,980,431,451,777},k; clrscr();

fun(a, 10, &k);

printf(\"%d, %d\n \[k]);}

则输出结果为

A)7,431 B)6 C)980 D)6,980 17、有如下程序

int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=&a[3],b;b=p[5]; 则b的值是

A)5 B)6 C)9 D)8 18、若有下面的程序段:

char s[]=\"china\";char *p; p=s;则下列叙述正确的是

A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等 C)s数组长度和p所指向的字符串长度相等 D)*p与s[0]相等 19、已定义以下函数

fun(char *p2, char *p1) { while((*p2=*p1)!='\0'){p1++;p2++;}} 函数的功能是

A)将p1所指字符串复制到p2所指内存空间 B)将p1所指字符串的地址赋给指针p2

C)对p1和p2两个指针所指字符串进行比较 D)检查p1和p2两个指针所指字符串中是否有'\0' 20、有以下程序

#include main() { char *p,*q;

p=(char *)malloc(sizeof(char)*20); q=p; scanf(\"%s %s\); printf(\"%s %s\n\); }

若从键盘输入:abc def<回车>,则输出结果是

A)def def B)abc def C)abc d D)d d 21、下列程序的输出结果是

main()

{ int a[5]={2,4,6,8,10},*p,**k; p=a; k=&p;

printf(\"%d\(p++)); printf(\"%d\n\);} A)4 B)22 C)24 D)46 22、下面能正确进行字符串赋值操作的是

A)char s[5]={\"ABCDE\ B)char s[5]={ ′A′, ′B′, ′C′, ′D′, ′E′};

仔细答题,认真总结! 二级考试专用

34

第 8 章 指针

C)char *s;s=\"ABCDE\"; D)char *s;char a; scanf(\"%s\); 23、有以下程序

void ss(char *s,char t) {while(*s)

{if(*s= =t)*s=t-'a'+'A'; s++;}} main()

{char str1[100]=\"abcddfefdbd\ss(str1,c); printf(\"%s\n\);}

程序运行后的输出结果是

A)ABCDDEFEDBD B)abcDDfefDbD C)abcAAfefAbA D)Abcddfefdbd 24、若有说明语句

char a[]=\"It is mine\";char *p=\"It is mine\";则以下不正确的叙述是

A)a+1表示的是字符t的地址 B)p指向另外的字符串时,字符串的长度不受限制 C)p变量中存放的地址值可以改变 D)a中只能存放10个字符 25、函数fun的返回值是

fun(char *a,char *b) { int num=0,n=0;

while(*(a+num)!=′\0′)num++; while(b[n]){*(a+num)=b[n];num++;n++;} return num;}

A)字符串a的长度 B)字符串b的长度 C)字符串a和b的长度之差 D)字符串a 和b的长度之和 26、下面程序段的运行结果是

char a[]=\"lanuage\ p=a;

while(*p!=′u′){printf(\"%c\);p++;} A)LANGUAGE B)language C)LAN D)langUAGE 27、以下函数返回a所指数组中最大值所在的下标值

fun(int *a,int n) { int i,j=0,p; p=j;

for(i=j;ia[p])_________; return(p);}

在下划线处应填入的内容是

A)i=p B)a[p]=a[i] C)p=j D)p=i 28、下面程序段的运行结果是

char *p=\"abcdefgh\"; p+=3;

printf(\"%d\n\(strcpy(p,\"ABCD\"))); A)8 B)12 C)4 D)7 29、下面判断正确的是

A)char *a=\"china\";等价于 char *a;*a=\"china\"; B)char str[5]={\"china\等价于char str[]={\"china\

C)char *s=\"china\";等价于 char *s;s=\"china\";D)char c[4]=\"abc\[4]=\"abc\";等价于char c[4]=d[4]=\"abc\"; 30、下面说明不正确的是

A)char a[10]=\"china\"; B)char a[10],*p=a;p=\"china\" C)char *a;a=\"china\"; D)char a[10],*p;p=a=\"china\"

31、以下程序的输出结果是

#include

void prt (int *x, int *y, int *z)

{printf(\"%d,%d,%d\n\(z++));} main()

{int a=10,b=40,c=20;

35

仔细答题,认真总结! 二级考试专用

第 8 章 指针

prt (&a,&b,&c); prt (&a,&b,&c);} A)11,42, 31

12,22,41

C)11,21,40

B)11,41,20

11,21,21

12,42,20

D)11,41,21

32、有如下程序

12,42,22

main()

{ char s[]=\"ABCD\

for(p=s+1; p该程序的输出结果是 A)ABCD

BCD

C)B

CD

C

D

D

B)A

D)BCD

B

CD

C

D

D

33、下列程序执行后的输出结果是

main() { int a[3][3], *p,i; p=&a[0][0];

for(i=1; i<9; i++)p[i]=i+1; printf(\"%d\n\[1][2]);} A)3 B)6 C)9 D)随机数 34、有以下函数 char *fun(char *p) {return p;}

该函数的返回值是

A)无确切的值 B)形参p中存放的地址值 C)一个临时存储单元的地址 D)形参p自身的地址值 35、设有定义:int n=0,*p=&n,**q=&p,则下列选项中正确的赋值语句是

A)p=1; B)*q=2; C)q=p; D)*p=5; 36、若有以下程序

#include int a[]={2,4,6,8}; main() { int i; int *p=a;

for(i=0;i<4;i++)a[i]=*p; printf(\"%d\n\[2]);}

上面程序输出结果是

A)6 B)8 C)4 D)2 37、下面程序段的运行结果是

char *format=\"%s,a=%d,b=%d\n\"; int a=11,b=10;a+=b;

printf(format,\"a+=b\); A)for,\"a+=b\ B)format,\"a+=b\" C)a+=b,a=21,b=10 D)以上结果都不对 38、有以下函数: char *fun(char *p) {return p;}

仔细答题,认真总结! 二级考试专用

36

第 8 章 指针

该函数的返回值是

A)无确切值 B)形参p中存放的地址值 C)一个临时存储单元的地址 D)形参p自身的地址值 39、下列程序的运行结果是

void fun(int *a, int *b) { int *k;

k=a; a=b; b=k;} main()

{ int a=3, b=6, *x=&a, *y=&b; fun(x,y);

printf(\"%d %d\);} A)6 3 B)3 6 C)编译出错 D)0 0 40、不合法的main函数命令行参数表示形式是

A)main(int a,char *c[]) B)main(int arc,char **arv) C)main(int argc,char *argv) D)main(int argv,char *argc[])

41、假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的DOS提示符下键入: PROG ABCDEFGH IJKL<回车>,则输出结果为

main( int argc, char *argv[]) { while(--argc>0)

printf(\"%s\[argc]); printf(\"\n\");} A)ABCDEFG B)IJHL C)ABCDEFGHIJKL D)IJKLABCDEFGH

42、以下定义中,标识符prt int(*prt)[3]

A)定义不合法 B)是一个指针数组名,每个元素都是一个指向整数变量的指针

C)是一个指针,它指向一个具有三个元素的一维数组 D)是一个指向整型变量的指针 43、有如下程序

main() {char ch[2][5]={\"6937\[2]; int i,j,s=0;

for(i=0;i<2;i++)p[i]=ch[i]; for(i=0;i<2;i++) for(j=0;p[i][j]>′\0′;j+=2) s=10*s+p[i][j]-′0′; printf(\"%d\n\);}

该程序的输出结果是

A)69825 B)63825 C)6385 D)693825 44、下面函数的功能是

char *fun(char *str1,char*str2) {while((*str1)&&(*str2++=*str1++)); return str2;}

A)求字符串的长度 B)比较两个字符串的大小 C)将字符串str1复制到字符串str2中 D)将字符串str1接续到字符串str2中 45、设有如下定义

char *s[2]={ \"abcd\则下列说法错误的是

A)s数组元素的值分别是\"abcd\"和\"ABCD\"两个字符串的首地址 B)s是指针数组名,它含有两个元素分别指向字符型一维数组

C)s数组的两个元素分别存放的是含有4个字符的一维字符数组中的元素 D)s数组的两个元素中分别存放了字符′a′和′A′的地址 46、(21)有以下程序(09年3月试题21)

#include main()

37

仔细答题,认真总结! 二级考试专用

第 8 章 指针

{char *s=”ABC”; do

{printf(“%d”,*s%10);s++; }while(*s);}

注意,字母A的ASCII码值为65。程序运行后的输出结果是 A)5670 B)656667 C)567 D)ABC 47、(26)有以下程序(09年3月试题26)

#include

void fun( int *a,int *b) {int *c;

c=a;a=b;b=c;} main()

{int x=3,y=5,*P=&x,*q=&y; fun(p,q);printf(“%d,%d,”,*p,*q); fun(&x,&y);printf(“%d,%d\\n”,*p,*q);} 程序运行后的输出结果是

A)3,5,5,3 B)3,5,3,5 C)5,3,3,5 D)5,3,5,3 48、(27)有以下程序(09年3月试题27)

#include

viod f(int *p,int *q ); main()

{ int m=1,n=2,*r=&m; f(r,&n);printf(“%d,%d”,m,n);} void f(int *p,int *q) {p=p+1;*q=*q+1;}

程序运行后输出的结果是

A)1,3 B)2,3 C)1,4 D)1,2 49、(29)若有以下定义(09年3月试题29)

int x[10],*pt=x;

则对x数组元素的正确应用是

A)*&x[10] B)*(x+3) C)*(pt+10) D)pt+3 50、(31)有以下程序(09年3月试题31)

#include main()

{ char *a[ ]={“abcd”,”ef”,”gh”,”ijk”};int I; for (i=0;i<4;i++) printf(“%c”,*a);}

程序运行后输出的结果是

A)aegi B)dfhk C)abcd D)abcdefghijk

二、填空题

1、函数 void fun(float *sn, int n)的功能是:根据以下公式计算S,计算结果通过形参指针sn传回;n通过形参传入,n的值大于等于0。请填空。

void fun( float *sn, int n) { float s=0.0, w, f=-1.0; int i=0;

for(i=0; i<=n; i++) { f=【 】* f; w=f/(2*i+1); s+=w; } 【 】=s;}

38 仔细答题,认真总结! 二级考试专用

第 8 章 指针

2、该程序运行的结果是【 】。

#include #include #define M 100

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) a[j++]=i; *n=j;} main()

{ int aa[M],n,k; clrscr();

fun(10,aa,&n); for(k=0;k3、下面函数要求计算两个整数x,y之和,并通过形参返回该值,请填空。 add(int x, int y, 【 】z) {【 】= x+y; }

4、以下函数用来在w数组中插入x。n所指向的存储单元中存放w数组中字符个数。数组w中的字符已按从小到大的顺序排列,插入后数组w中的字符仍有序。请填空。

void fun(char *w, char x, int *n) { int i, p; p=0;

w[*n]= x;

while(x > w[p])p++;

for(i=*n; i>p; i--)w[i]=【 】; w[p]=x; ++*n;}

5、函数my_cmp()的功能是比较字符串s和t的大小,当s等于t时返回0,否则返回s和t的第一个不同字符的ASCII码差值,即s > t时返回正值,当s < t时返回负值。请填空。

my_cmp(char *s, char *t) {while (*s == *t)

{if (*s == ′\0′)return 0; ++s; ++t;

} return 【 】 ; }

6、下列程序的功能是:求出ss所指字符串中指定字符的个数,并返回此值。 例如,若输入字符串123412132,输入字符1,则输出3,请填空。

#include #include #define M 81

int fun(char *ss, char c) { int i=0;

for(; 【 】;ss++) if(*ss==c)i++; return i;} main()

{ char a[M], ch;

39

仔细答题,认真总结! 二级考试专用

第 8 章 指针

clrscr();

printf(\"\nPlease enter a string: \"); gets(a); printf(\"\nPlease enter a char: \"); ch=getchar();

printf(\"\nThe number of the char is: %d\n\(a,ch));}

7、若给fun函数的形参s传送字符串:“]]6354abcc” (其中)表示空格字符),则函数的返回值是【 】。

#include long fun(char s[]) {long n;int sign;

for(;isspace(*s);s++); sign=(*s==′-′)?-1:1;

if(*s==′+′||*s==′-′)s++;

for(n=0;isdigit(*s);s++)n=10*n+(*s-′0′); return sign*n;}

8、以下程序中,select 函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标。请填空。

#define N 3 #define M 3

select(int a[N][M],int *n) {int i,j,row=1,colum=1; for(i=0;ia[row][colum]){row=i;colum=j;} *n= 【 】 ; return 【 】 ;} main() {int a[N][M]={9,11,23,6,1,15,9,17,20},max,n; max=select(a,&n);

printf(\"max=%d,line=%d\n\);}

9、下面程序是指从终端读入的20个字符放入字符数组中,然后利用指针变量输出上述字符串,请填空。

#include main ()

{ int i; char s[21],*p; for (i=0;i<20;i++) s[i]=getchar (); s[i]=【 】; p =【 】;

while (*p)putchar (【 】);}

10、以下函数的功能是求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。

例如,若x中的值为30,则有4个数符合要求,它们是1,3,5,15。 请按题意,完成填空。 试题程序:

#include #include

void fun (int x, int pp[], int *n) { int i,j=0; 【 】

if(x%i==0)pp[j++]=i; 【 】;} main ()

{ int x,aa[1000], n, i ;

仔细答题,认真总结! 二级考试专用

40

第 8 章 指针

clrscr();

printf(\"\nPlease enter an integer number : \n \"); scanf (\"%d \); fun (x, aa, &n); for (i=0 ; i11、下面的程序是输出数组a 中最大元素的下标和最大元素的值,完成填空。

#include #include

int fun(int *s, int t, int *k) { int i; *k=0; 【 】

if(s[ *k]{int a[10]={ 876,675,896,101,301,401,980,431,451,777},k; clrscr();

fun(a, 10, &k);

printf(\"%d, %d\n \[k]);}

12、mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。请填空。

int mystrlen(char *str) { int i;

for(i=0; 【 】!= ′\0′;i++); return(i);}

13、设有以下定义和语句,则*(*(p+2)+1)的值为【 】。 int a[3][2]={10, 20, 30, 40, 50, 60}, (*p)[2]; p=a;

14、下面函数的功能是:找出一维数组元素中最大的值和它所在的下标,最大值的和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。请填空。

#include #include

void fun(int a[],int n, int *max, int *d) { int i;

*max=a[0]; *d=0;

for(i=0; 【 】;i++) if(*max<【 】) {*max=a[i];*d=i;}} main()

{ int i, x[20], max, index, n=10; randomize(); for(i=0;i{x[i]=rand()%50; printf(\"%4d\[i]);} printf(\"\n\");

fun(x,n,&max,&index);

printf(\"Max=%5d,Index=%4d\n\);} for(i=0; 【 】;i++)if(*max<【 】) {*max=a[i];*d=i;}} main()

41

仔细答题,认真总结! 二级考试专用

第 8 章 指针

{ int i, x[20], max, index, n=10; randomize(); for(i=0;i{x[i]=rand()%50; printf(\"%4d\[i]);}

printf(\"\n\");

fun(x,n,&max,&index);

printf(\"Max=%5d,Index=%4d\n\);}

三、部分填空题解析

2、解答本题的关键是要读懂程序,试题要找出能被7或11整除的所有整数,注意数学中的“或”和C语言中的“或”的区别,但在此处,if条件语句中用了“||”运算符,若要找能同时被7和11整除的所有整数则在if()中应用“&&”运算符。 当然,如果m的值输入50,即表达式fun(10,aa,&n);为fun(50,aa,&n);时输入结果为:7 11 14 21 22 28 33 35 42 44 49。

3、解析: 函数希望通过形参z带回结果,形参z必须是指针类型的,由于返回整型结果,所以z的说明是int * z。函数返回前必须先把结果通过形参z间接引用(写成*z)传回。

4、解析: 在用数组实现的有序序列中插入内容,必须先寻找插入位置。插入位置找到后,需将插入位置之后的元素向后移动一个位置,留出插入点。最后,将元素插入,并增加序列的元素个数。函数为了简化寻找插入位置循环的循环条件,预先在序列的最后置入插入值。插入位置之后的元素向后移动一个位置必须从最后一个元素开始往前逆序移动,是将前一个元素向后移,所以在空框处应填入w[i-1]。

5、解析: 两字符串大小比较必须从它们的首字符开始,在对应字符相等情况下循环,直至不相等结束。相等时,若字符串已到了字符串的结束标记符,则两字符串相同,函数返回0值;如还有后继字符,则准备比较下一对字符。对应字符不相同,循环结束。循环结束时,就以两个当前字符的差返回。所以在空框处应填入*s-*t,保证在s > t时返回正值,当s < t时返回负值。

6、解析: 从字符串ss中找出子字符串的方法是:从第1个字符开始,对字符串进行遍历;若ss串的当前字符等于t串的第1个字符,两字符串的指针自动加1,继续比较下一个字符;若比较至字符串的结尾,则跳出循环;若ss串的字符和c串的字符对应不同,继续对ss串的下一个字符进行处理。本程序是采用逐一比较的方式找出出现的次数。循环的作用是在串中从左到右逐一走动,if()的作用是进行判断是否相同,若与c相同则表示又出现一次。 7、解析: 函数fun的第一个for循环跳过字符串的前导空白符,接着判断第一个非空白符是否是负号,若是则置变量sign为-1;否则,置变量sign为1。接着的if语句在第一个非空白字符是负号或正号时,跳过该字符。以后的for循环将后面的数字符当作十进制数的各位数字译出一个长整数n。遇字符a时,结束循环。最后,函数返回sign与n的乘积。所以若调用函数时提供的实参是“∪∪6354abc”,函数返回值是6354。 8、解析: 本题中,首先假定a[1][1]为最大值,然后利用循环结构将二维数组中的每个元素逐个与a[row][colum]进行比较,如果比a[row][colum]的值大,则令a[row][colum]指向该元素,比较完后,row即是最大值所在的行,所以第1个空所在的行的语句应是*n=row;,在第2个空中返回最大值,显然,是a[row][colum]

9、本题选通过for循环从键盘读入20个字符,然后在最后赋一定值′\0′后为结束标志,再使指针P指向字符串的首地址。最后通过while循环对字符串进行扫描并输出。

10、本题题干信息是能整除且不是偶数的所有整数之和。循环语句中i从1开始且每次增2,所以i始终是奇数,*n=j;语句是记录能够符合题意的各个整数的个数。

11、本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始应认*k的值为数组中的某一下标值,即*k=0。

12、解析: str是指针变量,它指向字符型数据,在循环过程中,可以用 *(str+i)来访问字符串中的第i个元素,判断是否是结束标志,如果不是,i=i+1,继续取下一个元素进行判断,直到 *(str+i)的值为′\0′为止,也可以用下标的方式引用字符,如*(str+i)相当于str[i]。

13、解析: 本题中,代码定义3行2列的两维数组a,定义指向两个元素的一维数组指针p,并让p指向两维数组a的首行。则代码*(*(p+2)+1)中的p+2指向两维数组a的第三行a[2],*(p+2)指向a[2][0],*(p+2)+1指向a[2][1],*(*(p+2)+1)是引用a[2][1],其值是60。 14、解析: 该程序直接使用形参max和d,由于它们都是指针变量,所以要引用它所指向的变量时要对它进行指针运算,也即*号运算。

仔细答题,认真总结! 二级考试专用

42

第 9 章 结构体数据类型与链表

第 9 章 结构体数据类型与链表

一、选择题

1、设有以下说明语句

struct stu {int a;

float b; } stutype;

则下面的叙述不正确的是

A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 2、设有以下说明语句

struct ex{ int x ; float y; char z ;} example; 则下面的叙述中不正确的是

A)struct结构体类型的关键字B)example是结构体类型名C)x,y,z都是结构体成员名D)struct ex是结构体类型名 3、设有以下说明语句

typedef struct { int n;

char ch[8];

} PER;

4、则下面叙述中正确的是

A)PER 是结构体变量名 B)PER是结构体类型名C)typedef struct 是结构体类型 5、当说明一个结构体变量时系统分配给它的内存是

A)各成员所需内存量的总和 B)结构中第一个成员所需内存量 C)成员中占内存量最大者所需的容量 6、以下程序的运行结果是

#include \"stdio.h\" main()

{struct date

{int year,month,day;}today;

printf(\"%d\n\(struct date));} A)6 B)8 C)10 7、在16位IBM-PC机上使用C语言,若有如下定义

struct data { int i;

char ch;

double f; } b;

则结构变量b占用内存的字节数是

A)1 B)2 C)7 8、若有以下结构体,则正确的定义或引用的是

struct Test {int x;

43

D)a和b都是结构体成员名

D)struct 是结构体类型名

D)结构中最后一个成员所需内存量

D)12

D)11

int y;} vl;

仔细答题,认真总结! 二级考试专用

第 9 章 结构体数据类型与链表

A)Test.x=10; 9、设有如下定义:

struck sk { int a; float b; } data;

int *p;

若要使P指向data中的a域,正确的赋值语句是

A)p=&a;

B)p=data.a; C)p=&data.a;

D)*p=data.a;

B)Test v2;v2.x=10; C)struct v2;v2.x=10; D)struct Test v2={10};

10、以下对结构体类型变量的定义中,不正确的是 A)typedef struct aa C)struct

{ int n; { int n; float m;

float m; }AA;

} aa;

AA tdl;

struct aa tdl; B)#define AA struct aa

D)struct

AA{ int n; { int n; float m;

float m; } tdl;

} tdl; 11、若有下面的说明和定义

struct test

{ int ml; char m2; float m3;

union uu {char ul[5]; int u2[2];} ua;

} myaa;

则sizeof(struct test )的值是

A)12 B)16 C)14 D)9

12、以下程序的输出结果是

union myun {struct { int x, y, z; } u; int k;} a; main()

{a.u.x=4; a.u.y=5; a.u.z=6;

a.k=0;

printf(\"%d\n\);} A)4 B)5 C)6 13、有以下程序:

#include union pw { int i;

char ch[2];}a; main()

{a.ch[0]=13;a.ch[1]=0;printf(\"%d\n\);}

程序的输出结果是

A)13 B)14 C)208 D)209

仔细答题,认真总结! 二级考试专用

D)0

44

第 9 章 结构体数据类型与链表

14、C语言结构体类型变量在程序执行期间

A)所有成员一直驻留在内存中 B)只有一个成员驻留在内存中 C)部分成员驻留在内存中 D)没有成员驻留在内存中 15、下列程序的输出结果是

struct abc

{ int a, b, c, s;}; main()

{ struct abc s[2]={{1,2,3},{4,5,6}}; int t; t=s[0].a+s[1].b;

printf(\"%d\n\);} A)5 B)6 C)7 16、已知学生记录描述为:

struct student { int no;

char name[20],sex; struct

{ int year,month,day; } birth;};

struct student s;

设变量s中的“生日”是“1984年11月12日”,对“birth”正确赋值的程序段是

A)year=1984;month=11;day=12; B)s.year=1984;s.month=11;s.day=12;

C)birth.year=1984;birth.month=11;birth.day=12; D)s.birth.year=1984;s.birth.month=11;s.birth.day=12; 17、有如下定义

struct person{char name[9];int age;};

struct person class[10]={\"John\根据上述定义,能输出字母M的语句是

A)printf(\"%c\n\[3].name); B)printf(\"%c\n\[3].name[1]); C)printf(\"%c\n\[2].name[1]); D)printf(\"%c\n\[2].name[0]); 18、有以下程序

struct STU

{ char num[10]; float score[3]; }; main()

{struct STU s[3]={{\"20021\ {\"20022\ { \"20023\},*p=s;

int i; float sum=0; for(i=0;i<3;i++)

sum=sum+p->score[i]; printf(\"%6.2f\n\); }

程序运行后的输出结果是

A)260.00 struct st

{ int x; int *y;} *p;

int dt[4]={ 10,20,30,40 };

45

D)8

B)270.00 C)280.00 D)285.00

19、以下程序的输出是

仔细答题,认真总结! 二级考试专用

第 9 章 结构体数据类型与链表

struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]}; main()

{ p=aa;

printf(\"%d\n\(p->x));}

A)10

20、有以下程序

B)11 C)51

D)60

#include struct NODE

{ int num; struct NODE *next; }; main()

{ struct NODE *p,*q,*r;

p=(struct NODE*)malloc(sizeof(struct NODE)); q=(struct NODE*)malloc(sizeof(struct NODE)); r=(struct NODE*)malloc(sizeof(struct NODE)); p->num=10; q->num=20; r->num=30; p->next=q;q->next=r;

printf(\"%d\n \);}

程序运行后的输出结果是 A)10 21、若以下定义:

struct link {int data;

struct link *next; } a,b,c,*p,*q;

且变量a和b之间已有如下图所示的链表结构:

B)20 C)30

D)40

指针p指向变量a,q指向变量c。则能够把c插入到a和b 之间并形成新的链表的语句组是:

A)a.next=c; c.next=b; C)p->next=&c; q->next=p->next; struct node { char data;

struct node *next; } a,b,*p=&a,*q=&b; A)a.next=q; 23、下面程序的输出结果是

struct st

仔细答题,认真总结! 二级考试专用

46

B)p.next=q; q.next=p.next; D)(*p).next=q; (*q).next=&b;

22、有以下结构体说明和变量的定义,且指针p指向变量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是

B)p.next=&b; C)p->next=&b; D)(*p).next=q;

第 9 章 结构体数据类型与链表

{ int x; int *y;

} *p;

int dt[4]={10,20,30,40};

struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]}; main()

{ p=aa;

printf(\"%d\n\); printf(\"%d\n\(++p)->x); printf(\"%d\n\(*p->y));}

A)10

20 20

B)50

60 21 24、(37)有以下程序 #include struct ord

{ int x,y;} dt[2]={1,2,3,4}; main()

{ struct ord *p=dt; printf (“%d,”,++p->x); printf(“%d\\n”,++p->y)}

程序的运行结果是

A)1,2 B)2,3 C)3,4 D)4,1

C)51

60 21

D)60

70 31

二、填空题

1、使用结构体处理数据的场合是【将不同类型数据看成一个整体】 。 2、下面程序的输出结果【6】 。

main ()

{enum team {y1=4,y2,y3}; printf (\"%d\);}

3、若有以下说明和定义语句,则变量w在内存中所占的字节数是 【34】 。

union aa {float x; float y; char c[6]; };

struct st{ union aa v; float w[5]; double ave; } w;

4、设有定义“struct {int a; float b; char c;} abc, *p_abc=&abc;”,则对结构体成员a的引用方法可以是abc.a和p_abc【->】a。 5、以下定义的结构体类型拟包含两个成员,其中成员变量info用来存入整形数据;成员变量link是指向自身结构体的指针,请将定义补充完整。

struct node { int info;

【struct node *】link; };

6、用以下语句调用库函数malloc,使字符指针st指向具有11个字节的动态存储空间,请填空。 st=(char*)【malloc(11)】 ;

三、部分填空题解析

47

仔细答题,认真总结! 二级考试专用

第 9 章 结构体数据类型与链表

1、把不同类型的数据当作整体处理时使用结构体。

2、解析: 本题中第1个枚举值y1为特定值4,那么y2=5,y3=6。

3、解析: 共用型aa有3个成分,一个是float型成分x,一个是float型成分y,再一个是有6个元素的字符数组。若float 型数据占4个字节,则类型aa 数据要占用6个字节。结构变量w有3个成分,一个是共用型成分aa , 要占用6个字节;一个是有5个float型元素的数组w,要占用20个字节;一个是double型的ave。double型数据要8个字节,则结构变量w要占用34个字节。

4、解析: 若有结构变量abc有成员a,并有指针p_abc指向结构变量abc,则引用变量abc成员a的标记形式有abc . a和p_abc->a。

5、解析: 本题中的结构类型名为struct node,所以空白处应填:struct node *。即定义一个指向自身的结构体指针。 6、解析: malloc函数的参数可以是一个具体的常数,也可以是一个表达式。在本题中,可以是malloc(11),也可以借助于sizeof运算符来表示。

仔细答题,认真总结! 二级考试专用

48

第 10 章 位运算与文件操作

第 10 章 位运算与文件操作

一、选择题

1、表达式0x13^0x17的值是

A)0x04 B)0x13 C)0xE8 2、已知 int a=1,b=3则a^b的值为 A)3 3、设有以下语句:

B)1 C)2

D)4

D)0x17

char x=3,y=6,z; z=x^y<<2; 则z的二进制值是

A)00010100 B)00011011 C)00011100 4、在位运算中,操作数左移一位,其结果相当于

D)00011000

D)操作数乘以4 D)操作数除以4

A)操作数乘以2 B)操作数除以2 C)操作数除以4 5、在位运算中,操作数右移一位,其结果相当于

A)操作数乘以2 main()

{ char x=040;

printf(\"%o\n\);}

A)100 B)80 C)64 7、C语言中,能识别处理的文件为

D)32

B)操作数除以2 C)操作数乘以4

6、以下程序的输出结果是

A)文本文件和数据块文件 B)文本文件和二进制文件 C)流文件和文本文件 8、C语言中,文件组成的基本单位为

A)记录 B)数据行 C)数据块 D)字符序列 9、C 语言中,系统的标准输入文件是指 A)键盘 B)显示器 C)软盘

D)硬盘

D)数据文件和二进制文件

10、如果需要打开一个已经存在的非空文件“Demo”进行修改,下面正确的选项是 A)fp=fopen(\"Demo\); B)fp=fopen(\"Demo\);C)fp=fopen(\"Demo\); D)fp=fopen(\"Demo\); 11、若要打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是

A)fopen(\"A:\user\abc.txt\) B)fopen(\"A:\\user\\abc.txt\) C)fopen(\"A:\user\abc.txt\) D)fopen(\"A:\user\abc.txt\) 12、fseek函数的正确调用形式是

A)fseek(文件指针,起始点,位移量) B)fseek(文件指针,位移量,起始点) C)fseek(位移量,起始点,文件指针) D)fseek(起始点,位移量,文件指针) 13、若fp是指向某文件的指针,且已读到文件末尾,则函数feof(fp)的返回值是 A)EOF B)-1 C)1 14、fscanf函数的正确调用形式是

D)NULL

A)fscanf(fp,格式字符串,输出表列); B)fscanf(格式字符串,输出表列,fp);

C)fscanf(格式字符串,文件指针,输出表列); D)fscanf(文件指针,格式字符串,输入表列); 15、下列关于C语言数据文件的叙述中正确的是

A)文件由ASCII码字符序列组成,C语言只能读写文本文件

B)文件由二进制数据序列组成,C语言只能读写二进制文件

C)文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件

49

仔细答题,认真总结! 二级考试专用

第 10 章 位运算与文件操作

D)文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件 16、若有运算符<<,sizeof,^,&=,则它们按优先级由高至低的正确排列次序是 A)sizeof,&=,<<,^ B)sizeof,<<,^,&= C)^,<<,sizeof,&= D)<<,^,&=,sizeof

17、函数fseek(pf, 0L,SEEK_END)中的SEEK_END代表的起始点是 A)文件开始 B)文件末尾 C)文件当前位置 D)以上都不对

18、有以下程序

#include main()

{ FILE *fp; int i=20,j=30,k,n;

fp=fopen(\"d1.dat\);

fprintf(fp,\"%d\n\);fprintf(fp,\"%d\n\); fclose(fp);

fp=fopen(\"d1.dat\);

fscanf(fp,\"%d%d\",&k,&n); printf(\"%d %d\n\); fclose(fp);}

程序运行后的输出结果是

A)20 30 B)20 50 C)30 50 D)30 20 19、函数 rewind 的作用是

A)使文件位置指针重新返回文件的开始位置 B)将文件位置指针指向文件中所要求的特定位置 C)使文件位置指针指向文件的末尾 D)使文件位置指针自动移至下一个字符位置 20、阅读以下程序及对程序功能的描述,其中正确的描述是

#include main()

{FILE *in,*out;

char ch,infile[10],outfile[10]; printf(\"Enter the infile name:\n\"); scanf(\"%s\);

printf(\"Enter the outfile name:\n\"); scanf(\"%s\);

if((in=fopen(infile,\"r\"))==NULL) {printf(\"cannot open infile\n\"); exit(0);} if((out=fopen(outfile,\"w\"))==NULL) {printf(\"cannot open outfile\n\"); exit(0);}

while(! feof(in))fputc(fgetc(in),out); fclose(in); fclose(out);}

A)程序完成将磁盘文件的信息在屏幕上显示的功能 B)程序完成将两个磁盘文件合二为一的功能 C)程序完成将一个磁盘文件复制到另一个磁盘文件中 D)程序完成将两个磁盘文件合并并在屏幕上输出21、下面的程序执行后,文件test中的内容是

#include

void fun(char *fname,char *st)

{ FILE *myf; int i;

myf=fopen(fname,\"w\" );

for(i=0;i仔细答题,认真总结! 二级考试专用

50

第 10 章 位运算与文件操作

fclose(myf);} main()

{ fun(\"test\); fun(\"test\);} A)hello, B)new worldhello, C)new world

D)hello, rld

22、若fp是指向某文件的指针,且已读到文件末尾,则库函数feof(fp)的返回值是 A)EOF B)-1 C)1 D)NULL 23、利用 fseek 函数可以实现的操作是

A)改变文件的位置指针

B)文件的顺序读写 C)文件的随机读写

D)以上答案均正确

24、若调用fputc函数输出字符成功,则其返回值是

A)EOF B)1 C)0 D)输出的字符 25、已知函数的调用形式:fread(buf,size,count,fp),参数buf的含义是

A)一个整型变量,代表要读入的数据项总数 B)一个文件指针,指向要读的文件 C)一个指针,指向要读入数据的存放地址 D)一个存储区,存放要读的数据项 26、(39)有以下程序 #include main()

{ int a=5,b=1,t;

t=(a<<2|b); printf(“%d\\n”,t)}

程序运行后的输出结果是

A)21 B)11 C)6 D)1 27、(40)有以下程序

#include

main()

{ FILE *f; f=fopen(“filea.txt”,”w”); fprintf(f,”abc”); fclose(f);}

若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt中的内容为 A) helloabc B)abclo C)abc D)abchello

二、填空题

1、设二进制数A是00101101,若想通过异或运算A^B使A的高4位取反,低4位不变,则二进制数B应是【1111 0000】 。 2、若有int a=1;int b=2;则a|b的值为 【3】 。

3、有定义char a,b;若想通过&运算符保留a的第3位和第6位的值,则b的二进数应是【0100 1000】 。 4、设int a, b=10;执行a=b<<2+1;后a的值是【80】 。

5、 “FILE *p”的作用是定义一个文件指针变量,其中的“FILE”是在 【stdio.h】 头文件中定义的。

6、以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文件末尾,然后调用ftell函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。

FILE *myf; long f1;

myf=【fopen】 (\"test.t\);

fseek(myf,0,SEEK_END); f1=ftell(myf); fclose(myf);

printf(\"%d\n\);

7、下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个名为bi.dat的新文件中,请填空。

#include \"stdio.h\" FILE *fp; { char ch; if((fp=fopen(【”bi.dat”,”w”】)==NULL)exit(0);

51

仔细答题,认真总结! 二级考试专用

第 10 章 位运算与文件操作

while((ch=getchar( ))!='@')fputc (ch,fp); fclose(fp);}

8、在对文件操作的过程中,若要求文件的位置指针回到文件的开始处,应当调用的函数是【rewind()】。 9、以下程序将数组a的4个元素和数组b的6个元素写到名为lett.dat的二进制文件中,请填空。

#include main ()

{ FILE *fp;

char a[4]=\"1234\",b[6]=\"abcedf\"; if((fp=fopen(\"【lett.dat】\))=NULL)exit(0); fwrite(a,sizeof(char),4,fp);

fwrite(b, 【6*sizeof(char)】,1,fp); fclose(fp);}

10、设有以下结构体类型:

struct st

{ char name[8]; int num; float s[4]; }student[50];

并且结构体数组student中的元素都已有值,若要将这些元素写到硬盘文件fp中,请将以下fwrite语句补充完整: fwrite(student, 【50*sizeof(struct st)】,1,fp);

11、以下程序的功能是:处理由学号和成绩组成的学生记录,N名学生的数据已在主函数中放入结构体数组s中,它的功能是:把分数最高的学生数据放在h所指的数组中,注意:分数高的学生可能不只一个,函数返回分数最高学生的人数。请填空。

#include #define N 16 typedef struct {char num[10]; int s ; } STREC;

int fun (STREC *a, STREC *b) {int i,j=0,max=a[0].s; for(i=0;iif(max{STREC s[N]={{ \"GA005\{\"GA001\ {\"GA015\{\"GA011\STREC h[N]; int i, n;FILE *out; n=fun(s,h);

printf(\"The %d highest score :\n\); for (i=0; iprintf(\"%s %4d\n \[i].num,h[i].s); printf(\"\n\");

out=fopen(\"out15.dat\); fprintf(out, \"%d\n\); for(i=0; i仔细答题,认真总结! 二级考试专用

52

第 10 章 位运算与文件操作

fprintf(out, \"%4d\n \[i].s); fclose(out);}

三、部分填空题解析

1、解析: 按位异成运算的一个重要应用是让某个整型变量的二进位取反,0变成1,而1变成0。这只要设计这样一个位串信息,让要变反的位为1,不要改变的位为0,用这个位串信息与整型变量按位加就能得到希望的结果。要使字节的高4位取反,低4位不变,则需要位串信息是11110000。

2、解析: 将a化成二进数和制数是0001,b化成二进制数为0010,|是或运算符,a|b=0011即为3。

3、解析: 由“&”运算符可知,两个对应二进数只要有一个为0,则结果为0,两者都为1时,如果才为1。因此,要想保留哪一位可用1,屏蔽其他位用0。

如 a=10101100,b=00100100,则a&b的结果如下 a∶10101100 b∶00100100 a&b∶00100100

4、解析: 本题考查的重点是运算符的优先级,题目中加法运算符“+”的优先级高于左移运算符“<<”,因而原表达式等价于a=b<<3。而左移一位,想当于将原数乘2。这样,10移动3位后的值是80。

5、解析: 代码“FILE *p”的作用是定义一个文件指针变量,其中的FILE是在标准输入输出头文件stdio.h中定义的。 6、解析: 函数fopen的原型为FILE *fopen(char *filename,char *mode),功能为以mode指定的方式打开名为filename的文件;函数fseek的原型为int fseek(FILE *fp,long offset,int base),功能为将fp所指向的文件的位置指针移到以base所指出的位置为基准。以offset是以字节为单位的位移量;函数ftell的原型为long ftell(FILE *fp),功能为返回fp所指向的文件中的读写位置;函数fclose的原型为int fclose(FILE *fp),功能为关闭fp所指的文件,释放文件缓冲区。 7、解析: fopen函数的调用方式通常为: FILE *fp

fp=fopen(文件名,使用文件方式);

9、本题主要考查函数fwrite (char *pt,unsigned size,unsigned n,FILE *fp),把pt所指向的n*size个字节输出到fp所指定的文件中。

10、解析: fwrite函数的一般调用形式为:fwrite(buffer,size,count,fp),其中: buffer:是一个指针变量,是要输出数据的起始地址 size:要写的字节数

count:要进行写多少个size字节的数据项 fp:文件型指针

11、解析: 该程序使用循环嵌套,第1个for语句的作用是找出最大值。第2个循环的作用是找出与max相等的成绩,也即最高成绩的学生,并存入b中。

53

仔细答题,认真总结! 二级考试专用

上机考试题

上机考试题

第一套上机题: 1. 填空题

下列给定程序中,函数fun()的作用是:将字符串tt中的大写字母都改为对应的小写字母,其他字符不变。例如,若输入\"Ab,cD\",则输出\"ab,cd\"。

试题程序:

#include #include #include

char 【1】fun(char tt[]) {int i;

for(i=0;tt[i];i++)

{if((tt[i]>='A')&&(tt[i]<= 【2】)) tt[i]+=32;} return(tt);} void main() { char tt[81];

printf(\"\\nPlease enter a string: \"); gets(tt);

printf(\"\\nThe result string is: \\n%s\【3】));}

2. 改错题

下列给定程序中,函数fun()的功能是逐个比较a,b两个字符串对应位置中的字符,把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。

例如:a中的字符串为fshADfg,b中的字符串为sdAEdi,则c中的字符串应为fdAADf。 请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include

void fun(char *p,char *q,char *c) { int k=0;

while(*p||*q)

/**********************found***********************/ { if (*p<=*q) c[k]=*q; else c[k]=*p; if(*p) p++; if(*q) q++ ;

/**********************found***********************/ k++ } }

main()

{ char a[10]=\"fshADfg\\\0'}; fun(a,b,c);

printf(\"The string a:\"); puts(a); printf(\"The string b:\"); puts(b); printf(\"The result :\"); puts(c); }

仔细答题,认真总结! 二级考试专用

54

上机考试题

3 . 编程题

请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。

例如,当a=16,b=35,调用该函数后,c=5361。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include

void fun(int a ,int b,long *c) { }

main() {

int a,b; long c; clrscr();

printf(\"Input a,b;\"); scanf(\"%d%d\ fun(a,b,&c);

printf(\"The result is:%ld\\n\}

第二套上机题: 1. 填空题

下列给定程序中,函数fun()的功能是:按顺序给s所指数组中的元素赋予从2开始的偶数,然后再按顺序对每5个元素求一个平均值,并将这些值依次存放在w所指的数组中。若s所指数组中元素的个数不是5的倍数,多余部分忽略不计。例如,s所指数组有14个元素,则只对前10个元素进行处理,不对最后的4个元素求平均值。

试题程序:

#include #define SIZE 20

fun (double *s,double *w) { int k,i; double sum; for(k=2,i=0;ifor(k=0,i=0;iif((i+1)【1】5==0)

{w[k]=sum/5; sum=0;k++;} } 【2】 k; }

main()

{ double a[SIZE],b[SIZE/5]; int i, k; k=fun(a,b);

printf(\"The original data:\\n\"); for(i=0;iif(i%5==0) printf(\"\\n\"); printf(\"%4.0f\

55

仔细答题,认真总结! 二级考试专用

上机考试题

}

printf(\"\\n\\nThe result:\\n\");

for(i=0;i2. 改错题

下列给定程序中,函数fun()的功能是根据整型形参m,计算如下公式的值。

y=1-1/(2×2)+1/(3×3)-1/(4×4)+„+(-1)

例如:m中的值为5,则应输出0.838611。 请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include double fun(int m) { double y=1.0;

/**********************found***********************/ int j=1; int i;

for(i=2; i<=m; i++) {

j=-1*j;

/**********************found***********************/ y+=1/(i * i); }

return(y); }

main() {

int n=5; clrscr();

printf(\"\\nThe result is %lf\\n\" ,fun(n)); }

(m+1)

/(m×m)

3. 编程题

请编一个函数void fun(int tt[M][N], int pp[N]), tt指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入pp所指的一维数组中。二维数组中的数已在主函数中给出。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #define M 3 #define N 4

void fun(int tt[M][N],int pp[N]) { }

main() {

int t[M][N]={{68, 32, 54, 12},{14, 24, 88, 58},{42, 22, 44, 56}}; int p[N],i,j,k;

仔细答题,认真总结! 二级考试专用

56

上机考试题

clrscr();

printf(\"The riginal data is:\\n\"); for(i=0;ifor(j=0;jprintf(\"%6d\ printf(\"\\n\"); }

fun(t,p);

printf(\"\\nThe result is:\\n\"); for(k=0;kprintf(\"%4d\ printf(\"\\n\"); }

第三套上机题:

1. 填空题

下列给定程序中,函数fun()的功能是:将s所指字符串中的字母转换为按字母序列的后续字母(但Z转化为A,z转化为a),其他字符不变。

试题程序:

#include #include #include void fun(char *s) {while(【1】)

{ if(*s>='A'&&*s<='Z'||*s>='a'&&*s<='z') {if(*s=='Z') *s='A';

else if(*s=='z') *s='a'; else *s+=【2】; } 【3】; } }

main()

{ char s[80];

printf(\"\\n Enter a string with length<80:\\n\\n\"); gets (s); printf(\"\\n The string:\\n\\n\"); puts(s); fun(s);

printf(\"\\n\\n The Cords :\\n\\n\"); puts(s); }

2. 改错题

下列给定程序中,函数fun的功能是按以下递归公式求函数值。

Fun(n)例如:当给n输入5时,函数值为240;当给n输入3时,函数值为60。 请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

15Fun(n1)2

#include

/**********************found***********************/ fun(int n); {

int c;

/**********************found***********************/

57

仔细答题,认真总结! 二级考试专用

上机考试题

if(n=1) c=15; else

c=fun(n-1)*2; return(c); }

main() {

int n;

printf(\"Enter n:\"); scanf(\"%d\

printf(\"The result :%d\\n\\n\}

3. 编程题

请编写函数fun(),对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按ASCII值码升序排列。 例如:原来的字符串为BdsihAd,则排序后输出为BAdhisd。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include

int fun(char *s, int num) { }

main() {

char s[10]; clrscr();

printf(\"输入7个字符的字符串:\"); gets(s); fun(s,7);

printf(\"\\n%s\}

第四套上机题

1. 填空题

下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如:当s中的数为87653142时,t中的数为7531。

试题程序:

#include #include

void fun(long s,long *t) {int d;

long s1=1; *t=0;

while(s>0)

{ d=s【1】10; if(d%2!=0)

{*t=d*s1+*t;

仔细答题,认真总结! 二级考试专用

58

上机考试题

s1*=【2】; }

s/=【3】; } }

main()

{long s, t; clrscr();

printf(\"\\nPlease enter s: \"); scanf(\"%ld\ fun(s,&t);

printf(\"The result is :%ld\\n\ }

2. 改错题

下列给定程序中函数fun()的功能是计算1/n!的值。 例如:给n输入5,则输出0.008333。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include

/**********************found***********************/ int fun(int n)

{ double result =1.0; if(n==0)

return 1.0;

while(n>1 && n <170)

/**********************found***********************/ result *=n++ ; result=1/result; return result; }

main() {

int n;

printf(\"Input N:\"); scanf(\"%d\

printf(\"\\n1/%d!=%lf\\n\}

3. 编程题

编写函数fun(),它的功能是求n以内(不包括n)同时能被5与11整除的所有自然数之和的平方根s,并作为函数值返回。 例如:n为1000时,函数值应为s=96.979379。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include double fun(int n) { }

59

仔细答题,认真总结! 二级考试专用

上机考试题

main() {

clrscr();

printf(\"s=%f\\n\}

第五套上机题

1 填空题

下列给定的程序中,fun()函数的功能是:将p所指字符串中每个单词的最后一个字母改成大写(这里的\"单词\"是指有空格隔开的字符串)。例如,若输入:

I am a student to take the examination

则应输出:I aM A studenT tO takE thE examinatioN 试题程序:

#include

#include #include #include void fun(char *p) {

int k=0;

for ( ;*p;p++) if (k) {

if (*p==' ') {

【1】;

【2】=toupper(*(p-1)); } } else k=1; }

main()

{char chrstr[64]; int d;

printf(\"\\nPlease enter an English sentence within 63 letters: \"); gets(chrstr);

d=strlen(chrstr); chrstr[d]=' '; chrstr[d+1]=0;

printf(\"\\nBofore changing:\\n %s\ 【3】;

printf(\"\\nAfter changing:\\n %s\ }

2. 改错题

下列给定程序中函数fun()的功能是计算正整数num的各位上的数字之平方和。 例如:输入352,则输出应该是38;若输入328,则输出应该是77。 请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include long fun(long num) {

仔细答题,认真总结! 二级考试专用

60

上机考试题

/**********************found***********************/

long k=1; do {

k+=(num%10)*(num%10); num/=10;

/**********************found***********************/ }while(num) return (k); }

main() {

long n; clrscr();

printf(\"\\Please enter a number:\"); scanf(\"%ld\

printf(\"\\n%ld\\n\}

3. 编程题

请编写函数fun(),它的功能是求Fibonacci数列中小于t的最大的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为

F(0)=0,F(1)=1 F(n)=F(n-1)+F(n-2)

例如:t=1000时 ,函数值为987。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include int fun(int t) { }

main() {

int n;

clrscr(); n=1000;

printf(\"n=%d, f=%d\\n\}

第六套上机题

1. 填空题

下列给定程序中,函数fun()的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。 试题程序:

#include #include #include #define N 80

int fun(char *s,char *t) { int n;

61

仔细答题,认真总结! 二级考试专用

上机考试题

char *p, *r; n=0;

while(*s) { p=s; r=t;

while(*r)

if(*r==*p) {r++; 【1】;} else break; if(*r==【2】) n++; 【3】; }

return n; }

main()

{char a[N],b[N]; int m;

printf(\"\\nPlease enter string a: \");gets(a);

printf(\"\\nPlease enter substring b: \"); gets(b); m=fun(a,b);

printf(\"\\nThe result is :m=%d\\n\ }

2 改错题

下列给定程序中,函数fun()的功能是将字符串s中位于偶数位置的字符或ASCII码为奇数的字符放入字符串t中(规定第一个字符放在第0位中)。

例如:字符串中的数据为ADFESHDI,则输出应当是AFESDI。 请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include

#include #include #define N 80

/**********************found***********************/

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

int i, j=0;

for(i=0; i/**********************found***********************/

if(i%2=0||s[i]%2!=0) t[j++]=s[i] ; t[j]='\\0'; }

main() {

char s[N], t[N]; clrscr();

printf(\"\\nPlease enter string s :\"); gets(s); fun(s,t);

printf(\"\\nThe result is :%s\\n\}

3. 编程题

仔细答题,认真总结! 二级考试专用

62

上机考试题

请编写一个函数fun(),它的功能是计算并输出给定整数n的所有因子(不包括1与自身)的平方和(规定n的值不大于100)。 例如:主函数从键盘给输入n的值为56,则输出为sum=1113。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include long fun(int n) { }

main() {

int n; long sum;

printf(\"Input n:\"); scanf(\"%d\ sum=fun(n);

printf(\"sum=%ld\\n\}

第七套上机题

1. 填空题

下列给定程序中,函数fun()的功能是:通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。例如变量a初值为8,b初值为3,程序运行后a中的值为3,b中的值为8。

试题程序:

#include #include int fun(int *x,int y) {

【1】 t; t=*x;*x=y; return(t)【2】 }

main()

{int a=3,b=8;

printf(\"%d %d\\n \ b=fun(【3】,b);

printf(\"%d %d\\n \ }

(2)某学生的记录由学号、8门课成绩和平均分组成,学号和8门课的成绩已在主函数中给出。函数fun()的功能是:求出该学生的平均分放在记录的ave成员中。请自己定义正确的形参。

例如,若学生的成绩是85.5,76,69.5,85,91,72,64.5,87.5,则他的平均分应当是78.875。 试题程序:

#include #define N 8 typedef struct { char num[10]; double s[N]; double ave; } STRUC;

void fun(STRUC *P)

63

仔细答题,认真总结! 二级考试专用

上机考试题

{

int i;

p->ave=【1】;

for(i=0;ip->ave=p->ave+p->s[i]; p->ave=【2】; }

main() {

FILE *wf;

STRUC s={ \"GA005 \ int i;

fun(【3】);

printf(\"The %s's student data:\\n\ for(i=0;iprintf(\"%4.1f\\n\

printf(\"\\nave=%7.3f\\n\ wf=fopen(\"out.dat\

fprintf(wf,\"ave=%7.3f\ fclose(wf); }

2. 改错题

下列给定程序中,函数fun()的功能是找出100~n(不大于1000)之间百位数字加十位数字等于个位数字的所有整数,把这些整数放在s所指的数组中,个数作为函数值返回。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #define N 100

int fun(int *s, int n) {

int i,j,k,a,b,c; j=0;

for(i=100; i/**********************found***********************/

k=n; a=k%10; k/=10; b=k%10; c=k/10; if(a==b+c)

/**********************found***********************/

s[j]=i; }

return j; }

main() {

int a[N], n,num=0, i; do {

printf(\"\\nEnter n(<=1000) :\"); scanf(\"%d\

仔细答题,认真总结! 二级考试专用

64

上机考试题

}

while(n > 1000); num= fun(a,n);

printf(\"\\n\\nThe result :\\n\"); for(i=0; i3. 编程题

程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[ ][ N ],int n),该函数的功能是使数组左下半三角元素中的值加上n。

例如:若n的值为3,a数组中的值为 a=2 5 4 1 6 9 5 3 7

则返回主程序后a数组中的值应为 5 5 4 4 9 9 8 6 10

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include #define N 5

fun(int a[ ][N], int n) { }

main() {

int a[N][N],n, i,j; clrscr();

printf(\"***** The array *****\\n\");

for(i=0; ifor(j=0; ja[i][j]=rand()%10;

printf(\"%4d\ }

printf(\"\\n\"); } do

n=rand()%10; /*产生一个小于5的随机数n*/ while(n>=5);

printf(\"n=%4d\\n\ fun(a, n);

printf(\"*****THE RESULT*****\\n\"); for(i=0; ifor (j=0; jprintf(\"%4d\

65

仔细答题,认真总结! 二级考试专用

上机考试题

printf(\"\\n\"); } }

第八套上机题

1. 填空题

下列给定程序中fun()函数的功能是:将n个无序整数从小到大排序。 试题程序:

#include #include #include fun(int n,int *a) { int i,j,p,t;

for (j=0;j<【1】;j++) { p=j;

for (i=【2】;ia[i]) p=i; if(p!=j)

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

putarr( int n,int *z) {int i;

for (i=1;i<=n;i++,【3】) { printf(\"%4d\

if (!(i%10) ) printf(\"\\n\"); } printf(\"\\n\"); }

main()

{int aa[20]={9,3,0,4,1,2,5,6,8,10,7}, n=11;

printf(\"\\n\\nBefore sorting %d numbers:\\n\ fun(n,aa);

printf(\"\\nAfter sorting %d numbers:\\n\ }

2. 改错题

下列给定程序中,函数fun()的功能是求出数组中最小数和次最小数,并把最小数和a[0]中的数对调,次最小数和a[1]中的数对调。请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #define N 20

void fun(int *a,int n) {

int i, m, t, k;

/**********************found***********************/

for(i=0; im=i;

for(k=i; k/**********************found***********************/

仔细答题,认真总结! 二级考试专用

66

上机考试题

k=m; t=a[i]; a[i]=a[m]; a[m]=t; } }

main() {

int x,b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i; clrscr();

for(i=0; ifor(i=0; i3. 编程题

m个人的成绩存放在score数组中,请编写函数fun(),它的功能是:将高于平均分的人数作为函数值返回,将高于平均分的分数放在up所指的数组中。

例如,当score数组中的数据为24,35,88,76,90,54,59,66,96时,函数返回的人数应该是5,up中的数据应为88,76,90,66,96。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include

int fun(int score[],int m, int up[]) { }

main() {

int i, n, up[9];

int score[9]={24,35,88,76,90,54,59,66,96}; clrscr();

n=fun(score, 9, up);

printf(\"\\nup to the average score are: \"); for(i=0;iprintf(\"%d \}

第九套上机题

1. 填空题

N个有序整数数列已放在一维数组中,给定下列程序中,函数fun() 的功能是:利用折半查找算法查找整数m在数组中的位置。若找到,则返回其下标值;反之,则返回\"Not be found!\"。

折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和high(low仔细答题,认真总结! 二级考试专用

上机考试题

直到low>high,查找结束。

试题程序:

#include #define N 10

int fun(int a[],int m) { int low=0,high=N-1,mid; while(low<=high) { mid=【1】; if(melse if(m>a[mid]) low=mid+1;

else return(mid); }

【3】(-1); }

main()

{ int i,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m; printf(\"a数组中的数据如下:\");

for(i=0;iif (k>=0) printf(\"m=%d,index=%d\\n\ else printf(\"Not be found!\\n\"); }

2. 改错题

下列给定程序中,函数fun()的功能是计算并输出high以内的素数之和。high由主函数传给fun()函数。若high的值为100,则函数的值为1060。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include int fun(int high) {

int sum=0,n=0, j, yes; while(high>=2) {

yes = 1;

for(j=2; j<=high/2; j++)

/**********************found***********************/

ifhigh%j==0 {

yes=0; break; }

/**********************found***********************/

if(yes==0) {

sum+=high; n++; }

仔细答题,认真总结! 二级考试专用

68

上机考试题

high--; }

return sum; }

main() {

clrscr();

printf(\"%d\\n\}

3. 编程题

请编写函数void fun (int x, int pp[], int *n),它的功能是:求出能整除x且不是奇数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。

例如,若x中的值为24,则有6个数符合要求,它们是2,4,6,8,12,24。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

void fun (int x, int pp[], int *n) { }

main () {

int x,aa[1000], n, i ; clrscr() ;

printf(\"\\nPlease enter an integer number : \\n \") ; scanf (\"%d\ fun (x, aa, &n) ;

for (i=0 ; iprintf (\"%d \ printf (\"\\n \") ; }

第十套上机题

1. 填空题

下列给定程序中,函数fun()的功能是:根据形参m的值(2≤m≤9),在m行m列的二维数组中存放如下所示的数据,由main()函数输出。 例如,若输入2,则输出1 2

2 4

输入4,则输出1 2 3 4

2 4 6 8 3 6 9 12 4 8 12 16

试题程序:

#include

#include 【1】 M 10

int a[M][M]={0};

void fun(int (*a)[M], int m) {int j,k;

69

仔细答题,认真总结! 二级考试专用

上机考试题

for(j=0;jfor(k=0;kmain()

{int i, j, n;

printf(\"Enter n\\n\"); scanf(\"%d\ fun(a,n);

for(i=0;i{ for (j=0;jprintf(\"%4d \ printf(\"【3】\"); } }

2. 改错题

下列给定程序中,函数fun()的功能是:读入一个字符串(长度<20),将该字符串中的所有字符按ASCII码降序排序后输出。 例如:输入dafhc,则应输出hfdca。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include

/**********************found***********************/

int fun(char t[ ]) {

char c; int i,j;

for(i=0;ic= t[j];

/**********************found***********************/

t[j]=t[i++]; t[i]=c; } }

main() {

char s[81]; clrscr();

printf(\"\\nPlease enter a character string :\"); gets(s);

printf(\"\\n\\nBefore sorting :\\n %s\ fun(s);

printf(\"\\nAfter sorting decendingly:\\n %s\}

3. 编程题

请编写一个函数void fun(int m, int k, int xx[]),该函数的功能是:将大于整数m且紧靠m的k个非素数存入所指的数组中。例如,若输入15,5,则应输出16,18,20,21,22。

仔细答题,认真总结! 二级考试专用

70

上机考试题

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

void fun(int m, int k, int xx[]) { }

main() {

int m,n,zz[1000]; clrscr();

printf(\"\\nPlease enter two integers: \"); scanf(\"%d%d\ fun(m, n, zz); for(m=0;mprintf(\"%d \ printf(\"\\n \"); }

第十一套上机题

1. 填空题

已知一个数列从0项开始的前3项:0,0,1,以后的各项都是其相邻的前3项之和。下列给定的程序中,函数fun()的功能是:计算并输出该数列前n项的平方根之和sum。n的值通过形参传入。例如,当n=10时,程序的输出结果应为23.197745。

试题程序:

#include #include #include <【1】> double fun(int n)

{double sum, s0, s1, s2, s; int k; sum=1.0;

if (n<=2) sum=0.0;

s0=0.0; s1=0.0; s2=1.0; for (k=4;k<=n;k++) { s=s0+s1+s2; sum+=sqrt(s);

s0=s1;s1=s2;【2】; }

return 【3】; }

main() {int n;

printf(\"Input N=\"); scanf(\"%d\

printf(\"%f\\n\ }

2. 改错题

在主函数中从键盘输入若干个数放入数组中,用0结束输入并放在最后一个元素中。下列给定程序中,函数fun()的功能是计算数组元素中值为负数的平均值(不包括0)。

例如:数组中元素的值依次为43,-47,-21,53,-8,12,0,则程序的运行结果为-25.333333。 请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: 71

仔细答题,认真总结! 二级考试专用

上机考试题

#include #include double fun(int x[ ]) {

double sum=0.0; int c=0, i=0;

/**********************found***********************/

while(x[i]==0) {

if(x[i]<0) {

sum=sum+x[i]; c++; } i++; }

/**********************found***********************/

sum=sum\\c; return sum; }

main() {

int x[1000]; int i=0; clrscr();

printf(\"\\nPlease enter some data(end with 0) :\"); do {

scanf(\"%d\ }while(x[i++]!=0);

printf(\"%f\\n\}

3. 编程题

请编写一个函数int fun(int *s,int t,int *k),用来求出数组的最小元素在数组中的下标并存放在k所指的存储单元中。例如,输入如下整数:

234 345 753 134 436 458 100 321 135 760 则输出结果为6,100。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

int fun(int *s,int t,int *k) { }

main() {

int a[10]={234,345,753,134,436,458,100,321,135,760},k; clrscr();

fun(a, 10, &k);

printf(\"%d, %d\\n \}

仔细答题,认真总结! 二级考试专用

72

上机考试题

第一套上机题 1.填空题

【1】*

【2】'Z'

【3】tt

【解析】填空1:由return语句可以看出,该函数的返回值类型是指向字符串的指针,所以应该使用符号\"*\"。

填空2:从ASCII码表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII码值大32,根据ASCII码值判断该字母是不是大写字母,判断的标准是ASCII码值是否介于A和Z之间。

填空3:根据题目的意思这里应该调用函数fun对字符串tt进行转换,所以应该使用tt作为函数的参数。

3. 编程题

void fun(int a ,int b,long *c) {

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

【解析】语句*c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10;是将a数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。注意\"/\"和\"%\"的用法。

第二套上机题 1.填空题

【1】%

【2】return

【3】b[i]

【解析】填空1:根据题目的意思,这里是执行按顺序对每5个元素求一个平均值的操作,所以应该使用取余符号\"%\",如果是5的倍数,则该式子的值为零。

填空2:根据C语言的规定,除了使用关键字void的任何一个子函数都应该有返回值,所以应该使用关键字return把变量k的值返回主函数。

填空3:由题目的意思可知这里是把存在数组b中的内容依次循环输出,所以后面的变量名应该使用b[i] 。

2. 改错题

(1)错误:int j=1; 正确:double j=1.0; (2)错误:y+=1/(i * i); 正确:y+=j/(i * i);

【解析】错误1:为了做后面的除法运算,j要定义为实型数,否则除得的结果将为整数。

错误2:题中公式是加减相间的运算,通过j来实现。 3. 编程题

void fun(int tt[M][N],int pp[N]) {

int i,j,max;

for(j=0;jmax=tt[0][j]; /*假设各列中的第一个元素最大*/ for(i=0;iif(tt[i][j]>max) /*如果各列中的其他元素比最大值还大,

则将这个更大的元素看做当前该列中最大的元素*/ max=tt[i][j];

pp[j]=max; /*将各列的最大值依次放入pp数组中*/ }

73

仔细答题,认真总结! 二级考试专用

上机考试题

}

【解析】本题中函数的功能是求出二维数组中每列的最大元素。首先,假设各列中的第一个元素最大,然后利用行标值的移动来依次取得各列中其他元素的值,并与假设的最大值进行比较,如果遇到更大的,则把这个更大的元素看做当前该列中最大的元素,继续与该列中其他元素比较。

第三套上机题:

1.填空题

【1】*s

【2】1

【3】s++

【解析】填空1:从C语言的学习中我们知道,while语句的结束条件是括号中的式子结果为0,而一个字符串的结尾标志为'\\0',即满足循环的结束条件,所以一般情况下C语言中使用字符串的结尾作为结束循环的标志;s为指向一个数组的指针,*s为取出s指向的内容。

填空2:根据题目的意思,若该字母不是'z'或'Z',则该字母的ASCII码值加1。

填空3:根据题目的意思,要对字符串所有字母进行遍历,使用指针进行这一过程应该使用循环,即每次都对该指针进行加一操作。

2. 改错题

(1)错误:fun(int n); 正确:fun(int n) (2)错误:if(n=1) 正确:if(n==1)

【解析】错误1:该行是函数的首部,不是一条语句,因此不能以分号结束。

错误2:if后面应该紧跟一个条件判断表达式,若写成\"if(n=1)\",则说明该表达式的值永远为真,也就是说这个条件永远成立,没有

递归执行。

3. 编程题

int fun(char *s, int num) {char t; int i, j;

for(i=1;iif(s[i]>s[j]) /*如果后面字符的ASCII码值小于该字符的ASCII码值*/ { t=s[i]; /*则交换这两个字符*/ s[i]=s[j]; s[j]=t; } }

【解析】本题考查利用循环来控制数组元素的操作,首尾元素除外,因此,数组的下标值要从1开始,用循环变量i来依次取得数组中的元素,用数组中的元素s[i]和s[j]进行比较,如果后一个元素的ASCII码值小于前一个元素的ASCII码值,则交换这两个数组元素的值。

第四套上机题

1.填空题

【1】% 符号\"%\" 。

填空2:根据题目的意思,这里是把提取出来满足条件的数字依次从低到高填入一个新的变量t中,所以进行的操作应该是每一个数字都循环乘以10,再加上原来的部分,例如:依次得到数字321,最后应该输出123。

填空3:由算法可以看出,这里应该是进行完毕一次提取,所以应该舍弃最低位--个位,即把变量s除以10。

【2】10

【3】10

【解析】填空1:根据题目的意思,此处是由低到高逐位地提取变量d的每一位,然后再进行判断,所以可以推断出这里应该使用取余

仔细答题,认真总结! 二级考试专用

74

上机考试题

2. 改错题

(1)错误:int fun(int n) 正确:double fun(int n) (2)错误:result *=n++ ; 正确:result *=n-- ;

【解析】错误1:函数的返回值为实型数据,所以函数的返回类型应为double。

错误2:根据阶乘的概念,从n开始,每递减1的数相乘,直到1,因此此处n递减,而不是递增。

3. 编程题

double fun(int n) {double s=0.0; int i;

for(i=0; is=sqrt(s); /*对s求平方根*/ return s; }

【解析】本题的解题思路是逐个取得从0~n之间的所有数,对每次取得的数进行条件判断,条件是既能被5整除同时又能被11整除,注意:这两个条件要求同时成立,因此用到了\"&&\"运算符。满足条件,该数就被累加到s中去,求出所有符合条件的数后,用sqrt()函数(包含于头文件中)对s求平方根。

第五套上机题

1.填空题

【1】k=0 下一次检测。

填空2:根据题目的意思,此处进行的是将p所指单词的最后一个字母改成大写,但是此时p已经循环到了单词后面的那个空格,所以应该对p-1进行操作。

填空3:由算法可以看出,这里应该是进行函数调用,根据前面的子函数定义可以知道,参数是一个指向向字符串的指针,所以应该把数组的名字(也可以认为是指向数组首地址的指针)作为参数。

【2】*(p-1)

【3】fun(chrstr)

【解析】填空1:根据题目的意思,这里应该是以变量k作为判断标志,如果标志为1并且当前指针指向空格就应该把标志返回0,以便

2. 改错题

(1)错误:long k=1; 正确:long k=0; (2)错误:while(num) 正确:while(num);

【解析】错误1:k用来存放各位数字的平方和,初值应为0。

错误2:do-while语句的语法,while()后加分号。

3. 编程题

int fun(int t) {

int a=1,b=1,c=0,i; /*a代表第n-2项,b代表第n-1项,c代表第n项*/

/*如果求得的数c比指定比较的数小,则计算下一个Fibonacci数,对a,b重新置数*/ do

{

75

仔细答题,认真总结! 二级考试专用

上机考试题

c=a+b; a=b; b=c; }

while (cc=a; /*此时数c的前一个Fibonacci数为小于指定比较的数的最大的数*/ return c; }

【解析】根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和(即第n项),而a始终代表第n-2项,b始终代表第n-1项(通过不断地重新赋值来实现)。应注意,退出循环时得到的数c是大于指定比较的数的最小的数,而它的前一个数就是小于指定比较的数的最大的数。

第六套上机题

1.填空题

【1】p++

【2】'\\0'

【3】s++

【解析】填空1:根据题目的意思,这里应该是把要比较的字符串和原字符串的一部分进行逐个字符的比较,所以指向原字符串的指针p也应该进行每步加一的操作。

填空2:根据题目的意思,此处是判断上一步的比较是否与r指向的完整的字符串相等,如果完全相同,则r应该指向字符串的末尾,即'\\0'。

填空3:由算法可以看出,这里应该是进行的整个while循环,即应该控制s指针不停的向后移动直到字符串结尾。

. 改错题

(1)错误: void fun(char s, char t[ ]) 正确:void fun(char *s, char t[ ]) (2)错误: if(i%2=0||s[i]%2!=0) 正确:if(i%2==0||s[i]%2!=0)

【解析】错误1:由于本题中函数的功能是对字符串进行处理,而不是对单个字符进行处理,因此,函数的参数应为字符串指针。

错误2:if语句中要用关系运算符,而不是赋值运算符。 3. 编程题

long fun(int n) {

int i; long s=0;

for(i=2;i<=n-1;i++) /*从2~n-1中找n的所有因子*/ if(n%i==0)

s+=i*i; /*将所有因子求平方加*/ return s; /*将平方和返回*/ }

【解析】本题的解题思路是用n逐个去除以2到n-1之间的所有数,如果n能被除尽,则把所得到的一个因子的平方累加到s中去。

第七套上机题

1.填空题

【1】int

【2】;

【3】&a

【解析】填空1:根据题目的意思,这里应该是声名一个新的变量t,由后面的赋值语句以及返回语句可以明白这个变量应该是整型的(因为函数的返回值类型是int)。

填空2:根据题目的意思,此处是子函数的返回语句,由C语言的知识,每个语句的结尾都应该使用\";\" 。

填空3:fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该把变量的地址作为参数传递(符号\"&\"是取地址操作)。

仔细答题,认真总结! 二级考试专用

76

上机考试题

2. 改错题 (1)错误:k=n; 正确:k=i; (2)错误:s[j]=i; 正确:s[j++]=i;

【解析】错误1:k就是当前要被判断的数,是随着i值的变化而变化的。

错误2:在循环中,j是数组的下标要递增。

3. 编程题

fun(int a[ ][N], int n) {

int i, j;

for(i=0; ia[i][j]=a[i][j]+n; /*使数组左下半三角元素中的值加上n*/ }

【解析】首先从数组中找出要被加上n的那部分元素,找的过程其实就是找出将被挑出的那部分元素在原数组中的分布规律的过程。通过观察得出,要被处理的那部分元素的下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。找到这个规律后,依次从数组中取得合乎要求的元素,然后再加上n。

第八套上机题

1.填空题

【1】n-1

【2】j+1

【3】z++

【解析】填空1:根据题目的意思,这里应该是排序操作的第一层循环,作用是先找出输入整数的最小项,置于指针第1个元素的位置;再找出第2个元素至尾元素的最小项,置于第2个元素的位置;之后顺次处理后读元素,所以只需要比较到倒数第二个元素,即比较n-1次就可以。

填空2:根据题目的意思,此处是比较的第二层循环,应该把该元素和该元素之后的所有元素进行比较,所以下标应该从外层的下一个开始,即j+1。

填空3:由算法可以看出,这里应该是把指针z指向的元素一次输出,所以指针z也需要步进1。

2. 改错题

(1)错误: for(i=0; i【解析】错误1:由于题目要求将最小数和次最小数分别与a[0]和a[1]中的数对调,因此这层循环只需循环两次。

错误2:赋值语句的执行方向是从右向左,即把右边的值赋给左边的变量。 3. 编程题

int fun(int score[],int m, int up[]) {

int i,j=0; float av=0.0; for(i=0;iav=av+score[i]/m; /*求平均值*/ for(i=0;iif(score[i]>av) /*如果分数高于平均分,则将此分数放入up数组中*/

77

仔细答题,认真总结! 二级考试专用

上机考试题

up[j++]=score[i];

return j; /*返回高于平均分的人数*/ }

【解析】该题第1个循环的作用是求出平均分av,第2个循环的作用是找出高于平均分的成绩并存入up数组中。

第九套上机题

1.填空题

【1】 (low+high)/2

【2】mid-1

【3】return

【解析】填空1:根据题目的意思,这里应该是确定折半查找的中间位置,所以很明显应该填(low+high)/2,注意这个式子返回的是整型数据,即如果分子为7则结果为3。

填空2:根据题目的意思,中间的元素值大时应该选择前半段进行下次查找,所以应该把mid前一位的下标赋值给high。 填空3:由算法可以看出,这里应该是所有循环完毕仍然没有找到满足条件的地方,即应该返回-1,所以使用关键字\"return\" 。

2. 改错题

(1)错误:ifhigh%j==0 正确:if(high%j==0) (2)错误:if(yes==0) 正确:if(yes)

【解析】错误1:if语句的两侧要加括号。

错误2:yes为1时,说明被判断的数为素数,要加入总和。 3. 编程题

void fun (int x, int pp[], int *n) {

int i,j=0;

for(i=2;i<=x;i=i+2) /*i的初始值为2,步长为2,确保i为偶数*/ if(x%i==0) /*将能整除x的数存入数组pp中*/ pp[j++]=i;

*n=j; /*传回满足条件的数的个数*/ }

【解析】本题题干信息是:能整除x且不是奇数的所有整数。循环语句中i从2开始且每次增2,所以i始终是偶数。

第十套上机题

1.填空题

【1】#define 分号。

填空2:根据题目的意思,此处是对每一个元素的赋值,很容易总结出(k+1)*(j+1)的规律,注意参数的传递方式:对于二维数组,应该理解成为是由几个一维数组元素组成的一维数组,或者说,二维数组实际是一个一维数组,只不过它的每个数组元素又都是一个一维数组。

填空3:由算法可以看出,这里应该是每行输出完毕之后,所以应该换行,即输出特殊字符\"\\n\" 。

【2】(k+1)*(j+1)

【3】\\n

【解析】填空1:从C语言的学习中我们知道,这里应该是进行常量定义的,应该使用关键字\"#define\"修饰,注意该语句的结尾不需要

2. 改错题

(1)错误:int fun(char t[ ]) 正确:void fun(char t[ ]) (2)错误: t[j]=t[i++];

正确:t[j]=t[i];

【解析】错误1:该函数只是对一个字符串中的元素进行比较大小的操作,并没有具体的返回值,因此,函数的返回值类型应为void。

错误2:本题的思路是利用选择法对数组元素进行比较。所谓选择法,是依次用当前取得的元素和它后面的元素进行比较,在第一个

仔细答题,认真总结! 二级考试专用

78

上机考试题

元素和它后面的元素顺次比较时,可以借助中间变量来对两数进行交换,要保证这第一个元素始终存放数组中的最大数,以后依次挑出次大数,这样最终的数组就是有序的。解答本题,只要理解了选择法的思想,找到并改正错误就很容易了。

3. 编程题

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

int i,j,n;

for(i=m+1,n=0;nxx[n++]=i; /*如果不是素数,放入数组xx中*/ break; /*并跳出本层循环,判断下一个数*/ } }

【解析】本题只要掌握了判断非素数和素数的算法即不难完成了,其实程序缺少部分也正是这部分。

第十一套上机题

1.填空题

【1】math.h

【2】s2=s

【3】sum

【解析】填空1:从C语言的学习中我们知道,下面的运算使用了数学函数sqrt,所以在前面的头文件中应该包含数学函数头文件math.h。 填空2:根据题目的意思,此处是更新数列中将要进行计算的三项,其中前两项就是前一步计算中的后面两项,第三项应该是刚才计算产生的,即变量s。

填空3:由算法可以看出,这里应该是把子函数的计算结果返回给主函数,需要返回的就是每次进行累加的变量sum。

2. 改错题

(1)错误:while(x[i]==0) 正确:while(x[i]!=0) (2)错误:sum=sum\\c;

正确:sum=sum/c;

【解析】错误1:此处考查的是对循环条件的理解,当被判断的数组元素为0时,说明这是数组的最后一个元素,此时要跳出循环。

错误2:C语言中的除法运算符是\"/\",而不是\"\\"。 3. 编程题

int fun(int *s,int t,int *k)

{

int i;

*k=0; /*k所指的数是数组的下标值*/ for(i=0;is[i])

*k=i; /*找到数组的最小元素,把该元素的下标赋给k所指的数*/ return s[*k]; /*返回数组的最小元素*/ }

【解析】本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始应让*k的值为数组中的某一下标值,即*k=0。

79

仔细答题,认真总结! 二级考试专用

因篇幅问题不能全部显示,请点此查看更多更全内容