全国计算机等级考试
二级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 { 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 { 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 二、填空题 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 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)!(x 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 程序运行时,输入的值在哪个范围才会有输出结果 A)不等于10的整数 B)大于3且不等于10的整数 C)大于3或等于10的整数 D)小于3的整数 20、有以下程序(09年3月试题19) #include 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、关系表达式x { 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、解析: x 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 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 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 {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【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); 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 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 #include { 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 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 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 { 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 {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 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 { 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; i 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 ③ { 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 int fun(int a[], int n) { int i,j=1; for(i=1;i for(i=0; i #include { 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所指字符串进行比较,若s1 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]的前面,即i 仔细答题,认真总结! 二级考试专用 第 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 int fun(int *s, int t, int *k) { int i; *k=0; for(i=0;i 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 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;i 在下划线处应填入的内容是 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 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 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 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 { 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 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;k 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 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 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;i printf(\"max=%d,line=%d\n\);} 9、下面程序是指从终端读入的20个字符放入字符数组中,然后利用指针变量输出上述字符串,请填空。 #include { 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 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 ; i #include int fun(int *s, int t, int *k) { int i; *k=0; 【 】 if(s[ *k] 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 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 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 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 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 { 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 { 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 { 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 {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 { 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的二进制文件中,请填空。该程序的输出结果是 A)ABCD{int a[10]={ 876,675,896,101,301,401,980,431,451,777},k; clrscr();