c答案

更新时间:2023-03-15 14:02:01 阅读量: 教育文库 文档下载

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

第6章 课后练习及作业习题指导

作业01:C语言简介及算法

一、选择题

1.一个C程序要有一个main函数,还可以包含( )个其他函数函数。 A.一个

B. 多个

C.若干

D.任意

2.下面不可以使用( )来编译和连接一个C程序。 A.Turbo C

B.VC++

C.C语言编译器

D.BC

3.C语言的程序一行写不下时,可以( )。 A.用逗号换行 B.用分号换行 C.在任意一空格处换行 D.用回车符换行

4.C控制语句有( )种。 A.6

B.9 C.32

5.复合语句是用一对( )界定的语句块。 A.{ }

B.[] C.()

D.‖

6.一个C程序的执行总是从该程序的( )函数开始,在( )函数最后结束。A.第一个、最后一个

B.main、main

C.主函数、最后一个

D.第一个、第一个

7.C语言提供的合法的数据类型关键字( )。 A. Float

B.signed

C.integer

8.在以下各组标识符中,合法的标识符是( )。 (1)A.B01 B.table_1 C. 0_t D. k% (2)A.Fast_ B. void C.pbl D. (3)A.xy_ B.longdouble C.*p D.CHAR (4)A. sj

B.Int C._xy

D.w_y23

9.C语言的标识符里不能有( )。 A.大小写字母 B.数字 C. . D.下划线

二、填空题

1.C程序是由( 函数 )构成的,一个C程序中至少包含(一个函数main )。 因此,(函数)是C程序的基本单位。

2.C程序注释是由( /* )和( */ )所界定的文字信息组成的。 3.函数体一般包括( 声明部分 )和( 执行部分 )。 4.算法是解决问题的( 方法 )和( 步骤 )的描述。

5.C程序的注释部分可以出现在程序的( 任意 )位置,它对程序的编 译和运行( 不起 )作用,但是可以增加程序的( 可读性 )。

D.34

D.Char

作业02:C语言数据类型、基本运算及简单程序设计

一、选择题

1.不合法的字符常量是( )。

A. ?\\t‘

B. ―A‖

C. ?a‘

D.‘\\x32‘

2.逻辑运算符两侧运算对象的数据类型( )。

A.只能是0或1 B.只能是0或非0正数 C.只能是整型或字符型数据

D.可以是任何类型的数据

3.下列表达式中,不能满足―当x的值为偶数时值为真,为奇数时值为假‖的要求( )。

A.x%2==0

B.!x%2!=0 C.(x/2*2-x)==0

D.!(x%2)

4.下面选项中,不是合法整型常量的是( )。

A.160 B.-0xcdg C.-01

D.-0x48a

5.能正确表示―当x的取值在[1,10]和[200,210]范围内为真,否则为假‖的表达式是( )。

A.(x>=1) && (x<=10) && (x>=200) && (x<=210) B.(x>=1) | | (x<=10) | | (x>=200) | | (x<=210) C.(x>=1) && (x<=10) | | (x>=200) && (x<=210) D.(x>=1) | | (x<=10) && (x>=200) | | (x<=210)

6.putchar ( )函数可以向终端输出一个( )。

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

B.实型变量值 D.字符或字符型变量值

7.在C语言中,要求参加运算的数必须时整数的运算符是( )。

A./

B.*

C.%

D. =

8.在C语言中,字符型数据在内存中以【 】形式存放。

A.原码

B.BCD码

C.反码

D.ASCII码

9.下列语句中,符合语法的赋值语句是( )。

A.a=7+b+c=a+7; C.a=(7+b,b++,a+7);

B.a=7+b++=a+7; D.a=7+b,c=a+7;

10. ( )是非法的C语言转义字符。

A.?\\b‘

B. ?\\0xf‘ C.?\\037‘

D.?\\‘‘

11.对于语句:f=(3.0,4.0,5.0),(2.0,1.0,0.0);的判断中,( )是正确的。

A.语法错误

B.f为5.0 C.f为0.0

D.f为2.0

12.与代数式(x*y)/(u*v) 不等价的C语言表达式是( )。

A.x*y/u*v B.x*y/u/v C.x*y/(u*v) D.x/(u*v)*y 13.已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为

10,20,A和B,当从第一列开始输入数据时,正确的数据输入方式是( )。

int a1,a2; char c1,c2;

scanf(―%d%d%c%c‖,&a1,&a2,&c1,&c2);

A.10A 20B↙ B.10 A 20 B↙ C.10A20B↙ D.10 20AB↙ 14.C语言中整数-8在内存中的存储形式为( )。

A.1111111111111000 C.000000000001000

B.100000000001000 D.1111111111110111

15.对于char cx=‘ \\039‘;语句,正确的是( )。

A.不合法 C.cx的值为四个字符

B.cx的ASCII值是33 D.cx的值为三个字符

16.若int k=7,x=12;则能使值为3的表达式是( )。

A.x%=(k%=5) B.x%=(k-k%5) C.x%=k-k%5 D.(x%=k)-(k%=5)

