《C语言程序设计教程》补充习题

更新时间:2024-05-25 05:08:01 阅读量: 综合文库 文档下载

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

《C语言程序设计教程》补充习题

第1章 C语言概述

一、选择题

1.机器语言属于( )。 A.低级语言 B.高级语言 C.面向问题的语言 D.汇编语言 2.下列语言中不属于面向问题的语言是( )。 A.高级语言 B.低级语言 C.C语言 D.BASIC语言 3.高级语言编写的程序称为( )。 A.高级程序 B.源程序 C.目的程序 D.目标程序

4.用C语言编写的源文件经过编译,若没有产生编译错误,则系统将( )。 A.生成可执行目标文件 B.生成目标文件 C.输出运行结果 D.自动保存源文件 5.在Turbo C/C++3.0集成环境下执行菜单命令“运行”,若运行结束且没有系统提示信息,说明( )。

A.源程序有语法错误 B.源程序正确无误

C.源程序有运行错误 D.源程序无编译、运行错误,但仅此无法确定其正确性

6.下列不正确的转义字符是( )。 A.\\\\ B.\\' C.074 D.\\0 7.下列正确的转义字符是( )。 A.\\777 B.\\821 C.\\xhh D.\\xff 8.下列正确的标识符是( )。 A.3a B.a=2 C.A-3 D.a_3 9.下列不正确的标识符是( )。 A._al B.a[i] C.a2_i D.in 10.下列说法中正确的是( )。

A.由于C源程序是高级语言程序,因此一定要在TC软件中输入

B.由于C源程序是字符流组成,因此可以作为文本文件在任何文本编辑的软件中输入

C.由于C程序是高级语言程序,因此输入后即可执行 D.由于C程序是高级语言程序,因此它由命令组成 11.下列说法中正确的是( )。

1

A.C语言程序由主函数和0个或多个函数组成 B.C语言程序由主程序和子程序组成 C.C语言程序由子程序组成 D.C语言程序由过程组成 12.下列说法中错误的是( )。

A.主函数可以分为两个部分:主函数说明部分和主函数体 B.主函数可以调用任何非主函数的其他函数 C.任何非主函数可以调用其他任何非主函数 D.程序可以从任何非主函数开始执行 二、填空题

1.汇编语言属于面向 语言,高级语言属于面向 语言。 2.在C语言程序中允许出现的字符集是 。

3.转义字符是由 符号开始的单个字符或若干个字符组成的。 4.C语言的程序中有特殊含义的英语单词称为 。

5.标识符一般由 组成,以 开头。

6.C语言中,标识符的定义规则是 。

7.C语言的语句主要分为 语句、 语句、 语句、 语句、 语句、 语句、 语句和 语句等8类。

8.C程序是由函数构成的。其中有并且只能有 个主函数。C语言程序的执行总是由 函数开始,并且在 函数中结束。

9.C语言程序的注释可以出现在程序中的任何地方,它总是以 符号作为开始标记,以 符号作为结束标记。

10.用高级语言编写的程序称为 程序,它可以通过 程序,翻译一句执行一句的方式执行;也可以通过 程序,一次翻译产生 程序,然后执行。

第2章 基本数据类型及其运算

一、选择题

1.下列数据中属于字符串常量的是()。 A.\ B.(ABC) C.'abc\\0' D.'a' 2.PC机中,'\\t'在内存占用的字节数是()。 A.1 B.2 C.3 D.4 3.在PC机中,\在内存占用的字节数是()。 A.5 B.6 C.3 D.4 4.字符串\在内存占用的字节数是()。 A.3 B.4 C.6 D.8 5.字符串\在内存占用的字节数是()。 A.4 B.6 C.7 D.8 6.在C语言中,合法的长整型常数是()。 A.0L B.4962710

2

C.0.054838743 D.2.1869e10 7.在C语言中,合法的短整型常数的末尾加( )。 A.L B.x C.l D.s 8.下列数据中不属于字符常量的是( )。 A.'\\xff' B.'\\160' C.'070' D.070 9.char型常量在内存中存放的是( )。

A.ASCII代码值 B.BCD代码值 C.内码值 D.十进制代码值 10.若int类型数据字长为2个字节,其最大值为( )。 A. 231 B. 215-1 C. 232-1 D. 232

11.常数的书写格式决定了常数的类型和值,03322是( )。

A.16进制int类型常数 B.8进制int类型常数 C.10进制int类型常数 D.10进制long类型常数 12.\是( )。 A.实型常数100 B.值为100的整型常数 C.非法标识符 D.合法标识符

13.要为字符型变量a赋初值,下列语句中哪一个是正确的( )。 A. char a='3'; B. char a=\ C. char a=%; D. char a=*;

14.下列说明语句中可以实现为float类型变量x,y,z赋同一初值3.14的是( )。 A. float x,y,z=3.14; B. float x,y,z=3*3.14; C. float x=3.14,y=3.14,z=3.14; D. float x=y=z=3.14; 15.语句float pi=3.1415926535;将( )。 A. 导致编译错误

B. 说明pi为初值3.1415926535的单精度实型变量 C. 导致运行时的溢出错误

D. 说明pi为初值3.141593的单精度实型变量

16.算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为( )。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 17.关系运算符中优先级最低的运算符是( )。 A.“>=”和“<=” B.“>”和“<” C.“==”和“!=” D. “<=”和“<” 18.逻辑运算符中,运算优先级按从高到低依次为( )。 A.&&,!,|| B.||,&&,! C.&&,||,! D.!,&&,||

19.C程序在作逻辑运算时,如何判断操作数的真、假 ( )。 A.0为假非0为真 B.只有1为真 C.-1为假1为真 D.0为真非0为假 20.表达式 x&&1等效于( )。 A.x==0 B.x==1

3

C.x!=0 D.x!=1 21.表达式x==0&&y!=0||x!=0&&y==0等效于( )。

A.x*y==0&&x+y!=0 B.x*y==0&&(x+y==0) C.x==0||y==0 D.x*y=0||x+y=0 22.表达式!x||a==b等效于( )。 A.!((x||a)==b) B.!(x||y)==b C.!(x||(a==b)) D.(!x)||(a==b)

