C语言理论复习题

更新时间:2023-09-15 15:27:01 阅读量: 资格考试认证 文档下载

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

练习题

一、C语言基础知识

1.1 选择题

1. 以下不是C语言的特点的是( B)。

A. 语言简洁紧凑 B. 能够编制出功能复杂的程序 C. C语言可以直接对硬件操作 D. C语言移植性好

2. 下列字符序列中,不可用作C语言标识符的是( B )。

A.abc123 B.no.1 C._123_ D._ok 3. 正确的C语言标识符是 (A )。

A._buy_2 B.2_buy C.?_buy D.buy? 4. 请选出可用作C语言用户标识符的一组标识符(B )。

A.void B.a3_b3 C.For D.2a define _123 -abc DO WORD IF Case sizeof

5. 下列符号中,不属于转义字符的是( B)。

A.\\\\ B.\\0xAA C.\\t D.\\0 6. 不属于C语言关键字的是(D )。

A.int B.break C.while D.character 7. 是C语言提供的合法关键字的是( B )。

A.Float B.signed C.integer D.Char 8. 以下不能定义为用户标示符的是(D )。

A.scanf B.Void C._3com_ D.int 9. 一个C程序是由(B )。

A. 一个主程序和若干子程序组成 B. 一个或多个函数组成 C. 若干过程组成 D. 若干子程序组成

10. C语言程序的基本单位是(C )。

A.程序行 B.语句 C.函数 D.字符

20.下列变量定义中合法的是 A

A.short _a=1-.le-1; B.double b=1+5e2.5; C.long do=0xfdaL; D.float 2_and=1-e-3;

9xn

21.与数学式子对应的C语言表达式是(C )。

2x?1

A.9*x^n/(2*x-1) B.9*x**n/(2*x-1) C.9*pow(x,n)*(1/(2*x-1)) D.9*pow(n,x)/(2*x-1)

22.若有代数式

3ab,则不正确的C语言表达式是(C )。 cd A.a/c/d*b*3 B.3*a*b/c/d C.3*a*b/c*d D.a*b/d/c*3 23.已知各变量的类型说明如下: int m=8,n, a, b;

unsigned long w=10; double x=3.14, y=0.12;

则以下符合C语言语法的表达式是(A )。

A.a+=a-=(b=2)*(a=8) B. n=n*3=18 C.x%3 D.y=float (m) 24.以下符合C语言语法的赋值表达式是(B )。

A.a=9+b+c=d+9 B.a=(9+b, c=d+9) C.a=9+b, b++, c+9 D.a=9+b++=c+9

25. 已知字母A的ASCII码为十进制数65,且S为字符型,则执行语句S=’A’+’6’-’3’;

后,S中的值为( A)。

A.’D’ B.68 C.不确定的值 D.’C’ 26.在C语言中,要求运算数必须是整型的运算符是(D )。

A./ B.++ C.*= D.% 36.若有以下定义,则正确的赋值语句是( )。

int x,y; float z;

A.x=1,y=2, B.x=y=100 C.x++; D.x=int (z); 37.设x、y均为float型变量,则不正确的赋值语句是(C )。

A.++x ; B.x*=y-2; C.y=(x%3)/10; D.x=y=0; 38.下列语句中符合C语言的赋值语句是( D)。

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; 39.putchar函数可以向终端输出一个( D)。

A.整型变量表达式值。 B.字符串

C.实型变量值。 D.字符或字符型变量值。 40.以下程序段的输出结果是( C )。

int a=12345; printf(”-\\n”, a);

A.12 B.34 C.12345 D.提示出错、无结果

41.若x和y均定义为int 型,z定义为double型,以下不合法的scanf()函数调用语句为

( D )。

A.scanf(”%d%lx,%le”,&x,&y,&z); B.scanf (”-*%d%lf ”, &x, &y, &z); C.scanf(”%x%*d%o”, &x,&y);

D。scanf(”%x%o%6.2f”, &x,&y,&z); 42.有如下程序段: int x1,x2;

char y1,y2;

scanf(”%d%c%d%c”,&x1,&y1,&x2,&y2);

若要求x1、x2、y1、y2的值分别为10、20、A、B,正确的数据输入是( A )。(注:└┘代表空格)

A.10A└┘20B B.10└┘A20B C.10 └┘A└┘20└┘ B D.10A20└┘B 45.已有定义int a=-2;和输出语句:printf(”%8lx”,a);以下正确的叙述是(D)。

A.整型变量的输出格式符只有%d一种

B.%x是格式符的一种,它可以适用于任何一种类型的数据 C.%x是格式符

D.%8lx不是错误的格式符,其中数字8规定了输出字段的宽度 46.有如下程序段,对应正确的数据输入是(A )。

float x,y;

scanf(”%f%f”, &x,&y); printf(”a=%f,b=%f”, x,y);

A.2.04<回车> B.2.04,5.67<回车> 5.67<回车>

C.A=2.04,B=5.67<回车> D.2.055.67<回车>

1.2 填空题

1. C语言的符号集包括________、________、________。

2. 结构化设计中的三种基本结构是________、_______、________。

3. C语言源程序文件的后缀是________,经过编译后生成文件的后缀是________,经过链

接后生成文件的后缀是________。

4. C语言的关键字都用________{大写或小写}。

5. 一个函数由两部分组成,它们是_______、_______。 6. 函数体一般包括_______、_______。

7. C语言是通过_______来进行输入和输出的。 8. 以下程序的执行结果________。 #include ”stdio.h” main()

{ short i=-1,j=1;

printf(”dec:%d,oct:%o,hex:%x,unsigned:%u\\n”,i,i,i,i); printf(”dec:%d,oct:%o,hex:%x,unsigned:%u\\n”,j,j,j,j); }

9. 以下程序的执行结果是________。

#include ”stdio.h” main()

{ char s=’b’;

printf(”dec:%d,oct:%o,hex:%x,ASCII:%c\\n”, s,s,s,s); }

10.以下程序的执行结果是________。(注:└┘代表空格)

#include ”stdio.h” main()

{ float pi=3.1415927;

printf(”%f,%.4f,%4.3f,.3f”,pi,pi,pi,pi);

printf(”\\n%e,%.4e,%4.3e,.3e”,pi,pi,pi,pi); }

11.以下程序的执行结果是:________。

#include ”stdio.h” main()

{ char c=’c’+5;

printf(”c=%c\\n”,c); }

12.以下程序输入1└┘2└┘3后的执行结果是________。(注:└┘代表空格)

#include ”stdio.h” main() { int i,j; char k;

scanf(”%d%c%d”,&i,&k,&j); printf(”i=%d,k=%c,j=%d\\n”,i,k,j); }

13.有以下程序,若输入9876543210后的执行结果是________;若输入为:98└┘76└┘543210

后的执行结果是________;若输入为:987654└┘3210后的执行结果为:________。(注:└┘代表空格)

#include ”stdio.h” main()

{ int x1,x2; char y1,y2;

scanf(”-=<%c”,&x1,&x2,&y1,&y2); printf(”x1=%d,x2=%d,y1=%c,y2=%c\\n”,x,y); }