17.为了计算s=10!(即10的阶乘.,则s变量应定义为( )。

A.int B.unsigned C.long D.以上三种类型均可

18.若w=1,x=2,y=3,z=4,则条件表达式w

A.4

B.3

C.2

D.1

19.若运行时输入:12345678↙,则下列程序运行结果为( )。

main ( )

{ int a,b; scanf(―--=‖,&a,&b); printf(―%d\\n‖,a+b);} A.46

B.579 C.5690

D.出错

20.设变量n为float型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是( )。

A.n=(n*100+0.5)/100.0 B.m=n*100+0.5, n=m/100.0 C.n=n*100+0.5/100.0 D.n=(n/100+0.5)*100.0

二、填空题

1.在C语言中,一个char数据在内存中所占字节数为( 1 ),其数值范围为(0-255 );一个int数据在内存中所占字节数为( 2 ),一个long数据在内存中所占字节数为( 4 个float数据在内存中所占字节数为( 4 )。

2.字符常量使用一对( 单引号 )界定单个字符,而字符串常量使用一对( 双引号 )来界定若干个字符的序列。

3.C语言中基本数据类型可以分为( 整型 ),( 实型 ),( 字符型 ),(空类型 );构造数据类型可以分为(枚举类型 ),(数组类型 ),(结构体类型 ),(共用体类型 )。 4.设x=2.5,a=7,y=4.7, 则x+a%3*(int)(x+y)%2/4为( 2.75 )。

5.自增运算符(++)或自减运算符(--)只能用于( 变量 ),不能用于( 常量或表达式 )。 6.表达式5%(-3)的值是( 2 ),表达式-5%(-3)的值是( -2 )。

7.已知A=7.5,B=2,C=3.6,表达式A>B && C>A || AB的值是( 0 )。 8.已知int a=12,n=5;则:表达式运算后a的值各为( )。 a+=a 24 a-=2 10 a*=2+3 60 a/=a+a 0 n%=(n%=2) 0 a+=a-=a*=a 0

9.设int a; float f; double i ;则表达式10+‘a‘+i*f值的数据类型是(double )。 10.假设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为( 9 )。 三、读程序写运行结果

1.main ( ) //按两字节整型考虑

{int a= -1; printf(―%d,%u,%o,%x‖,a,a,a,a);} //-1,65535,177777,ffff 2.main ( ) { int x=-1,y=4,k;

k=x++<=0 && !(y--<=0);

printf(―%d,%d,%d‖,k,x,y);} // 1,0,3 3.main ( )

{ int a,b,c; int x=5,y=10; a=(--y==x++) ? –y : ++x ; b=y++ ; c=x ;

printf(―%d,%d,%d‖,a,b,c);} // 7,9,7

4.若运行时输入100↙,写出以下程序的运行结果。 main ( ) { int a ;

scanf(―%d‖,&a);

printf(―%s‖,(a%2!=0)?‖No‖:‖Yes‖);} // Yes 四、编程题

1.由键盘任意输入2个数,分别计算输出它们的和、差、积、商。

#include

);一

