A.不确定的值 B.3 C.2 答案:A30
D.1 下面程序的运行结果是:( )。 main() { int x[]={22,33,44,55,66,77,88}; int k,y=0; for (k=1;k<=4;k++) if (x[k]%2==1) y++; printf(\"%d\} A.0 B.1 C.2 D.3 答案:C
下面程序的运行结果是:( )。 main() { int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0; for(i=1;i<3;i++) for(j=0;jA.14 B.19 C.20 D.21 答案:A
下面程序的运行结果是:( )。 main() { char ch[7]= {\"12ab56\ int i,s=0; for(i=0;ch[i]>='0'&&ch[i]<='9';i+=2) s=10*s+ch[i]-'0'; printf(\"%d\} A.1 B.1256 C.12ab56 D.l2 答案:A
下面程序的运行结果是:( )。 main() { char s[]=\"ab1c2d4e\"; int i; i=0; while(s[i]!='\\0') { if(s[i]>='a'&&s[i]<='z') printf(\"%c\
31
i++; } }
A.ab B.ab1c2d4e C.abcde D.a 答案:C
下面程序的运行结果是:( )。 main() { int i=0,n=0; char s[10]=\"298h01\"; for(i=0;s[i]!='\\0';i++) if(s[i]<='9'&&s[i]>='0') n=n*10+(s[i]-'0'); else break; printf(\"%d\\n\ }
A.298h01 B.29801 C.01 D.298 答案:D
二、判断题:
( F )在程序中可以对数值数组中的数据进行整体使用。
( T )如果strcmp(s1,s2)的返回值为一个负数,则表明字符串s1一定小于字符串s2。 ( F )字符数组的输出不能一次性的整体输出。 ( T )用scanf函数输入的字符串不可以带空格。 ( T )用gets函数输入的字符串可以带空格。
( F )实现两个字符串的复制可以使用str1=str2;语句。 ( T )使用strcpy函数可以实现两个字符串的复制。 ( T )使用strcat函数可以实现两个字符串的连接。
( F )使用strlen函数可以求出一个字符串的实际长度(包含‘\\0’字符)。 ( F )如有定义char a[]=”student”;则数组a的长度为7。
( F )如有定义char a[20];则可以通过a=“I am a boy”;给a赋值。 ( T )如有定义int a[2][3];则数组a的最后一个元素为a[1][2]。
( T )如有定义int a[3][4]={0}; 则数组a的所有元素初值均为0。
( F )C语言中数组名实质上是数组的首地址,是一个变量地址,可对其进行赋值。 ( F )构成数组的各个元素可以有不同的数据类型。
( F )若有说明:int a[10];,则可以a[10]引用数组a的第10个元素。
( T )引用数组元素时,其数组下标的数据类型允许的是:整型常量或整型表达式。 ( T )若有int a[10]={6,7,8,9,10};,则是将5个初值依次赋给a[0]至a[4]。
( T )一个一维数组,它的每一个元素也是类型相同的一维数组时,便构成二维数组。 ( T )在C语言中,允许用字符串来直接初始化字符数组。 ( F )字符数组的输出不能一次性的整体输出。
( F )使用strcat函数可以实现两个字符串的复制。 三、多选题
32
以下关于数组的描述中,正确的有:( )。 在定义数组时,有时可以将该数组的维数省略
数组名实质上是数组的首地址,是一个变量地址,可对其进行赋值 构成数组的各个元素可以有不同的数据类型
有定义:int a[3]; 则定义了a[0]、a[1]、a[2]三个数组元素 在程序中可以对数值数组中的数据进行整体使用 答案:AD
以下关于数组的描述中,错误的有:( )。
引用数组元素时,其数组下标的数据类型允许的是:整型常量或整型表达式 可以通过数组名来整体引用一个数组
在程序中可以对数值数组中的数据进行整体使用
若有说明:int a[10];,则可以a[10]引用数组a的第9个元素 若有说明:int a[10];,则可以a[10]引用数组a的第10个元素 答案:BCDE
以下关于数组的描述中,错误的有:( )。
可以通过如下语句来完成对一个数组的输入:int a[10]; scanf(\"%d\可以通过如下语句来完成对一个数组的输入:int a[10]; scanf(\"%d\若有int a[10]={6,7,8,9,10};,则是将5个初值依次赋给a[0]至a[4] 数组元素可以像普通变量一样使用 int a[9]; 则数组a的下标范围是1-9 答案:ABE
以下关于数组的描述中,正确的有:( )。
数组名实质上是数组的首地址,是一个常量,不能对其赋值 在定义数组时,有时可以将该数组的维数省略
一个一维数组,它的每一个元素也是类型相同的一维数组时,便构成二维数组 如有定义int a[3][4]={0}; 则数组a的所有元素初值均为0 可以通过数组名来整体引用一个数组 答案:ABCD
以下关于数组的描述中,错误的有:( )。
如有定义int a[2][3];则数组a的最后一个元素为a[1][2]
一个一维数组,它的每一个元素也是类型相同的一维数组时,便构成二维数组 若有说明:static int a[3][3]; 那么数组a中每个元素初值为0 在定义二维数组时,可以将该数组的两个维数全部省略 如有定义char a[20]; 则可以通过a=\"I am a boy\"; 给a赋值 答案:DE
若有说明:int a[][4]={0,0};,则下面正确的叙述有:( )。 数组a的每个元素都可得到初值0 二维数组a的第一维大小为1
因为二维数组a中初值的个数不能被第二维大小的值整除,则第一维的大小等于所得商数再加1,故数组a的行数为1
只有元素a[0][0]和a[0][1]可得到初值0,其余元素均得不到初值 只有元素a[1][1]和a[1][2]可得到初值0,其余元素均得不到初值 答案:ABC
以下关于数组的描述中,正确的有:( )。
33
若有定义char a[]=\"hello\";,则数组a的长度为6
有定义char a[3]; 则定义了a[1]、a[2]、a[3]三个数组元素 构成字符数组的各个元素必须是字符类型的数据 可以通过数组名来整体引用一个数组
设有数组定义char array [ ]=\"China\"; 则数组array所占的空间为5个字节 答案:AC
以下关于数组的描述中,正确的有:( )。
在C语言中,允许用字符串来直接初始化字符数组
若有定义char a[20];,则可以通过a=\"I am a boy\";给a赋值 若有char a[10]={1,2,3};,则是将3个初值依次赋给a[1]至a[3] 构成字符数组的各个元素必须是字符类型的数据
数组名实质上是数组的首地址,是一个常量,不能对其赋值 答案:ADE
以下关于数组的描述中,错误的有:( )。 字符数组的输出不能一次性的整体输出
若有char a[10]={1,2,3};,则是将3个初值依次赋给a[0]至a[2] 构成字符数组的各个元素可以是不同数据类型的元素 构成字符数组的各个元素必须是字符类型的数据 若有定义char b[]=\"hello\";,则数组b的长度为6 答案:AC
下列语句中,正确的有:( )。 char str[5]=\"hello\";
char str[]={'h','e','l','l','o','\\0'}; char str[5]={\"hi\char str[100]=\"\"; char str[3]=\"this\"; 答案:BCD
函数调用strcat(strcpy(str1,str2),str3)的功能,以下说法错误的有:( )。 将串str1复制到串str2中后在连接到串str3之后 将串str1连接到串str2之后再复制到串str3之后
将串str2复制到串str1中后再将串str3连接到串str1之后 将串str2连接到串str1中后再将串str1复制到串str3中 将串str2连接到串str1中后再将串str3复制到串str1中 答案:ABDE
以下关于数组的描述中,正确的有:( )。 在定义数组时,有时可以将该数组的维数省略 数组元素可以像普通变量一样使用
若有int a[10]={6,7,8,9,10};,则是将5个初值依次赋给a[0]至a[4] 如有定义char a[]=\"student\"; 则数组a的长度为7
若有定义double x[3][5]; 则x数组中行下标的下限为0,列小标的上限为4 答案:ABCE
定义了一维int型数组a[10]后,下面正确的引用有:( )。 a[0]=1; a[10]=2;
34
a[0]=5*2;
a[1]=a[2]*a[0]; a[2]=a[1]+a[0]; 答案:ACDE
第8章 函 数 一、选择题
若调用一个函数,且此函数中没有RERUrn语句,则关于该函数正确的说法是:( ) 没有返回值
返回若干个系统默认值
能返回一个用户所希望的函数值 返回一个不确定的值 答案:D
在c语言中以下不正确的说法是:( ) 实参可以是常量、变量、或表达式 形参可以是常量、变量或表达式 实参可以为任意类型
形参应与其对应的实参类型一致 答案:B
以下程序有语法性错误,有关错误原因的正确说法是:( ) main()
{ int G=5,k; void prt_char(); ……
k=prt_char(G); …… }
语句void prt_char();有错,它是函数调用语句,不能用void说明 变量名不能使用大写字母
函数说明和函数调用语句之间有矛盾 函数名不能使用下划线 答案:C
以下正确的说法是:( )
函数的定义可以嵌套,但函数的调用不可以嵌套 函数的定义不可以嵌套,但函数的调用可嵌套 函数的定义和调用均不可以嵌套 函数的定义和调用均可以嵌套 答案:B
若使用一个数组名作函数实参,则以下正确的说法是:( ) 必须在主调函数中说明此数组的大小 实参数组类型与形参数组类型可以不匹配 在被调用函数中,不需要考虑形参数组的大小 实参数组名与形参数组名必须一致
35
答案:A
在一个函数内部定义的变量是:( )
A、 简单变量 B、 局部变量 C、 全局变量 D、 标准变量 答案:B
若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是:( ) A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中
D)函数调用可以作为一个函数的形参 答案:D
已定义以下函数 fun(int*p) { return *p; }
该函数的返回值是:( )
A)不确定的值 B)形参p中存放的值 C)形参p所指存储单元中的值 D)形参p的地址值 答案:C
以下所列的各函数首部中,正确的是:( ) A、 void play(var :Integer,var b:Integer) B、 void play(int a,b) C、 void play(int a,int b)
D、 Sub play(a as integer,b as integer) 答案:C
当调用函数时,实参是一个数组名,则向函数传送的是:( ) A、 数组的长度 B、 数组的首地址
C、 数组每一个元素的地址 D、 数组每个元素中的值 答案:B
在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是:( A、 地址传递 B、 单向值传递
C、 由实参传给形参,再由形参传回实参 D、 传递方式由用户指定 答案:B
以下函数值的类型是:( ) fun ( float x ) { float y; y= 3*x-4; return y; }
A、 int B、 不确定 C、 void D、 float 答案:A
下列函数的功能是:( ) int fun1(chat* x) { char *y=x; while(*y++); return(y-x-1);
36
) }
A)求字符串的长度 B、比较两个字符串的大小
C、将字符串X复制到字符串Y D、将字符串X连接到字符串Y后面 答案:A
下面程序的输出结果是:( ) void prty(int * x)
{ printf(\"%d\\n\ main()
{ int a=25; prtv(&a); }
A、23 B、24 C、25 D、26 答案:D
以下对C语言函数的有关描述中,正确的是:( )
A、只能把实参的值传送给形参,形参的值不能传送给实参 B、C函数既可以嵌套定义又可以递归调用 C、函数必须有返回值,否则不能使用函数 D、C程序中所有函数都可以嵌套调用 答案:A
以下叙述中不正确的是:( )
A)在C中,函数体中定义的动态变量可以赋初值,每调用一次,赋一次初值. B、 在C中,函数体中定义的静态变量可以赋初值,每调用一次,赋一次初值. C、 在C中,局部变量的隐含类别是自动存储类别.
D)在C中,在调用函数时,实在参数和对应形参在类型上只需赋值兼容. 答案:B
以下叙述中不正确的是:( )
在不同的函数中可以使用相同名字的变量 函数中的形式参数是局部变量
在一个函数内定义的变量只在本函数范围内有效
D)在一个函数内的复合语句中定义的变量在本函数范围内有效 答案:D 有以下程序
void fun (int a,int b,int c) { a=456; b=567; c=678;} main()
{ int x=10, y=20,z=30; fun (x,y,z);
printf(\"%d,/%d,%d\\n\ }
输出结果是:( )
A、30,20,10 B、10,20,30 C、456,567,678 D、678,567,456 答案:B
有以下程序 ( )
int fun(int x,int y,int *cp,int *dp) { *cp=x+y; *dp=x-y; } main()
37
{ int a, b, c, d; a=30; b=50; fun(a,b,&c,&d);
printf(\"%d,%d\\n\ }
输出结果是:( )
A、50,30 B、30,J50 C、80,-20 D、80,20 答案:C
下列程序执行后的输出结果是 ( )。 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”,b[0]); }
A、 6 B、 7 C、 8 答案:A
一个完整的可运行的C源程序中,( )。 A、 可以有一个或多个函数 B、 必须有且仅有一个主函数 C、 可以没有主函数
D、 必须有主函数和其他函数 答案:B
下述函数定义形式正确的是( )。 A、 int f(int x; int y) B、 int f(int x,y) C、 int f(int x, int y) D、 int f(x,y: int) 答案:C
关于函数参数,说法正确的是( )。
A、 实参与其对应的形参各自占用独立的内存单元 B、 实参与其对应的形参共同占用一个内存单元
C、 只有当实参和形参同名时才占用同一个内存单元 D、 形参是虚拟的,不占用内存单元 答案:A
一个函数的返回值由( )确定。 A、 return语句中的表达式 B、 调用函数的类型 C、 系统默认的类型 D、 被调用函数的类型 答案:D
以下叙述中正确的是( )。
A、 C语言程序总是从第一个定义的函数开始执行
B、 在C语言程序中,要调用的函数必须在main()函数中定义 C、 C语言程序总是从main()函数开始执行
D、 C语言程序中的main()函数必须放在程序的开始部分 答案:C
38
D、 9 以下函数 fff(float x) { printf(“%d\\n”,x*x); }
的类型是( )。
A、 与参数x的类型相同 B、 void类型 C、 int类型 D、 无法确定 答案:C
以下对C语言函数的描述中,正确的是( )。 A、 C程序由一个或一个以上的函数组成 B、 C函数既可以嵌套定义又可以递归调用 C、 函数必须有返回值,否则不能使用函数
D、 C程序中调用关系的所有函数必须放在同一个程序文件中 答案:A
以下叙述中不正确的是( )。
A、 在C语言中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B、 在C的函数中,最好使用全局变量
C、 在C语言中,形式参数只是局限于所在函数 D、 在C语言中,函数名的存储类别为外部 答案:B
在一个源文件中定义的外部变量的作用域为( )。 A、 本文件的全部范围 B、 本程序的全部范围 C、 本函数的全部范围
D、 定义该变量的位置开始至本文件结束 答案:B
有以下函数调用语句:
func((exp1,exp2),(exp3,exp4,exp5)); 其中含有的实参个数和是( )。 A、 1 B、 2 C、 4 D、 5 答案:B
C语言中形参的默认存储类别是( )。 A、 自动(auto) B、 静态(static) C、 寄存器(register) D、 外部(extern) 答案:A
以下正确的函数形式是( )。 A、 double fun(int x,int y) { z=x+y; return z; } B、 fun(int x,y) { int z; return z; } C、 fun(x,y)
{ int x,y; double z; z=x+y; return z; } D、 double fun(int x,int y)
39
{ double z; z=x+y; return z; } 答案:D
在一个源程序文件中定义的全局变量的有效范围为( )。 A、 一个C程序的所有源程序文件 B、 该源程序文件的全部范围
C、 从定义处开始到该源程序文件结束 D、 函数内全部范围 答案:C
下列函数中,能够从键盘上获得一个字符数据的函数是( )。 A、 puts( ) B、 putchar( ) C、 getchar( ) 答案:C
以下程序的输出结果是( )。 fun(int a,int b,int c) { c=a+b; }
main() { int c; fun(2,3,c); printf(“%d\\n”,c); }
A、 2 B、 3 C、 5 答案:D
分析以下程序的运行结果( )。 func(int a,int b) { int temp=a; a=b; b=temp; }
main() { int x,y; x=10; y=20; func(x,y);
printf((“%d,%d\\n”,x,y); }
A、 10,20 B、 10,10 C、 20,10 答案:A
下面程序的输出是( )。 fun(int x) {
static int a=3; a+=x;
40
D、 gets( ) D、D、 20,20 无定值 return(a); }
main() { int k=2,m=1,n; n=fun(k); n=fun(m); printf(“%d”,n); }
A、 3 B、 4 C、 答案:C
以下程序输出的结果是( 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”,r); }
A、 12 B、 13 C、 答案:D
以下程序的输出结果是( int a,b void fun() {
a=100; b=200; }
main() {
int a=5,b =7; fun(); printf(“%d%d \\n”,a,b); A、 100200 B、 57 C、 200100 D、 75 答案:B
以下程序的输出结果是( int x=3; main() { int i; for(i=1;i6 D、 9。 14 D、 15
。 。 41
) ) ) incre(); }
incre() {
static int x=1; x*=x+1; printf(“%d”,x); }
A、 33 B、 22 C、 26 D、 25 答案:C
二、判断题
( F ) 函数定义void max(int a,int b)表示该函数的返回值不确定。 ( T )在C语言中,函数体中变量的隐含存储类别是自动变量auto。 ( F )return语句作为函数的出口,在一个函数体内只能有一个。 ( T )在C程序中,函数不能嵌套定义,但可以嵌套调用。 ( F ) C语言的源程序中必须包含库函数。 ( F )在C程序中,函数调用不能出现在表达式语句中。 ( F )在C函数中,形参可以是变量、常量或表达式。 ( F )在主函数main( )中定义的变量都可以在其它被调函数中直接使用。
( T )在C语言中,一个函数一般由两个部分组成,它们是函数说明和函数体。 ( F )C语言程序中的main( )函数必须放在程序的开始部分。 ( F )若定义的函数没有参数,则函数名后的圆括号可以省略。 ( T )函数的函数体可以是空语句。
( T )函数的实参和形参可以是相同的名字。
( T )函数调用中,形参与实参的类型和个数必须保持一致。
( F )C语言中函数返回值的类型由return语句中的表达式的类型决定。 ( T )外部类型的变量只能定义一次,但可在不同地方声明多次。 ( F )外部类型的变量作用范围大,编程中应多用外部变量。 三、多选题
以下叙述中正确的有( )。
一个C语言程序有且仅有一个main函数 C语言程序中,main函数是没有参数的
一个函数通过其他函数间接的调用了自身,这种情况也是一种递归调用 main函数是由系统调用的
若要通过函数参数带回多个返回值,则应使用按地址传送的参数结合方式 答案:ACDE
下面叙述中,正确的有( )。
函数的定义不能嵌套,但函数调用可以嵌套 为了提高可读性,编写程序时应该适当使用注释
变量定义时若省去了存储类型,系统将默认其为静态型变量 函数中定义的局部变量的作用域在函数内部 函数必须有返回值,否则不能使用函数
42
答案:ABD
以下不正确的说法有( )。
定义函数时,形参的类型说明可以放在函数体内 return后边的值不能为表达式
函数返回值的类型可能会与函数的计算结果类型不一致 在不同的函数中可以使用相同名字的变量
如果形参与实参的类型顺序不一致,以实参顺序为准 答案:ABE
以下叙述中,正确的描述是有( )。
函数之内定义的变量称为内部变量,内部变量是全局变量
在一个函数中既可以使用本函数中的局部变量,又可以使用外部变量 外部变量定义和外部变量说明的含义不同 外部变量与局部变量的作用范围不同 在C的函数中,最好使用全局变量 答案:BCD
以下正确的说法有( )。 C语言程序的基本组成单位是函数 函数必须要有返回值
一个函数的类型为void,在定义时,可以省略void 函数声明是一条C语句 return语句只能返回一个值 答案:ADE
以下叙述中正确的有( )。
调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 函数的实参可以是常量、变量和表达式 形式参数只是局限于所在函数
函数定义时的函数首部不是语句,后面不能跟分号 函数名的存储类别为外部 答案:ABCDE
以下对C语言函数的有关描述中,正确的有( )。 调用函数时,实参与形参应该数量相同,类型一致 函数可以嵌套定义
函数必须有返回值,否则不能正确使用
程序中有调用关系的所有函数必须放在同一个源程序文件中 C程序由一个或一个以上的函数组成 答案:AE
以下对C语言函数的有关描述中,正确的有( )。 在C程序中,函数调用不能出现在表达式语句中
在C语言中,一个函数一般由两个部分组成,它们是函数说明和函数体 函数的实参和形参可以是相同的名字
在main()中定义的变量都可以在其它被调函数中直接使用 外部类型的变量只能定义一次,但可在不同地方声明多次 答案:BCE
一个数据类型为void的函数在被调用后,下列错误的描述有( )。
43
A、 函数没有返回值 B、 函数可以返回一个系统默认值 C、 函数返回值由用户临时决定 D、 函数可以返回一个不确定的值 答案:BCD
下列函数中,能够输出字符数据的函数有( )。
A、 puts( ) B、 printf( ) C、 scanf( ) D、 putchar( ) E、 put( ) 答案:ABD
第9章 编译预处理 选择题
1、若有宏定义“#define PI =3.14159 ”,且在程序中有语句 s +PI; 其中宏名PI代替的是:( )
A、PI的值 B、3.14159 C、=3.14159 D、宏定义错误,编译通不过
答案:C
2、设有以下宏定义:#define N 3
#define Y(n) ((N+1)*n) 执行语句z=2*(N+Y(5+1));后,z的值为:( )
A、出错 B、42 C、48 D、54 答案:C
3、以下说法正确的是:( ) A、#define和printf都是C语句
B、#define 是C语句,而printf不是 C、printf是C语句,但#define不是 D、#define 和printf都不是C语句 答案:C
4、编译预处理命令以___________结尾。
A、 ; B、 . C、 \\ D、回车 答案:D
5、用C语言编写的程序是一种_________能运行的程序。 A、只需要经过编译就 B、只需要经过连接就 C、需要经过编译和连接才 D、不需要作任何处理就 答案:D
6、以下叙述中正确的是( )。
A、 用#include包含的头文件的后缀不可以是“.a”
B、 若一些源程序中包含某个头文件,当该头文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译 C、 宏命令行可以看做是一行C语句
D、 C编译中的预处理是在编译之前进行的 答案:D
7、下面是对宏定义的描述,不正确的是( )。
A、 宏不存在类型问题,宏名无类型,它的参数也无类型 B、 宏替换不占用运行时间
C、 宏替换时先求出实参表达式的值,然后代入形参运算求值
44
D、 其实,宏替换只不过是字符替代而已 答案:C
8、以下正确的描述为( )。
A、 每个C 语言程序必须在开头使用预处理命令#include B、 预处理命令必须位于C源程序的首部 C、 在C语言中预处理命令都以“#”开头D、 C语言的预处理命令只能实现宏定义和条件编译的功能 答案:C
9、下列选项中不会引起二义性的宏定义是( )。 A、 #define POWER(x) x*x B、 #define POWER(x) (x)*(x) C、 #define POWER(x) (x*x) D、 #define POWER(x) ((x)*(x)) 答案:D
10、以下程序的输出结果是( )。 #define f(x) x*x #include main() {int a=6,b=2,c; c=f(a)/f(b); printf(“%d\\n”,c); }
A、 9 B、 6 C、 36 D、18 答案:C
11、以下程序运行后,输出结果是( )。 #define PT 5.5
#defme S(x) PT*x*x #include main() {int a=1,b=2; printf(“%4.1f\\n”,S(a+b)); }
A、 49.5 B、 9.5 C、22.0 D、45.0 答案:B
12、下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) #include main() {int a=1,b=2; printf(“%d\\n”,MA(1+a+b)); }
A、 6 B、 8 C、 10 D、12 答案:B
45
13、以下程序的输出结果为( )。 #include #define SQR(x) x*x main() { int a,k=3; a=++SQR(k+1); printf(“%d\\n”,a); } A、6 B、l0 C、 8 D、 9 答案:D14、对下面程序段,正确的判断是( )。 #define A 3
#define B(a) ((A+1)*a) ...
x=3*(A+B(7));
A、 程序错误,不许嵌套宏定义 B、 x=93 C、 x=21 D、 程序错误,宏定义不许有参数. 答案:B
15、以下程序的输出结果为( )。 #include #define F(y) 3.84+y#define PRINT(a) PR(a);putchar(‘\\n’) main() { int x=2; PRINT(F(3)*x); }
A、 8 B、 9 C、 10 D、 11 答案:B
二、判断题
( F )预处理命令行必须以#开头,且最后要用分号结尾。 ( T )宏命令的处理占用编译时间,而不占用运行时间。 三、多选题
下面是对宏定义的描述,正确的有( )。
A、 宏不存在类型问题,宏名无类型,它的参数也无类型 B、 宏替换不占用运行时间
C、 宏替换时先求出实参表达式的值,然后代入形参运算求值 D、 预处理命令行必须以#开头,且最后要用分号结尾 E、 宏命令的处理占用编译时间,而不占用运行时间 答案:ABE
以下叙述中不正确的是( )。
A、 用#include包含的头文件的后缀不可以是“.a”
46
B、 宏不存在类型问题,宏名无类型,它的参数也无类型 C、 宏命令行可以看做是一行C语句
D、 C编译中的预处理是在编译之前进行的 E、 在C语言中预处理命令都以“#”开头 答案:AC
第10章 指 针 选择题
1、 有以下程序
void fun(char *a, char *b) { a=b; (*a)++; } main()
{ char c1='A',c2='a',*p1,*p2; p1=&c1; p2=&c2; fun(p1,p2); printf(\"%c%c\\n\}
程序运行后的输出结果是:( )
A)Ab B)aa C)Aa D)Bb 答案:A
2、 下列选项中正确的语句组是:( )
A)char s[8]; s={\"Beijing\ B)char *s; s={\"Beijing\C)char s[8]; s=\"Beijing\"; D)char *s; s=\"Beijing\"; 答案:D
3、 已定义以下函数 fun(int *p) { return *p; }
该函数的返回值是:( )
A)不确定的值 B)形参p中存放的值 C)形参p所指存储单元中的值 D)形参p的地址值 答案:C
4、 若有定义:int *p[3];,5、 则以下叙述中正确的是:( ) A)定义了一个类型为int的指针变量p,该变量具有三个指针
B)定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针 C)定义了一个名为*p的整型数组,该数组含有三个int类型元素
D)定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素 答案:B
6、 已定义以下函数 fun(char *p2, char *p1)
{ while((*p2=*p1)!='\\0'){ p1++;p2++; } } 函数的功能是:( )
A)将p1所指字符串复制到p2所指内存空间 B)将p1所指字符串的地址赋给指针p2
C)对p1和p2两个指针所指字符串进行比较
D)检查p1和p2两个指针所指字符串中是否有'\\0'
47
答案:A
7、 有以下程序: main()
{ int p[7]={11,13,14,15,16,17,18},i=0,k=0; while(i<7&&*(p+i)%2) {k=k+*(p+i); i++;} printf(\"%d\\n\}
执行后输出的结果是:( )
A) 58 B) 56 C) 45 D) 24 答案:D
8、 若有如下定义char a[10],*p=a,9、 则对a数组中元素的不10、( )
A)*&a[5] B)a+2 C)*(p+5) D)*(a+5) 答案:B 11、 有以下程序 int *f(int *x,int *y) { if(*x<*y) return x; else return y; }
main()
{ int a=7,b=8,*p,*q,*r; p=&a; q=&b; r=f(p,q);
printf(\"%d,%d,%d\\n\}
执行后输出结果是:( )
A) 7,8,8 B) 7,8,7 C) 8,7,7 D) 8,7,8 答案:B 12、 有以下程序 main()
{ char *s[]={\"one\p=s[1];
printf(\"%c,%s\\n\}
执行后输出结果是:( )
A) n,two B) t,one C) w,one D) o,two 答案:C 13、 有以下程序 main()
{ int x[8]={8,7,6,5,0,0}, *s; s=x+3;
printf(\"%d\\n\
48
正确的引用是:
}
执行后输出结果是:( )
A) 随机值 B) 0 C) 5 D) 6 答案:B 14、 以下函数的功能是:通过键盘输入数据,15、 为数组中的所有元素赋值。 #define N 10
void arrin(int x[N]) { int i=0; while(iscanf(\"%d\}在下划线处应填入的是:( )
A) x+i B) &x[i+1] C) x+(i++) D) &x[++i] 答案:A 16、 有以下程序 main()
{ char *s=\"\\n123\\\\\";
printf(\"%d,%d\\n\}
执行后输出结果是:( )
A) 5,4 B) 5,6 C) 6,7 D) 7,8 答案:A 17、 阅读以下函数 fun(char *sl,char *s2) { int i=0;
while( sl[i]==s2[i] && s2[i]!='\\0') i++; return( sl[i]=='\\0' && s2[i]=='\\0' ); }
此函数的功能是:( ) A) 将s2所指字符串赋给s1
B) 比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0 C) 比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为0
D) 比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为0 答案:C 18、 有以下程序 main()
{ char str[ ]=\"xyz\while(*ps) ps++;
for(ps--;ps-str>=0;ps--) puts(ps);} 执行后输出结果是:( )
A) yz B) z C) z D) x xyz yz yz xy xyz xyz 答案:C
49
19、 有以下程序 void fun(int *a,int i,int j) { int t; if (i{ t=a[i];a[i]=a[j];a[j]=t; fun(a,++i,--j); }main()
{ int a[]={1,2,3,4,5,6},i; fun(a,0,5);
for(i=0;i<6;i++) rintf(\"%d\}
执行后输出结果是:( )
A) 6 5 4 3 2 1 B) 4 3 2 1 5 6 C) 4 5 6 1 2 3 D) 1 2 3 4 5 6 答案:A 20、 下列程序的输出结果是:( ) main()
{ char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5; printf(\"%d\}
A) 非法 B)a[4]的地址 C)5 答案:C 21、 下列程序的运行结果是:( ) 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) 0 0 答案:B 22、 下面程序的输出结果是:( ) main()
{ int a[ ]={1,2,3,4,5,6,7,8,9,0,},*p; p=a;
printf(\"%d\\n\}
A) 0 B) 1 C) 10 D) 9
50
D)3 D)编译出错 答案:C 23、 以下程序的输出结果是:( ) main()
{ int i, x[3][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) printf(\"%d,\}
A) 1,5,9 B) 1,4,7 C) 3,5,7 D)3,6,9 答案:C 24、 以下程序的输出结果是:( ) main()
{ int a[3][3]={ {1,2},{3,4},{5,6} },i,j,s=0; for(i=1;i<3;i++) for(j=0;j<=i;j++) s+=a[i][j];
printf(\"%d\\n\}
A) 18 B) 19 C) 20 D)21 答案:A 25、 若有说明:int i, j=2,26、 *p=&i;,27、 则能完成i=j赋值功能的语句是:(A) i = *p; B) *p = *&j; C) i = &j; D) i = **p; 答案:B 28、 以下定义语句中,29、 错误的是:( ) A) int a[]={1,2}; B) char *a[3]; C) char s[10]=\"test\"; D) int n=5,a[n]; 答案:D 30、 以下程序的输出结果是:( ) char cchar(char ch) {
if(ch>='A'&&ch<='Z') ch=ch-'A'+'a'; return ch; }
main()
{ char s[]=\"ABC+abc=defDEF\while(*p)
{ *p=cchar(*p); p++; }
printf(\"%s\\n\}
A) abc+ABC=DEFdef B) abc+abc=defdef C) abcaABCDEFdef D) abcabcdefdef 答案:B 31、 以下程序段的输出结果是:( ) char s[]=\"\\\\141\\141abc\\";
51
) printf (\"%d\\n\
A) 9 B) 12 C) 13 D) 14 答案:A 32、 以下程序调用findmax函数返回数组中的最大值。 findmax(int *a,int n) { int *p,*s;
for(p=a,s=a; p-amain(){ int x[5]={12,21,13,6,18}; printf(\"%d\\n\}
在下划线处应填入的是:( )
A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s 答案:B 33、 以下程序的输出结果是:( ) main()
{ char cf[3][5]={\"AAAA\printf(\"\\\"%s\\\"\\n\}
A) \"AAAA\" B) \"BBB\" C) \"BBBCC\" D) \"CC\" 答案:B 34、 以下不35、 能正确进行字符串赋初值的语句是:(A) char str[5]=\"good!\"; B) char str[]=\"good!\";
C) char *str=\"good!\"; D) char str[5]={'g','o','o','d'}; 答案:D 36、 以下程序的输出结果是:( ) f(int *b , int m, int n) { int i,s=0;
for(i=m;imain(){ int x,a[]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7);
printf(\"%d\\n\}
A) 10 B)18 C) 8 D) 15 答案:A 37、 以下程序的输出结果是:( ) #include #include 52
) main()
{ char b1[8]=\"abcdefg\while (--pb>=b1) strcpy(b2,pb); printf(\"%d\\n\}
A) 8 B) 3 C) 1 D) 7 答案:D 38、 若有说明:int n=2,*p=&n,*q=p;,39、 则以下非法的赋值语句是:( ) A) p=q; B) *p=*q; C) n=*q; D) p=n; 答案:D 40、 有以下程序 void fun(char *c,intd) { *c=*c+1;d=d+1; printf(\"%c,%c,\ }
main()
{ char a='A',b='a';
fun(&b,a); printf(\"%c,%c\\n\ }
程序运行后的输出结果是:( )
A) B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b 答案:D 41、 以下程序中函数sort的功能是对a所指42、 数组中的数据进行由大到小的排序 ,
void sort(int a[],int n) { int i,j,t;
for(i=0;i{ t=a[i];a[i]=a[j];a[j]=t; } }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,\ 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, 答案:C 43、 有以下程序
53
main()
{ char a[]={'a','b','c','d','e','f','g','h','\\0'}; int i,j; i=sizeof(a); j=strlen(a); printf(\"%d,%d\\n\ }
程序运行后的输出结果是:( )
A) 9,9 B) 8,9 C) 1,8 D) 9,8 答案:D 44、 以下程序中的函数reverse的功能是将a所指45、 数组中的内容进行逆置。 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 答案:A 46、 有以下程序 main()
{ int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}}; int i,s=0;
for(i=0;i<4;i++) s+=aa[i][1]; printf(\"%d\\n\ }
程序运行后的输出结果是:( ) A) 11 B) 19 C) 13 D) 20 答案:B 47、 有以下程序 #include main(){ char *p=\"abcde\\0fghjik\\0\"; printf(\"%d\\n\ }
程序运行后的输出结果是:( ) A) 12 B) 15 C) 6 D) 5 答案:D 48、 有以下程序 void ss(char *s,char t)
54
{ 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 答案:B
38. 变量的指针,其含义是指该变量的______. a)值 b)地址 c)名 d)一个标志 答案:B
39.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是_______. a)a,point,*&a b)&*a,&a,*point c)*&point,*point,&a d)&a,&*point ,point 答案:D
40.若有说明;int *p,m=5,n;以下正确的程序段的是____. a)p=&n; b)p=&n;
scanf(\"%d\c)scanf(\"%d\ *p=n;?? *p=m; 答案: D
41.下面程序段的运行结果是_______. char *s=\"abcde\"; s+=2;printf(\"%d\
a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果 答案:D
42.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确 执行的赋值语句是______.
a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2); 答案:B?
43.以下正确的程序段是______.
55
a)char str[20];? b)char *p; scanf(\"%s\
c)char str[20];? d)char str[20],*p=str; scanf(\"%s\答案:A
44.若有说明语句
char a[]=\"It is mine\"; char *p=\"It is mine\";
则以下不正确的叙述是_____. a)a+1表示的是字符t的地址
b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符 答案:D
45.下面程序的运行结果是____. #include? #include main() {char *s1=\"AbDeG\"; char *s2=\"AbdEg\"; s1+=2;s2+=2;
printf(\"%d\\n\}
a)正数 b)负数?? c)零?? d)不确定的值 答案: B
46.下面程序的运行结果是___. #include? #include? fun(char *w,int n) {char t,*s1,*s2; s1=w;s2=w+n-1;while(s1main() {char *p;p=\"1234567\"; fun(p,strlen(p)); puts(p); }
a)7654321 b)1714171 c)1711717 d)7177171
56
答案:C
47.若有以下定义,则对a数组元素的正确引用是______. int a[5],*p=a;
a)*&a[5] b)a+2? c)*(p+5)? d)*(a+2) 答案:D
48.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为_____ a)*(a[i]+j) b)(a+i) c)*(a+j)? d)a[i]+j 答案:D
49.若有以下定义,则p+5表示___. int? a[10],*p=a;
a)元素a[5]的地址 b)元素a[5]的值 c)元素a[6]的地址 d)元素a[6]的值 答案:A
50. 以下程序的输出结果是________. #include void fun(int x); int main() { int x = 3; fun(x); printf(“x = %d\\n”, x); }void fun(int x) { x = 5; }
A) 3 B) 5 C) 8 D) 2 答案:A
51. 以下程序的输出结果是________. #include void fun(int *p); int main() { int x = 3; fun(&x); printf(“x = %d\\n”, x); }void fun(int *p) { *p = 5;
57
}
A) 3 B) 5 C) 8 D) 2 答案:B
52. 以下count函数的功能是统计substr在母串str中出现的次数。 int count(char *str,char *substr) { int i,j,k,num=0; for(i=0; ① ;i++)
{for( ② ,k=0;substr[k]==str[j];k++,j++) if(substr[ ③ ]==’\\0’) {num++;break;} }
return num; }
① A) str[i]==substr[i] B) str[i]!=‘\\0’ C) str[i]==‘\\0’ D) str[i]>substr[i] 答案:B
② A) j=i+1 B) j=i C) j=i+10 D) j=1 答案:B
③ A) k B) k++ C) k+1 D) ++k 答案:C
53. 以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。 void Delblank(char *s) { int i,t; char c[80];
for(i=0,t=0; ① ;i++)
if(!isspace( ② ))c[t++]=s[i]; c[t]=‘\\0’; strcpy(s,c); }
① A) s[i] B) !s[i] C) s[i]=‘\\0’ D) s[i]==‘\\0’ 答案:B
② A) s+i B) *c[i] C) *(s+i)=‘\\0’ D) *(s+i) 答案:D
54. 以下conj函数的功能是将两个字符串s和t连接起来。 char *conj(char *s,char *t) { char *p=s; while(*s) ① ; while(*t)
{*s= ② ;s++;t++;} *s=‘\\0’;
③ ; }
58
① A) s-- B) s++ C) s D) *s 答案:B
② A) *t B) t C) t-- D) *t++ 答案:A
③ A) return s B) return t C) return p D) return p-t 答案:C
55. 下列程序的输出结果是 。 #include main(){int **k,*a,b=100;a=&b; k=&a;printf(“%d\\n”,**k);}
A) 运行出错 B) 100 C) a的地址 D) b的地址 答案:B
56. 下列程序的输出结果是 。 #include fun(int *a,int *b){int *w;*a=*a+*a;*w=*a; *a=*b; *b=*w;} main()
{int x=9,y=5,*px=&x,*py=&y;fun(px,py);printf(“%d, %d\\n”,x,y);} A)出错 B) 18, 5 C) 5, 9 D) 5, 18 答案:A
57. 若定义了以下函数: void f(……) {……
p=(double *)malloc(10*sizeof(double)); …… }
p是该函数的形参,要求通过p把动态分配存储单元的地址传回主调函数,则形参p的正确定义应当是 。 A) double *p B) float **p C) double **p D) float *p 答案:C 二、判断题
1.(F)指针变量里存放的是地址值,因此指针变量只能是int型的。 2.(T)在C语言中,所谓指针型数据,即指该数据是一个地址。 3.(T)有一个一维数组a[10],那么a与&a[0]等价。
4.(F)如有说明:int b[10], *p = b;表明在使用时b与p就完全等价了。
5.(T)数组中的每一个元素相当于一个变量。若要让一个指针变量指向它,必须用“&数组元素”的方法向该指针变量赋值。
6.(F)有如下程序段:int i, j = 2, k, *p = &i;k = *p + j;这里出现的两个“*”号,含义是一样的。
7.(F)在C语言中,每一个变量在内存里占用的单元数都是相同的。 8.(T)通过指针变量,就能间接地得到它所指向的变量的内容。
9.(T)说明语句:int *p, p1, p2;只说明了一个能指向int型变量的指针。
10.(F)有说明:int *p;且p指向地址为1500的内存单元,那么经过操作“p++;”后,p将指向1501的内存单元。
59
11.(F)数组元素可以是不同数据类型的。
12.(F)如果初值表中的初值个数少于数组长度,那么C语言编译程序会自动把剩余的元素初始化为初值表中的最后一个值。 13.主调函数把单个数组元素传递给修改该元素值的被调函数时,主调函数就能够得到修改后的值。(F)
14.(T)设p是指向数组a的指针变量,则a[i]和p[i]等价。 15.(T)一个变量的指针就是该变量的地址。
16.(F)若定义int **p;则程序中调用*p时,它代表的是p的地址。
17.(F)若指针占用的内存大小为2Byte,则指向它的二重指针占用内存大小为4Byte . 18.(F)带参main函数中的形参的值可以在程序中得到。
19.(F)main(argc,argv)中的参数argv的定义格式为char argv[]。 20.(F)int **p;表示定义一个*p指针变量。
21.(F)在C语言中允许将一个整数赋给指针变量。
22.(F)一个指针变量加1表示将该指针变量的原值(地址)加1。 23.(F)int *p();表示定义一个指向函数的指针变量p。
24.(F)当函数实参中使用指针变量时,形参变量也必须使用指针变量。 25.(F)*p++等价于(*p)++。
26.(F)使用指针技术,可以通过修改形参变量的值达到修改实参变量的值的目的。。
27.(F)因为用字符数组和字符指针变量都能实现字符串的存储和运算,因此它们二者是完全等价的。
28.(T)对指向函数的指针变量,像p+n、p++、p- -等运算是无意义的。 29.(T)main(int argc,char *argv[])中的参数argc表示命令行只参数的个数。 30.(T)在int a[3][4];中a+i和*(a+i)的含义是不一样的。
31.(F)char *p[10];定义了一个指向字符数组的指针变量。
32.(F)将指向函数的指针作为函数的参数,虽然可以提高效率,但是容易造成混乱,所以不符合结构化程序设计的原则。
33.(F)数组名实际上是此数组的首地址,所以数组名相当于一个指针变量。 34.(F)若定义数组a[2][3],则a+1和*(a+1)完全等价。
35.(T)函数的形参为一个数组,则调用此函数时将数组名作为对应的实参。
第11章 结构与联合 一、单选题 下列关于结构的说法错误的是:( ) A:结构是由用户自定义的一种数据类型 B:结构中可设定若干个不同数据类型的成员
C:结构中成员的数据类型可以是另一个已定义的结构 D:在定义结构时,可以对成员进行初始化 答案:D 以下关于结构体的叙述中,错误的是:( ) A:结构体是一种可由用户构造的数据类型 B:结构体中的成员可以具有不同的数据类型 C:结构体中的成员不可以与结构体变量同名 D:结构体中的成员可以是数组
60
答案:C 以下结构体类型说明及结构体变量a,b的定义中,正确的是:( ) A:struct ss B:struct ss { char flag; { char flag; float x; float x; } ; }; ss a,b; struct ss a,b; C:struct D:struct { char flag; { char flag; float x; float x; }ss;; }ss;
ss a,b; struct ss a,b;
答案:B 设有以下说明语句: struct stu { int a;
float b; }stutype;
则下面的叙述不正确的是:( ) A:struct是结构体类型的关键字
B:struct stu是用户定义的结构体类型名 C:stutype是用户定义的结构体类型名 D:a和b都是结构体成员名 答案:C 在16位IBM-PC机上使用C语言时,若有如下定义: struct data { long i;
char ch; double f; }b;
则结构变量b占用内存的字节数是:( )
A:4 B:8 C:12 D:答案:D 下面程序的运行结果是:( ) main( )
{ struct cmplx { int x; int y; }c[2]={1,3,2,7};
printf(\"%d\}
A:0 B:1 C:3 D:6 答案:D
61
13 若有以下说明和语句,则对pup中sex域的正确引用方式是:( ) struct pupil
{ char name[20]; int sex; }pup,*p; p=&pup;
A:p.pup.sex B:p->pup.sex C:(*p).pup.sex D:(*p).sex 答案:D
当定义一个结构体变量时系统分配给它的内存是:( )
A:各成员所需内存量的总和 B:成员中占内存量最大者所需的容量 C:结构中第一个成员所需内存量 D:结构中最后一个成员所需内存量 答案:A
若有以下说明和语句,则下面表达式中值为1002的是:( ) struct student { int age; int num; };
struct student stu[3]={ {1001,20},{1002,19},{1003,21} }; struct student *p; p=stu;
A:(p++)->num B:(p++)->age C:(*p).num D:(*++p).age 答案:D 当说明一个共用体变量时,系统分配给它的内存是:( ) A:各成员所需内存量的总和
B:共用体中第一个成员所需内存量 C:成员中占内存量最大者所需的内存量 D:共用体中最后一个成员所需内存量 答案:C 以下对C语言中共用体类型数据的叙述正确的是:( ) A:可以对共用体变量名直接赋值
B:一个共用体变量中可以同时存放所有成员 C:一个共用体变量中不能同时存放其所有成员 D:共用体类型定义中不能出现结构体类型的成员 答案:C 若有以下定义和语句: union data { int i; char c; float f; }a;
则以下语句正确的是:( )
62
A:a=5 B:printf(\"%d\\n\ C:a={2,'a',1.2}; D:n=a 答案:B 下面程序运行后的输出结果应为:( ) #include \"stdio.h\" main( ) { union
{ int a[2]; long b; char c[4]; }s;
s.a[0]=0x39; s.a[1]=0x38;
printf(\"%c\}
A;39 B:9 C:38 D:8 答案:B
根据以下定义,能输出字母M的语句是______________ struct person { char name[9];int age;}; struct person class[10]={ “John”,17, “Paul”,19, “Mary”,18, “Adam”,16,}; A.printf(“%c\\n”,class[3].name); B.printf(“%c\\n”,class[3].name[1]); C.printf(“%c\\n”,class[2].name[1]); D.printf(“%c\\n”,class[2].name[0]); 答案:D
对整个结构能够进行的操作是____________。 A) 对结构进行赋值 B) 对结构进行存取 C) 对结构进行减法运算 D) 对结构体做加法 答案:A
下列对结构类型的描述错误的是___________。 A) 结构体变量可以有不同类型的成员
B) 结构体变量所占内存空间一定等于各个分量所占内存空间之和。 C) 结构体变量既可以做函数参数,又可以从函数中返回 D) 结构体变量的成员既可以读又可以写 答案:B
第12 章 文 件 一、单选题
1.利用C语言的文件操作,可以把数据永久保存在:( )
63
A.磁盘 B.内存 C.屏幕 D.键盘 答案:A
2.若有程序片段 FILE *fp; fp=fopen(“a.txt”,”r”); 则以下说法中正确的是:( ) A.fp指向磁盘文件a.txt的地址 B.fp指向磁盘文件a.txt 所对应的FILE 结构 C.如果fp不为NULL,表示文件打开失败 D.可以利用fp指针对文件a.txt进行写操作 答案:B
3.fopen函数的作用是:( ) A.将文件的内容读入内存 B.读出文件的大小 C.建立与文件关联的FILE结构体变量并返回该结构体变量的地址 D.向文件写数据 答案:C 9.fclose函数的作用是:( ) A.删除文件 B.删除文件中的数据 C.释放与该文件相关联的FILE结构体变量 D.清空文件缓冲区 答案:C
4.已知fp是一个指向已打开文件的指针,ch是一个字符型变量,则ch=fgetc(fp)的作用是:( ) A.获取键盘输入的字符,并赋值给ch B.获取fp所指向的文件的第一个字节的内容,并赋值给ch C.获取fp所指向的文件的当前文件位置指针所指向的一个字节的内容,并赋值给ch D.将ch的值输出到fp所指向的文件中 答案:B
5、以下可作为函数fopen中第一个参数的正确格式是_____________。 A)c:user\ext.txt B)c:\ext.txt C)”c:\ext.txt” D)”c:\\\\\ext.txt” 答案:D
6、若执行fopen函数时发生错误,则函数的返回值是________________ 。 A)地址值 B)0 C)1 D)EOF 答案:B
7、若要用fopen函数打开一个新的二进制文件,该文件要求既能读也能写,则打开方式字符串应是_______。 A)”ab+” B)”wb+” C)”rb+” D)”ab” 答案:B
8、若以“a+”方式打开一个已存在的文件,则以下叙述正确的是______________。
A)文件打开时,原有文件内容不被删除,位置指针移到文件末尾,可作添加和读操作 B)文件打开时,原有文件内容不被删除,位置指针移到文件开头,可作重写和读操作 C)文件打开时,原有文件内容删除,只可作写操作 D)以上各种说法皆不正确
64
答案:A
9、当顺利执行了文件关闭操作时,fclose函数的返回值是_______________。 A)-1 )TURE C)0 D)1 答案:D 10、已知函数的调用形式:fread (buffer,size,count,fp);其中buffer代表的是____________。 A)一个整型变量,代表要读入的数据项总数 B)一个文件指针,指向要读的文件
C)一个指针,指向要读入数据的存放地址 D)一个存储区,存放要读的数据项 答案:C
11、fscanf函数的正确调用形式是_________________。 A)fscanf (fp,格式字符串,输出表列); B)fscanf(格式字符串,输出表列,fp); C) fscanf(格式字符串,文件指针,输出表列) D)fscanf(文件指针,格式字符串,输入表列) 答案:A
12、fwrite函数的一般调用形式是______________。 A)fwrite(butter, count, size fp); B) fwrite(fp, size, count, butter); C) fwrite(fp, count, size, butter); D) fwrite(butter, size, count, fp); 答案:D
13、fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是____________。 A)只写 B)追加 C)读或读写 D)答案B和C都正确 答案:C
14、若调用fputc函数输出字符成功,则其返回值是___________。 A)EOF B)1 C)0 D)输出的字符 答案: D
15、若调用fputc函数输出字符失败,则其返回值是___________。 A)EOF B)1 C)0 D)输出的字符 答案:A 二、判断题
1. ( T )C语言中,2. 认为键盘是标3. 准输入文件stdin 4. ( T )C语言中,5. 认为显示器是标6. 准输出文件stdout 7. ( F )C语言中,8. 文件都是以ASCII码形式存储。 9. ( F )C语言中,10. 文件是以记录(record)组成。 11. ( T )C语言中,12. 文件存取是以字节为单位的。
13. ( T )fopen(“c:\est.dat”,”r”)的作用是打开一个磁盘文件,14. 此文件可以被执行写操作
15. ( F )fopen(“test.txt”,”r”)表示为写操作打开一个二进制文件 16. ( T )使用文件前必须先打开文件 17. ( T )文件时候结束后必须关闭文件
18. ( T )fputc函数的作用是把一个字符写到磁盘文件中去。
65
19. ( T )如果希20. 望向文件的末尾添加新的数据,21. 可以选择“W+”方式打开文件 ( )。
22. ( F )当遇到文件结束时,23. feof()函数的值为0,24. 否则为1 ( )。 25. ( T )如果文件以二进制形式打开,26. 用fread和fwrite函数就可以读写任何类型的信息( )。
27. ( T )当文件操作完成后必须使用fclose命令关闭文件 ( )。
28. ( F )用文件结束标29. 志EOF判断文件是否结束,30. 可以适用于任何类型的文件 ( )。
66