一、选择题
1.以下叙述中错误的是( A )。
A.使用三种基本结构构成的程序只能解决简单问题 (P28) B.结构化程序由顺序、分支、循环三种基本结构组成(P26) C.C语言是一种结构化程序设计语言
D.结构化程序设计提倡模块化的设计方法(P34) 2.以下叙述正确的是( A )。
A.C语言函数可以嵌套调用,例如:fun(fun(x))
B.C语言程序是由过程和函数组成的(P10 C语言程序是由函数组成的) C.C语言函数不可以单独编译
D.C语言中除了main函数,其他函数不可作为单独文件形式存在 3.有以下程序
#include
{ int a=0, b=0; /* 给a赋值 a=10;
b=20; 给b赋值 */ printf(\输出计算结果 */ }
程序运行后的输出结果是( B )。 A.出错
B.a+b=0
C.a+b=10
D.a+b=30
4.以下叙述中正确的是( A )。
A.每个后缀为.C的C语言源程序都可以单独进行编译
B.每个后缀为.C的C语言源程序都应该包含一个main函数(若在一个项目中,后缀为.C的C语言源可以不包含main)
C.在C语言程序中,main函数必须放在其他函数的最前面 D.在C语言程序中,只有main函数才可单独进行编译
5.按照C语言规定的用户标识符命名规则,不能出现在标识符中的是( D )。 A.大写字母
B.下划线
C.数字字符
D.连接符
6.以下选项中能表示合法常量的是( D )。(p39)
A.1,200 7.有以下程序
B.1.5E2.0 C.0118 D.\
#include
int sum, pad, pAd; sum = pad = 4;
pAd = ++sum, pAd++, ++pad; printf(\ }
程序的输出结果是( B )。 A.4
8.有以下程序 #include
a = (int)(-1.65*3); printf(\}
程序的运行结果是( B )。(直接取整数部分) A.-3
B.-4
C.-5
D.结果不确定
B.5
C.6
D.7
9.关于\条件表达式)循环体\,以下叙述正确的是( B )。 A.循环体的执行次数总是比条件表达式的执行次数多一次 B.条件表达式的执行次数总是比循环体的执行次数多一次 C.条件表达式的执行次数与循环体的执行次数一样 D.条件表达式的执行次数与循环体的执行次数无关
10.若有定义语句:int year=2009, *p=&year ;以下不能使变量year中的值增至2010的语句是( B )。 A.(*p)++; 11.有以下程序
#include
B.*p++;
C.++(*p);
D. *p+=1;
int fun( int a, int b) { return a+b; } main()
{ int x=6, y=7, z=8, r ; r = fun ( fun(x,y), z-- ); printf (\ }
程序运行后的输出结果是( A )。 A. 21
B. 15
C. 20
D. 31
12.在以下给出的表达式中,与while(E)中的(E)不等价的表达式是( B )。 A. (E>0||E<0)
B. (E==0)
C. (! E==0)
D. (E!=0)
13. 由以下while构成的循环,循环体执行的次数是( D )。 int k=1;
while ( k=2 ) k++;//请注意:若改为while ( k==2 ),则如何?(B) A. 有语法错,不能执行 C. 执行一次 14. 若有以下定义 int x[10], *pt=x;
则对x数组元素的正确引用是( D )。(p236) A. pt+3 15. 有以下程序
#include
{ int c[6]={10,20,30,40,50,60}, *p,*s; p = c; s = &c[5]; printf(\ }
程序运行后的输出结果是( A )。 A. 5
B. 4
C. 20
D. 16
B. *&x[10]
C. *(pt+10)
D. *(x+3)
B. 一次也不执行 D. 无限次
16. 以下叙述中正确的是( B )。 A.一条语句只能定义一个数组
B.每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元 C.数组说明符的一对方括号中只能使用整型常量,而不能使用表达式 D.在引用数组元素时,下标表达式可以使用浮点数(整型) 17. 以下叙述中正确的是( D )。 A.数组下标的下限是1(0)
B.数组下标的下限由数组中第一个非零元素的位置决定 C.数组下标的下限由数组中第一个被赋值元素的位置决定 D.char c1, c2, *c3, c4[40];是合法的变量定义语句 18. 有如下程序 #include
char name[10] = {'S', 'T', 'R', 'I', 'N', 'G'}; name[3] = 'E'; name[5] = 0; printf(\}
程序运行后的输出结果是( A )。 A. STREN
B. STRIEG
C. STRENG
19. 下列定义数组的语句中,正确的是( A )。 A. #define N 10
B. int N=10;int x[N]; int x[N]; C. int x[0..10]; D. int x[ ];
20. 设有定义
double a[10] ,*s=a;
以下能够代表数组元素a[3]的是( B )。 A. (*s)[3] B. *(s+3)
C. *s[3]
21. 有以下程序 #include
{ char str[12] = { 's','t' , 'r' , 'i' , 'n' , 'g'} ;
D. STREN0
D. *s+3
printf(\}
程序运行后的输出结果是( D )。 A. 12
B. 11
C. 7
D.6
22.设有函数定义:void sub(int k,char ch){ ? } 则以下对函数sub的调用语句中,正确的是 ( A )。 A. sub(1,97);
B. sub(2,'97');
C. n=sub(3,'a');
D. sub(4,\
23.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( A )。 A.函数的形参和实参分别占用不同的存储单元 B.形参只是形式上的存在,不占用具体存储单元 C.同名的实参和形参占同一存储单元
D.函数的实参和其对应的形参共占同一存储单元 24.以下叙述中错误的是( D )。 A.C程序必须由一个或一个以上的函数组成 B.函数调用可以作为一个独立的语句存在 C.若函数有返回值,必须通过return语句返回 D.函数形参的值也可以传回给对应的实参
25.以下关于C语言函数参数传递方式的叙述正确的是( A )。 A.数据只能从实参单向传递给形参 B.数据可以在实参和形参之间双向传递
C.数据只能从形参单向传递给实参(实参可以传递形参但形参不可以传递实参)
D.C语言的函数参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用
26.以下关于函数的叙述中正确的是( A )。 A.函数形参的类型与返回值的类型无关 B.函数必须要有形参 C.函数必须要有返回值 D.函数调用必须传递实参
27..若有说明和语句:char str[]=\*p; p=str;,则此时*(p+5)中的值为( A )。 A. '\\0'
B. 'o'
C. 'o'的地址
D. 不确定的值
28.以下选项中的编译预处理命令行,正确的是( A )。
A. #define PI 3.14 C. #DEFINE TRUE 29.若程序中有宏定义行: #define N 100
则以下叙述中正确的是( B )。
B. ##define eps 0.001 D. #define int INT
A. 宏定义行中定义了标识符N的值为整数100
B. 在编译程序对C源程序进行预处理时用100替换标识符N C. 上述宏定义行实现将100赋给标示符N D. 在运行时用100替换标识符N 30.设有定义: struct complex
{int real,unreal;} data1={1,8},data2; 则以下赋值语句中错误的是( A )。 A. data2=(2,6); B. data2=data1; C. data2.real=data1.real;
D. data2.real=data1.unreal;
31.下面结构体的定义语句中,错误的是( A )。
A. struct ord {int x;int y;int z;} struct ord a; B. struct ord {int x;int y;int z;}; struct ord a; C. struct ord {int x;int y;int z;} a; D. struct {int x;int y;int z;} a;
32.设有定义:struct { int n; float x;} s[2],m[2]={{10,2.8},{0,0.0}}; 则以下赋值语句中正确的是( A )。 A. s[0]=m[1];
B. s=m;
C. s.n=m.n;
D. s[2].x=m[2].x;
33.下列关系表达式中,结果为\假\的是( D )。 A. 3 <= 4 4”为真为1)
34.若变量已正确定义,以下选项中非法的表达式是( D )。 A. a!=4||'b'
B. 'A' + 32
C. 'a' % 4
D. 'a'=1/2*(x=y=20,x*3)
B. (3 < 4) == 1
C. (3 + 4) > 6
D. (3 != 4) > 2 (“3 !=
34.若a是数值类型,则逻辑表达式 (a==1)||(a!=1)的值是( A )。 A. 1 确定
B. 0
C. 2
D. 不知道a的值,不能
35.下关于逻辑运算符两侧运算对象的叙述中正确的是( A )。 A) 可以是任意合法的表达式 B) 只能是整数0或非0整数 C) 可以是结构体类型的数据 D) 只能是整数0或1 36.有以下程序 #include
c= 13&5; d=10&&5; printf(\}
程序的运行结果是( A )。 A) 5,1 B) 1,1
C) 18,1
37.有以下程序
#include
{ int x=35, B; char z='B' ; B = (( x ) && ( z <'b' )); printf(\ }
程序运行后的输出结果是( A )。 A) 1 B) 0
C) 35
37.有以下程序
#include
{ int a[ ]={ 10,20,30,40 }, *p=a, i ; for( i=0; i<=3; i++ ) { a[i] = *p; p++; } printf(\ }
程序运行后的输出结果是( C )
D) 13,1
D) 66
A. 10 38.有以下程序 #include
B. 20 C. 30 D. 40
int a[10] = { 11,12,13,14,15,16,17,18,19,20 },*p=a,i=9 ; printf( \}
程序运行后的输出结果是( A )。 A. 11,20,20 B. 12,20,20
39.有以下程序 #include
int *p, x=100; p=&x; x=*p+10; printf(\}
程序运行后的输出结果是( A )。 A. 110 B. 120
40.有如下程序 #include
int a = 0, *ptr; ptr = &a; *ptr = 3; a = (*ptr) ++;
printf(\}
程序运行后的输出结果是( A )。
C. 11,19,19
C. 100
D. 12,19,20
D. 90
A. 4,4 B. 0,1 C. 1,4 D. 0,4
41. 以下叙述中正确的是 C ___ 。 A) break语句只能用于switch 语句中
B) continue语句的作用是:使程序的执行流程跳出包含它的所有循环 C) break语句只能用在循环体内和switch语句体内 D) 在循环体内使用break语句和continue 语句的作用相同
42. 若有说明int a[][3]={1,2,3,4,5,6,7}; 则a数组第一维的大小是 B ___ 。 A) 2 B) 3 C) 4
D) 无确定值
43. 有如下程序, 该程序段的输出结果是 B ___ 。 void main(void) { int n=5; while(n>2)
{
n--;
printf(“%d”,n); }
} A) 543 B)432 C)4321 D)5432
44.下列四种数组定义,合法的数组定义是 A ___ 。 A) char a[ ]=\
C) char a=\
45.若已定义x和y为实型变量,则表达式x=1, y=x+3/2的值是( D )。
A) 1
B) 2
C) 2.0 D) 2.5
46.下列语句中,正确的是 D ___ 。
A) #define PI=3.14159 B) include “stdio.h” C) define M 3 D) #define PI 3.14159 47.判断字符型变量 ch是否为大写英文字母的表达式为 B ___ 。
A) ‘A’<=ch<=‘Z’
B) ch>=‘A’&& ch<=‘Z’
C) ch>‘a’&& ch<=‘z’ D) ch>=‘A’|| ch<=‘Z’
48.设x为整型变量, p是指向整型的指针变量, 则下列赋值表达式正确的是 A ___。
A) p=&x B) p=x C) *p=&x D) *p=*x
49.设有定义:int k=3,*p=&k; 则表达式 *p的值是 ____D____。
A)1 B) 0 C) 2 D) 3
50. 要将字符串str2复制到字符串str1中,应使用的函数是 A ___ 。
A) strcpy(str1,str2); C) strcat(str1,str2); 51. 以下叙述错误的是 B D ___ 。
A) 一个C源程序可由一个或多个函数组成 B) 一个C源程序必须包含一个main函数 C) C程序的基本组成单位是函数
D) 在C程序中,注释说明只能位于一条语句的后面
52.函数调用语句func ((exp1,exp2),(exp3,exp4,exp5));中,实参的个数为 B___ 。
A) 1
B) 2
C) 4
D) 5
B) strcpy(str2,str1); D) strcmp(str2,str1);
53.下面字符数组初始化语句正确且与语句char c[]=\;等价的是 B_ ___ 。
A) char c[]={'s','t','r’,'i’,'n','g'}; B) char c[]={'s','t','r’,'i’,'n','g','\\0'}; C) char c[]={'string'}; D) char c[]='string';
54.运行下面程序段后,i的值是 C___ 。
int i=10; while(i--); printf(\,i); A) 0
B) 1
C) -1
D) 10
55.设 int i=4;则表达式(i= =2)?i:i-1的值为 C ___ 。
A) 1
B) 2
C) 3
D) 4
56.下面不正确的字符串常量是 A ___ 。
A) 'ABC'
B) \
C) \
D) \
57.若定义int d, c=1;则执行下面的语句后,d的值为 A ___ 。
switch(--c)
{ case 0:d=0;break; case 1: case 2:d=1; case 3:
case 4:d=2;break; default:d=3;}
A) 0 B) 1 C) 2 D) 3
58.以下能正确定义变量a,b和c并为它们赋值的语句是 D ___ 。
A) int a=5; b=5; c=5; C) a=5,b=5,c=5;
B) int a,b,c=5;
D) int a=5, b=5, c=5;
59.当定义一个结构体变量时,系统为它分配的内存空间是 D ___ 。
A) 结构中一个成员所需的内存容量 B) 结构中第一个成员所需的内存容量 C) 结构体中占内存容量最大者所需的容量 D) 结构中各成员所需内存容量之和 60.有下列程序段落:
int i,a[5]; for(i=0;i<5;i++)
scanf(“%d”,&a[i]);
若要使数组元素的值分别为1,2,3,4,5,应从键盘输入 _____B____。 A) 1,2,3,4,5↙ B) 1 2 3 4 5↙ C) 12345↙ D) 1;2;3;4;5↙
二、填空题
1.算法是 为解决一个问题而采取的方法和步骤 。
2.C语言的数据类型分为 基本数据类型 和构造类型两大类。 3.程序的三种控制结构是:顺序结构、 选择结构 和循环结构。
4.在循环语句中,break语句的作用是 提前结束循环语句的执行 。 5.C语言规定,函数返回值的类型是由 所定义函数的类型决定的。 6.若用数组名作为函数调用的实参,则传递给形参的是数组的 首地址。 7.按照作用范围可以把变量分为局部变量和 全局变量 。
8.在C语言中,实参和与其对应的形参 各占独立的存储单元 9. 某函数直接或间接调用自身称为该函数的 递归调用 。
10.表达式(int)((double)9/2)-9%2的值是____3____________。//后有详解
11.C语言规定,二维数组元素在内存中是按 行优先 的顺序存储的。
12.设x为int型变量,请写出一个关系表达式 x%7==0&&x%3==0 ,用以判断x同时为3和7的倍数时,关系表达式的值为真。
13.设y为int型变量,请写出描述”y是奇数”的表达式y%2!=0。
14.若定义 int b[7],*p=b; 则p+3表示 &b[3] 。 15.计算机能直接执行的程序是 机器语言程序 。 16.C语言主要是借助 函数 来实现程序模块化
17.C语言的函数由两部分构成,分别是 函数首部 和函数体。
18.C语言本身不提供输入输出语句,输入和输出操作是由 库函数 来完成的。
19.按照C语言规定的用户标识符命名规则,构成C标识符的字符只能是 字母,数字,下划线 三类字符。
20.C语言规定,标识符的第一个字符只能 字母开头 。
21.按照作用范围,可以把C语言的变量分为 全局变量 和局部变量。
22.编译时分配存储单元,作用范围结束后还占据原来存储单元的变量,是用关F键字 static 定义的。
23.C语言规定,二维数组元素在内存中是按照__ 先行后列 (或称为行优先)的顺序存储的。
24.若有定义int a[2][3]={{2},{3}};则值为3的数组元素是 a[1][0] 。 25.若有定义语句:int x=5;,则表达式x+=x-=x*x的值为 -40 。//后有详解
?b?b2?4ac26.将数学表达式写成C语言表达式,为 (-b+sqrt(b*b-4*a*c))/(2*a) 。
2a27.存放其他变量地址的变量称为 指针变量 。
28.若有说明int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[2];,则*(p+4)的值是 7 。//后有详解
29.如果函数先被调用,后被定义,应该在调用之前进行 原型声明 。 30.C语言中,按变量地址访问变量的方式称为 直接访问 。
31.C语言中,按照指针变量访问其他变量的方式称为 间接访问 。
32.函数调用语句:fun( ( exp1, exp2 ), ( exp1, exp2, exp3) ); 含有的实参个数是 2 。 //后有详解
33.若定义函数时未指定返回值的数据类型,则C语言规定:函数返回值的类型为 int 。
34.若要求从键盘读入含有空格字符的字符串,应使用函数 gets() 。 35.C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,称为 结构体类型 ,在其他一些高级语言中称为“记录”。
36.使几个不同的变量共享同一段内存的结构称为 共用体 结构。 37.若有联合数据类型定义如下: union { int a;
int b; }x,y;
执行语句 x.a=5;x.b=x.b+3;y.a=x.a*5;后,则y.b的值为 40 。
38.设文件指针fp已定义,执行语句fp=fopen(\后,对文本文件file操作是 只写 。
39.在C语言中调用 fopen() 就可把程序中要读、写的文件与磁盘上实际的数据文件联系起来。
40.当程序中对fp指针指向的文件的所有写操作完成之后,必须调用 fcolse() 函数关闭文件。
41.若程序中使用了函数sqrt(),则必须包含的头文件名为_____math.h______。 42.C语言源程序中主函数名由系统规定为 main ,程序员是不能改变的。 43.若定义 int b[5],*p=b; 则p++表示 &b[0] 。
44.按照作用范围可以把变量分为全局变量和 局部变量 。
45.按照存储类别可以把变量分为自动存储类别的变量和 静态,外部,寄存器四种存储类别。
46.程序的三种控制结构是: 顺序结构 、 选择结构 和 循环结构 。 47.若用数组名作为函数调用的实参,则传递给形参的是数组的 首地址 。 48.一个函数直接或间接调用自身称为 递归调用 。 49.在C语言中,用零来表示逻辑“假”,用 非零 来表示逻辑“真”。 50.循环的嵌套是指 一个循环语句中又包含另一个完整循环语句 。 51.C语言规定,程序中用到的变量必须“ 先说明,后使用 ”。 52. C语言规定,函数返回值的类型是由 定义函数声明类型 决定的。 53.若定义 int b[7],*p=b; 则p+3表示 数组b中第四个函数的地址 。 54.指针变量是 存放其他变量地址的变量 。
55.调用函数时,在函数名后面列出的参数称为 实参 。
56.定义函数时,在函数名后面的圆括号中出现的参数称为 形参 。 57.C源程序中,凡是行首以#标识的控制行都是 编译预处理指令 。
三、读程序写结果 //后有详解
1.以下程序运行后,如果输入的是1 2 3 4 5 0<回车>,输出结果为: 24689 #include
scanf(“%d”,&s);
while(s>0) {switch(s)
{default :printf(“%d”,s+4);break;
case 1:printf(“%d”,s+1); break; case 2:printf(“%d”,s+2);break; case 3:printf(“%d”,s+3); }
scanf(“%d”,&s); } }
2. 写出下列程序结果: n=9
#include
char s[]=\int i,n=0;
for(i=0;s[i]!=’\\0’;i++) if(s[i]>='0'&&s[i]<='9') n++; printf(\}
3.有以下程序程序的执行结果是: CdEfGh
#include
{ char b,c; int i;
b='C';c='c'; for(i=0;i<6;i++) {if(!(i%2)) putchar(i+b); else
putchar(i+c);} printf(\
}
4.以下程序执行后输出结果是: k=11,s=16
#include
for(k=2, s=1; k<20; k+=3)
if (s>k) break ; else s+=k;
printf(\}
5.运行下面的程序段,输出结果是 d56def 。 int i=0;
char s1[10]=\; strcat(s1,s2); while (s1[i++]!='\\0') s2[i]=s1[i]; puts(s2);
6.运行下面的程序段,输出结果是 2, 3, 1 。 #include
{int x, y, z; x=y=1;
z=x++,y++,++y;
printf(\,%d,%d\\n\,x,y,z); }
7.运行下面的程序段,输出结果是 1,0,0,1 。 #include
{ int a=0,b=0,c=0,d=0; (a++ && b++) ? c++ : d++; printf(\}
8.运行下面的程序段,输出结果是 0,-1 。 #include
{ int a=-1, b=-1; while(++a) ++b;
printf(\}
9.运行下面的程序段,输出结果是 -1 。 #include
printf(\ }
程序执行后的输出结果是( A ) A. y=-1 B. y=0
C. y=1
D. while构成无限循环
10.运行下面的程序段,输出结果是 7.5 。 #include
printf(\ return 0; }
11.运行下面的程序段,输出结果是 6,6,1 。 #include
{ int a=6, b=0, c=0; for ( ;a&&(b==0); )
{ b += a; a -= c++; } printf(\ }
则程序的输出结果是 A) 5,6,0
B) 6,0,0
C) 6,6,1
D) 5,6,1
12.运行下面的程序段,输出结果是 1,3,3 。 #include
{ int a=1,b=2,c=3,d=0; if (a==1 && b++==2) if (b!=2||c--!=3)
printf(\
else printf(\ else printf(\}
13.运行下面的程序段,输出结果是 2,2,2,4 。 #include
{ int a=1,b=2,c=3,d=4; if ((a=2) || (b=1)) c=2; if ((c==3) && (d=-1)) a=5; printf(\ }
14.运行下面的程序段,输出结果是 5,1,2,-1 。 #include
{ int a=1,b=2,c=3,d=4; if ((a=2) && (b=1)) c=2; if ((c==3) || (d=-1)) a=5; printf(\
}
15.以下程序运行后的输出结果是: 817 。
func(a,b) int a,b;
{ static int m=0,i =2; i+=m+1;m=i+a+b;return(m); } main()
{ int k=4,m=1,p;
p=func(k,m); printf(“%d”,p); p=func(k,m); printf(“%d\\n”,p); }
16. 设从键盘上输入 Hello World! 下面程序的运行结果为 hello world ! 。
#include
for( i=0; ss[i]!='\\0'; i++)
if( ss[i]>='A' && ss[i]<='Z') ss[i] = ss[i]+32 ; puts(ss);
} 17.下面程序的运行结果为 6, 45
2, 98
#include
{ int a[10]={78,89,98,66,54,76,45,82,62,95 }; int ka, ki, j; ka = ki = 0; for(j=1; j<10; j++) {