23.设整型变量m,n,a,b,c,d均为0,执行(m=a==b)||(n=c==d)后,m,n的值是( )。 A.0,0 B.0,1 C.1,0 D.1,1

24.设整型变量m,n,a,b,c,d均为1,执行 (m=a>b)&&(n=c>d)后, m,n的值是( )。 A.0,0 B.0,1 C.1,0 D.1,1

25.设a为2,执行下列语句后,b的值不为0.5的是( )。 A.b=1.0/a B.b=(float)(1/a) C.b=1/(float)a D.b=1/(a*1.0) 26.设a为5,执行下列语句后,b的值不为2的是( )。 A.b= a/2 B.b=6-(--a) C.b= a%2 D.b= a>3?2:2

27.执行语句“x=(a=3,b=a--)”后,x,a,b的值依次为( )。 A.3,3,2 B.3,2,2 C.3,2,3 D.2,3,2

28.int b=0,x=1;执行语句if(x++) b=x+1; 后,x,b的值依次为( )。 A.2,3 B.2,0 C.3,0 D.3,2

29.设有语句int a=3;,则执行了语句 a+=a-=a*a; 后,变量a的值是( )。 A.3 B.0 C.9 D.-12

30.设有语句int a=3;,则执行了语句a+=a-=a*=a; 后,变量a的值是( )。 A.3 B.0 C.9 D.-12

31.设有语句int a=4, b=3, c= -2, d=2;则逻辑表达式a>0&&b&&c<0&&d>0的值是( )。 A.1 B.0 C.-1 D.出错

32.在以下一组运算符中,优先级最高的运算符是( )。 A.<= B.= C.% D.&&

33.设整型变量i值为2,表达式(++i)+(++i)+(++i)的值是( )。 A.6 B.12 C.15 D.表达式出错

34.设整型变量i,j的值均为3,执行了j=i++;j++;++i;后,i,j的值分别是( )。 A.3,3 B.5,4 C.4,5 D.6,6

35.若已定义x和y为double类型,则表达式 x=1,y=x+3/2 的值是( )。

4

A.1 B.2 C.2.0 D.2.5 36.sizeof (double)的结果值是( )。 A.8 B.4 C.2 D.出错 37.表达式 1?(!1?3:2 ):(0?1:0)的值是( )。 A.3 B.2 C.1 D.0

38.设a=1,b=2,c=3,d=4,则表达式:a

39.设a为整型变量,不能正确表达数学关系:1010 && a<15 D.!(a<=10) && !(a>=15) 40.执行语句int a=0; if(a=1) a+=10; 后,a的值是( )。 A.0 B.11 C.10 D.出错

41.下列表达式中符合C语言语法的赋值表达式是( )。 A.a=7+b+c=a+7 B.a=7+b++=a+7 C.a=(7+b,b++,a+7) D.a=7+b,c=a+7

42.设f是实型变量,下列表达式中不是逗号表达式的是( )。 A.f= 3.2, 1.0 B.f>0, f<10 C.f=2.0, f>0 D.f=(3.2, 1.0) 43.下列表达式中,不正确的表达式是( )。 A.a=1,b=1 B.y=int(x) C.a+b=5 D.i++

44.int n; float f=13.8; 执行n=((int)f)%3 后, n的值是( )。 A.1 B.4 C.4.333333 D.4.6