main( ) { float a,b;

printf(\ a,b=\ scanf(\%f,%f\printf(\%f+%f=%f\\n\,a+b); printf(\%f-%f=%f\\n\,a,b,a-b); printf(\%f*%f=%f\\n\,a,b,a*b); printf(\%f/%f=%f\\n\,a/b); }

2.假设m是一个三位数,则输出将m的个位,十位,百位反序而成的 三位数(例如:123反序为321。 main ( ) { int m;

scanf(\%d\,&m); printf(\%d\); printf(\%d\10); printf(\%d\\n\100); }

#include main( ) { int m,n,a,b,c; scanf(\%d\ c=m; b=m/10; a=m/100; n=c*100+b*10+a; printf(\%d\\n\ }

3.已知int x=10,y=12;写出将x和y的值互相交换的表达式。

{t=x;x=y;y=t;}

或 {x=x+y; y=x-y; x=x-y;}

4.任意输入一个字符,输出此字符对应的ASCII码。 main ( ) { char ch;

scanf(\%c\,&ch); printf(\%d\

}

5.已知一个学生的4门功课的成绩,计算平均成绩。 main() {int a,b,c,d;

scanf(\ printf(\}

作业03:分支结构程序设计

一、选择题

1.下面的程序( )。 #include main( )

{ int x =3,y =0,z =0; if(x =y +z)printf(\else printf(\

A.有语法错误不能通过编译 B.输出 * * * *

C.可以通过编译,但是不能通过连接,因而不能运行 D.输出# # # #

2.两次运行下面的程序,如果从键盘上分别输入6和4,则输出结果是( #include main( ) { int x;

scanf(\ %d \if(x++>5)printf(\d\ else printf(\d\\n\

A.7和5 B.6和3 C.7和4 D.6和4 3.以下程序的输出结果是( )。 #include main( )

{ int a =-1,b =4,k;

k =(++a<0)&&! (b- -<= 0); printf(\d%d%d \\n\,a,b);}

A.104 B.103 C.003 D.004

4.能正确表示a≥10或a≤ 0的关系表达式是( )。 A.a >=10or a < =0 B. a >=10| a < =0 C.a >=10& &a < =0

D. a >=10||a < =0

5.假定所有变量以正确说明,下列程序段运行后x的值是( )。 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

6.表示关系X≤Y≤Z的c语言表达式为( )。 A.(X < =Y)&&(Y< =Z). B.(X < =Y)AND(Y< =Z) C.(X < =Y< =Z) D.(X < =Y)&(Y <=Z)

7.如下程序的输出结果是( )。 #include main( ) { int a,b,c =246; a=c/100%9;

b=(-1)& &(-1); b为真 so, b=1 printf(\d,%d\\n\,a,b);}

)。

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

8.当a=1、b=2、c=5、d=5时,执行下面的程序后,x的值是( )。 if(a

if(c

B.2

C.3

D.6

9.能正确表示a和b同时为正或同时为负的逻辑表达式是( )。 A.(a>=0||bx>=0)&& (a<0||b<=0) B.(a>=0&&b>=0)&& (a<0&&b<=0) C. (a+b>0)&& (a+b<=0) D.a * b >0

10. 若a、b、c1、c2、x、y、均是整型变量,正确的switch语句是( )。 A.switch(a +b);

B. switch(a +b)

{ case 1:y =a +b;break; { case 3:

case 0:y =a -b;break; case 1:y =a +b;break; } case 3:y =b –a,break;} C.switch a D. switch(a –b) { case c1:y =a -b;break; { default:y =a *b;break; case c2:x =a *b;break; case 3:case 4:x=a +b;break;

default:x =a +b; } case 10:case 11:y =a -b;break;} 11.下列关于switch语句和break语句的结论中,正确的是( )。 A.break语句是switch语句中的一部分

B.在switch语句中可以根据需要使用或不使用break语句 C.在switch语句中必须使用break语句 D.break语句只能用于switch语句中

12.设有说明语句“int a =1,b=0;”则执行以下语句后,输出为( )。 switch(a) { case 1: switch(b)

{ case 0:printf(\ );break;

case 1:printf(\ak; } case 2:printf(\ );break; }

A.* * 0 * * B.* * 0 * * * * 2 * * C.* * 0 * * * * 1 * * * * 2 * * D.有语法错误 13.以下关于运算符优先顺序的描述中正确的是( )。 A.关系运算符<算术运算符<赋值运算符<逻辑与运算符 B.逻辑与运算符<关系运算符<算术运算符<赋值运算符 C.赋值运算符<逻辑与运算符<关系运算符<算术运算符 D.算术运算符<关系运算符<赋值运算符<逻辑与运算符 14.为了避免在嵌套的条件语句if···else中产生二义性,C语 言规定:else字句总是与( )配对。

A.缩排位置相同的if B. 其之前最近的if C.其之后最近的if D. 同一行上的if

15.有定义语句:int a =1 ,b =2,c =3,x;,则以下选项中各程序段执行后, x的值不等于3的是( )。

A.if(c

else if(b

else x =3; else x =1; C.if(a <3) x =3; D. if(a

if(b

if(a <1) x =1; if(c

{ int a =5,b =4,c= 3, d= 2; if (a> b> c)

printf(\d\\n\ else if ((c-1> = d) = = 1); printf(\d\\n\,d+ 1); else

printf(\d\\n\ 2);} 执行后输出结果是( )。 A.2

B.3 1 x >0

17.有一函数:y = 0 x =0 ,以下程序段中不能根据x值正确计算出y值的是( )。

-1 x <0

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

if(x >0) y =1;

C.4 D.编译时有错,无结果

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

if(x >0) y =1;

if(x >0) y =1; else y =0; else y =-1; else y = -1; 18.与y=(x >0?1:x <0? -1:0);的功能相同的if语句是( )。 A.if(x >0) y =1; B. if(x) else if(x<0) y = -1;

if(x >0) y=1;

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

C.y = -1; D. y =0; if(x)

if(x > =0)

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

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

if(b < d) x = 2; else x = 3; else x = 6; else x = 7;

20.为了使输出结果为:t=4,则给a和b输入的值应满足的条件是( )。 main( ) { int s,t,a,b;

A.a>b B.a

C.0

D.0 >a>b

scanf (\ %d,%d \ s =1;t =1; if (a >0) s =s +1; if (a >b) t =s +1; else if (a = =b) t =5; else t =2*s; printf(\d \\n\,t);} 二、填空题

1.表示“整数x的绝对值大于5”时值为“真”的c语言 表达式是( x>5 || x<-5 )。

2.若从键盘输入58,则以下程序的结果是( 58 58 58 )。 #include main( ) { int a;

scanf(\ %d \ if(a>50) printf(\d \ if(a>40) printf(\%d \ if(a>30) printf(\d \,a);} 3.以下程序的输出结果是( 0 )。 #include main( )

{ int a =5,b =4,c=3,d; d= (a>b>c); printf(\d \\n\

4.20

6.以下程序的输出结果是( 2 )。 #include main( )

{ int x=2,y= -1,z =2; if(x

if(y <0)z =0; else z + =1; printf(\d\\n\,z);}

7.若运行时输入12,则以下程序的结果( 0 )。 #include main( ) { int x,y;

scanf(\d \ y =x >12? x +10:x -12;

)。

printf(\d \\n\

8.设x、y、z均为int型变量,请写出描述“x或y中至少有一个小于z”的 表达式(x

9.已知A =7.5,B =2,C =3.6,表达式A > B&&C >A||A B的值是( 0 )。 10.若已知x,y,z均为int型变量,请写出下列printf函数的输出结果 (1)x=y=z=0; ++x||++y&&++z;

printf(\%d\\ty=%d\\tz=%d\\n\x=1 y=0 z=0______ (2) x=y=z=-1;

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

printf(\%d\\ty=%d\\tz=%d\\n\x=0 y=-1 z=-1_____ (3) x=y=z=-1;

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

printf(\%d\\ty=%d\\tz=%d\\n\x=0 y=-2 z=-2_____ 三、读程序写运行结果

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

{ int a =1,b =3,c =5;

if(c =a +b) printf(\,); else printf(\o\\n\2.若有以下程序 main( )

{ int a =4,b =3,c =5,t =0; if (a

printf(\d %d %d \\n\,c);} 执行后输出结果是( 5 0 3 )。

3.以下程序运行后的输出结果是( 20 ,0 )。 main( )

{ int x =10,y =20,t =0; if(x = =y) t =x;x =y;y =t;

printf(\d ,%d\\n\ }

4.以下主程序运行后的输出结果是( 1 3 2 )。 main( )

{ int i,m =0,n =0,k =0; for(i =9;i <=11;i++) switch(i)

{ case 0:m ++;n++;break; case 10:n++;break;

default: k++;n++; } printf(\d %d %d \\n\); }

四、阅读下列程序,在【】处填入适当内容,使程序完整。 1.输入x、y两个整数,按先大后小的顺序输出x、y。 #include ―stdio.h‖ main( )

{ int x,y, 【1】t;

scanf(“%d %d”,&x,&y);

if(x

{ 【2】t=x; 【3】x=y; 【4】y=t; } printf(“x=%d,y=%d\\n”,x,y); } 2.输入一个三位数,按逆序输出各个位数 #include ―stdio.h‖ main( ) { int x,a,b,c,y; scanf(―%d‖,&x); a=【5】; // x b=【6】; // x/10 c=【7】; // x/100 y=a*100+b*10+c; printf(―y=%d\\n‖,y);}

3.输入百分制成绩,要求输出成绩的等级‘A‘,‘B‘,‘C‘,‘D‘,‘E‘。90分以上为‘A‘,80~89分为‘B‘,70~79分为‘C‘,60~69分为‘D‘,60分以下为‘E‘。 #include ―stdio.h‖ main( ) {float score;

【11】; // char grade printf(―请输入学生成绩:‖); scanf(―%f‖,&score);

switch(【12】) // (int)(score/10) { case 10:

case 9 : grade=‘A‘;break; case 8 : grade=‘B‘;break; case 7 : grade=‘C‘;break; case 6 : grade=‘D‘;break; case 5 : case 4 : case 3 : case 2 : case 1 :

case 0 : grade=‘E‘;}

printf(―成绩是%5.1f,相应的等级是%c。\\n‖,score,grade);} 五、编程题

1.从键盘输入一个字符,如果该字符为小写字母,则转换为大写字母输出;如果该字符为大写字母,则转换为小写字母输出;如果为其它字符,则原样输出。 #include main( ) { char c; c=getchar();

if(c>='A' && c<='Z') printf(\%c\,c+32); else if (c>='a' && c<='z')printf(\%c\,c-32); else printf(\%c\ }

2 .有一函数

?x...........(x?1)?y??2x?1....(1?x?10)?3x?11...(x?10)?

写一程序,输入x,输出y值。

#include main( ) { int x,y; scanf(\%d\,&x); if(x<1) y=x;

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

else y=3*x-11; printf(\%d\,y); }

3.用整数1—12依次表示1—12月,由键盘输入一个月份数,输出对应的季节(中文)英文名称(12—2月为冬季;3—5月为春季;6—8月为夏季;9—11月为秋季。)

#include \o.h\main( ) {int x;

printf(\请输入月份:\ scanf(\%d\,&x); switch(x) { case 12: case 1:

case 2: printf(\冬季 \\n\ak; case 3: case 4:

case 5: printf(\春季 \\n\ak; case 6: case 7:

case 8: printf(\夏季 \\n\ak; case 9: case 10:

case 11: printf(\秋季 \\n\ak; default : printf(\输入错误!\\n\ } }

4.征税的办法如下:收入在800元以下(含800元)的不征税;收入在800元以上,1200元以下者,超过800元的部分按5%的税率征税;收入在1200元以上,2000元以下者,超过1200元的部分按8%的税率征税;收入在2000元以上,2000元以上部分按20%的税率征税,试编写按收入计算税费的程序。

#include main( ) { float x,y;

printf(\请输入工资额=\

scanf(\%f\ if(x<=800) y=0;

else if(x<=1200) y=(x-800)*0.05;

else if(x<=2000) y=(1200-800)*0.05+(x-1200)*0.08; else y=(1200-800)*0.05+(2000-1200)*0.08+(x-2000)*0.2; printf(\%f\}

作业04:循环结构程序设计

一、选择题 1.有下列程序: main( ) {int k=5;

while(--k)printf(―%d‖,k-=3); printf(―\\n‖);}

执行后的输出结果是( )。 A.1 B.2 C.4

D.死循环

2.有下列程序段: int n,t=1,s=0; scanf(―%d‖,&n) ;

do{s=s+t ;t=t-2 ;}while(t !=n) ;

为使此程序段不陷入死循环,从键盘输入的数据应该是( )。 A.任意正奇数 B.任意负偶数 C.任意正偶数

D. 任意负奇数

3.若变量已经正确定义,有下列程序段: i=0;

do printf(―%d,‖,i); while(i++); printf(―%d\\n‖,i); 其输出结果是( )。 A.0,0 B.0,1

C.1,1

D.程序进入无限循环

4.若如下不构成无限循环的语句或语句组是( )。 A.n=0;

B.n=0;

do{++n;}while(n<=o); while(1) {n++;} C.n=10; D.for(n=0,i=1;

while(n);{n--;}

5.设变量已经正确定义,则以下能正确计算f=n!的程序段是( )。 A.f=0;

B.f=1;

for(i=1;i<=n;i++)f*=i ; for(i=1;i

D.f=1;

for(i=n;i>1;i++)f*=i;

for(i=n;i>=2;i--)f*=i;

6.有下列程序: #include main( ) {int i,j,m=55; for(i=1;i<=3;i++)

for(j=3;j<=i;j++) m=m%j; printf(―%d\\n‖,m);}

程序的运行结果是( )。 A.0 B.1 C.2

D.3

7.有下列程序 #include main()

;i++)n+=i;

{int x=8; for(;x>0;x--)

{if(x%3) {printf(―%d,‖,x--);continue;} printf(―%d,‖,--x); } }

程序的运行结果是( )。 A.7,4,2 C.9,7,6,4

8.有下列程序: main() {int i,j,x=0; for(i=0;i<2;i++) {x++;

for(j=0;j<=3;j++) {if(j%2) continue; x++;} x++;}

printf(―x=%d\\n‖,x);}

程序执行后的输出结果是( )。 A.x=4 C.x=6

9.下列程序的输出结果是( )。 main() {int a=1,b;

for(b=1;b<=10;b++) {if(a>=8) break; if(a%2= =1) {a+=5;continue;} a=3;}

printf(―%d\\n‖.b);} ?? A.3 C.5

10.若有如下语句,则程序段( )。 int x=6;

do{printf(―%d\\n‖,x-=2);} while(--x); A.输出的是1

C.输出的是3和0

11.下面程序段的输出结果是( )。 a=1;b=2;c=2; while(a

{t=a;a=b;b=t;c--;}

printf(―%d,%d,%d‖,a,b,c); A.1,2,0 C.1,2,1

12.下面程序的输出结果是( )。 #include main()

{int x=10,y=10,i;

B.8,7,5,2

D.8,5,4,2,

B.x=8

D.x=12

B.4

D.6

B.输出的是4和1

D.是死循环

B.2,1,0

D.2,1,1

作业08:结构体和共用体

一、选择题

1.设struct {int a; char b; } Q, *p=&Q;错误的表达式是( )。 A.Q.a

B.(*p),b

C.p->a

D.(*p).b

2.有以下定义和语句: struct student { int age; int num;};

struct student stu[3]={{1001,20},{1002,19},{1003,21}}; main()

{ struct student *p; p=stu; ...}

则不正确的引用是( )。 A. (p++)->num B. p++ 3.有以下语句: struct st { int n;

struct st *next;};

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

则以下表达式的值为 6的是( )。 A. p++->n B. p->n++

C. (*p).n++ D. ++p->n

C. (*p).num

D. p=&stu.age

4.有以下说明和定义语句,则表达式的值为 3的选项是( )。 struct s

{ int m; struct s *n;};

static struct s a[3]={1,&a[1],2,&a[2],3,&a[0]},*ptr; ptr=&a[1];

A. ptr->m++ B. ptr++->m 5.程序的运行结果是( )。 main()

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

A. 0,1,2,3 B. 0,4,0,10 C. 0,4,5,15 D. 3,4,5,15?? 6.根据下面的定义,能打印出字母M的语句是( )。 struct person{char name[9]; int age;}

struct person class[10]={\John\,17,\aul\ary\am\A.printf(\%c\\n\lass[3].name); B.printf(\%c\\n\,class[3].name[1]); C.printf(\%c\\n\lass[2].name[1]); D.printf(\%c\\n\ass[2].name[0]); 7.以下对枚举类型的定义中正确的是( )。

A.enum a={one,two,three}; B.enum a {one=9,two=-1,three}; C.enum a={\one\o\,\\ D.enum a{\one\o\ree\8.已知学生记录描述为 struct student {int no; char name[20]; char sex; struct

C. *ptr->m

D. ++ptr->m??

{int year; int month;

int day; } birth; }; struct student s;

9.设变量s中的“生日”应是“1984年11月11日”,下列对“生日”的正确赋值方式是( )。 A. year=1984;month=11;day=11; B. birth.year=1984;birth.month=11;birth.day=11; C. s.year=1984;s.month=11;s.day=11; D. s.birth.year=1984;s.birth.month=11;s.birth.day=11; 10.设有以下说明语句 struct stu {int a;

float b; }stutype; 则下面的叙述不正确的是( )。

A. struct是结构体类型的关键字 B. struct stu是用户定义的结构体类型 C. stutype是用户定义的结构体类型名 D. a和b都是结构体成员名 11.设有以下说明语句 struct stu {int a;

float b; }stutype; 则下面的叙述不正确的是( )。

A. struct是结构体类型的关键字 B. struct stu是用户定义的结构体类型 C. stutype是用户定义的结构体类型名 D. a和b都是结构体成员名 二、填空题

1.程序的运行结果是( )。 #include main() { union{ long a; int b;

char c; }m;

printf(\%d\\n\of(m));} 2.设有如下的枚举类型定义:

enum language{Basic = 3, Assembly, Ada = 100, COBOL, Fortran};枚举量Fortran的值为( )。 3.若有以下说明和定义语句,则变量w在内存中所占的字节数是( )。 union aa

{ float x, y; char c[6];}

struct st {union aa v; float w[5]; double ave;} w; 4.下面程序的输出是( )。 main()

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

5.有以下说明定义和语句,可用a.day 引用结构体成员day ,请写出引用结构体成员a.day 的其它两种形式( struct{int day; char mouth; int year;}a,*b;b=&a; 三、读程序写运行结果 1.程序的运行结果是( )。 #include main() { struct date

{ int year,month,dat; } today;

printf(\%d\\n\of(struct date));} 2.程序的运行结果是( )。 main()

), ( )。

{ struct cmplx{ int x;

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

printf(\%d\\n\num[0].y/cnum[0].x*cnum[1].x); } 3.程序的运行结果是( )。 struct st {int x,*y; }*p;

int dt[4]={10,20,30,40};

struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]}; main() { p=aa;

printf(\%d\\n\x); printf(\%d\\n\+p)->x); printf(\%d\\n\ } 4.程序的运行结果是( )。 main()

{ struct MING{ struct{ int x;

int y; }in;

int a; int b; }e;

e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b;

printf(\%d,%d\n.x,e.in.y); } 5.有以下程序: #include union pw {int i;

char ch[2]; } a; main() {a.ch[0]=13; a.ch[1]=0;

printf(\%d\\n\

程序的输出结果是( )。(注意: ch[0]在低字节,ch[1]在高字节.) 四、阅读下列程序,在【】处填入适当内容,使程序完整

1.以下程序建立了一个有头结点的单向链表,链表结点中的数据通过键盘输入,当输入数据为-1时,表示输入结束(链表头结点的data 域不放数据,表空的条件是ph->next==NULL)。 #include

struct list{ int data; struct list *next; }; 【1】 creatlist() { struct list *p,*q,*ph; int a;

ph=(struct list * )malloc(sizeof(struct list)); p=q=ph;

printf(%ut an integer number,enter -1 to end :\\n\scanf(\%d\,&a); while(a!=-1) {

p=(struct list*)malloc(sizeof(struct list)); p->data=a; q->next=p; 【2】 =p

scanf(\%d\,&a);}

p->next=NULL; return(ph);} main()

{ struct list *head; head=creatlist();}

2.下面min3函数的功能是:计算单向循环链表first中每3 个相邻结点数据域中的值之和,返回其中最小的值。请填空。 struct node { int data; struct node *link;}; int min3(sturct node *first) {struct node *p=first;

int m,m3=p->data+p->link->data+p->link->link->data;

for (p=p->link;p!=first;p=【3】 ) /*填空*/ {

m=p->data+p->link->data+p->link->link->data; if 【4】 m3=m; } /*填空*/

}

return (m3);

3.以下函数creat 用来建立一个有头结点的单向链表,新产生的结点是插在链表的末尾,单向链表的头指针作为函数值返回。请填空。 #include struct list {

char data; struct list *next;};

struct list *creat() {

struct list *h,*p,*q; char ch;

h=【5】 malloc(sizeof(struct list)); /*填空*/ p=q=h; ch=getchar(); while (ch!='?') {

p=【6】 malloc(sizeof(struct list)); /*填空*/ p->data=ch; q->next=p; q=p; ch=getchar();

}

p->next='\\0';

【7】 } /*填空*/

作业09:文件和位运算

一、选择题

1.如果想打开一个已经存在的非空文件“FILE”,并进行修改,正确的语句是( )。 A.fp=fopen(―FILE‖,‖r‖); C.fp=fopen(―FILE‖,‖w+‖);

B.fp=fopen(―FILE‖,‖a+‖);

D.fp=fopen(―FILE‖,‖r+‖);

2.若以‖r+‖方式打开一个已经存在的文件,则以下叙述正确的是( )。 A.文件打开时,原有文件不被删除,位置指针移动到文件末尾,可作添加或读操作. B.文件打开时,原有文件不被删除,只能进行读操作. C.文件打开时,原有文件被删除,只能进行写操作. D.以上均不正确.

3.若fp是指向某文件的指针,且尚未读到文件末尾,则函数feof(fp)的返回值是( )。 A.EOF

B.-1 C. 非0值

D.0

4.函数fseek(fp,-10L,SEEK_END)的含义是( )。 A.将文件位置指针从当前位置向文件尾移动10个字节. B.将文件位置指针移动到距离文件头10个字节处. C. 将文件位置指针从文件末尾向文件头退10个字节. D.将文件位置指针移动到离当前位置10个字节处. 5.函数rewind(fp)的作用是( )。

A.使fp指定的文件的位置指针重新定位到文件的开始位置. B.将fp指定的文件的位置指针指向文件中所要求的特定位置. C. 使fp指定的文件的位置指针指向文件的末尾.

D.使fp指定的文件的位置指针自动移到下一个字符的位置.

6.已知函数的调用形式:fread(buffer,size,count,fp);其中buffer代表的是( )。 A.一个整形变量,代表要读入的数据项总数 B.一个文件指针,指向要读的文件.

C.一个指针,是指向的输入数据放在内存中的起始位置. D.一个存储区,存放要读的数据项. 7.函数ftell(fp)的作用是( )。 A.得到fp所指向的当前读写位置. B.初始化文件的位置指针. C.移动文件的位置指针. D.以上均不对.

8.表达式 0x13 | 0x17的值是( )。 A. 0x13 B. 0x17 C. 0xe8 D. 0xc8 9.若a=1,b=2 则 a | b 的值是( )。 A.0 B.1 C.2 D.3 10.若有以下程序段: int x=1,y=2; x=x ^ y ; y=y ^ x ; x=x ^ y ;

则执行以上语句后x和 y的值是( )。 A. x=1,b=2 B.x=2,y=2 二、填空题

1.在c程序中,数据可以用【1】和【2】两种代码形式存放。

2.在c程序中,文件的存取是以【3】为单位的,这种文件被称作【4】文件。 3.与表达式 x ^= y-2 等价的另一书写形式是【5】。

4.设二进制数x的值是11001101 ,若想通过想x & y 运算使x 中的低4位不变,高 4位清零,则y的二进制数是【6】。

C.x=2,y=1

D.x=1,y=1

}

4.输入一串字符,直到输入一个星号为止,统计(输出)其中的字母(含大小写)个数和数字字符个数。

#include main() {char c; int n1=0,n2=0; do

{c=getchar();

if(c>='A' && c<='Z' || 【 】) n1++; else if(c>='0' && c<='9') n2++; }while(c!='*');

printf(\%d,n2=%d\1,n2); }

5.输入一串整数,直到输入的整数为0,统计(输出)其中的正数个数和负数个数,以及所有正数的平均值和所有负数的平均值。

#include main()

{int n,n1=0,n2=0; float av1=0,av2=0; do

{scanf(\%d\ if(n>0){n1++;av1+=n;}

else if(n<0){ 【 】} }while(n);

printf(\1=%d,n2=%d,av1=%f,av2=%f\1,n2,av1/n ,av2/n ); }

6.计算斐波那契分数序列前n项之和(n是某个常数)。

?

213581321,,,,,,235813前一项的分子作为后一项的分母。前一项的分子分母之和作为后一项的分子。

#include main( ) {int i,n;

float s=0,s1=2,s2=1,t1,t2; scanf(\%d\ for(i=0;i

printf(\%f‖,s ); }

7.输入一个正整数n,各输出一个形如下的n行的正(倒)三角形宝塔图案。

*

*** ***** ******* *********

#include main( ) {int n,i,j;

printf(\请输入n=\ scanf(\%d\,&n); for(i=0;ii;j--) printf(\ for(j=0;j<2*i+1;j++) printf(\*\ printf(\ }

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

} }

8.打印出所有的“水仙花数”,所谓的“水仙花数”是

********* ******* ***** *** *

指一个3位数,其各位数字立方和等于该数本身。 例如153是一个“水仙花数”,因为153=13+53+33。 main( )

{int i,【 a 】 ,【 b 】 ,【 c 】 ; for(i=100;【i<=999 】;i++) {a= 【i 】; //个位数字 b= 【i/10 】; //十位数字 c= 【i/100 】; //百位数字 if(a*a*a+【b*b*b+c*c*c 】== i)

printf(\%-5d\, i); } }

9.根据下面的公式计算出?的值。从键盘输入要求满足的精度值eps。

?2?1?13?13?25?13?25?37?13?25?37?49?.....

#include \o.h\main( )

{double s=1.0,s1=1,s2=1; double eps=1e-15; int n;

for(n=1; ;n++)

{ s1*=n;

s2*=2*n+1;

s+=1.0*s1/s2;

if(1.0*s1/s2

printf(\π值为:%.14f\,2*s); }

作业05:函数与宏定义

一、选择题

1.已知函数abc的定义为:void abc( ){ ……}则函数定义中void的 含义是( )。

A.执行函数abc后,函数没有返回值 B.执行函数abc后,函数不再返回 C.执行函数abc后,可以返回任意类型 D.以上三个答案都是错误的 2.已知int p();p是( )。

A.int型变量 B.函数p的调用

C.一个函数声明,该函数的返回值是int型的值 D.强制类型转换表达式中的变量

3.C语言中的函数( )。

A.可以嵌套定义 B.不可以嵌套调用 C.可以嵌套调用,但不能调用自己 D.嵌套调用和调用自己均可 4.C语言中函数返回值的类型是由( )决定的。 A.return语句中的表达式类型

B.调用该函数的主调函数类型 C.调用函数时临时 D.定义函数时所指定的函数类型

5.C语言规定,调用一个函数时,实参表达式的值变量和形参变量之间的数据传递方式是( )。 A.地址传递 B.值传递

C.由实参传给形参,并由形参传回来给实参 D.由用户指定传递方式 6.以下正确的函数形式是( )。 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) {double z;z=x+y;return z;} 7.以下正确的说法是( )。

A.定义函数时,形参的类型说明可以放在函数体内 B.return后边的值不能为表达式

C.如果函数值的类型与返回值表达式类型不一致,以函数值类型为准 D.如果形参与实参的类型不一致,以实参类型为准

8.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是( )。 A.地址传递 B.单向值传递 C.由实参传给形参,再由形参传给实参 D.由用户指定传递方式 9.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是( )。 A.float型 B.int型 C.long型 D.double型 10.关于return语句,下列正确的说法是( )。

A.可以在同一函数中出现多次 B.在主函数中不能出现

C.必须在每个函数中出现 D.只能在除主函数之外的函数中出现一次

11.在一个C源程序文件中,若要定义一个只允许在该源文件中所有函数使用的变量,则该变量需要的存储类别是( A.extern B.register C.auto D.static 12.将一个函数说明为static后,该函数将( )。

A.既能被同一源文件中的函数调用,也能被其他源文件中的函数调用 B.只能被同一源文件中的函数调用,不能被其他源文件中的函数调用 C.只能被其他源文件中的函数调用,不能被其他源文件中的函数调用 D.既不能被同一源文件中的函数调用,也不能被其他源文件中的函数调用

)。

13.在函数中的复合语句中定义了一个变量,则对于该变量以下正确的说法是( )。 A.只在该复合语句中有效 B.在该函数中有效 C.在本程序范围内均有效 D.为非法变量 14.以下不正确的说法是( )。

A.在不同函数中可以使用相同名字的变量 B.形式参数是局部变量

C.在函数内定义的变量只在本函数范围内有效

D.在函数内的复合语句中定义的变量在本函数范围内有效

15.凡是函数中未指定存储类别的局部变量,其隐含的存储类别为( )。 A.自动(auto) B.静态(static) C.外部(extern) D.寄存器(register) 16.若有以下函数调用语句:

fun(a+b,(x,y),ab(n+k,d,(a,b)));在此fun函数调用语句中实参的个数是( )。 A.5 B.6 C.3 D.4 17.以下叙述中不正确的是( )。

A.函数中的自动变量可以赋初值,每调用一次,赋一次初值 B.在调用函数时,实参和对应形参的类型要一致 C.全局变量的隐含类别是自动存储类别 D.函数形参可以说明为register变量

18.数组名作为实参数传递给函数时,数组名被处理为( )。 A.该数组的长度 B.该数组的元素个数 C.该数组的首地址 D.该数组中各元素的值 19.以下说法中正确的是( )。 A.宏替换是在程序编译时进行的 B.函数调用是在程序编译时进行的

C.宏替换时,如果实参是表达式,应先求表达式的值,再替换 D.函数调用时,如果实参是表达式,应将表达式的值传递给形参 20.以下说法中正确的是( )。

A.define和printf都是C语句 B.define是C语句,printf不是C语句 C.define不是C语句,printf是C语句 D.define和printf都不是C语句 二、填空题

1.函数f(double x){return x*x;}返回值的类型是(int )。无返回值的函数应定义为 ( void )类型。 2.以下程序的输出结果是( 12 )。 #define M(x,y,z) x*y+z main()

{int a=1,b=2,c=3;Printf(\%d\\n\,M(a+b,b+c,c+a));} 3.函数可以嵌套调用,不可以嵌套( 定义 )。

4.设有如下宏定义:#define SWAP(z,x,y) {z=x,x=y,y=z}以下程序段通过宏调用实现变量a.b内容的交换。请填空将语句补充完整。int a=5,b=16,c;SWAP( c 5.函数的实参传递到形参有两种方式:( 传值 )和( 传地址 )。

6.在一个函数内部调用另一个函数的调用方式称为(嵌套调用 )。在一个函数内部直接或间接调用该函数成为函数(递归 )的调用方式。 7.C语言变量按其作用域分为(局部变量 )和(全局变量 )。按其生存期分为( 动态变量)和(静态变量)。 8.下列程序的输出结果是(48 )。 #define N 3

#define Y(n) ((N+1)*n)

main(){printf(―%d\\n‖,2*(N+Y(5+1)));}

9.C语言变量的存储类别有(auto ),(static ),(exten )和(register )。 10.下列程序的输出结果是( 20 )。 #define MIN(x,y) (x)<(y)?(x):(y)

main(){int i,j,k;i=10;j=20;k=10*MIN(i,j);printf(―%d\\n‖,k);} 三、读程序写运行结果

,a,b);

1.下面程序的运行结果为( 8,17 ) func (int a,int b) { static int m=0,i=2; i+=m+1; m=i+a+b; return (m);} main ( )

{ int k=4,m=1,p1,p2;

p1=func(k,m) ; p2=func(k,m) ; printf(―%d,%d\\n‖,p1,p2) ;}

2.下面程序的运行结果为(0 2 4 6 8 10 12 14 16 18 ) # define MAX 10 int a[MAX], i ; sub1 ( )

{ for (i=0; i

{ int a[MAX], i ,max ; max=5;

for (i=0; i

for (i=0; i

{ pritnf(―\\n‖);sub1( ); sub2( ); sub3(a );}

3.若输入的值是-125,下面程序的运行结果为(-125=-5*5*5#include fun (int n) { int k,r ;

for (k=2; k<=sqrt(n); k++) { r = n % k ;

while (!r) { printf(―%d‖,k); n=n/k; if (n>1) printf(―*‖); r = n % k ; } }

if (n!=1) printf(―%d\\n‖,n); } main ( ) { int n ;

scanf(―%d‖,&n); printf(―%d=‖,n); if (n<0) printf(―-‖); n = fabs(n); fun(n);}

4.下面程序的运行结果为( 8 ) #include int abc(int u,int v); main ( )

{ int a= 24,b=16,c; c=abc(a,b); printf(―%d\\n‖,c);}

)

int abc(int u,int v) {int w; while(v) {w=u%v; u=v; v=w;} return u;}

5.下面程序的运行结果为( 85 ) #include int d=1; fun(int p) { int d=5; d+=p++; printf(―%d‖,d);} main ( ) { int a=3; fun (a); d+=++a; printf(―%d\\n‖,d);}

6.下面程序的运行结果为( 9 ) int f( ) { static int i=0; int s=1; s+=i;i+=2; return s;} main ( ) { int i,a=0;

for (i=0;i<3;i++) a+=f( ); printf(―%d\\n‖,a);}

7.下面程序的运行结果为( 2 ) fun1(int a,int b) { int c1,c2; c1=fun2(a,b); c2=fun2(b,a); return c1+c2;} fun2(int a,int b) {renturn a/b;} main ( ) { int x=12,y=5;

printf(―%d\\n‖,fun1(x,y));}

8.下面程序的运行结果为( 4 ) #include f (int a) { int b=0; static int c=3; a=c++,b++; return (a);} main ( ) { int a=2,i,k;

for(i=0;i<2;i++) k=f (a++); printf(―%d\\n‖,k);}

四、阅读下列程序,在【】处填入适当内容,使程序完整

1.下面函数用―折半查找法‖从有10个有序数的a数组中对关键字m查找,若找到,返回其下标值,否则返回-1,请填空使程序完整。

算法提示:折半查找法的思路是先确定待查元素的范围,将其分成两半,然后比较位于中间点元素的值。如果该待查元素的值大于中间点元素的值,则将范围重新定义为大于中间点元素的范围,反之亦反。

int search(int a[10],int m) { int x1=0,x2=0,mid ; // x2=9 while (x1<=x2) { mid = (x1+x2)/2;

if (ma[mid]) 【2】 ; //x1=mid+1 else return (mid) ; } return (-1) ;}

2.del函数的作用是删除有序数组a中的指定元素x,n为数组a的元素个数,函数返回删除后的数组a元素个数,请填空使程序完整。 int del (int a[10],int n,int x) { int p=0,i ;

while (x!=a[p]&&p

3.验证哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。要求将6~100之间的偶数都表示成两个素数之和。素数指只能被1和自身整除的正整数,1不是素数,2是素数。

#include

int prime(int n) /* 判断n是否为素数 */ { main() {

int i, k;

for (i=6 ; i<=100; i+=2)

for (k=2; k<=i/2; k++)

if ( 【6】 ) {printf(\%d = %d +%d\\n\, i, k, i-k);break;}

int k;

for (k=2; k<=n/2; k++) if (n%k==0) return 0; return 【5】 ;} // 1

} // prime(k) && prime(i-k)

4.下列程序调用swap函数交换a和b的值,并输出交换后的a和b的值。程序的输出结果是:After swap 5, 3。

void main()

{ int a, b; a = 3, b = 5;

swap( 【7】 ) ; &a,&b printf(\ap %d, %d\swap( 【8】 ) int *x,int *y { int t;

【9】 ; t=*x 【10】 ; *x=*y 【11】 ; *y=t }

5.以下程序中,func函数的功能是在N行M列的二维数组中,找出最大值作为函数的返回值,并通过全局变量传回最大值所在的行下标和列下标,请填空使程序完整。 #define N 3 #define M 4

【12】 ; int row,colum func(int a[N][M]) {int i,j; for(i=0;i

if(a[i][j]> [alow][colum]) //row {row=i;colum=j;}

return 【13】 ;} a[row][colum] main()

{int a[N][M],max,i,j; for(i=0;i

scanf(―%d‖,&a[i][j]); max=func( 【14】 ); a

pritnf(―max=%d,row=%d,colum=%d\\n‖,max,row,colum);} 五、编程题

1.编写一个带参数的宏定义,求x2-5*x+4的值,x作为形参,在主函数中输入a的值,通过宏替换求y1,y2,y3的值: y1=a2-5*a+4

y2=(a+15)2-5*(a+15)+4

y3=sin2a-5*sina+4

2.编写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。

写出一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。本程序应准备以下测试数据:17,34,2,1,0,分别输入数据,运行程序并检查结果是否正确。 提示:

求素数函数如下: int p(int n) {if( n<2 ) return 0

for(i=2;i<=n/2;i++) else return 1;

if ( n%i==0) return 0;

} main() {int n,I;

Scanf(“%d”,&n);

If(p(n)==1)printf(“yes”); Else printf(“no”);}

函数中输入一个整数赋给变量n,通过prime(n)判断其是否素数,若函数值为1则是素数否则不是素数。

3.编写一个函数,其功能是将字符串中的大写字母改为小写字母,其他字符不变。

思路:判断大写字母的表达式是:str[i]>=‘A‘&& str[i]<=‘Z‘,若该表达式为真,str[i]为大写,则将str[i]的值加32,因为小写字母比大写字母的ASCII值多32。

4.编写一个函数,其功能是删除字符串中的字符‘d’。

思路:函数的形参是一个字符型数组s,存放待处理的字符串 ,定义另一个字符型数组c,存放删除了‘d‘字符的字符串。用一个for循环控制s数组元素的下标发生变化,每一个元素与‘d’比较,若不同,将该元素赋给c数组,然后c数组下标加1,若与‘d‘相同,则接着判断s数组中下一字符,直到遇‘\\0‘为止。

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

Top