14.若x和y均为int型变量,则以下语句的功能是________。 x+=y; y=x-y; x-=y; 15.有一输入函数scanf(”%d”,k);则不能使float类型变量k得到正确数值的原因是:________。 16.有如下程序段,输入数据:12345ffl678后,u的值是 【1】 ,v的值是 【2】 。

int u; float v;

scanf(“=%f”,&u,&v);

1. 答案:英文字母、数字、一些有特定含义的标点符号 2. 答案:顺序结构、选择结构、循环结构 3. 答案:C,OBJ,EXE 4. 答案:小写

5. 答案:函数说明部分和函数体 6. 答案:变量定义部分和执行部分 7. 答案:输入和输出函数

8. 答案:dec:-1,oct:177777,hex:ffff,unsigned:65535

dec:1,oct:1,hex:1,unsigned:1

9. 答案:dec:98,oct:142,hex:62,ASCII:b

10.答案:3.141593,3.1416,3.142, └┘└┘└┘└┘└┘3.142

3.141593e+00,3.1416e+00,3.142e+00,└┘└┘3.142e+00

(注:由于c编译系统不同,我们上机使用的机器,其第二个printf语句实际结果为:3.14159e+00,3.142e+00,3.14e+00,└┘└┘3.14e+00,即:小数点后取5位。)

11.答案:c=h

12.答案:i=1,k=└┘,j=2

13.答案:第一种情况的执行结果:x1=98,x2=765,y1=4,y2=1

第二种情况的执行结果:x1=98,x2=76,y1=└┘,y2=3

第三种情况的执行结果:x1=98,x2=765,y1=4,y2=2

14.答案:交换x和y的值 15.答案:(1)格式符应为:%f;(2)变量前边未加取地址符&, 即应为scanf(”%f”,&k); 16.答案:【1】123 【2】45.000000

二、选择结构 2.1 选择题

1. 已有定义:int x=3, y=4, z=5; 则表达式!(x+y)+z-1 && y+z/2的值是(D)。

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

2. 设a=5,b=6,c=7,d=8,m=2,n=2, 则执行(m=a>b) && (n=c>d)后n的值为(B)。

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

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

()。

A.’x’ && ’y’ B.x<=y