45.设a,b和c都是int型变量,则执行语句a=3;b=4;c=5;后,下面的表达式中值为0的是( )。 A.'a'&&'b' B.a<=b C.a||b+c&&b-c D.!( (a

x=10;t=x&&x>10; A.不定值 B.10 C.1 D.0

47.设x,y,z,t均为int型变量,则执行以下语句后,t的值为 ( )。

x=y=z=1;t=++x‖++y&&++z; A.不定值 B.2 C.1 D.0

48.设a是char型变量,其字符值为 '1',则把其值变成整数1的表达式是( )。 A.(int)a B.int(a) C.a= a-48 D.a / (int)a

49.设a是int型变量,其值为3,则把其值变成字符 '3' 的表达式是( )。

5

11.设int i=010,j=10;,则执行语句printf(\后,屏幕的输出的是( )。 A.11,10 B.9,10 C.010,9 D.10,9

12.设a、b为字符型变量,执行scanf(\后,要使a为'A', b为'B',从键盘上的正确输入应是( )。

A.'A' 'B' B.'A','B' C.A=A,B=B D.a=A,b=B

13.假定所有变量均已正确定义,下列程序段运行后y的值是( )。 int a=0,y=10;

if(a=0) y--;else if(a>0) y++; else y+=y; A.20 B.11 C.9 D. 0

14.假定所有变量均已正确定义,下列程序段运行后x的值是( )。 int a=b=c=0;x=35;

if(!a) x--; else if(b); if(c) x=3; else x=4; A.34 B.4 C.35 D.3

15.下列各语句序列中,能够且仅输出整型变量a、b中最大值的是( )。 A.if(a>b) printf(\B.printf(\C.if(a>b) printf(\D.if(a

16.下列各语句序列中,能够将变量u、s中最大值赋值到变量t中的是( )。 A.if(u>s)t=u; t=s; B.t=s; if(u>s)t=u; C.if(u>s)t=s; else t=u; D.t=u; if(u>s)t=s; 17.下列各语句中,能够输出整型变量a、b中最大值的是( )。 A.printf(\

B.(a>b)? printf(\C.printf(\D.printf(\

18.下列语句应将小写字母转换为大写字母,其中正确的是( )。 A.if(ch>='a'&ch<='z') ch=ch-32; B.if(ch>='a'&&ch<='z')ch=ch+32; C.ch=(ch>='a'&&ch<='z')?ch-32:’’; D.ch=(ch>'a'&&ch<'z')?ch-32:ch;

19.int a=1, x=1; 循环语句while(a<10) x++; a++; 的循环执行了( )。 A.无限次 B.不确定次 C.10次 D.9次 20.下列语句中,错误的是( )。 A.while(x=y) 5; B.do x++ while(x==10); C.while(0) ; D.do 2;while(a==b);

21.循环语句for(x=0, y=0; (y! =123)| | (x<4); x++); 的循环体执行了( )。 A.无限次 B.不确定次 C.4次 D.3次

11

22.循环语句for(i=0, x=1; i=10 && x>0; i++); 的循环体执行了( )。 A.无限次 B.不确定次 C.10次 D.9次

23.i、j 已定义为int类型,则以下程序段中内循环体的执行次数是( )。 for(i=5;i;i--)

for(j=0;j<4;j++){?} A.20 B.24 C.25 D.30 24.C语言while语句中,用于条件的表达式是( )。 A.关系表达式 B.逻辑表达式 C.算术表达式 D.任意表达式 25.下面的while循环,执行次数是( )。 i=4; while(--i) printf(\A.3次 B.4次 C.0次 D.无数次 26.下列程序段执行后s的值为( )。

int i=1, s=0; while(i++) if(!(i%3)) break ; else s+=i ; A.2 B.3 C.6 D.以上均不是 27.下列程序的输出结果是( )。 #include void main( )

{int x=3, y=6, z=0;

while(x++!=(y-=1)){ z++; if(y

A.x=4,y=4,z=1 B.x=5,y=4,z=3 C.x=5,y=4,z=1 D.x=5,y=5,z=1 28.int i=1,s=0;

while (i<100) {s+=i++;if (i>100 ) break;} 执行以上程序段后,s的值是( )。 A.1到101的和 B.1到100的和 C.1到99的和 D.以上均不是 29.假定i和j为int型变量,则执行以下语句后i的值为( )。 int i=1,j; switch (i++)

{case 1: for (j=0;j<9;j++) if (i==1) break; case 2: for (j=1;j<10;j++) if (i==2) break; case 3: printf (“i=%d\\n”,i ); }

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

30.假定a和b为int型变量,则执行以下语句后b的值为( )。 a=1;b=10;

12

do { b-=a;a++;} while (b--<0); A.9 B.8 C.-1 D.-3

31.设x和y均为int型变量,则执行下面的循环后,x,y的值分别为( )。 for (y=1,x=1;y<=50;y++) {if (x>=10 ) break;

if (x%2==1) {x+=5;continue; } x-=3; }

A.10,6 B.2,51 C.2,50 D.3,50

32.求整数1至10的和并存入变量s,下列语句中错误的是( )。

A.s=0;for(i=1;i<=10;i++) s+=i; B.s=0;i=1;for(;i<=10;i++) s=s+i; C.for(i=1,s=0;i<=10;s+=i,i=i+1) D.for(i=1;s=0;i<=10;i++) s=s+i; 33.若sizeof(int)为2,计算1至10的乘积,下列语句序列中正确的是( )。 A.int i,jc=1; for(i=2;i<=10;i++) jc*=i;

B.int i;float jc; for(jc=1,i=2;i<=10;i++,jc*=i); C.int i; float jc=1; for(i=2;i<=10;jc*=i,i=i+1); D.float jc; for(jc=1;i=2;i<=10;i++) jc*=i;

34.下列语句中,哪一个可以输出26个大写英文字母( )。 A.for(a='A';a<='Z';printf(\B.for(a='A';a<'Z';a++)printf(\C.for(a='A';a<='Z';printf(\D.for(a='A';a<'Z';printf(\

35.在C语言中,下列说法中正确的是( )。 A.不能使用“do语句while(条件);”的循环

B.“do语句while(条件);”的循环必须使用“break”语句退出循环 C.“do语句while(条件);”的循环中,当条件为非0时将结束循环 D.“do语句while(条件);”的循环中,当条件为0时将结束循环 二、填空题

1.结构化程序设计规定的三种基本结构是 结构、 结构和 结构。 2.若有定义语句int a=25,b=14,c=19; 以下语句的执行结果是 。 if(a++<=25 && b--<=2 && c++)

printf(\else

printf(\

3.以下两条if语句可合并成一条if语句 。 if(a<=b) x=1; else y=2;

if(a>b) printf(\else prinft(\

4.下列程序的功能是输入一个正整数,判断是否能被3或7整除,若能整除,输出

13

“YES”,若不能整除,输出“NO”。请为程序填空。 void main() {

int k;

scanf (\

if printf(\else printf (\}

5.三种循环语句是 价的。

6.当循环体中的switch语句内有break语句,则只跳出 语句。同样,当switch语句中有循环语句,内有break语句,则只跳出 语句。

7.循环体中的continue 语句是 。

8.若int k=10, 循环语句while (k=0) k=k-1; 执行 次。

9.若int k=2, 循环语句while (k!=0) { printf(\执行 次。 10.若int i=10,s=0;,执行语句while(s+=i--,--i);后s、i的值分别为 。 11.程序段 int s,i; for(i=1;i<=100;s+=i,i++); 能否计算1~100的和? ,原因 。

12.若int类型变量字长为2,程序段 int i,jc=1; for(i=2;i<10;i++)jc*=i; 能否计算1~10的阶乘? ,原因是 。

13.设i, j, k均为int型变量,则执行完下面的for循环后,k的值为 。 for(i=0,j=10; i<=j; i++,j--) k=i+j; 14.下列程序的功能是输入一个正整数,判断是否是素数,若为素数输出1,否则输出0,请为程序填空。

void main( ) {int i, x, y=1;

scanf(\for(i=2; i<=x/2; i++) if { y=0; break; } printf(\}

15.输入若干个字符,分别统计数字字符的个数、英文字母的个数,当输入换行符时输出统计结果,运行结束。

#include void main( ) {char ch;

int s1=0,s2=0;

while( !='\\n') {

if(ch>='0'&&ch<='9') s1++;

if(ch>='a'&&ch<='z' || ch>='A'&&ch<='Z') s2++; } }

三、程序分析题

1.阅读程序,写出运行结果。

14

void main ()

{int a=10,b=4,c=3; if(a

printf(\}

2.阅读下列程序,写出程序的输出结果。 void main ( )

{int x=100,a=10,b=20,ok1=5,ok2=0; if(a

else x=-1;

printf(\}

3.阅读下列程序,写出下列程序的输出结果。void main( ) {int k,a=1,b=2; k=(a++==b)?2:3; printf(\

4.阅读下列程序,写出程序运行的输出结果。void main( ) {int y=9;

for( ;y>0; y--)

if(y%3==0) { printf(\}

5.阅读下列程序,写出程序运行的输出结果。void main ( ) {int i=5; do {

switch (i%2) {

case 4: i--; break; case 6: i--; continue; } i--; i--;

printf(\} while(i>0); }

6.阅读下列程序,写出程序运行的输出结果。#include void main( )

15

{int k=0; char c='A'; do {

switch (c++) {

case 'A': k++; break; case 'B': k--;

case 'C': k+=2; break; case 'D': k=k%2; break; case 'E': k=k*10; break; default: k=k/3; } k++; }

while(c<'G');

printf(\}

7.阅读下列程序,当输入为:ab*ABí#CD$ 时,写出程序运行的输出结果。void main ( ) {char c;

while((c=getchar( ))!='$')

{if('A'<=c && c<'Z') putchar(c);

else if('a'<=c && c<='z') putchar(c-32); } }

8.阅读下列程序,输入数据:2,4 写出程序运行的输出结果。 #include void main( )

{int i,s=1,t=1,a,n;

scanf(\for(i=1;i

s*=a; printf(\}

9.阅读下列程序,写出程序运行的输出结果。 #include void main( ) {int i,j,n;

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

{for(j=1;j<=i;j++) printf(\n=7-2*i;

for(j=1;j<=n;j++) printf(\printf(\

16

} }

第4章 数组

一、选择题

1.在C语言中,在int num[5]={10,20,30,40,50}中,num[3]的值是( )。 A.20 B.50 C.40 D.10

2.若int a[10];,则下列( )可以正确引用a数组的元素。 A.a [10] B.a[3+1] C.a(5) D.a[11]

3.若int num[10];,要将10赋值到数组num的第4个元素,正确的方法是( )。 A.num[3]=10; B.Num[3]=10; C.num[4]=10; D.Num[4]=10;

4.在C语言中,若要定义一个数组用于保存5个参赛者,参加4个不同项目的比赛成绩,是应是( )。

A.score[6][5] B.score[4][3] C.score[5][4] D.score[5] 5.执行下面的C代码段后,屏幕输出结果是( ) 。 char str1[15] = \ char str2[15] = \ strcpy(str1,str2); printf(\ A.She is a girl B.He is a boy C.She is a girl He is a boy D.He is a boy She is a girl 6.以下对二维数组a进行初始化,不正确的是( )。 A.int a[] [3]={1,2,3,4,5,6}; B.int a[] [3]={{1,2,3},{4,5,6}}; C.int a[2] [3]={{1,2,3},{4,5,6}}; D.int a[] []={{1,2,3},{4,5,6}}; 7.下列描述中不正确的是( )。

A.字符型数组中可以存放字符串

B.可以对字符型数组进行整体输入、输出 C.可以对整型数组进行整体输入、输出

D.不能在赋值语句中通过赋值运算符“=”对字符型数组进行整体赋值 8.以下程序的输出结果是 ( )。 #include #include void main( ) {char b[30];

strcpy (&b[0],\ strcpy (&b[1],\ strcpy (&b[2],\

17

printf (\}

A.CFGH B.ACFGH C.ABCDEFGH D.FGH

9.假定int类型变量占用2个字节,若有定义:int x[8]={1,2,3};,则数组x在内存中所占字节数是( ) 。

A.3 B.6 C.10 D.16 10.若char x[ ]=\

char y[ ]={'a','b','c','d'};

则正确的叙述为( )。

A.数组x和数组y长度相等 B.数组x的长度小于数组y的长度 C.数组x的长度大于数组y的长度 D.以上都不对 11.以下程序执行后的输出结果是( )。 #include void main()

{int i,test ,p[17],head; for(i=0;i<16;i++) p[i]=i+1; p[16]=0; test=0;

while(test!=p[test]) {for(i=1;i<3;i++) {head=test; test=p[test]; } p[head]=p[test]; test=p[head]; } printf(\}

A.1,2,3 B.2,3,4 C.10 D.4 12.有以下程序 #include void main()

{ int num[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},i,j; for(i=0;i<4;i++) { for(j=0;j<=i;j++) printf(\

for(j=_____;j<4;j++) printf(\printf(\ } }

若要按以下形式输出数组右上半三角

18

1 2 3 4  6 7 8  11 12  16

则在程序下划线处应填入的是( )。 A.i-1 B.i C.i+1 D.4-i

13.若有定义语句:int b;char c[10];,则下列正确的输入语句是( )。 A.scanf(\B.scanf(\ C.scanf(\ D.scanf(\14.若定义:int a[100];,则下列数组元素的引用中,非法的是( )。 A.a[0] B.a[1] C.a[99] D.a[100] 15.有以下程序 main()

{ char a[7]=\

int i,j;

i=sizeof(a); j=strlen(a); printf(\}

程序运行后的输出结果是( )。 A.2 2 B.7 6 C.7 2 D.6 2 16.有以下程序 #define N 20

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

for(i=m;i>=n;i--) a[i+1]=a[i]; }

main() {

int i,a[N]={1,2,3,4,5,6,7,8,9,10}; fun(a,2,9);

for(i=0;i<5;i++) printf(\}

程序运行后的输出结果是( )。 A.10234 B.12344 C.12334 D.12234 17.有以下程序 main()

{ char str[][10]={\int n=0,i;

19

for(i=0;i<7;i++) if(str[i][0]==′r′) n++;

printf(\

}

程序执行后的输出结果是( )。 A.0 B.1 C.2 D.3 18.有以下程序 #include void main() { int p[8]={ 1, 2, 3, 4, 5, 6, 7, 8},i=0,j=1; while(i++<=7) if(p[i]%2) j*=p[i]; printf(\}

程序运行后的输出结果是( )。 A.42 B.40320 C.105 D.384 19.有以下程序 main()

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

程序执行后的输出结果是( )。 A.45 B.20 C.25 D.36 20.以下程序运行后的输出结果是( )。 #include \main() {

char ch[]=\ i; for(i=0;i<3;i++) strcpy(x[i],ch);

for(i=0;i<3;i++) printf(\ printf(\}

A.abcbcc B.2 C.3 D.无数 二、填空题

1.不管数组是几维的,程序内存都是按 维存放的。2.用来引用特定数组元素的数值称为 。 3.数组长度和数组的最大下标之间相差 。

20

二、填空题

1.简述传值: 。 2.形参其实就是变量,实参是表达式,可以是 、 、 、 ,。形参和实参结合,必须满足三个条件: 、 和 。

3.空函数是指 。

4. 函数是由系统调用的。 5.定义函数时函数名后面括号中的参数为 ,函数调用时函数名后面括号内的参数是 。

6.函数可以嵌套调用,但是不能嵌套 。

7.程序的执行总是从 函数开始,最后由 函数中结束。 8.一个C程序由 个源程序文件组成。

9.若没有定义函数的类型,该函数的类型是 ,如果在函数中没有使用return语句,则返回的是 值。

10.如果函数值的类型为 ,表示函数没有返回值。

第6章 编译预处理

一、选择题

1.下列程序执行后的输出结果是( )。 #define MA(x) x * ( x - 1 ) void main(void) {int a = 1 , b = 2;

printf(\}

A.6 B.8 C.10 D.12 2.以下程序中,for循环体执行的次数是( )。 #define N 2

#define M 1+ N #define K M+1*M/2 void main(void) {int i;

for( i = 1;i < K; i++) {??} ?? }

A.4 B.5 C.3 D.6 3.下列程序执行后的输出结果是( )。 #define F(x) x*x main() {int i;

i=F(4+4)/F(2+2); printf(\}

26

A.4 B.16 C.28 D.24 4.宏展开是在( )阶段完成的。 A.程序运行时 B.编辑程序时 C.编译阶段 D.编译之前 5.以下程序运行的结果是( )。 main()

{#ifdef YES

printf(\ #else

printf(\ #endif }

A.编译出错 B.Hello C C.Bye bye! D.Hello C Bye bye! 6.以下文件包含命令中错误的是( )。 A.#include B.#include < math.h > C.#include \ D.#include 'math.h' 7.以下程序的输出结果是( )。 #define M(x,y,z) x * y + z void main(void) {int a=1,b=2, c=3;

printf(\}

A.19 B.12 C.18 D.15 8.以下叙述中正确的是( )。 A.预处理命令行必须位于源文件的开头 B.在源文件的一行上可以有多条预处理命令 C.宏名必须用大写字母表示

D.宏替换不占用程序的运行时间 9.以下程序输出结果为( )。 #define S (x) x+x void main(void) {int a; a=S(2*2); printf(\}

A.2 B.16 C.8 D.报错 10.以下说法错误的是( )。

A.预处理命令是在编译之前完成的工作 B.文件包含命令可以用来处理多文件程序 C.#if后边必须是常量表达式

27

D.#define STU NO 10,是定义一个宏名为STU NO,宏体为10的宏定义 二、填空题

1.在预处理宏定义时,不做 检查,只有在编译已被宏展开后的源程序时才报错。

2.宏名的作用域是从宏定义开始到本文件结束或者到 命令的位置结束。 3.宏展开时,只是将宏名用 做简单替换,而并不关心语法。 4.预处理命令都是以 符号做为命令的开头。

5. 一般情况下,源程序中所有的行都参加编译。如果希望对其中一部分内容只在满足一定条件时才进行编译,这就是 。

第7章 指针

一、选择题

1.指针是一种( )。 A.标识符 B.变量 C.内存地址 D.运算符 2.显示指针变量p中的值,可以使用以下哪个命令( )。 A.printf(\ B.printf(\ C.printf(\ D.printf(\3.为指针变量p输入整型变量i的地址,以下正确的是( )。 A.scanf(\ B.*p=i; C.p=&i; D.*p=&i; 4.若有定义int *p,*q,i;下面操作不正确的是( )。 A.p=*q+i; B.*p=--i; C.i=p-q; D.p=--q+i;

5.若有定义int a[]={0,1,2,3,4},i=2,*p=a;以下能正确表示数组元素的是( )。 A.p+i B.p[5] C.a+i D.*(a+i) 6.以下不能进行++和--运算的是( )。 A.指针 B.数组名 C.int D.long

7.若有定义int *p;float *q;以下强制类型转换不正确的是( )。 A.p=(int *)q; B.q=(float *)p; C.p=(int)*q; D.*q=(float)*p; 8.若有定义int a[]={1,2,0};那么a[a[a[0]]]的值是( )。 A.0 B.1 C.2 D.3 9.若有说明 #define M 20 int n=10;

下面定义不正确的是( )。 A.float s[M]; B.float s[M*10]; C.float s[M+n]; D.float s[M+10];

10.若有定义int a[3][2]={1,2,3,4,5,6};下面能正确访问元素4的是( )。 A.a[2][2] B.*(a+3)

28

C.*(*a+3) D.*(a[2]+1) 11.若有定义char s[10],*p=s;那么下面表达式正确是( )。 A.s=p+s; B.p=s+10; C.s[2]=p[4]; D.p=s[0]; 12.若有定义int (*p)[m];则p是( )。 A.m个元素的整型数组 B.指向m个元素的整型数组的指针 C.m个整型指针的数组 D.指向m个整型指针数组的指针 13.定义整型指针变量p和q,下面正确的命令是( )。 A.int *p,q=NULL; B.int *p,q=NULL, NULL; C.int *p, *q=NULL, NULL; D.int *p, *q=NULL; 14.若有定义int *p,i,j;下面操作不正确的是( )。 A.p=&i+j; B.*p=i+j; C.p=&i; D.p=&i++; 15.下面定义不正确的是( )。 A.float s[2][]={1}; B.float s[][2]={1}; C.float s[2][2]={1}; D.float s[2][2]={{1},{1}}; 16.若有定义int a[]={1,2,3},b[3]={1,2,3};则表达式a==b的结果是( )。 A.不能比较 B.结果为真 C.结果为假 D.结果不确定

17.若有定义int a[][3]={1,2,3,4,5,6};下面能正确访问元素5的是( )。 A.a[4] B.a[0]+4 C.**a+4 D.*(&a[0][0]+4)

18.若有定义int x[5][6],*p=x;下面不表示数组元素x[0][2]的是( )。 A.p[0][2] B.*x+2 C.*(*x+2) D.x[0][2] 二、填空题

1.数组是类型相同的数据序列,通过 来指定要访问的元素。 2.二级指针是存放一级指针的 。

3.空指针名称是 ,表示没有指针的一种状态。 4.函数名和 名可以作为指针常量。 5.数组下标可以是非负的 。

6.二维数组作为函数参数, 维必须给出大小。

7.如果子程序要修改主程序的变量,可以使用 类型的参数。 8.初始化指针变量的工作可有可无,若无则变量值是 。 9.不同类型的指针变量的赋值必须 。

10.二维数组有两个 ,分别用一对 括起。 11.函数指针是函数的 ,通过它可以访问该函数。

12.void是空类型,表示没有数据的类型,void *表示 。 13.数组指针是指 。

14.函数的返回值和 可以是指针。

15.数组作为函数返回类型,实际上不是返回数组值,而是返回 。 16.数组的下标必须在定义的空间之内,若超界C语言编译器 。 17.二维数组名是 的指针常量。

18.整型与实型类型是兼容的,整型和实型指针类型 。

29

三、程序分析题

1.阅读程序,写出运行结果。 #include main()

{ static int arr[]={4,5,6}; int j; for(j=0;j<3;j++)

{ printf(\ } }

2.阅读程序,写出运行结果。 #include main()

{ static int arr[]={4,5,6}; int j, *ptr=arr; for(j=0;j<3;j++)

{ printf(\ } }

四、程序填空题

1.函数fun(int a[],int n,inty)的功能是替换数组a中值为y的元素,n为数组长度。例如,假设数组a中的元素为:1 2 4 1 1 3 1 5,y为8,则替换后,数组a中的元素为8 2 4 8 8 3 8 5。请填空,完成题目要求。

fun(int a[],int n,int y) { int i;

for(i=0;i (1) ;i++) if(a[i]==y) (2) ; }

2.函数fun()的功能是把字符数组a中的字符串按反序存放,例如,字符串“abcd”的输出结果为“dcba”。

#include void fun(char a[]) { char t; int i,j;

for(i=0,j=strlen(a)-1;i

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

main()

{ char s[10];

printf(\ scanf(\

30

fun(s);

printf(\}

3. 函数strcmpstr()的功能是对两个字符串进行比较,从左到右判断并返回相同字符的个数,如“abc”和“ebc”,相同字符个数为0(注意:若第一个都不相等,则以后就无需判断),“deg”和“defgh”,相同字符个数为2,请填空。

int strcmpstr(char *s,char *t) { int i=0;

while(*s&&*t&&*s== (1) ) { (2) ;

s++; t++; }

return i; }

五、程序改错题

1.下面程序的功能是将指定数组中的最大数和最小数进行位置互换。如将下面8个数:5,9,1,4,2,8,0,6变成5,0,1,4,2,8,9,6。程序中,最大数与最小数的互换操作通过函数jh()来实现。

#include void jh(int a[],int n)

{ int t,max,min,end,q; end=n; max=min=0;

for(q=1;q

/********found*******/ { if(a[q]>a[max]) max=q; if(a[q]

/*******found*********/ t=max;max=min;min=t; }

main() { int i;

static int a[8]={5,9,1,4,2,8,0,6}; printf(\

for (i=0;i<8;i++) printf(\ printf(\ jh(a,8);

printf(\ for (i=0;i<8;i++)

printf(\ printf(\}

2.以下程序中,fun函数的功能是把数组中所有元素都向前移动一个位置,最前一个元

31

素移到最后面(假设数组长度为10,整数类型)。

#include void fun(int b[ ],int n) { int x,i;

/********found*******/ x=b[1];

for(i=0;i

/*******found*********/ b[i+1]=b[i]; b[n-1] =x; }

main()

{ int a[10],i;

for (i=0;i<10;i++) scanf(\for (i=0;i<10;i++) printf(\ fun(a,10); printf(\

for (i=0;i<10;i++) printf(\}

第8章 结构体、共用体和枚举类型

一、选择题

1.在访问一个结构体元素前,必须( )。 A.定义结构体类型 B.定义结构体变量 C.定义结构体指针 D.a和b 2.给出语句xxx.yyy.zzz=5;下面( )是正确的。 A.结构体zzz嵌套在结构体yyy中 B.结构体yyy嵌套在结构体xxx中 C.结构体xxx嵌套在结构体yyy中 D.结构体xxx嵌套在结构体zzz中

3.如果temp是结构体变量weather的成员,而且已经执行了语句addweath =&weather;那么( )能代表temp。

A.weather*temp B.(*weather).temp C.addweath.temp D.addweath->temp 4.共用体是由( )的成员组成。 A.必须有相同类型 B.必须包含有指针成员 C.允许在内存占有不同大小的空间 D.必须在内存中占有相同大小的空间 5.定义结构体类型时,下列叙述正确的是( )。 A.系统会按成员大小分配每个空间 B.系统会按最大成员大小分配空间 C.系统不会分配空间 D.以上说法均不正确

6.若有定义 union {long i;

32

char m[3]; } r;

请问执行r.i=0x12345678;后r.m[0]= ( )。 A.0x12 B.0x34 C.0x56 D.0x78 7.若有定义 struct s1 {int x; };

struct s2 {int x; float y;

struct s1 *p2; } r,*p1=&r;

下面正确的是( )。 A.*p1.p2.x=3 B.p1.p2.x=3 C.p1->(*p2).x D.p1->x=3;

8.已知结构体类型变量x的初始化值为{\,合适的结构体定义是( )。 A.struct s {int no; int x,y,z;}; B.struct s {char no[2]; int x,y,z;}; C.struct s {int no; float x,y,z;}; D.struct s {char no[2]; float x,y,z;}; 9.若程序中有定义 struct abc {int x; char y; };

abc s1,s2;

则会发生的情况是( )。 A.编译时会有错误 B.链接时会有错误 C.运行时会有错误 D.程序没有错误 10.关于结构体类型的成员类型,下列说法正确的是( )。 A.成员类型必须是基本数据类型 B.每个成员类型必须为同一种 C.成员不可以定义为自身类型的指针 D.以上说法均不正确 11.若有定义 union s {int w,x,y,z; char c[6]; };

请问执行sizeof(union s)=( )? A.2 B.6 C.8 D.14 12.若有定义 typedef struct { int x; } A[10];

33

A a;

下面正确的是( )。 A.a.x=30; B.a[0].x=30; C.a.A[0].x=30; D.A[0].x=20; 13.若有定义 struct s { int x; char y[6]; } s1;

请问正确的赋值是( )。 A.s1.y=\ B.s1->y=\C.strcpy(s1.y, \); D.s1.strcpy(y, \); 14.以下枚举类型名的定义中正确的是( )。 A.emum a={one,two,three}; B.enum a={one=1,two,three}; C.enum a={one=1;two;three}; D.enum a={one;two;three;}; 15.若有结构体变量定义如下: struct student {int num;

char name[20]; char sex; };

struct student stu; struct student *p; p=&stu;

则下面关于结构体成员引用不正确的是( )。 A.stu.num B.p->num C.(*p).num D.*p.num 二、填空题

1.结构体类型是一种自定义的组合类型,其每个元素称为 。 2.定义结构体类型的变量必须先 ,并且在类型名前加保留字。 3.使用结构体中成员变量必须先写上结构体变量名,中间以 分隔。 4.结构体指针是结构体变量的内存地址,保存该指针的变量称为 。 5.链表是以结构体类型表示链中元素,以 表示链的一种线性数据结构。 6.动态链表是通过动态分配函数分配堆空间建立的,使用完后需要 。 7.共用体类型以union保留字开始,其每个成员分配的空间为 方式。 8.位域类型以 开始,其每个成员定义后要指出分配的位数。 9.结构体类型的定义需要以保留字开始,其保留字为 。

10.定义结构体类型的成员允许嵌套,但不允许递归定义,即 。

11.结构体变量可以作为函数的参数和返回值类型,以 方式传递参数。 12.结构体数组是以 为基类型的数组,下标运算可以访问每个结构体元素。 13.链表的第一元由称为链头的指针指向,最后元则指向 。 14.链表与数组相比,比较适合的操作包括 和 。

15.枚举类型以enum开始,它是一种简单类型,其变量取值于后面的 列表。 16.枚举类型可以像整数一样比较大小和加减运算,其第一个列表元素的值默认

34

为 。 三、程序分析题

1.以下程序运行后,y和z的值是多少。 #include union

{unsigned int x; struct

{unsigned char y; unsigned char z; } a2; } a1; main()

{a1.x=0x5678;

printf(\}

四、程序改错题

1.下列定义无法正确使用,请指出定义中的错误并改正。 struct husband {char name[10]; int age;

struct wife spouse; } x;

struct wife {char name[10]; int age;

struct husband spouse; } y;

第9章 文件

一、选择题

1.下列有关C语言文件的叙述,正确的是( )。

A.文件由ASCII码字符系列组成,C语言只能读/写文本文件 B.文件由二进制数据序列组成,C语言只能读/写二进制文件

C.文件由记录序列组成,可按数据的存储形式分为二进制文件和文本文件 D.文件由数据流形式组成,按数据的存储形式分为二进制文件和文本文件2.下列有关C语言中文件的叙述,错误的是( )。 A.C语言中的文本文件以ASCII码形式存储数据 B.C语言中对二进制位的访问速度比文本文件快 C.C语言中随机读/写方式不适用于文本文件 D.C语言中随机读/写方式不适用于二进制文件 3.C语言中标准输入文件是指( )。 A.键盘 B.显示器 C.打印机 D.硬盘 4.C语言中用于关闭文件的库函数是( )。

35

A.fopen() B.fclose() C.fseek() D.rewind() 5.假设fp为文件指针并已指向了某个文件,在没有遇到文件结束标志时,函数feof(fp)的返回值为( )。

A.0 B.1 C.-1 D.一个非0的值

6.在函数fopen()中使用“a+”方式打开了一个已经存在的文件时,以下叙述正确的是( )。

A.文件打开时,原有文件内容不被删除,位置指针移动到文件末尾,可做追加和读操作 B.文件打开时,原有文件内容不被删除,位置指针移动到文件首,可做重写和读操作 C.文件打开时,原有文件内容被删除,只可做写操作 D.以上三种说法都不正确 7.以下程序的运行结果是( )。 #include void main()

{int i,n; FILE *fp;

if ((fp=fopen(\ {printf(\ return; }

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

fprintf(fp, \ for (i=0;i<5;i++)

{fseek(fp,i*6L,SEEK_SET); fscanf(fp, \ printf(\ }

printf(\ fclose(fp); }

A.1 3 5 7 9 B.2 4 6 8 10 C.3 5 7 9 11 D.1 2 3 4 5 8.下面各选项中能正确实现文件打开操作的是( )。 A.fp=fopen(c:mydir\\info.dat, \B.fp=fopen(c:\\mydir\\info.dat, \ C.fp=fopen(\D.fp=fopen(\9.在C语言中,把文件缓冲区中的数据写入文件的过程称为( )。 A.输入 B.输出 C.修改 D.删除

10.当顺利地执行了文件的关闭命令之后,函数fclose()的返回值是( )。 A.-1 B.1 C.0 D.非零 11.有以下程序: #include main()

36

{FILE *fp; int i,k=4,n=5;

fp=fopen(\ for (i=1;i<4;i++) fprintf(fp, \ fclose(fp);

fp=fopen(\ fscanf(fp, \ printf(\ fclose(fp); }

程序执行后的输出结果是( )。 A.1 2 B.123 5 C.1 23 D.4 5 12.下面4个结论中正确的是( )。

A.在C语言中如果要对文件操作,必须先打开文件 B.在C语言中如果要对文件操作,必须先关闭文件 C.在C语言中对文件的操作实际上没有统一的规定

D.在C语言中如果要对文件操作,即使不打开文件也可以对其进行读/写 13.在C语言中系统定义的标准输出文件是指( )。 A.文本文件 B.二进制文件 C.键盘 D.显示器

14. 若将文件fp的读/写位置指针移动到距离文件头200个字节的位置,正确的操作是( )。

A.fseek(fp,200,0) B.fseek(fp,200,1) C.fseek(fp,200,2) D.ftell(200)

15.已知stu是一个数组,那么语句fread(&stu,3,6,fp);的功能是( )。

A.从fp所指的数据文件中读取6次3个字节的数据,然后存入数组stu中 B.从fp所指的数据文件中读取3次6个字节的数据,然后存入数组stu中

C.从数组stu中读取3次6个字节的数据,然后保存到fp所指的文件中 D.从数组stu中读取6次3个字节的数据,然后保存到fp所指的文件中 16.下列这段程序的功能是( )。 #include main()

{FILE *fout, *fin;

char c, infile[10], outfile[10];

printf(\ scanf(\

printf(\ scanf(\

if ((fin=fopen(infile, \

{printf(\}

if ((fout=fopen(outfile, \

37

{printf(\

}

while((c=fgetc(fin))!=EOF)

fputc(c,fout); fclose(fin); fclose(fout); }

A.分别将两个磁盘文件首尾合并,形成一个新的文件 B.分别显示两个文本文件的内容

C.将一个已知的源文件重命名为另一个新文件 D.把一个文件复制为另一个文件 二、填空题

1.C语言中的文件被看作是一个个的字符(或字节)按照一定的顺序组成的,因此文件又被称为 。

2.C语言中文件的分类有不同的标准。从用户的角度来看,文件可以分为 和 ;从文件的读/写方式来看,文件可以分为 和 ;从文件的编码方式来看,文件可以分为 和 。

3.在MS-DOS方式下,用来显示一个被指定的文本文件的内容使用 命令,用来显示一个或多个被指定文件的目录清单情况用 命令。

4.在C语言定义的多个标准设备文件中, 代表标准输入文件, 代表标准输出文件, 代表错误输出文件, 代表标准辅助设备, 代表标准打印机。

5.专门负责把文件的读/写位置指针重新指回文件首的函数是 ,能够把文件的读/写指针调整到文件中的任意位置的函数是 ,能够获取当前文件的读/写位置字节数的函数是 。

6.C语言系统为每个正在使用的文件在内存中开辟了一个 。 7.C语言对文件操作的一般顺序是 、 和 。

8.在Turbo C中,能在程序中调用一条MS-DOS的内部命令,或者是调用一个可执行文件的库函数是 ,实现文件删除操作的库函数是 ,对文件进行重命名的函数是 。 三、程序分析题

1.C盘下有一个非空的文本文件“test.txt”,其内容如下:“Hello,everyone!” 请问下述程序执行后的输出结果。

#include main()

{FILE *fp; char str[40];

fp=fopen(\ fgets(str,5,fp); printf(\ fclose(fp); }

2.已知三个不同的文本文件file1、file2和file3,它们各自的内容如下: 文件名 文件内容 file1 AAA#

38

file2 BBB# file3 CCC#

假设下面这段源程序对应的文件名为“myprog.c”,经编译和连接后生成的可执行文件名为“myprog.exe”。当在MS-DOS方式下执行下述命令:

myprog file1 file2 file3 则写出屏幕显示的结果。 #include void f(FILE *fp0) {char c;

while((c=fgetc(fp0))!='#')

putchar(c+32); }

main(int argc, char *argv[]) {FILE *fp; int i=1;

while (--argc>0)

{fp=fopen(argv[i++],\ f(fp);

fclose(fp); } }

3.有如下程序,写出执行后的输出结果。 #include main() {FILE *fp;

int i,a[4]={10,20,30,40},b; fp=fopen(\ for (i=0;i<4;i++)

fwrite(&a[i],sizeof(int),1,fp); fclose(fp);

fp=fopen(\

fseek(fp,-2L*sizeof(int),SEEK_END);

/*(使文件位置指针从文件尾向前移动2*sizeof(int)个字节)*/ fread(&b,sizeof(int),1,fp); printf(\ fclose(fp); }

四、程序填空题

1.从键盘上输入某个文本文件的文件名,要求把该文件的内容显示在屏幕上,请将该程序补充完整。

#include main() {FILE *fp;

char c,filename[20];

39

printf(\scanf(\

if ((fp=fopen(filename, \

{printf(\}

while (!feof(fp))

{ (1) ; putchar(c); } }

2.下面程序的功能是从键盘上输入一个字符串,把该字符串中的小写字母转化为大写字母,然后输出到文件“eng.txt”文件中,请根据题目要求将程序补充完整。

#include main() {FILE *fp; char str[100]; int i=0;

if ((fp=fopen(\ (1) ))==NULL) {printf(\}

printf(\gets(str);

while(str[i])

{if (str[i]>= 'a'&& str[i]<= 'z') (2) ; fputc(str[i],fp); i++; }

fclose(fp);

fp=fopen(\ (3) ); fgets(str, (4) ,fp); printf(\fclose(fp); }

3.以下程序用来统计C盘根目录下文本文件“file.txt”中字符的个数,请将程序补充完整。

#include main() {FILE *fp; int count=0;

if ((fp=fopen(\ {printf(\}

while(fgetc(fp)!=EOF) (1) ; 40

fclose(fp);

printf(\}

4.下面的程序将磁盘中一个文件复制到另一个文件中,两个文件名在命令行中给出(假设文件名无误),请将程序补充完整。

#include

main(int argc, char * argv[]) {FILE *fp1,*fp2;

if (argc< (1) ) {printf(\}

fp1=fopen(argv[1], \fp2=fopen(argv[2], \while( (2) ) fputc(fgetc(fp1),fp2); fclose(fp2); fclose(fp1); }

41

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

Top