C.x||y+z && y-z D.!((x

4.为了避免嵌套的if-else语句的二义性,C语言规定else总是与(C)组成配对关系。

A.缩排位置相同的if B.在其之前未配对的if

C.在其之前未配对的最近的if D.同一行上的if

5. 逻辑运算符两侧运算对象的数据类型(D)。 A.只能是0或1

B.只能是0或非0正数 C.只能是整型或字符型数据 D.可以是任何类型的数据

6. 以下关于运算符优先顺序的描述中正确的是(C)。

A.关系运算符<算术运算符<赋值运算符<逻辑与运算符 B.逻辑与运算符<关系运算符<算术运算符<赋值运算符 C.赋值运算符<逻辑与运算符<关系运算符<算术运算符 D.算术运算符<关系运算符<赋值运算符<逻辑与运算符 7. 下列运算符中优先级最高的是(C)。

A.< B.&& C.+ D.!= 8. 选择出合法的if语句(设int x,a,b,c;)(A)。 A.if(a=b) c++; B.if(a=b) c++; D.if(a=>b) c++;

9. 能正确表示“当x的取值在[-58,-40]和[40,58]范围内为真,否则为假”的表达式是(C)。

A.(x>= -58) && (x<= -40) && (x>=40) && (x<=58) B.(x>= -58) || (x<= -40) || (x>=40) || (x<=58)

C.(x>= -58) && (x<= -40) || (x>=40) && (x<=58) D.(x>= -58) | |(x<= -40) && (x>=40) || (x<=58)

10.判断char型变量s是否为小写字母的正确表达式是(C)。

A.’a’ <= s<=’z’ B.(s>=’a’) & (s<=’z’) C.(s>=’a’) && (s<=’z’) D.(’a’<=s) and (’z’>=s) 11.若希望当x的值为奇数时,表达式的值为“真”,x的值为偶数时,表达式的值为“假”。

则以下不能满足要求的表达式是(C)。

A.x%2==1 B.!(x%2==0) C.!(x%2) D.x%2

12.已知 x=45, y=’a’, z=0; 则表达式(x>=z && y<’z’ || !y)的值是(C)。 A.0 B.语法错 C.1 D.“假” 13.指出下列程序段所表示的逻辑关系是(B)。

if(a

x=10; } else

x=-10;

A.x??B.x??C.x???10??10a?b且c?d

a?b且c?da?b且c?d

a?ba?b且c?d

a?b且c?d?10??10?10??10?10D.x????10a?b且c?d

c?d??1?y??014.有一函数:

?1?A.if (x>0) y=1;

else if (x==0) y=0; else y= -1; B.y=0;

if (x>0) y=1;

else if (x<0) y= -1; C.y=0; if (x>=0)

if(x>0) y=1; else y= -1;

x?0x?0 ,以下程序段中不能根据x值正确计算出y值的是(C)。 x?0D.if (x>=0) if (x>0) y=1; else y=0; else y= -1;

15.执行以下语句后,y 的值为(A)。

int x,y,z; x=y=z=0;

++x || ++y && ++z;

A.0 B.1 C.2 D.不确定值 16.已知int a=1,b=2,c=3; 以下语句执行后a,b,c的值是(B)。

if(a>b)

c=a; a=b; b=c;

A.a=1, b=2, c=3 B.a=2, b=3, c=3 C.a=2, b=3, c=1 D.a=2, b=3, c=2 17.请阅读以下程序:该程序(C)。

#include ”stdio.h” main()

{ int x=-10, y=5, z=0;

if (x=y+z) printf(”***\\n” ); else printf(”$$$\\n”); }

A.有语法错不能通过编译 B.可以通过编译但不能通过连接 C.输出*** D.输出$$$

18.以下程序的运行结果是(C)。

#include ”stdio.h” main() { int a=1;

if (a++>1) printf(”%d\\n”, a); else printf(”%d\\n”, a--); }

A.0 B.1 C.2 19.当a=1,b=2,c=4,d=3时,执行完下面一段程序后x的值是(B)。 if (a

if (c

if (a

if (b

A.1 B.2 C.3 20.执行以下程序段后,变量x,y,z的值分别为(B)。 int a=1,b=0, x, y, z;

x=(--a= =b++)?--a:++b; y=a++; z=b;

D.3 D.4 A.x=0,y=0,z=0 B.x= -1,y= -1,z= 1 C.x=0,y=1,z=0 D.x= -1,y= 2, z= 1

三、循环结构 2.2 填空题

1. 若从键盘输入58,则输出结果是________。

#include ”stdio.h” main() {

int a;

scanf(”%d”, &a);

if (a>50) printf(”%d”, a);

if (a>40) printf(”%d”,a); if (a>30) printf(”%d”,a); }

2. 设int x=9,y=8;表达式x==y+1的结果是________。

3. 定义int x,y;执行y=(x=1,++x,x+2);后, y的值是________。

4. 定义int x=10,y,z; 执行y=z=x; x=y==z;后, x的结果是________。

1.答案:585858

解析:虽然三个if语句按照嵌套方式书写,但是程序仍然是依顺序运行的,会分别对每一

个if的条件表达式进行判断,若其条件表达式为真,就执行其后的语句,否则,不执行。 2.答案:1

解析:注意该表达式是关系表达式的双等号,所以其结果只能为1或0。 3.答案:4 4.答案:1

8. 以下程序的运行结果是________。 #include ”stdio.h” main()

{

int a,b,c,d,e; a=c=1; b=20; d=100;

if (!a) d=d++; else if (!b)

if (d) d= --d;

else d= d--;

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

9. 以下程序的运行结果是________。

#include ”stdio.h” main() {

int a, b= 250, c; if ((c=b)<0) a=4; else if (b=0) a=5; else a=6;

printf(”\\t%d\\t%d\\n”,a,c); if (c=(b==0))

a=5;

printf(”\\t%d\\t%d\\n”,a,c); if (a=c=b) a=4;

printf(”\\t%d\\t%d\\n”,a,c);

}

8.答案:100

9.答案: 6 250

5 1 0 0

13.以下程序的功能是判断输入的年份是否是闰年。请在【】内填入正确内容。

#include ”stdio.h” main() {

int year, flag;

printf(”please input the year to jude whether it is a leap year:”); scanf(”%d”,&year);

if (year@0==0) flag=1; else if (【1】) flag=1; else 【2】;

if (flag) printf(”%d is a leap year\\n”,year); else printf(”%d is not a leap year!\\n”,year); }

14.以下程序是对用户输入的字母进行大小写转换。请在【】内填入正确内容。

#include ”stdio.h” main() {

char ch;

printf(”please input a letter:”); scanf(”%c”,&ch); if (【1】) ch=ch+32;

else if (ch>=’a’ && ch<=’z’) 【2】;

printf(” the converted letter is: %c\\n”,ch); }

15.以下程序是对从键盘输入的任何三个整数,求出其中的最小值。请在【】内填入正确内

容。

#include ”stdio.h”

main()

{

int a,b,c,min;

printf(”please input three numbers:”); scanf(”%d%d%d”,&a,&b,&c); if (【1】) min=b; else

min=a; if (min>c)

【2】;

printf(”min=%d\\n”,min); }

13.答案:【1】(year%4==0)&&(year0!=0) 14.答案:【1】ch>=’A’ && ch<=’Z’ 15.答案:【1】a>b

21.以下程序运行后的输出结果是_____________。 #include ”stdio.h” main()

{

int x=10, y=20, t=0;

if (x==y) t=x; x=y; y=t; printf(”%d,%d\\n”,x,y);

}

22.执行以下语句后,x、y和z 的值分别为_____________。int x,y,z; x=y=z=0;

++x || ++y && ++z;

21.答案:20,0 22.答案:1,0,0

3.1 选择题

1. 以下程序的输出结果是( A )。

main()

{ int n=4; while (n--)

printf(〞%d〞,--n);

}

A.20 B.31 C.321 2. 以下程序的输出结果是( D )。

2】flag=0 2】ch=ch-32 2】min=c;

D.210 【 【 【

main()

{int x=10,y=10,i; for(i=0;x>8;y=++i) printf(\}

A.10192 B.9876 C.10990 D.101091 3. 当执行以下程序段时。 A

x=-1; do

{x=x*x;}

while (!x);

A.循环体将执行一次 B.循环体将执行两次 C.循环体将执行无数多次 D.系统将提示有语法错误 4. 执行以下程序后输出的结果是( D )。

main() { int y=10;

do{y--;}while(--y); printf(\

A.-1 B.1 C.8 D.0 5. 下面程序的输出结果是( D )。

main()

{ int x=3,y=6,a=0; while (x++!=(y-=1)) {a+=1;

if (y

printf(\}

A.x=4,y=4,a=1 B.x=5,y=5,a=1 C.x=5,y=4,a=3 D.x=5,y=4,a=1

6.若i,j已定义为int类型,则以下程序段中内循环的总的执行次数是 ( A )。

for (i=5;i;i--) for (j=0;j<4;j++)

{…}

A.20 B.24 C.25 D.30 7. 请读程序:

#include main()

{int x=1,y=0,a=0,b=0; switch(x)

{case 1:switch(y)

{case 0:a++;break;

case 1:b++;break;

}

case 2:a++;b++;break; }

printf(\}

上面程序的输出结果是( D )。

A.a=2,b=1 B.a=1,b=1 C.a=1,b=0 D.a=2,b=2

11.在下列选项中,没有构成死循环的程序段是( C )。 A.int i=100; while (1)

{

i=i0+1; if(i>100) break;

}

B. for ( ; ;); C.int k=1000;

do {++k;}while (k>=10000); D.int s=36; while (s) ;

--s;

12.若输入B,以下程序的运行结果为( C )。

main()

{char grade;scanf(\switch(grade)

{case'A':printf(\case'B':

case'C':printf(\case'D':printf(\default:printf(\} }

A.>=85. B.>=60. C.>=60.<60.error. 13.列程序运行的情况是(D )。

main() { int i=1,sum=0;

while(i<10)sum=sum+1;i++; printf(\}

A.i=10,sum=9 B.i=9,sum=9 C.i=2,sum=1 14.有以下语句:

i=1;

for(;i<=100;i++) sum+=i;

与以上语句序列不等价的有( C )。

A. for(i=1; ;i++) {sum+=i;if(i==100)break;} B. for(i=1;i<=100;){sum+=i;i++;} C. i=1;for(;i<=100;)sum+=i;

D. i=1;for(; ;){sum+=i;if(i==100)break;i++;}

D.error. D.运行出现错误 15.下面程序的运行结果为( A )。

main() { int n;

for(n=1;n<=10;n++) { if(n%3==0)continue; printf(\} }

A.12457810 B.369 C.12 D.12345678910 16.下面程序的运行结果是( C )。

main() {int x,y,z;

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

printf(\}

A.x=4 B.x=0 C.x=2 D.x=3 17.标有/**/的语句的执行次数是( C )。

int y,i;

for(i=0;i<20;i++) {if(i%2==0)continue; y+=i;/**/ }

A.20 B.19 C.10 D.9

18.在C语言中,if语句后的一对圆括号中,用以决定分支的流程的表达式。D

A.只能用逻辑表达式 B.只能用关系表达式 C.只能用逻辑表达式或关系表达式 D.可用任意表达式

19.在以下给出的表达式中,与do-while(E)语句中的(E)不等价的表达式是(C )。

A.(!E==0) B.(E>0||E<0) C.(E==0) D.(E!=0) 20.假定所有变量均已正确定义,下列程序段运行后x的值为( B )。

k1=1;k2=2; k3=3; x=15; if(!k1)x--;else if(k2) if(k3)x=4;else x=3; A.14 B.4 C.15 D.3 21.执行下面语句的输出为(A )。

int i=-1;

if(i<=0)printf(“* * * *\\n”); else printf(“% % % % \\n”);

A.* * * * B.% % % % C.% % % % c D.有错,执行不正确

28.C语言的if语句嵌套时,if与else的配对关系是( A )。

A. 每个else总是与它上面的最近的if配对 B. 每个else总是与最外的if配对 C. 每个else与if的配对是任意的 D. 每个else总是与它上面的if配对 29.下列程序的输出为(C )。

#include main()

{int i=0,j=0,a=6;

if((++i>0)||(++j>0))a++;

printf(\

}

A.i=0,j=0,a=6 B.i=1,j=1,a=7 C.i=1,j=0,a=7 D.i=0,j=1,a=7 30.下列程序段的输出结果为( C )。

main() {int x=3; do

{ printf(\while(!(--x));}

A.1 B.3 0 C.1 -2 D.死循环

3.2 填空题:

1. 当输入19,2,21时下列程序运行的结果是____21_____。

main()

{int a,b,c,max;

printf(\scanf(\max=a;

if(max

printf(\}

2. 若输入字母C,程序输出结果为【1】;若输入字符*,程序将【2】。

#include main()

{char c1,c2; c1=getchar();

while(c1<97||c1>122)c1=getchar(); c2=c1-32;

printf(\}

3. 以下程序运行的结果为________。

main()

{ int a,b,c,x,y,z; a=10;b=2;

c=!(a%b);x=!(a/b); y=(a=0); z=(a=0);

printf(\} 4. 若输入4,程序运行结果为【 1 】,若输入-4,运行结果为【 2 】,若输入10,运行结果为【 3 】.

main() { int x,y;

scanf(\if(x<1) { y=x;

printf(\

}

else if(x<10) { y=2*x-1;

printf(\} else

{ y=3*x-11;

printf(\}

}

5.以下程序运行的结果________。

main()

{int i=1,sum=0; loop:if(i<=10) {sum+=i; i++;

goto loop; }

printf(\}

6.以下程序运行的结果________。

main()

{ int x=2,y,z;

x*=3+1;

printf(\x+=y=z=5; printf(\x=y==z;

printf(\}

7.以下程序运行的结果________。

#include #include main()

{int i,k,m,n=0;

for(m=1;m<=10;m+=2) { if(n==0)printf(\k=sqrt(m);

for(i=2;i<=k;i++) if(m%i==0)break; if(i>k)

{printf(\n++; } } }

8.如果输入‘1’,‘2’,‘3’,‘4’,程序运行输出的是________。

#include main() {char c; int i,k;

k=0;

for(i=0;i<4;i++) {while(1)

{ c=getchar();if(c>='0'&&c<='9')break;} k=k*10+c-'0'; }

printf(\

}

9.运行以下程序后,如果从键盘上输入china#<回车>,则输出结果为________。

#include main()

{int v1=0,v2=0; char ch;

while ((ch=getchar())!='#') switch(ch) {case 'a': case 'h':

default: v1++; case '0':v2++; }

printf(\ }

10.程序运行结果是_________。

#include main() {int i;

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

{ if(i>4){printf(\printf(\} }

1. 答案:21 2. 答案:【1】c C 【2】等待继续输入,直到输入小写字母。 3. 答案:1,0,0,1 4. 答案:【1】x=4,y=2*x-1=7 【2】x=-4,y=x=-4 【3】x=10,y=3*x-11=19 5. 答案:55 6. 答案:8,14,1 7. 答案:1 3 5 7 8. 答案:1234 9. 答案:5,5 10.答案:1 3 5

20.下列程序计算平均成绩并统计90分及以上人数。

main() {int n,m;

float grade,average; average=n=m=【1】; while(【2】)

{ scanf(\if(grade<0)break; n++;

average+=grade; if(grade<90)【3】; m++; }

if(n)printf(\}

21.下列程序计算Fibonacci数列:1,1,2,3,5,8,13……的前40项。

main()

{int I;long f1,f2; 【1】;

for(I=0;I<20;I++)

{ printf(\if(I%2)printf(\f1+=f2; 【2】; } }

22.下列程序判断一个数是否为素数。

#include #include main() {int I,k,m;

scanf(\k=sqrt(【1】); for(I=2;I<=k;I++) if(m%I==0)【2】;

if(【3】)printf(\else printf(\}

20.答案:【1】0 【2】1 21.答案:【1】f1=1;f2=1 【2】f2+=f1 22.答案:【1】m 【2】break

24.从键盘上输入两个整数m和n,求其最大公约数。

main()

{int a,b,num1,num2,temp;

scanf(\if(【1】)

{ temp=num1; num1=num2; num2=temp; }

a=num1;b=num2; while(b!=0) { temp=【2】;

3】continue 3】I>=k+1

【 【a=b; b=temp; }

printf(\

}

24.答案:【1】num1>num2 【2】a%b

四、关于数组 4.1 选择题

1. 以下关于数组的描述正确的是(C )。

A. 数组的大小是固定的,但可以有不同的类型的数组元素 B. 数组的大小是可变的,但所有数组元素的类型必须相同 C. 数组的大小是固定的,所有数组元素的类型必须相同 D. 数组的大小是可变的,可以有不同的类型的数组元素 2. 以下对一维整型数组a的正确说明是(D )。

A.int a(10); B. int n=10,a[n]; C.int n; D. #define SIZE 10 scanf(\

int a[n];

3. 在C语言中,引用数组元素时,其数组下标的数据类型允许是(C )。

A. 整型常量 B. 整型表达式

C. 整型常量或整型表达式 D. 任何类型的表达式

4. 以下对一维数组m进行正确初始化的是(C )。

A. int m[10]=(0,0,0,0) ; B. int m[10]={ }; C. int m[ ]={0}; D. int m[10]={10*2}; 5. 若有定义:int bb[ 8];。则以下表达式中不能代表数组元bb[1]的地址的是(C )。 A. &bb[0]+1 B. &bb[1] C. &bb[0]++ D. bb+1 9. 执行下面的程序段后,变量k中的值为(A )。 int k=3, s[2]; s[0]=k; k=s[1]*10;

A. 不定值 B. 33 C. 30 D. 10 10. 以下程序的输出结果是(C )

main() {

int i, a[10];

for(i=9;i>=0;i--) a[i]=10-i; printf(\}

A. 258 B. 741 C. 852 D. 369

11. 以下程序运行后,输出结果是(D )。

main() {

int n[5]={0,0,0},i,k=2;

for(i=0;i

A. 不确定的值 B. 2 C. 1 D. 0 12. 以下程序运行后,输出结果是(B )。 main()

{

int y=18,i=0,j,a[8]; do

{ a[i]=y%2; i++; y=y/2;

} while(y>=1);

for(j=i-1;j>=0;j--) printf(\ printf(\

}

A. 10000 B. 10010 C. 00110 D. 10100 13. 以下程序运行后,输出结果是(A )。

main() {

int a[10], a1[ ]={1,3,6,9,10}, a2[ ]={2,4,7,8,15},i=0,j=0,k; for(k=0;k<4;k++)

if(a1[i]

for(k=0;k<4;k++) printf(\ }

A. 1234 B. 1324 C. 2413 D. 4321

17. 若说明:int a[2][3]; 则对a数组元素的正确引用是( C) 。

A. a(1,2) B. a[1,3] C. a[1>2][!1] D. a[2][0] 18. 若有定义:int b[3][4]={0};则下述正确的是(B ) 。

A. 此定义语句不正确 B. 没有元素可得初值0 C. 数组b中各元素均为0

D. 数组b中各元素可得初值但值不一定为0 19. 若有以下数组定义,其中不正确的是(D ) 。

A. int a[2][3];

B int b[][3]={0,1,2,3}; C. int c[100][100]={0};

D. int d[3][]={{1,2},{1,2,3},{1,2,3,4}};

20. 若有以下的定义:int t[5][4];能正确引用t数组的表达式是(C )。

A. t[2][4] B. t[5][0] C. t[0][0] D. t[0,0]

21. 在定义int m[ ][3]={1,2,3,4,5,6};后,m[1][0]的值是(A )。

A. 4 B. 1 C. 2 D. 5 22. 在定义int n[5][6]后第10个元素是(C)。

A. n[2][5] B. n[2][4] C. n[1][3] D. n[1][4] 23. 若二维数组c有m列,则计算任一元素c[i][j]在数组中的位置的公式为(D )。

(假设c[0][0]位于数组的第一个位置)

A. i*m+j B. j*m+i C. i*m+j-1 D. i*m+j+1 24. 若有以下定义语句,则表达式“x[1][1]*x[2][2]”的值是(A )。

float x[3][3]={{1.0,2.0,3.0},{4.0,5.0,6.0}};

A. 0.0 B. 4.0 C. 5.0 D. 6.0 25. 以下程序运行后,输出结果是 (A )。

main() {

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

printf(\}

A. 0650 B. 1470 C. 5430 D. 输出值不定

29. 下述对C语言字符数组的描述中错误的是(C )。

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

B. 字符数组中的字符串可以整体输入、输出

C. 可以在赋值语句中通过赋值运算符\对字符数组整体赋值 D. 不可以用关系运算符对字符数组中的字符串进行比较 30. 下述对C语言字符数组的描述中正确的是 ( A)。

A. 任何一维数组的名称都是该数组存储单元的开始地址,且其每个元素按照顺序连续占存储空间

B. 一维数组的元素在引用时其下标大小没有限制 C. 任何一个一维数组的元素,可以根据内存的情况按照其先后顺序以连续或非连续的方式占用存储空间

D. 一维数组的第一个元素是其下标为1的元素

31. 不能把字符串:Hello!赋给数组b的语句是( B)。

A. char str[10]= {'H', 'e', 'l', 'l', 'o', '! '}; B. char str[10];str=\

C. char str[10];strcpy(str,\D. char str[10]=\32. 合法的数组定义是(D )。

A. int a[]=\ B. int a[5]={0,1,2,3,4,5}; C. int s=\ D. char a[]={0,1,2,3,4,5}; 33. 下列语句中,不正确的是(C )。

A. static char a[2]={1,2}; B. static char a[2]={ '1', '2'}; C. static char a[2]={ '1', '2', '3'}; D. static char a[2]={ '1'}; 34. 若给出以下定义:

char x[ ]=\

char y[ ]={'a','b','c','d','e','f','g'}; 则正确的叙述为(C )。

double r2; float r3; union uu { char u1[5]; long u2[2]; }ua; }mya;

A.30 B.29 C.24 D.22 6. 设有以下定义

typedef union { long i; int k[5]; char c; } DATE; struct date { int cat;

DATE cow; double dog; } too;

DATE max;

则语句printf(〞%d〞,sizeof(struct date)+sizeof(max)))的执行结果是( B )。 A.25 B.30 C.18 D.8 1.A 2.B 3.A 4.B 5.D 6.B

10. 下列程序的执行结果为( A )。

struct s1 { char *s; int i;

struct s1 *sip; }

main()

{ static struct s1 a[]={{\struct s1 *p=a;int i=0;

printf(\printf(\printf(\}

A.abcd abcd abcd 2 0 e B.abcd efgh ijkl 2 0 e C.abcd abcd ijkl 2 0 e D.abcd abcd abcd 2 1 e 11. 下面程序的输出结果为( C )。

struct st { 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(\printf(\printf(\}

A.10 B.50 C. 51 D.60 20 60 60 70 20 21 21 31

12. 设有以下语句:

struct st{int n;struct st *next;};

static struct st a[3]={5,&a[1],7,&a[2],9,'\\0'},*p; p=&a[0];

则表达式( D )的值是6。

A.p++->n B.p->n++ C.(*p).n++ D.++p->n 13. 下面程序的输出是( C )。

main()

{ enum team{my,your=4,his,her=his+10}; printf(\}

A.0 1 2 3 B.0 4 0 10 C.0 4 5 15 D.1 4 5 15 14. 下面程序的输出是( D )。

main()

{ struct cmplx{int x;int y;} cnum[2]={1,3,2,7};

printf(\}

A.0 B.1 C.3 D.6 15. 下面程序的输出是( C )。

typedef union { long x[2];

int y[4]; char z[8];

} MYTYPE; MYTYPE them; main()

{ printf(\}

A.32 B.16 C.8 D.24

10.A 11.C 12.D 13.C 14.D 15.C

8.2 填空题

1. 有以下定义和语句,则sizeof(a)的值是【1】,而sizeof(a.share)的值是【2】。

struct date { int day; int month; int year; union

{ int share1;

float share2; }share; } a;

2.若有以下说明和定义语句,则变量w在内存中所占字节数________。

union aa { float x,y; char c[6]; }; struct st

{ union aa v; float w[5]; double ave; } w;

3.有以下说明定义语句,可用a.day引用结构体成员day,请写出引用结构体成员a.day

的其它两种形式【 1 】 【 2 】。 { int day;

char mouth; int year; } a,*b; b=&a;

4.为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向该结构

的指针域,data用以存放整型数)请填空。

data next

struct link {char data;( 【 1 】 )}node;

5.变量root有如图所示的存储结构,其中sp是指向字符串的指针的指针域,next是指向该

结构的指针域,data用以存放整型数。请填空,完成此结构的类型说明和变量root的定义。

Sp data nextroot

struct list {

char *sp; ( 【1】) ( 【2】 ) }root;

6.以下函数creatlist用来建立一带头节点的单链表,链表的结构如下图所示,新的

节点总是插入在链表的末尾。链表的头指针作为函数值返回。链表最后一个节点的next域放入NULL,作为链表结束的标志。data为字符型数据域,next为指针域。读入时字符以#表示输入结束(#不存入链表)。请填空。

h ? 0

struct node { char data;

struct node *next; }; ……

( 【1】 )creatlist( ) { struct node *h,*s,*r; char ch;

h=(struct node *)malloc(sizeof(struct node)); r=h;

ch=getchar(); while (ch!=?#?)

{ s=(struct node*)malloc(sizeof(struct node)); s->data=( 【2】 ); r->next=s.r; r=s;

ch=getchar(); }

r->next=( 【3】 ); return h; }

1. 答案:【1】10 【2】4 2. 答案:34 3. 答案:【1】(*b).day 【2】b->day 4. 答案:【1】struct link *next 5. 答案:【1】struct list *next 【2】int data 6. 答案:【1】struct 【2】ch 【3】NULL

10. 下面程序的输出结果是________。

struct ks

{ int a;int *b;} main()

{ struct ks s[4],*p;int n=1,i; for(i=0;i<4;i++) { s[i].a=n;

s[i].b=&s[i].a; n=n+2; }

p=&s[0];

printf(\}

10. 答案:2 5

12. 若有以下的说明和语句,已知int类型占两个字节,则以下的输出结果为_______。

main() { struct st { char a[10]; int b; double c; };

printf(\}

13. 若有以下的说明和语句,已知int类型占两个字节,则以下的输出结果为________。

main() { union un { int i;

double y; };

struct st

{ char a[10]; union un b; };

printf(\}

12. 答案:20 13. 答案:18

15. 下面程序的输出是_______。

main()

{ enum em{em1=3,em2=1,em3};

char *aa[]={\

printf(\}

15. 答案:DDBBCC

4. 答案:120 5. 答案:0,0 0,1

15.设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的

首部 【1】 。(要求形参名为b。) main() {

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

fun(s); ┆ }

15. 答案:【1】 void fun(double b[][22]);

17.下面函数的功能是:求x的y次方,请填空。

double fun( double x, int y) { int i; double z;

for(i=1, z=x; i

18.若已定义:int a[10], i;,以下fun函数的功能是:在第一个循环中给前10个数组

元素依次赋1、2、3、4、5、6、7、8、9、10;在第二个循环中使a数组前10个元素中的值对称折叠,变成1、2、3、4、5、5、4、3、2、1。请填空。 fun( int a[ ]) { int i;

for(i=1; i<=10; i++) 【1】=i; for(i=0; i<5; i++) 【2】=a[i]; }

17. 答案:【1】 x 18. 答案:【1】 a[i-1] 【2】 a[9-i]

24.求出数组中的最大、最小元素值以及所有元素的均值。

【1】 ;

float average(int n,float array[]) {

int i; float sum;

max=min=sum= 【2】 ; for(i=1;i

if(maxarray[i]) min=array[i]; }

return(sum/n); }

main() {

int i;

float aver,score[10];

printf(\

for(i=0;i<10;i++) scanf(\【3】 ); aver=average(10,score);

printf(\}

25.下面程序的功能是找出三个字符串中最大串,填空完善程序。

【1】

#include main() {

int i; char string[20],str[3][20]; for(i=0;i<3;i++) gets( 【2】 );

if(strcmp(str[0],str[1])>0) strcpy(string,str[0]); else strcpy(string,str[1]);

if(strcmp(str[2],string)> 【3】 ) strcpy(string,str[2]); printf(\}

24. 答案:【1】 float max,min 【2】 array[0] 【3】 &score[i] 25. 答案:【1】 #include 【2】 str[i] 【3】0

六、预编译 6.1 选择题

1. 下面叙述中正确的是( )。

A. 带参数的宏定义中参数是没有类型的 B. 宏展开将占用程序的运行时间

C. 宏定义命令是C语言中的一种特殊语句

D. 使用#include命令包含的头文件必须以“.h”为后缀 2. 下面叙述中正确的是( )。

A. 宏定义是C语句,所以要在行末加分号

B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套

D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换

3. 在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含

文件的方式为( )。

A. 直接按系统设定的标准方式搜索目录

B. 先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索 C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录

4. 下面叙述中不正确的是(B )。

A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的

字符替换

B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进

行的,在展开时也要分配内存单元,进行值传递

C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问

题,宏没有类型

D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果 5. 下面叙述中不正确的是(D )。

A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进

行的,在展开时不分配内存单元,不进行值传递 C. 宏替换占用编译时间 D. 函数调用占用编译时间

1.A 2.B 3.B 4.B 5.D

10.以下程序执行的输出结果是( A )。

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

int i,j,k; i=10;j=15; k=10*MIN(i,j); printf(\}

A.15 B.100 C.10 D.150 11.下列程序执行后的输出结果是(B )。

#define MA(x) x*(x-1) main() {

int a=1,b=2;

printf(\}

A. 6 B. 8 C. 10 D. 12 12.以下程序的输出结果是( )。

#define M(x,y,z) x*y+z main() {

int a=1,b=2, c=3;

printf(\}

A. 19 B. 17 C. 15 13.程序中头文件typel.h 的内容是( )。

#define N 5 #define M1 N*3 程序如下:

#include \#define M2 N*2 main() { int i; i=M1+M2;

printf(\}

程序编译后运行的输出结果是( )。

A. 10 B. 20 C. 25 14.请读程序:

#include

#define SUB(X,Y) (X)*Y main() {

int a=3, b=4;

printf(\}

上面程序的输出结果是( )。

A. 12 B. 15 C. 16 D. 20

10.A 11.B 12.D 13.C 14.A6.2 填空题

1. 以下程序的输出结果是________。

#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(\}

2. 下面程序的运行结果是________。

#define N 10 #define s(x) x*x #define f(x) (x*x)

D. 12 D. 30

main() {

int i1,i2; i1=1000/s(N); i2=1000/f(N);

printf(\}

3. 设有如下宏定义

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

以下程序段通过宏调用实现变量a、b内容交换,请填空。 float a=5,b=16,c;

MYSWAP( 【1】 ,a,b);

4. 计算圆的周长、面积和球的体积

【1】 main() {

float l,r,s,v;

printf(\scanf(\【2】 ); l=2.0*PI*r; s=PI*r*r;

v=4.0/3*( 【3】 );

printf(\}

5. 计算圆的周长、面积和球的体积

#define PI 3.1415926

#define 【1】 L=2*PI*R; 【2】 ;

main() {

float r,l,s,v; printf(\scanf(\CIRCLE(r,l,s,v);

printf(\【3】 ); } 1. 答案:7

2. 答案:1000,10 3. 答案:【1】 c 4. 答案:【1】 #define PI 3.1415926 【2】 &r 5. 答案:【1】 CIRCLE(R,L,S,V) 【2】 S=PI*R*R;V=PI*R*R*R*4/3

七、指针

3】 PI*r*r*r 3】 r,l,s,v

【【

7.1 选择题

1. 若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是(D)。

A. p=q; B. *p=*q; C. a=*q; D. q=a; 2. 若定义:int a=511, *b=&a;,则printf(\%d\\n\, *b);的输出结果为: D A. 无确定值 B. a的地址 C. 512 D. 511 3. 已有定义 int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是(B)。

A. a=*p1+*p2; B. p1=a; C. p1=p2; D. a=*p1*(*p2); 4. 变量的指针,其含义是指该变量的(B)。

A. 值 B. 地址 C. 名 D. 一个标志 5. 若有说明语句:int a, b, c, *d=&c;,则能正确从键盘读入三个整数分别赋给变量a、b、c

的语句是(A)。

A. scanf(\%d%d%d\, &a, &b, d); B. scanf(\%d%d%d\, a, b, d);

C. scanf(\%d%d%d\, &a, &b, &d); D. scanf(\%d%d%d\, a, b,*d); 6. 若已定义int a=5; 下面对(1)、(2)两个语句的正确解释是(D)。

(1) int *p=&a; (2) *p=a;

A. 语句(1)和(2)中的*p含义相同,都表示给指针变量p赋值。 B. (1)和(2)语句的执行结果,都是把变量a的地址值赋给指针变量p。 C. (1)在对p进行说明的同时进行初始化,使p指向a;

(2)变量a的值赋给指针变量p。

D. (1)在对p进行说明的同时进行初始化,使p指向a; (2)将变量a的值赋予*p。

11.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是(B)。 #include main()

{

int *p, *q, a, b; p=&a;

printf(\input a:\); scanf(\%d\, *p); … }

A. *p表示的是指针变量p的地址

B. *p表示的是变量a的值,而不是变量a的地址 C. *p表示的是指针变量p的值

D. *p只能用来说明p是一个指针变量

12.下面程序的功能是从输入的十个字符串中找出最长的那个串。请在___A_____处填空。 #include \stdio.h\ #include \string.h\ #define N 10 main()

{

char s[N][81], * t; int j;

for (j=0; j

gets (s[j]); t= *s;

for (j=1; j

if (strlen(t)

printf(\the max length of ten strings is: %d, %s\\n\, strlen(t), t); }

A. t=s[j] B. t=&s[j] C. t= s++ D. t=s[j][0] 13.下面判断正确的是(C)。

A. char *s=\girl\; 等价于 char *s; *s=\girl\;

B. char s[10]={\girl\}; 等价于 char s[10]; s[10]={\girl\}; C. char *s=\girl\; 等价于 char *s; s=\girl\; D. char s[4]= \boy\, t[4]= \boy\; 等价于 char s[4]=t[4]= \boy\

14.设char *s=\\\ta\\017bc\;则指针变量s指向的字符串所占的字节数是(C)。

A. 9 B. 5 C. 6 D. 7 15.下面程序段中,for循环的执行次数是(C)。 char *s=\\\ta\\018bc\;

for (;*s!='\\0';s++) printf(\*\);

A. 9 B. 5 C. 6 D. 7 16.以下不能正确进行字符串赋初值的语句是(A)。

A. char str[5]= \good!\; B. char *str=\good!\; C. char str[]=\good!\;

D. char str[5]={'g', 'o','o', 'd'};

17.若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是(A)。

A. p=2*(int *)malloc(sizeof(int)); B. p=(int *)malloc(2*sizeof(int)); C. p=(int *)malloc(2*2);

D. p=(int*)calloc(2, sizeof(int)); 18.下面程序段的运行结果是(C)。 char *s=\abcde\; s+=2;

printf(\%d\, s);

A. cde B. 字符'c' C. 字符'c'的地址 D. 无确定的输出结果 19.设有如下的程序段:char s[]=\girl\, *t; t=s;则下列叙述正确的是(D)。

A. s和t完全相同

B. 数组s中的内容和指针变量t中的内容相等 C. s数组长度和t所指向的字符串长度相等 D. *t与s[0]相等

20.以下正确的程序段是(C)。

A. char s[20]; B. char *s;

scanf(\%s\, &s); scanf(\%s\, s); C. char s[20]; D. char s[20], *t=s; scanf(\%s\, &s[2]); scanf(\%s\, t[2]); 21.下面程序段的运行结果是(C)。

#include \stdio.h\ main()

{

int m=10, n=20;

char *format=\%s, m=%d, n=%d\\n\; m*=n;

printf(format, \m*=n\, m,n); }

A. format, \m*=n\, m, n B. format, \m*=n\ C. m*=n, m=200, n=20 D. 以上结果都不对

26.若有以下定义和语句:

int s[4][5], (*ps)[5]; ps=s;

则对s数组元素的正确引用形式是(C)。

A. ps+1 B. *(ps+3) C. ps[0][2] D. *(ps+1)+3 27.不合法的main函数命令行参数表示形式是:(B)。

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

28.若有说明语句:char s[]=\it is a example.\, *t=\it is a example.\;则以下不正确的叙述

(D)。

A. s表示的是第一个字符i的地址,s+1表示的是第二个字符t的地址 B. t指向另外的字符串时,字符串的长度不受限制 C. t变量中存放的地址值可以改变 D. s中只能存放16个字符

29.若已定义char s[10];则在下面表达式中不表示s[1]地址的是(B)。

A. s+1 B. s++ C. &s[0]+1 D. &s[1] 30.下面程序段的运行结果是(C)。(注:└┘代表空格) #include \stdio.h\ main()

{ char s[6];

s=\abcd\;

printf(\\\\%s\\\\\n\, s); }

A. \abcd\ B. \abcd└┘\ C. \\\abcd\\\ D. 编译出错 31.执行以下程序后,a的值为【1C】, b的值为【2C】。

#include main() {

int a, b, k=4, m=6, *p=&k, *q=&m; a=p==&m;

b=(-*p)/(*q)+7;

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

37.下列程序的输出结果是(C)。

#include \stdio.h\ main()

{

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

printf(\%d\\n\, *p+9); }

A. 0 B. 1 C. 10 D. 9 38.以下程序的输出结果是( C)。

#include \stdio.h\ char cchar(char ch) {

if (ch>='A' && ch<='Z') ch=ch-'A'+'a'; return ch; }

main() {

char s[]=\ABC+abc=defDEF\, *p=s; while(*p) {

*p=cchar(*p); p++; }

printf(\%s\\n\,s); }

A. abc+ABC=DEFdef B.C. abc+abc=defdef D.

39.以下程序的输出结果是(D)。

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

{

char b1[8]=\abcdefg\, b2[8], *pb=b1+3;

while( --pb>=b1) strcpy(b2, pb); printf(\%d\\n\, strlen(b2)); }

A. 8 B. 3 C. 1 40.有以下程序

#include \string.h\ #include \stdio.h\ main() {

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

程序运行后的输出结果是( D)。

A. 12 B. 15 C. 6

45.下列程序段的输出结果是( A)。

#include \stdio.h\

abcaABCDEFdef abcabcdefdef D. 7 D. 5

void fun( int *x, int *y) {

printf(\%d%d\, *x, *y); *x=3; *y=4; }

main() {

int x=1, y=2; fun(&y, &x);

printf(\%d %d\, x, y); }

A. 2 1 4 3 B. 1 2 1 2 C. 1 2 3 4 D. 2 1 1 2 46.下列程序的输出结果是(C)。

#include \stdio.h\ main() {

char a[10]={9,8,7,6,5,4,3,2,1,0}, *p=a+5; printf(\%d\, *--p); }

A. 非法 B. a[4]的地址 C. 5 D. 3

7.2 填空题

1. 设有定义:int a, *p=&a; 以下语句将利用指针变量p读写变量a中的内容,请将语句补

充完整。

scanf(\%d\, 【1】 ); printf(\%d\\n\, 【2】 );

1. 答案:【1】p 【2】 *p

3. 以下程序的运行结果是________。

#include \stdio.h\ #include \string.h\ int *p; main() {

int x=1, y=2, z=3; p=&y;

fun(x+z, &y);

printf(\(1) %d %d %d\\n\, x, y, *p); }

fun( int x, int *y) {

int z=4; *p=*y+z;

x=*p-z;

printf(\(2) %d %d %d\\n\, x, *y, *p);

}

4. 下面程序段是把从终端读入的一行字符作为字符串放在字符数组中,然后输出。请填空。 #include \stdio.h\ #include \string.h\ main() {

int m;

char s[80], *t;

for (m=0; m<79; m++) {

s[m]=getchar();

if (s[m]=='\\n') break; }

s[m]= 【1】; t=【2】;

while (*t) putchar(*t++); }

5. 下面程序段的运行结果是________。 char s[80], *t=\EXAMPLE\; t=strcpy(s, t); s[0]='e';

puts(t);

6. 函数sstrcmp()的功能是对两个字符串进行比较。当s所指字符串相等时,返回值为0;当

s所指字符串大于t所指字符串时,返回值大于0;当s所指字符串小于t所指字符串时,返回值小于0(功能等同于库函数strcmp())。请填空。 #include \stdio.h\

int sstrcmp( char *s, char *t) {

while (*s && *t && *s==【1】) {

s++; t++;

}

return 【2】; }

7. 下面程序的运行结果是________。

void swap(int *a, int *b) {

int *t; t=a; a=b; b=t; }

main() {

int x=3, y=5, *p=&x, *q=&y; swap(p,q);

printf(\%d %d\\n\, *p, *q); }

8. 以下程序的输出结果是________。

#include \stdio.h\ main() {

char *p=\abcdefgh\, *r; long *q; q=(long *) p; q++;

r=(char *) q;

printf(\%s\\n\, r); }

9. 下面程序的功能是将字符串中的数字字符删除后输出。请填空。 #include \stdio.h\ #include \malloc.h\ void delnum( char *t)

{

int m, n;

for (m=0,n=0; t[m]!='\\0';m++)

if (t[m]<'0' 【1】t[m]>'9')

{ t[n]=t[m]; n++;}

【2】; }

main()

{

char *s;

s=(char *) malloc (sizeof(char)); /*给s分配一个地址*/

printf(\\\n input the original string:\); gets(s); delnum(s); puts(【3】); }

10.下面程序的功能是比较两个字符串是否相等,若相等则返回1,否则返回0。请填空。

#include \stdio.h\ #include \string.h\

fun (char *s, char *t) {

int m=0;

while (*(s+m)==*(t+m) && 【1】) m++; return (【2】); }

3. 答案:(2) 2 6 6

(1) 1 6 6

4. 答案:【1】'\\0' 【2】s 5. 答案:eXAMPLE 6. 答案:【1】*t 【2】 *s-*t 7. 答案:3 5

8. 答案:efgh 9. 答案:【1】|| 【2】t[n]= '\\0' 【3】s 10.答案:【1】s[m]!='\\0' 【2】(*(s+m)== '\\0' && *(t+m)=='\\0')? 1:0

17.以下程序将数组a中的数据按逆序存放。请填空。

#include \stdio.h\ #define M 10 main()

{

int a[M], m, n, temp;

for( m=0; m

temp=*(a+m); 【1】;

*(【2】)=temp; m++; n--;}

for (m=0;m

18.以下程序在a数组中查找与x值相同的元素的所在位置。请填空。

#include \stdio.h\ main() {

int a[11], x, m;

printf(\please input ten numbers:\\n\); for(m=1;m<11;m++) scanf(\%d\, a+m); printf(\please input x:\); scanf(\%d\, &x); *a=【1】; m=10;

while (x!=*(a+m)) 【2】;

if (m>0) printf(\]'s position is : M\\n\, x, m); else printf(\%d not been found!\\n\, x); }

19.以下程序的功能是________。

#include \stdio.h\ main() {

char * s[]=={ \PASCAL\, \FORTRAN\, \COBOL\, \BASIC\}; char **p; int n; p=s;

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

printf(\%s\\n\, *(p++)); }

20.若有定义和语句:int a[4]={1,2,3,4},*p; p=&a[2]; ,则*--p的值是________。 21.若有定义和语句:int a[2][3]={0}, (*p)[3]; p=a;,则p+1表示数组________。 22.若有如下定义和语句:

int *p[3], a[6], n;

for (m=0;m<3;m++) p[m]=&a[2*m]; 则*p[0]引用的是a数组元素【1】;*(p[1]+1)引用的是a数组元素【2】。

17.答案:【1】*(a+m)=*(a+n) 【2】a+n 18.答案:【1】x 【2】m-- 19.答案:PASCAL FORTRAN COBOL BASIC 20.答案:2

21.答案:&a[1][0] 22.答案:【1】a[0] 【2】a[3]

25.定义语句int *f();和int (*f)();的含义分别为【1】和【2】。 26.请根据运行结果,完成main函数中的填空。 Array_add( int a[], int n) {

int m, sum=0;

for (m=0;m

main() {

int Array_add(int a[], int n);

static int a[3][4]={2,4,6,8,10,12,14,16,18,20,22,24}; int *p, total1, total2; 【1】;

pt=Array_add; p=a[0];

total1=Array_add(p,12); total2=(*pt)(【2】);

printf(\total1=%d\\ntotal2=%d\\n\, total1,total2); }

运行结果:total1=156 total2=156

25.答案:【1】函数的返回值为指向int类型的指针 【2】定义一个指向函数的指针 26.答案:【1】int (*pt)() 【2】p,12

八、结构体与共用体

8.1 选择题

1. 以下程序运行的输出结果是(A )。

main()

{union {char i[2]; int k; }r;

r.i[0]=2;r.i[1]=0; printf(\}

A.2 B.1 C.0 D.不确定 2. 有以下程序输出结果是( B )。

#include struct stu {int num;

char name[10]; int age; };

void fun(struct stu *p)

{printf(\main()

{struct stu students[3]=

{{9801,\

fun(students+2);}

A.Zhang B.Zhao C.Wang D.18 3. 有下列程序输出结果是( A )。

#include main() {union {int k; char i[2]; }*s,a; s=&a;

s->i[0]=0x39; s->i[1]=0x38;

printf(\ }

A.3839 B.3938 C.380039 D.390038 4. 设有如下定义:

struct sk { int a; float b; } data,*p;

若有p=&data;则对data中的a 域的正确引用是( B )。

A.(*p).data.a B.(*p).a C.p->data.a D.p.data.a 5. 若有下面的说明和定义,则sizeof(struct aa)的值是( D )。

struct aa { int r1;

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

Top