C语言程序设计基础教程 - 习题答案 下载本文

习题答案 第1章

1.1 填空题

1.1.1 应用程序ONEFUNC.C中只有一个函数,这个函数的名称是__main 。 1.1.2 一个函数由__函数头__和__函数体__两部分组成。

1.1.3 在C语言中,输入操作是由库函数__scanf 完成的,输出操作是由库函数_printf_完

成的。

1.1.4 通过文字编辑建立的源程序文件的扩展名是_.c__;编译后生成目标程序文件,扩展

名是__.obj__;连接后生成可执行程序文件,扩展名是_.exe_;运行得到结果。

1.1.5 C语言程序的基本单位或者模块是__函数__。 1.1.6 C语言程序的语句结束符是_;___。

1.1.7 编写一个C程序,上机运行要经过的步骤:______________________________。 1.1.8 在一个C语言源程序中,注释部分两侧的分界符分别为_/*__和__*/__。

1.1.9 C语言中的标识符只能由三种字符组成,它们是 字母 、 数字 和 下划线 。

且第一个字符必须为 字母或下划线 。

1.1.10 C语言中的标识符可分为关键字、 预定义标识符 和 用户标识符 3类。

1.2 选择题

1.2.1 一个C程序的执行是从( A )。

A)本程序的main函数开始,到main函数结束

B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C)本程序的main函数开始,到本程序文件的最后一个函数结束 D)本程序文件的第一个函数开始,到本程序main函数结束 1.2.2 以下叙述不正确的是(C)。

A)一个C源程序可由一个或多个函数组成 B)一个C源程序必须包含一个main函数

C) 在C程序中,注释说明只能位于一条语句的后面 D) C程序的基本组成单位是函数

1.2.3 C语言规定:在一个源程序中,main函数的位置( C )。

A)必须在程序的开头 B)必须在系统调用的库函数的后面 C)可以在程序的任意位置 D)必须在程序的最后 1.2.4 C编译程序是 (A)。

A)将C源程序编译成目标程序的程序 B)一组机器语言指令

C) 将C源程序编译成应用软件 D) C程序的机器语言版本

1.2.5 要把高级语言编写的源程序转换为目标程序,需要使用( D)。

A) 编辑程序 B) 驱动程序 C) 诊断程序 D) 编译程序 1.2.6 以下叙述中正确的是( C)。

A) C语言比其他语言高级

B) C语言可以不用编译就能被计算机识别执行

C) C语言以接近英语国家的自然语言和数学语言作为语言的表达形式 D) C语言出现的最晚,具有其他语言的一切优点 1.2.7 以下叙述中正确的是(A)。

A) C程序中注释部分可以出现在程序中任意合适的地方 B) 花括号“{”和“}”只能作为函数体的定界符

C) 构成C程序的基本单位是函数,所有函数名都可以由用户命名 D) 分号是C语句之间的分隔符,不是语句的一部分

1.2.8 以下叙述中正确的是( B)。

A) C语言的源程序不必通过编译就可以直接运行

B) C语言中的每条可执行语句最终都将被转换成二进制的机器指令 C) C源程序经编译形成的二进制代码可以直接运行 D) C语言中的函数不可以单独进行编译 1.2.9 用C语言编写的代码程序(B)。

A) 可立即执行 B) 是一个源程序 C) 经过编译即可执行 D) 经过编译解释才能执行 1.2.10 以下叙述中正确的是(C )。

A) 在C语言中,main函数必须位于程序的最前面 B) C语言的每行中只能写一条语句 C) C语言本身没有输入输出语句

D) 在对一个C程序进行编译的过程中,可以发现注释中的拼写错误 1.2.11 下列4组选项中,均不是C语言关键字的选项是( A )。

A)define B)getc C)include D)while IF char scanf go type printf case pow 1.2.12 下列4组选项中,均是C语言关键字的选项是(B)。

A)auto B)switch C)signed D)if enum typedef union struct include continue scanf type

1.2.13 C语言中的标识符只能由字母、数字和下划线3种字符组成,且第一个字符(C)。

A) 必须为字母 B)必须为下划线

C)必须为字母或下划线 D)可以是字母、数字和下划线中任一种字符

1.3 编程题

1.3.1 参照本章例题,编写一个C程序,要求输出如下字符。

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

Welcome to Expo 2010! Shanghai 2010

#include void main() { printf(“***************************************************************************\\n”); printf(“ Welcome to Expo 2010!\\n”);

printf(“ Shanghai 2010\\n”);

printf(“***************************************************************************\\n”); }

1.3.2 设计一程序,输入3个整数,计算并显示输出这3个整数之和。 #include void main() {

int a,b,c; printf(“input a,b,c:\\n”);

}

scanf(“%d%d%d”,%a,%b,%c);

printf(“the sum of a,b,c is ]\\n”,a+b+c);

第2章

2.1填空题

2.1.1 C程序中数据有 常量 和 变量之分,其中,用一个标识符代表一个常量的,称

为 符号 常量。C语言规定在程序中对用到的所有数据都必须指定其 数据 类型,对变量必须做到先 定义 ,后使用。

2.1.2 C语言中,用关键字 float 定义单精度实型变量,用关键字 double 定义双精度实型变量,用关键字 char 定义字符型变量。

2.1.3 在C语言中,以16位PC机为例,一个char型数据在内存中所占的字节数为 1 ;一个int型数据在内存中所占的字节数为 2 ,则int型数据的取值范围为 -32768~32767 。一个float型数据在内存中所占的字节数为 4 ;一个double型数据在内存中所占的字节数为 8 。单精度型实数的有效位是 6-7 位 ,双精度型实数的有效位是 15-16 位 。

2.1.4 设C语言中的一个基本整型数据在内存中占2个字节,若欲将整数135791正确

无误地存放在变量a中,应采用的类型说明语句是 long int a=15791; 。 2.1.5 C的字符常量是用 单 引号括起来的 1 个字符,而字符串常量是用 双引号括起

来的 字符 序列。 2.1.6 C语言中,用“\\”开头的字符序列称为转义符。转义符“\\n”的功能是 回车换行 ;

转义符“\\r”的功能是 回车 。

2.1.7 若有定义:char c=‘\\010’;则变量c中包含的字符个数为 1 。 2.1.8 负数在计算机中是以 补码 形式表示。

2.1.9 C语言中,&作为双目运算符是表示的是 按位与 ,而作为单目运算符时表示

的是 取地址 。

2.1.10 在C语言的赋值表达式中,赋值号左边必须是 变量 。

2.1.11 自增运算符++、自减运算符--,只能用于 变量 ,不能用于常量或表达式。++

和- -的结合方向是“自 右左 至 左 ”。

2.1.12 若a是int型变量,则执行下面表达式后a的值为 2 。 a=25/3%3

2.1.13 写出下列数所对应的其它进制数(D对应十进制,B对应二进制,o对应八进制,

H对应十六进制)

32D= 100000 B= 40 O= 20 H

75D= 1001011 B= 113 O= 4B H

2.1.14 假设已指定i为整型变量,f为float变量,d为double型变量,e为long型变量,

有式子10+'a'+i*f-d/e,则结果为 double 型。

2.1.15 若有定义:int x=3,y=2; float a=2.5,b=3.5;则下面表达式的值为 1 。 (x+y)%2+(int)a/(int)b

2.1.16 5/3的值为 1 ,5.0/3的值为 1.666667 。 2.1.17 若有以下定义,int m=5,y=2;则执行表达式y+=y-=m*=y后的y值是 -16 。 2.1.18 若a是int型变量,则表达式(a=4*5,a+2),a+6的值为 26 。 2.1.19 若x和n均为int型变量,且x的初值为12,n的初值为5,则执行表达式x%=(n%=2)

后x的值为: 0 。

2.1.20 若有定义语句:int e=1,f=4,g=2;float m=10.5,n=4.0,k;,则执行表达式

k=(e+f)/g+sqrt((double)n)*1.2/g+m后k的值是 13.7 。

2.2 选择题

2.2.1 逗号表达式\的值是( C )。

A) 15 B) 60 C) 30 D) 不确定 2.2.2 若有以下定义和语句:

char c1='a', c2='f';

printf(\ 则输出结果是:( D )

A) 2 ,M B) 5,! C) 2,E D) 5,G

2.2.3 sizeof(float)是( B )。

A)一个双精度型表达式 B)一个整型表达式 C)一种函数调用 D)一个不合法的表达式

2.2.4 若有以下定义,则能使值为3的表达式是( D )。

int k=7,x=12;

A)x%=(k%=5) B)x%=(k-k%5) C)x%=k-k%5 D)(x%=k)-(k%=5) 2.2.5 在C语言中,要求运算数必须是整型的运算符是( A )。

A) % B) / C) < D) ! 2.2.6 下面4个选项中,均是合法整型常量的选项是( A )。

A) 160 B) -0xcdf C) -01 D)-0x48a -0xffff 01a 986,012 2e5 011 0xe 0668 0x 2.2.7 下面4个选项中,均是不合法浮点数的选项是( B )。

A) 160. B)123 C) -.18 D)-e3 0.12 2e4.2 123e4 .234 E3 .e5 0.0 1e3 2.2.8 下面正确的字符常量是( C )。

A)”C” B)”\\\\” C)?W? D)??

2.2.9 在C语言中,int、char和short三种类型数据在内存中所占用的字节数( D )。

A)由用户自己定义 B)均为2个字节

C)是任意的 D)由所用机器的机器字长决定 2.2.10 假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)后x的值为( B )。

A)7 B)8 C)6 D)2

2.2.11 假设所有变量均为整型,则表达式x=(i=4,j=16,k=32)后x的值为( C )。

A)4 B)16 C)32 D)52

3x2.2.12 若有代数式x?log10,则正确的C语言表达式是( D )。

A)fabs(x*3+log(x)) B)fabs(pow(x,3)+log(x))

C)abs(pow(x,3.0)+log(x)) D)fabs(pow(x,3.0)+log(x))

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

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 2.2.14 以下不正确的叙述是( D )。

A)在C语言中,逗号运算符的优先级最低

B)在C语言中,APH和aph是两个不同的变量

C)若a和b类型相同,在执行了赋值表达式a=b后b中的值将放入a中,而b中的值不变

D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值

2.2.15 以下正确的叙述是( D)。

A)在C语言中,每行中只能写一条语句

B)若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数 C)在C程序中,无论是整数还是实数,都能被准确无误地表示

D)在C程序中,%是只能用于整数运算的运算符

2.3编程题

2.2.1 编写一程序,求出给定半径r的圆的面积和周长,并输出计算结果。其中,r的值由用户输入,用实型数据处理。

#include #define PI 3.14159 void main() {

float r,c,s;

printf(\半径 \ scanf(\ c=2*PI*r; s=PI*r*r;

printf(\周长为%5.2f,面积为%5.2f\\n\}

2.2.2 已知华氏温度和摄氏温度之间的转换关系是:C=5/9*(F-32)。编写一程序,将用户输入的华氏温度转换为摄氏温度,并输出结果。

#include void main() {

float c,f;

printf(\华氏温度 \ scanf(\ c=5.0/9*(f-32);

printf(\华氏温度为%5.2f,摄氏温度为%5.2f\\n\}

习 题 三

3.1 填空题

3.1.1 程序的三种基本结构是 顺序 、 选择 、 循环 。 3.1.2 执行( a=3.0+5,a*4 ),a+=-6; 变量a 及表达式的值分别为 2.0,2.0 3.1.3 下列语句被执行后的执行结果是 1\\abc\\def 。 int a=1;

printf (“%d\\\\%s\\\\%s”,a,”abc”,”def”);

3.1.4 getchar( ) 函数的作用是 从键盘上接收一个字符 。 3.1.5 运行以下程序后,用户输入123456abc,输出结果为 123,45,6 。

void main() { int a,b; char c;

scanf (\ printf(\ }

3.1.6 下面程序的输出结果是 1112 。

# include void main( ) { int i=10;

{ /* int i=20; */ i++;

printf (“%d”,i ++); }

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

3.1.7 下面程序运行后,从键盘输入30,则程序的输出结果是 a=31,Ha=1f,Oa=37 。

void main () { int a ;

scanf(”%d”, &a ); a++;

printf (“a=%d,Ha=%x,Oa=%o”,a,a,a); } 3.1.8 下面程序的输出结果是 a=-3 b=?D?

“END” 。

void main ( ) { int a,b=68; a=-3;

printf(“\\ta=%d\\n\\tb=\\?%c\\?\\n\\”end\\”\\n”,a,b); }

3.1.9 下面程序的输出结果是 13.7000000 。

# include # include main()

{ int a=1,b=4,c=2; float x=10.5,y=4.0,z;

z=(a+b)/c+sqrt((double)y)*1.2/c+x; printf(“%f\\n”,z); }

3.1.10 下面程序运行后,若输入a=2,b=3结果是x1= 6.00

x2= 0.67 。

void main( ) { float a ,b ,x1, x2 ;

scanf (“a=%f,b=%f“ ,&a ,&b ) ; x1=a*b ; x2=a/b ;

printf (“x1=%5.2f \\nx2=%5.2f \\n” ,x1,x2 ); }

3.2 选择题

3.2.1 指出下面正确的输入语句是( B )。

A) scanf (“a=b=%d”,&a,&b); B) scanf (“a=%d,b=%f”,&m,&f ); C) scanf (“<”,c); D) scanf (“%5.2f”, &f);

3.2.2 执行scanf (“%d%c%f”,&a,&b,&c) 语句,若输入1234a12f56 则变量a,b,c的值为

( C )。

A) a=1234 b=?a? c=12.56 B) a=1 b=?2? c=341256 C) a=1234 b=?a? c=12.0 D) a=1234 b=?a12? c=56.0

3.2.3 执行scanf (“a=%d,b=%d”,&a,&b) 语句, 若要使变量a和b的值分别为3和4, 则

正确的输入方法为( C )。

A) 3 ,4 B) a:3 b: 4 C) a=3,b=4 D) 3 4

3.2.4 设b=1234 , 执行printf(“%%d@%d”,b) 语句,输出结果为: ( D )。

A) 1234 B) 34 C) %%d@1234 D) %d@1234 3.2.5 若x是int型变量,y是float型变量,所用scanf语句为 scanf(“x=%d,y=%f”,&x,&y);

正确的输入操作是( A )。

A) x=10,y=66.6<回车> B) 10 66.6<回车>

C) 10<回车>66.6<回车> D) x=10<回车>y=66.6<回车> 3.2.6 设a,b均是int型变量,则以下不正确的函数调用为( D )。

A) getchar(); B) putchar(?\\108?); C) scanf(“%d,-”,&a,&b); D) putchar(?\\?); 3.2.7 下列程序的执行结果是( C )。

# include void main( ) { int a=5;

float x=3.14; a*=x*(?E?-?A?);

printf (“%f\\n”,(float)a); }

A) 62.800000 B) 62 C) 62.000000 D) 63.000000 3.2.8 若输入2.50 ,下列程序的执行结果是( A )。

void main( ) { float r , area ;

scanf (“ %f ” , & r ) ;

printf (“ area=%f \\n” , area=1/2*r*r ) ; }

A) 0 B) 3.125 C) 3.13 D) 程序有错

3.3 编程题

3.3.1 编写程序,从键盘上输入2个整数给变量a和b,交换a、b值然后输出。

//参考程序

#include void main( ) { int a,b,temp;

scanf(\

printf(\交换前: a=%d,b=%d\\n\ temp=a;a=b;b=temp;

printf(\交换后: a=%d,b=%d\\n\}

3.3.2 试编写一个程序,任意输入一个小写字母,分别按八进制、十进制、十六进制、

字符格式输出。

//参考程序: #include void main()

{ char c;

printf(\请输入1个小写字母:\\n\ scanf(\

printf(\八进制: %o\\n十进制: %d\\n\ printf(\十六进制: %x\\n字符: %c\\n\}

3.3.3 输入一个华氏温度,要求输出摄氏温度,输出要有文字说明,取2位小数。公式

c?为:

5?F?32?9

//参考程序:

# include void main() { float c,f;

printf(“请输入一个华氏温度:\\n”); scanf(“%f”,&f); c= 5.0/9*(f-32);

printf(“华氏温度F=%.2f\\n”,f); printf(“摄氏温度c=%.2f\\n”,c); } 3.3.4 设圆半径r=3,圆柱高h=4,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体

积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。

//参考程序:

# include # define PI 3.1415926 void main() { float r,h,c,s1,s2,v1,v2;

printf(“请输入圆半径,圆柱高:”);

scanf(“%f,%f”,&r,&h);

c=2*PI*r; s1=PI*r*r; s2=4*PI*r*r; v1=4/3*PI *r*r*r; v2=s1*h; printf(“r=%.2f,h=%.2f\\n”,r,h);

printf(“圆周长=%.2f,圆面积=%.2f\\n”,s1,s2); printf(“圆体积=%.2f,圆柱体积=%.2f\\n”,v1,v2);

}

习 题 四

4.1 填空题

4.1.1 表示条件:10

达式为 a 。 4.1.3 若已知a=10,b=20,则表达式!ab>c的值是 0 。

4.1.5 设y为int型变量,请写出描述“y是奇数”的表达式 y%2!=0 。 4.1.6 设x,y,z为int型变量,请写出描述“x或y中有一个小于z”的表达式 x=z||x>=z&&yb && c>a||ab的值是 1 。 4.1.8 假设 a=5, b=2, c=4,以下表达式的值依次为: 0,1,1,1 。

(1) a % b * c && c % b * a (2) b % c * a && a % c * b (3) a % b * c || c % b * a (4) b % c * a || a % c * b

4.1.9 假设 a=3, b=4, c=5,x=0,y=0,以下各表达式的值依次为 0,1,1,0,1 。

(1) a + b > c && b == c (2) a || b + c && b - c (3) ! (a > b) && ! c || 1

(4) ! (x = a) && (y = b) && 0 (5) ! (a + b) + c – 1 && b + c/2

4.1.10 两次运行下面的程序,如果从键盘上分别输入6和4,输出的结果是 7和5 。

void main() { int x;

scanf(“%d”,&x); if(x++>5)

printf(“%d”,x); else

printf(“%d\\n”,x--); }

4.2 选择题:

4.2.1 设a为整型变量,不能正确表达数学关系: 10

A) 1010&&a<15 D) !(a<=10)&&!(a>=15) 4.2.2 在以下一组运算符中,优先级最高的是( C )。

A) <= B) = C) % D) && 4.2.3 设a,b,c都是int型变量,且a=3,b=4,c=5,则下面表达式中,值为0的表达式是

( D )。

A) ?a?&&?b? B) a<=b C) c||+c&&b-c D) !((a

A) 关系表达式 B) 逻辑表达式 C) 算术表达式 D) 任意表达式 4.2.5 在以下运算符中,优先级最高的运算符是( B )。

A) <= B) / C) != D) && 4.2.6 假设所有变量均为整型,表达式(a=2,b=5,a>b? a++:b++,a+b)的值是( B )。

A) 7 B) 8 C) 9 D) 2 4.2.7 在C语言中,能代表逻辑值\真\的是( D )。

A) true B) 大于0的数 C) 非0整数 D) 非0的数 4.2.8 在以下运算符中,优先级最高的运算符是( A )。

A) ! B) = C) + D) || 4.2.9 逻辑运算符两侧运算对象的数据类型( D )。

A) 只能是0或1 B) 只能是0或非0正数

C) 只能是整型或字符型数据 D) 可以是任何类型的数据

4.3 编程题

4.3.1 编写一个C程序,要求从键盘输入一个整数,判断该整数是否能够被17整除。

(解析:当该数与17的余数为零时,即可以被17整除。) //参考程序

#include void main() { int a;

printf(“请输入一个整数:”); scanf(“%d”,&a); if(a==0)

printf(“%d能被17整除\\n”,a); else

printf(“%d不能被17整除\\n”,a); }

4.3.2 编写一个C程序,计算并显示由下列说明确定的一周薪水。如果工时小于40,

则薪水按每小时8元计;否则,按320元加上超出40小时部分的每小时12元。(解析:一周工时数为键盘输入,显示其相应薪水为输出。)

//参考程序

#include void main() {

float a,wage;

printf(“请输入工时数:”); scanf(“%f”,&a);

if(a<0) printf(“error!”); else

{ if(a<40) wage=a*8;

else wage=320+(a-40)*12; printf(“周薪水=%.1f元\\n”,wage);

}

}

4.3.3 编写一个C程序,要求从键盘输入三个整数a,b,c,输出其中最大的数。(解析:

求极值问题。设立一个变量max总是保留两数比较时较大的那个值。具体方法如下:先将a的值赋给max,如果max

//参考程序

#include void main() {

int a,b,c,max;

printf(“请输入三个整数:”); scanf(“%d %d %d”,&a,&b,&c); if(a>b) max=a;

else max=b; /* max=a>b?a:b; */ if(c>max) max=c; /* max=max>c?max:c; */ printf(“最大值max=%d\\n”,max); }

4.3.4 编写一个C程序,要求从键盘输入三个整数x,y,z,请把这三个数由小到大输出。

(解析:排序问题。想办法把三个数进行调换,使得最小的数放到x变量里,最

大的数放在z变量里。具体方法如下:先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小;然后将y与z比较,并将较小的值保存在y里而较大的值放在z里。最后,依次输出x、y、z。)

//参考程序

#include void main() {

int x,y,z,a;

printf(“input 3 integer :\\n”); scanf(“%d,%d,%d”,&x,&y,&z); if(x>y) /*使x<=y*/ {a=x; x=y; y=a;}

if(x>z) /*使x<=z*/ {a=x; x=z; z=a;} if(y>z) /*使y<=z*/ {a=z; z=y; y=a;}

printf(“\\nx=%d, y=%d, z=%d\\n”,x,y,z); }

4.3.5 编写一个C程序,要求从键盘输入一个不多于5位的正整数x,要求输出:一、

它是几位数;二、逆序打印出各位数字,例如:原数为789,应输出987。(解析:该问题的核心是分解出每一位上的数字: a=x/10000; /*分解出万位上的数字*/ b=x000/1000; /*分解出千位上的数字*/ c=x00/100; /*分解出百位上的数字*/ d=x0/10; /*分解出十位上的数字*/ e=x; /*分解出个位上的数字*/

通过检测各数字是否为零,便可知道x是几位数,例如:if (a) 则x是5位数。 )

//参考程序

#include void main()

{ long x; int a,b,c,d,e;

printf(\ scanf(\

e=x; d=x/10; c=x/100; b=x/1000; a=x/10000; if(x>=1E+5||x<=0)

printf(\ else

{ if(a>0) printf(\位数,反序数字是:%d%d%d%d%d\\n\ else if(b>0) printf(\位数, 反序数字是:%d%d%d%d\\n\ else if(c>0) printf(\位数,反序数字是:%d%d%d\\n\ else if(d>0) printf(\位数,反序数字是:%d%d\\n\ else printf(\位数,数字是:%d\\n\ } }

4.3.6 编写一个C程序,要求从键盘输入两个数,并依据提示输入的数字,选择对这两

个数的运算,并输出相应运算结果。要求提示为: 1、作加法; 2、做乘法; 3、做除法:

(解析:可使用switch语句,以提示输入的数字为依据,作分支结构设计,使得提示输入1时,将两数之和输出;提示输入2时,将两数之积输出;提示输入3时,将

两数之商输出 -- 注意,除数不可为零的检测与提示。)

//参考程序

#include void main() { float op1,op2; int sign;

printf(\请输入两个操作数: a b\\n\ scanf(\

printf(\请选择进行的运算(1,2,3,4): \\n\ printf(\ printf(\ printf(\ printf(\ printf(\您选择: \ scanf(\ switch(sign)

{ case 1: printf(\ case 2: printf(\ case 3: printf(\

case 4: if(op2) {printf(\ else { printf(\除数不能为0\\n\ default: printf(\您选择的运算不对\\n\ } }

习 题 五

5.1填空题

5.1.1 C语言三个循环语句分别是 while 语句, do while 语句和 for 语句。 5.1.2 至少执行一次循环体的循环语句是 do while 。 5.1.3 循环功能最强的循环语句是 for 。

5.1.4 下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环。请填

填空。 int n=0,c; c=getchar();

while( c!=?\\n? )

{ if( c>=?0?&&c<=?9? ) n++; c=getchar(); }

5.1.5 在执行以下程序时,如果键盘上输入:ABCdef<回车>,则输出为 abcDEF 。

#include { char ch;

while((ch=getchar())!=?\\n?)

{ if(ch>=?A?&&ch<=?Z?) ch=ch+32; else if(ch>=?a?&&ch<=?z?) ch=ch-32; printf(“\\n”); }

5.1.6 下面程序的功能是用辗转相除法求两个正整数的最大公约数,请填空。

#include void main() { int r,m,n;

scanf(“%d,%d”,&m,&n);

if(m

while(r) { m=n; n=r; r= m%n ;} printf(“%d\\n”,n); }

5.1.7 当运行以下程序时,从键盘输入“right? <回车>”,则下面程序的运行结果是sjhiu 。

#include void main() { char c;

while((c=getchar())!=???) putchar(++c); }

5.1.8 下面程序的运行结果是 s=254 。

#include void main()

{ int a,s,n,count;

a=2; s=0; n=1; count=1;

while(count<=7) { n=n*a; s=s+n; ++count; } printf(“s=%d”,s); }

5.1.9 执行下面程序段后,k的值是 36 。

k=1;n=263;

do{ k*=n; n/=10; } while(n); 5.1.10 下面程序的运行结果是 -10 。

#include void main() { int i;

for(i=100; i>=0; i-=10); printf(“%d\\n”, i); }

5.1.11 下面程序使循环结束的条件式 i==0 。

#include void main() { int i;

for(i=250;i;i-=5) printf(“%d\\n”,i); }

5.1.12 以下程序输出结果为 x=-1,y=21 。

#include void main() { int x,y;

for(x=30,y=0;x>=10,y<20;x--,y++) x/=2, y+=2;

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

5.1.13 下面程序的功能是计算1-3+5-7+...-99+100的值,请填空。

#include void main()

{ int i, t=1, s=0;

for( i=1; i<=101; i+=2) { t=t*i ; s=s+t; t=-t/i ; } printf(“%d\\n”,s); }

5.1.14 下面程序的运行结果是****。

#include void main() { int i, j=4;

for(i=j; i<2*j; i++) switch(i/j) { case 0:

case 1: printf(”*”); break; case 2: printf(“#”); } }

5.1.15 下面程序的输出结果是i=6, k=4 。

#include

void main() { int i, j,k=19; while(i=k-1) { k-=3;

if(k%5==0) { i++; continue; } else if(k<5) break; i++; }

printf(“i=%d, k=%d\\n”,i k); }

5.2 选择题

5.2.1 设有程序段:int k=10; while(k=0) k=k-1;,则下面描述正确的是( C)。

A) while循环执行10次 B) 循环时无限循环 C) 循环体语句一次也不执行 D) 循环体语句执行一次 5.2.2 有以下程序:

#include

void main() { while(putchar(getchar())!=???); }

当输入“china?”时,程序的执行结果是( D )。

A) china B) dijob C) dijiob? D) china? 5.2.3 语句while(!E);中的表达式!E等价于( A )。

A) E==0 B) E!=1 C) E!=0 D) E==1 5.2.4 下面程序段的运行结果是( A )。

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 B) 2,1,0 C) 1,2,1 D) 2,1,1 5.2.5 下面程序段的输出结果是( C )。

int n=0;

while(n++<=2); printf(“%d“,n);

A) 2 B) 3 C) 4 D) 有语法错误

5.2.6 下面程序的功能是将从键盘输入的一对数,由小到大排序输出。当输入一

对相等数时结束循环,请选择填空。 #include void main() { int a,b,t;

scanf(“%d,%d”,&a,&b); while( B ) { if(a>b)

{ t=a; a=b; b=t; } printf(%d,%d\\n“,a,b); scanf(“%d,%d”,&a,&b); }

}

A) !a=b B) a!=b C) a==b D) a=b

5.2.7 下面程序的功能是从键盘输入的一组字符中统计出大写字母的个数m和小

写字母的个数n,并输出m、n中的较大者,请选择填空。 #include void main()

{ int m=0,n=0; char c;

scanf(“%d,%d”,&a,&b); while( ( [1] C )!=?\\n ? ) { if(c>=?A?&&c<=?Z?) m++; if(c>=?a?&&c<=?z?) n++; } printf(“%d”,m

}

[1] A) c==getchar( ) B) getchar( )

C) c=getchar( ) D) scanf(“%c”,c) [2] A) n:m B) m:n

C) m:m D) n:n

5.2.8 下面程序的功能是在输入的一批正整数中求出最大者,输入0结束循环,

请选择填空。 #include void main()

{ int a,max=0;

scanf(“%d”,&a); while( B )

{ if(max

printf(“%d”,max);

}

A) a==0 B) a C) !a==1 D) !a 5.2.9 下面程序段的输出结果是( C)。

#include void main() { int num=0;

while( num<=2 ) { num++;

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

}

A) 1 B) 1 C) 1 D) 1

2 2 2 3 3 4

5.2.10 若运行下程序,从键盘输入2473<回车>,则下面程序的结果是( A )。

#include void main() { int c;

while((c=getchar())!=?\\n? ) switch(c-?2?) { case 0:

case 1: putchar( c+4 );

case 2: putchar( c+4 ); break; case 3: putchar( c+3 );

default: putchar( c+2 ); break; }

printf(“\\n”);

}

A) 668977 B) 668988 C) 66778777 D) 6688766 5.2.11 以下描述正确的是( C )。

A) while、do…while、for循环中的循环体语句都至少被执行一次。 B) do…while循环中,while(表达式)后面的分号可以省略。

C) while循环中,一般要有能使while后面表达式的值变为“假”的操作。 D) do…while循环中,根据情况可以省略while。 5.2.12 C语言的do…while循环中,循环由do开始,用while结束;而且在while

表达式后面的(B)不能丢,它表示do…while循环的结束。 A) \\n B) “;” C) “%” D) “。” 5.2.13 下面程序段的输出结果是( D )。

int x=3;

do{ printf(“=”, x-=2); } while(!(--x));

A) 1 2 B) 3 2 C) 2 3 D) 1 -2

5.2.14 下面程序的功能是计算正整数2345的各位数字的平方和,请选择填空。

#include void main()

{ int n=2345,sum=0;

do

{ sum=sum+( [1] B ); n=( [2] C ) }while(n);

printf(“sum=%d”,sum);

}

[1] A) n B) (n)*(n)

C) n/10 D) (n/10)*(n/10) [2] A) n/1000 B) n/100

C) n/10 D) n

5.2.15 执行程序段:x=-1;do{x=x*x;} while(!x);的结果是( C )。

A) 死循环 B) 循环执行2次 C) 循环执行一次 D) 有语法错误 5.2.16 以下能正确计算1*2*3*4…*10的程序段是( C )。

A) do(i=1;s=1;s=s*i;i++) while(i<=10); B) do(i=1;s=0;s=s*i;i++) while(i<=10); C) i=1;s=1; do(s=s*i;i++) while(i<=10); D) i=1;s=0; do(s=s*i;i++) while(i<=10);

5.2.17 下面程序的功能是从键盘输入若干学号,然后输出学号中百位数字式3的

学号(输入0时结束循环),请选择填空。 #include void main()

{ long int num;

scanf(“%ld”,&num); do

{ if( [1] B) printf(“%ld”, num); scanf(“%ld”,&num); }whle( [2] C ))

}

[1] A) num0/10==3 B) num/100==3

C) num/10==3 D) num/10==3

[2] A) !num B) num<0==0 C) !num==0 D) !num!=0 5.2.18 对于for(表达式;;表达式3)可理解为( B )。

A) for(表达式;0;表达式3) B) for(表达式;1;表达式3)

C) for(表达式;表达式1;表达式3) D) for(表达式;表达式3;表达式3) 5.2.19 以下不正确的描述是( B )。

A) break语句不能用于循环语句和switch语句外的任何其他语句 B) 在switch语句中使用break语句或continue语句的作用相同

C) 在循环语句中使用continue语句是为了结束本次循环,而不是终止整

个循环的执行。

D) 在循环语句中使用break语句是为了使流程跳出循环体,提前结束循环

5.2.20 若i为整型变量,循环语句for(i=2,i==0;) printf(“%d”,i--);的执行次数为(B)。

A) 无限次 B) 0次 C) 1次 D) 2次 5.2.21 以下叙述正确的是(C )。

A) for循环中设置if(条件)break,当条件成立时中止程序执行。

B) for循环中设置if (条件)continue,当条件成立时中止本层循环。 C) for循环中设置if (条件)break,当条件成立时中止本层循环。 D) for循环中设置if (条件) continue,当条件成立时暂停程序执行。 5.2.22 下面关于for循环的正确描述是(D )。

A) for循环只能用于循环次数已经确定的情况。 B) for循环是先执行循环体语句,后判断表达式。 C) 在for循环中,不能用break语句跳出循环体。 D) for循环的循环体语句中,可以包含多条语句。

5.2.23 循环语句for(i=0,x=0; !x&&i<=5; i++);的执行次数为(B)。

A) 5次 B) 6次 C) 1次 D) 无限 5.2.24 以下程序段的输出结果是( D )。

int x,i;

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

{ x=I; if(++x%2==0) if(++x%3==0) if(++x%7==0) printf(“%d”,x); } A) 39 81 B) 42 84 C) 26 68 D) 28 70 5.2.25 以下描述正确的是( C )。

A) goto语句只能用于退出多层循环 B) switch语句不能出现continue语句 C) 只能用continue语句来终止本次循环 D) 在循环中break语句不能独立出现 5.2.26 以下不是无限循环的语句是( A )

A) for(y=0,x=1;x>++y; x=i++) i=x; B) for(; ; x++=i);

C) while(1) { x++; }

D) for(i=10; ; i- -) sum+=i;

5.2.27 下面程序段的输出结果是( D )。

int i,sum;

for(i=1;i<=10;i++) sum+=sum printf(“%d\\n”, i);

A) 10 B) 9 C) 15 D) 11 5.2.28 下面程序段的运行结果是(D )。

for(x=3; x<6; x++) printf((x%2)?(“**%d”):(“##%d\\n”),x);

A) **3 B)##3 C) ##3 D) **3##4 ##4 **4 **4##5 **5 **5 ##5

5.2.29 执行语句for(i=1; i++<4; );后变量i的值是( C )。

A) 3 B) 4 C) 5 D) 不定 5.2.30 下面程序段运行结果是(C)。

int i,j,k;

for(i=2;i<6;i++,i++) { k=1;

for(j=i; j<6; j++) k+=j; } printf(“%d\\n”,k);

A) 4 B) 5 C) 10 D) 7 5.2.31 下面程序段( D )。

for( t=1; t<=100; t++) { scanf(“%d”, &x); If(x<0) continue; printf(”=”,t); }

A) 当x<0时整个循环结束 B) x>=0时什么也不执行

C) printf函数永远也不执行 D) 最多允许输出100个非负数 5.2.32 下面程序段运行结果是( A)。

int i,j,a=0;

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

{ for(j=0; j<4; j++) {if(j%2) break; a++;} a++; } printf(“%d\\n”,a);

A) 4 B) 5 C) 6 D) 7 5.2.33 下面程序的运行结果是( B)。

#include void 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 B) x=8 C) x=6 D) x=12 5.2.34 下面程序段运行结果是( A)。

#include void main() { int i;

for(i=1; i<=5; i++) { if(i%2) printf(”*”); else continue; printf(“#”); }

printf(“$\\n”);

}

A) *#*#*#$ B) #*#*#*$ C) *#*#$ D) #*#*$

5.2.35 有一堆零件(100~200之间),如果分成4个零件一组的若干组,则多2

个零件;若分成7个零件一组,则多3个零件;若分9个零件一组,则多5个零件。下面程序是求这堆零件的总数,请选择填空。 #include void main( ) { int i;

for(i=100; i<201; i++) if((i-2)%4==0)

if(!(i-3)%7) if( D )

printf(”%d”, i); }

A) i%9=5 B) i%9!=5 C) (i-5)%9!=0 D) i%9==5

5.3编程题

5.3.1 输入一行字符,分别统计出其中字母、数字和其它字符的个数。 #include void main() { char ch; int i,j,k; i=j=k=0;

while( (ch=getchar() )!='\\n')

{ if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z' ) i++; //统计字母

else if(ch>='0'&&ch<='9') j++; //统计数字

else k++; //统计其它

}

printf(\字母个数:%d,数字个数:%d,其他字符:%d\}

5.3.2 求100~200之间不能被3整除也不能被7整除的数。 #include void main() { int i;

for (i=100;i<=200;i++) {

if (i%3!=0&&i%7!=0) printf(“]”,i); } } 5.3.3 求 1?11111??????。 23499100#include

void main() {

int i; float s=0,k=1; for (i=1;i<=100;i++) { s=s+ k / i ; k = -k ; }

printf(\ } 5.3.4 求

111????1?22?3n?(n?1),直到某一项小于0.001时为止。

void main()

{

int i ;

float t=0.5,s=0,i=1; while (t>=0.001) { s=s+t; i++;

t=1/(i*(i+1)); }

printf(\ }

5.3.5 用迭代法求

X?a。迭代公式为:

Xn?1?1?a??Xn???2?Xn??,要求迭代精度满足

|Xn?1?Xn|?0.00001。提示:a由键盘输入,x1=a/2.

#include

#include

void main( ) {

float x1,x2,a,k; scanf(\

x1=a/2; x2=(x1+a/x1)/2; while(fabs(x1-x2)>=0.00001) { x1=x2;

x2=(x1+a/x1)/2; } printf(\ %f\}

5.3.6 假设x,y是整数,编写程序求xy的最后3位数,要求x,y从键盘输入。 #include void main()

{ int x. y, i, b, s, g, san; long m=1;

scanf(“%d,%d”,&x, &y); for(i=1; i<=y; i++) m=m*x

san=m00; //求出最后3位数

b=san/100; //求出最后3位数的百位 s=san0/10; //求出最后3位数的十位 g=san; //求出最后3位数的个位 printf(“%d,%d,%d”,b,s,g); }

5.3.7 从键盘上输入10个整数,求其中的最大值和最小值。 #include void main()

{ int x,i,max,min; scanf(“%d”,&x); min=max=x;

for (i=2;i<=10;i=i++) {

scanf(“%d”,&x);

if(xmax) max=x; }

printf(“%d,%d”,max,min); }

5.3.8 (1)判断一个数是否为素数。(2)输出3-100之间的所有素数。 (1)判断m素数 #include #include void main()

{int i,k,m;

scanf(“%d”,&m); k=sqrt(m);

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

if(i>=k+1) printf(“%d is a prime number\\n”,m ); else printf(“%d is not a prime number\\n”,m );} (2)输出3~100之间的所有素数 #include void main() { int i,k,m,n;

for(m=3;m<=100;m=m+2) { k=sqrt(m);

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

if(i>k) { printf(“%d”,m); n++;} if(n==0) printf(“\\n”); } }

5.3.9 求解爱因斯坦数学题。有一条长度不多于1000步的阶梯,若每步跨2阶,则最后

剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶,则最后剩5阶,若每步跨7阶,最后一阶都不剩,问总共有多少级阶梯? #include void main( ) {

int n;

for(n=1;n<=1000;n++)

if(n%7==0&&n%6==5&&n%5==4&& n%3==2&&n%2==1) printf(\}

5.3.10 100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担,求大、

中、小马的数目,要求列出所有的可能。

#include void main() {

int x,y,z;

for (x=0;x<=19;x++) for (y=0;y<=33;y++) { z=100-x-y;

if (5*x+3*y+z/3.0==100 )

printf(“cocks=%d,hens=%d,chickens=%d\\n\}

}

5.3.11 假设我国国民经济总值按每年8%的比率增长,问几年后翻番。 #include void main( ) {

float old=1,n; int i;

for(i=0,n=old;n<2*old;i++) n=n*(1+0.08);

printf(\}

5.3.12 编写程序,求1~99之间的全部同构数。同构数是这样一组数;它出现在平方数的

右边。例如:5是25的右边的数,25是625右边的数,5和25都是同构数。

#include Void main() { int n, k;

for(n=1;n<10;n++) { k=n*n;

if (k==n) printf(“d”,n); } for(n=10;n<100;n++) { k=n*n0;

if (k==n) printf(“d”,n); } }

5.3.13 编写程序,对数据进行加密。从键盘输入一个数,对每一位数字均加2,若加2后

大于9,则取其除10的余数。如,2863加密后得到4085。 #include #include void main() {

int i,s,m,n; printf(\ scanf(\ for(i=0,s=0;n>0;i++) { m=n;

m=(m+2); s=s+m*pow(10,i); n=n/10; } printf(\}

5.3.14 从键盘输入n,打印n行倒等腰三角形,如n=4,则打印:

*******

*****

***

*

#include void main() {

int i,j,N;

printf (\请输入N=\ scanf(\ for ( i=1 ; i<=N ; i++) { for (j=1; j<=i - 1; j++)

printf(“ ”); //空格 for (j=1; j<=2*N-(2* i -1); j++) printf(“*”); //星号 printf(“\\n”); } //换行 }

5.3.15 打印如下的九九乘法表

1 2 3 4 5 6 7 8 9 ---------------------------------------- 1 2 4 3 6 9

4 8 12 16 5 10 15 20 25

???????????..

9 18 27 36 45 54 63 72 81

#include void mian() { int i,j;

for (i=1;i<=9;i++) printf(“%-5d”,i); printf(“\\n”);

for (i=1;i<=9;i++) {for (j=1;j<=i;j++)

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

习题六

6.1 填空题

6.1.1 C语言中,数组名代表 数组首地址 。

6.1.2 在c语言中,引用数组元素时,其数组下标的数据类型允许是 整型常量

6.1.3 在c语言中,一维数组的定义形式为:存储类型 类型说明符 数组名 [常

量表达式] 。 6.1.4 若有说明:int a[][3]={1,2,3,4,5,6,7}; 则a数组第一维的大小是

3 。

6.1.5 下面程序段的运行结果是 f 。

char a[7]=\char b[4]=\strcpy(a,b);

printf(\6.1.6 下面程序段的运行结果是 3 。

char c[]=\printf(\

6.1.7 假设字符串s1和s2均定义过并初始化,判断字符串s1是否大于字符串

s2,应当使用语句为:

if( strcmp(s1,s2)>0) 6.1.8 定义int arr[5]={1,2,3};则引用数组元素a[4]的值是: 0 。 6.1.9 数组的长度若为N,则可以访问的数组下标范围为: 0~(N-1) 。 6.1.10 数组元素引用时,下标为整型的表达式,可以使用 变量 。 6.2 选择题

6.2.1 合法的数组定义是(D)。

A.int a[ ]=”string”; B.int a[5]={0,1,2,3,4,5}; C.char a=”string”; D.char a[ ]={0,1,2,3,4,5}; 6.2.2 若有定义和语句:char s[10]; s=”abcd”; printf(“%s\\n”,s); 则

结果是(以下u代表空格)(A)。

A.输出abcd B.输出a

C.输出abcd u u u u u D.编译不通过 6.2.3 数组a[2][2]的元素排列次序是(A)。

A.a[0][0],a[0][1],a[1][0],a[1][1] B.a[0][0],a[1][0],a[0][1],a[1][1]

C.a[1][1],a[1][2],a[2][1],a[2][2] D.a[1][1],a[2][1],a[1][2],a[2][2] 6.2.4 有以下语句,则下面正确的描述是(B)。

static char x [ ]=“12345”; static char y[ ]={?1?,?2?,?3?,?4?,?5?};

A.x数组和y数组的长度相同。 B.x数组长度大于y数组长度。 C.x数组长度小于y数组长度 D.x数组等价于y数组。

6.2.5 列不能正确进行字符串赋值操作的语句是(C)。

A.char str[10];gets(str); B.char*str;str=“a”; C.char*str;str=?a?;

D.charstr[10];strcpy(str,“hello”);

6.2.6 若数组的长度为n,则该数组中的元素最多有n个。若[3][5]是一个二维

数组,则最多可使用的元素个数为(C)

A.8 B.10 C.15 D.5

6.2.7 若有说明:int a[3][4]; 则对a数组元素的非法引用是(D)。

A.a['B'-'A'][2*1] B.a[1][3] C.a[4-2][0] D.a[0][4] 6.2.8 设有语句static char str[10

={“china”};printf(“%d”,strlen(str)); 则输出结果是 A.10 B.5 C.china D.6

6.2.9 表达式strlen(“string”)+strlen(“C”)的运算结果为(C)。

A.9 B.10 C.7 D.8 6.2.10 执行以下程序段后,s的值为(B)。

static char ch[ ]=“623”

int a,s=0;for(a=0;ch[a]>=?0?&&ch[a]<=?9?;a++) s=10*s+ch[a]-?0?;

A.-4705 B.623 C.600 D.326

6.3 编程题

6.3.1 从键盘输入若干个整数(数据个数应少于50),其值在0至4的范围内,用-1作为输入结束标志.统计每个整数的个数。试编程。

参考答案

#include #define M 50 void main()

{ int a[M],c[5],i,n=0,x;

printf(\ scanf(\ while(x!=-1)

{if(x>=0 && x<=4) {a[n]=x;n++;} scanf(\ }

for(i=0;i<5;i++) c[i]=0; for(i=0;i

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

6.3.2 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。请编程。

参考答案

#include #define SIZE 30 void main()

{ float b[SIZE/5],sum; int a[SIZE],i,k;

for( k=2,i=0;i

{ }

}

sum=0.0;

for( k=0,i=0;i

{ }

sum+=a[i]; if((i+1)%5==0) { }

b[k]=sum/5; sum=0; k++;

a[i]=k; k+=2;

printf(\for(i=0;i

6.3.3 通过赋初值按行顺序给2*3的二维数组赋予2、4、6....等偶数,然后按列的顺序输出该数组。试编程。

参考答案

#include void main() {

int i,j,a[2][3]={{2,4,6},{8,10,12}}; printf(\ for(i=0;i<2;i++) {

for(j=0;j<3;j++)

printf(\ printf(\ }

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

for(j=0;j<2;j++)

printf(\ printf(\ } }

6.3.4 通过循环按行顺序为一个5*5的二维数组a赋1到25的自然数,然后输出该数组的左下半三角。试编程。

参考答案

#include void main() {

int a[5][5],i,j,n=1; for(i=0;i<5;i++) for(j=0;j<5;j++) a[i][j]=n++;

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

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

printf(\ printf(\ } }

6.3.5 下面是一个5*5阶的螺旋方阵。试编程打印出此形式的n*n(n<10)阶的方阵(顺时针方向旋进)

1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

#include void main()

{ int a[10][10],i,j,k=0,m,n; printf(\ scanf(\ if(n%2==0) m=n/2; else m=n/2+1; for(i=0;i

k++;a[i][j]=k;

}

for(j=+1;j

k++;a[j][n-i-1]=k; }

for(j=n-i-2;j>=i;j--) {k++;a[n-i-1][j]=k;} for(j=n-i-2;j>=i+1;j--) {k++;a[j][i]=k;} }

for(i=0;i

{for(j=0;j

printf(\ printf(\ }

}

6.3.6 从键盘输入一个字符,用折半查找法找出该字符在已排序的字符串a中的位置。若该字符不在a中,则打印出提示信息:The char is not in the string.试编程。

注:折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。 折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。

参考答案

#include void main()

{ char a[12]=\ int i,top,bot,mid;

printf(\ scanf(\

printf(\

for(top=0,bot=10;top<=bot;) { mid=(top+bot)/2; if(c==a[mid])

{ printf(\ break; }

else if(c>a[mid]) top=mid+1; else bot=mid-1; }

if(top>bot) printf(\}

6.3.7 从键盘输入两个字符串a和b,要求不用库函数strcat把串b的前五个字符连接到串a中;如果b的长度小于5,则把b的所有元素都连接到a中。试编程。 参考答案

#include #include void main()

{ char a[80],b[80]; int i=0,j;

printf(\ gets(a);gets(b); while(a[i++]!='\\0');

for(j=0,i--;j<5&&b[j]!='\\0';j++)

a[i++]=b[j]; a[i]='\\0'; puts(a); }

6.3.8 从键盘输入10个数给数组a,然后逆序输出。

参考答案

#include void main() {

int i,a[10];

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

scanf(\ for(i=9;i>=0; i--)

printf(\}

6.3.9 输入10个0到100的随机整数到指定的数组中。

参考答案

#include #include void main() {

int i,a[10]={0};

srand(50); /*初始化随机数序列*/ for(i=0;i<10;i++) {

a[i]=rand()0; /*产生100以内的随机整数*/ }

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

printf(\}

6.3.10 为比赛选手评分。 计算方法:从1 0名评委的评分中扣除一个最高分,扣除一个最低分,然后统计总分,并除以8,最后得到这个选手的最后得分(打分采用百分制)。

参考答案

#include void main( ) {

int score[10]; /* 10 个评委的成绩*/ float mark; /* 最后得分*/ int i;

int max =-1; /*最高分*/ int min =101; /*最低分*/

int sum=0; /*10个评委的总和*/ for( i =0 ; i < 10 ; i ++)

{

printf(\ scanf(\ sum=sum+score[i]; }

for(i = 0 ; i < 10 ; i++) {

if(score[i] > max) max = score[i]; }

for(i = 0;i < 10 ; i++) {

if(score[i]

mark = ( sum - min - max ) / 8.0;

printf(\}

习题七答案

习题七

7.1 选择题

7.1.1 在一个C语言程序构成中,较完整的描述是(D )

A) 由主程序与子程序构成 B) 由多个主函数与多个子函数构成 C) 由主函数与子函数构成 D) 由一个主函数与多个子函数构成 7.1.2 C语言在程序开始执行时,其正确的描述是(B )

A) 由编写程序语句的顺序格式执行 B) 在主函数main()开始处执行 C) 在第一个子函数处执行 D) 由人随机选择执行 7.1.3 下列有关函数错误的描述是(A )

A) C语言中允许函数嵌套定义 B) C语言中允许函数递归调用 C) 调用函数时,实参与形参的个数、类型需完全一致 D) C语言函数的缺省数据类型是int类型

7.1.4 在C语言中,各个函数之间具有的关系是(D )

A) 不允许直接递归调用,也不允许间接递归调用 B) 允许直接递归调用,不允许间接递归调用 C) 不允许直接递归调用,允许间接递归调用 D) 允许直接递归调用,也允许间接递归调用 7.1.5 在C语言中,函数的返回值的类型是由(D )

A) C语言的编译程序,在程序编译时决定 B) 由调用该函数的主调函数所决定

C) 由return语句的表达式的类型所决定

D) 由定义该函数时指定的函数类型所决定

7.1.6 当调用函数时,如果实参是一个数组名,则向函数传送的是(B )

A) 数组的首元素 B) 数组的首地址

C) 数组每个元素的地址 D) 数组每个元素中的值 7.1.7 对于以下程序,不正确的叙述是(A )

#include

void f(int n); /*函数说明*/ void main()

{ void f(int n); /*函数说明*/ f(5); }

void f(int n)

{ printf(\ }

A) 若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f B) 要求函数f无返回值,所以可用void将其类型定义为无值型

C) 在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调

用函数f

D) 对于上面程序的说明,编译时系统会提示出错信息:提示对f函数重复说明 7.1.8 以下程序的输出结果是(A )。

long fun( int n) { long s;

if(n==1 || n==2) s=2; else s=n-fun(n-1); return s;} void main()

{ printf(\

A) 1 B) 2 C) 3 D) 4 7.1.9 有以下程序执行后输出的结果是(C )。

int f1(int x,int y)

{ return x>y?x:y; } int f2(int x,int y)

{ return x>y?y:x; } main()

{int a=4,b=3,c=5,d,e,f; d=f1(a,b); d=f1(d,c); e=f2(a,b); e=f2(e,c); f=a+b+c-d-e;

printf(\}

A)3,4,5 B)5,3,4 C)5,4,3 D)3,5,4 7.1.10 设有以下函数;

f(int a) { int b=0; static int c=3;

b++;c++;

return(a+b+c); }

如果在下面的程序中调用该函数,则输出结果是(A )。

void main() { int a=2, i;

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

a) b) c) d) 7 7 7 7 8 9 10 7 9 11 13 7

A)a) B)b) C)c) D)d) 7.1.11 以下程序的输出结果是(C )。

int x=3; void main() { int i;

for(i=1;i

incre()

{ static int x=1; x*=x+1;

printf(\}

A)3 3 B)2 2 C)2 6 D)2 5

7.1.12 以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。程序运

行后的输出结果是(A )。 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;} }

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

A)22 B)10 C)34 D)30 7.1.13 程序运行后的输出结果是(C )。

#include void f(char p[][10],int n) { char t[20]; int i,j;

for(i=0;i

{ strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);} }

void main()

{char p[][10]={\ f(p,5); printf(\}

A)6 B)4 C)5 D)3

7.2 填空题

7.2.1 在C语言中,除主函数外,其子函数分为 标准库函数、自定义函数 两类。 7.2.2 变量在程序使用中,其作用域可分为 全局 变量和 局部 变量。 7.2.3 以下函数用以求x的y次方,请补充填空。

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

for ( i=1 ; i <=y ; i + + ) z= z*x ; return z; }

7.2.4 以下程序的功能是计算 s?long f(int n)

{ int i; long s; s= 1 ; for(i=1; i<=n; i++) s= s*i ; return s; main()

{ long s; int k,n; scanf(\s= 0 ;

for(k=0; k<=n; k++) s=s+ f(k) ; printf(\ }

7.3 编程题

7.3.1 编写一个函数,其功能是判断一个是否是素数,是返回为1,不是返回为0。 int isprime(int x) { int i;

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

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

?k!,请补充填空。

k?0n

return 1 ;

}

7.3.2 编写一个函数,其功能是计算二维数组每行之和以及每列之和。 void fun(int a[][4],int n,int row[],int col[]) { int i,j;

for (i=0;i

for (i=0;i<4;i++) col[i]=0;

for (i=0;i

row[i]+=a[i][j]; col[j]+= a[i][j]; } }

7.3.3 编一子函数,在100~999中打印出所有的\水仙花数\。所谓\水仙花数\指一个

三位数,其各位数字立方和等于该数本身。例如:153是一\水仙花数\,因为153=13+53+33

void fun()

{int I,j,k,n;

for (n=100;n<1000;n++) {i=n/100; j=n/10-i*10; k=n;

if(n==i*i*i+j*j*j+k*k*k) printf(“%d”,n); }

printf(“\\n”); }

7.3.4 从键盘上输入多个单词,输入时各单词用空格隔开,用'#'结束输入。现编写一

个子函数把每个单词的第一个字母转换为大写字母,其主函数实现单词的输入。

void fun(char str[]) {

int i=0,j=0;

while (str[i]!='#') { if (str[i++]==' ') { if (str[j]>='a'&&str[j]<='z') str[j]-=32; j=i;

} }

}

7.3.5 编写函数fun(char str[20], int num[10]),它的功能是:分别找出字符串中每个

数字字符(0,1,2,3,4,5,6,7,8,9)的个数,用num[0]来统计字符0的个数,用num[1]来统计字符1的个数,用num[9]来统计字符9的个数。字符串由主函数从键盘读入。

fun(char str[20], int num[10]) {int i;

for (i=0;i<10;i++) num[i]=0

for (i=0;str[i]!=?\\0?;i++) num[str[i]-?0?]++; }

习题八

8.1 选择题 8.4.1 下面各语句行中,能正确进行赋字符串操作的语句行是 ( C)

A) char s[4][5]={ \ B) char s[5]={?a?,?b?,?c?,?e?,?f?}; C) char *s; s=\ D) char *s=; scanf(“%s”,s); 8.4.2 正确的数组定义语句为 (D )

A) int A[“a”]; B) int A[3,5]; C) int A[ ][ ]; D) int *A[3]; 8.4.3 若有以下说明和语句,对c数组元素的正确引用是(D)

int c[4][5], (*cp)[5]; cp=c;

A) cp+1 B) *(cp+3) C) *(cp+1)+3 D) *(*cp+2) 8.4.4 执行下列语句后,其输出结果为 (B )

#include void main()

{ int **k, *j, i=100; j=&i; k=&j;

printf(\}

A) 运行错误 B) 100 C) i的地址 D) j的地址 8.4.5 设有如下的程序段:

char str[ ]=\char *ptr;ptr=str;

执行上面的程序段后,*(ptr+5)的值为( B )

A) 'o' B) '\\0' C) 不确定的值 D) 'o'的地址 8.4.6 若有说明:long *p,a;

则不能通过scanf语句正确给输入项读入数据的程序段是(A)。

A)*p=&a;scanf(\ B)p=(long *)malloc(8);scanf(\ C)scanf(\ D)scanf(\8.4.7 下面函数的功能是(B )

sss(s, t) char *s, *t;

{ while((*s)&&(*t)&&(*t++==*s++)); return(*s-*t);}

A) 求字符串的长度 B) 比较两个字符串的大小

C) 将字符串s复制到字符串t中 D) 将字符串s接续到字符串t中 8.4.8 请选出以下程序的输出结果(B )

#include sub(x,y,z) int x, y, *z; { *z=y-x; } void main() { int a, b, c;

sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(\}

A) 5,2,3 B) -5,-12,-7 C) -5,-12,-17 D) 5,-2,-7 8.4.9 下面函数的功能是(A)

int fun1(char*x) { char *y=x; while(*y++); return(y-x-1); }

A)求字符串的长度 B)比较两个字符串的大小 C)将字符串x复制到字符串y D)将字符串x连接到字符串y后面 8.2 填空题

8.2.1 在指针的概念中,“*”表示的含义是所指对象的内容,而“&”表示的含义是 取变量的地址 。

8.2.2 如果p是一个指针,那么*&p表示的含义是 P ,而&*p表示的含义是

P 。

8.2.3 统计从终端输入的字符中每个大写字母的个数。用#号作为输入结束标志,请

填空。

#include #include void main( ) { int num[26],i; char c,*pc=&c;

for(i=0; i<26; i++) num[i]=0;

while( (c(或者*pc)=getchar()) !='#') /*统计从终端输入的大写字母个数*/

if( isupper(*pc)) num[*p-65]+=1;

for(i=0; i<26; i++) /*输出大写字母和该字母的个数*/

if(num[i]) printf(“%c: %d\\n”, i+?A?, num[i] );

以下程序调用findmax函数求数组中值最大的元素在数组中的下标,请补充填空。

# include

findmax (int *s ,int t ,int *k ) { int p;

for(p=0,*k=p;p

if ( s[p] > s[*k] ) __*k=p______; }

void main()

{ int a[10] , i , k ;

for ( i=0 ; i<10 ; i + + ) scanf(\findmax ( a,10,&k );

printf ( \} 8.2.5 以下程序求a数组中的所有素数的和,函数isprime用来判断自变量是否为素

数,请补充填空。

#include void main()

{ int i,a[10],*p= a ,sum=0; printf(\

for(i=0;i<10;i + + ) scanf(\for(i=0;i<10;i + + )

if(isprime(*(p+i)) = = 1)

{ printf(\ sum+= a[i] //或者 *(a+i) 或者 *(p+i) ; } /*打印

素数*/

printf(\ /*打印所有素数的和*/ }

isprime(int x) { int i;

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

if(x%i = = 0) return (0); return 1 ; } 8.2.6 在下列程序中,其函数的功能是比较两个字符串的长度,比较的结果是函数返

回较长的字符串的地址。若两个字符串长度相同,则返回第一个字符串的地址。

#include

char * fun ( char *s, char *t) { char *ss=s, *tt=t; while((*ss)&&(*tt)) { ss++; tt++; } if (*tt) return tt;

else return ss ;

} 8.2.4

}

void main( )

{ char a[20],b[10],*p=a,*q=b; gets(p);

gets( q );

printf(\}

8.3 写出以下程序的运行结果 8.4.1

main( )

{ int a[ ]={2,4,6,8},*p=a,i;

for(i=0;i<4;i++) a[i]=*p++; printf(\}

运行结果: 6,8 8.4.2

#include void main( ) { int a,b,c;

int x=4,y=6,z=8;

int p1=&x,p2=&y,*p3; a=p1==&x;

b=3*(-*p1)/(*p2)+7; c=*(p3=&z)=*p1*(*p2); printf(\}

运行结果: 1,5,24 8.4.3

#include void main( )

{ int a[ ]={2,4,6,8,10},*p,**k; p=a; k=&p;

printf(\ \printf(\}

运行结果: 24 8.4.4

#include void main( )

{ int a[3][4]={2,4,6,8,10,12,14,16,18,20,22,24}; int (*p)[4]=a,i,j,k=0; for(i=0;i<3;i++) for(j=0;j<2;j++))

k+=*(*(p+i)+j);

printf(\

}

运行结果: 66 8.4.5

#include void main( ) { int k=0,sign,m;

char s[ ]=“-12345”; if(s[k]==?+?||s[k]==?-?) sign=s[k++]==?+??1:-1;

for(m=0;s[k]>=?0?&&s[k]<=?9?;k++) m=m*10+s[k]-?0?;

printf(\ }

运行结果: Result=-12345 8.4.6 若有5门课程的成绩是:90.5, 72, 80, 61.5, 55,则程序运行结果是多少,其函数执

行什么功能。 #include

float fun ( float *a , int n ) { int i;

float sum=0; for(i=0; i

void main()

{ float score[30]={90.5, 72, 80, 61.5, 55}, aver; aver = fun( score, 5 );

printf( \}

运行结果: Average score is: 71.80 函数功能:求5门课程平均分

8.4.7 若输入字符串\,则程序运行结果是多少,其程序执行什么功能。

#include #include long fun ( char *p)

{ long nn=0; int ss=1;

if((*p)=='-'){ p++; ss=-1;} if((*p)=='+') p++; while(*p)

nn=nn*10-48+(*p++); return(nn*ss); }

void main() /* 主函数 */ { char s[6];

8.4.8

8.4.9

long n;

printf(\ gets(s); n = fun(s);

printf(\}

运行结果: -1234 程序功能:输入一个字符串,并将其转换为数字

下列程序功能是将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为:87653142时,t中的数为:8642。请改正程序中的错误,使它能得出正确的结果。 #include

void fun (long s, long *t) { int d;

long sl=1; *t = 0;

while ( s > 0) { d = s;

if (d/2==0) // 改为:if(d%2==0) { *t=d* sl+ *t; sl *= 10; }

s \\= 10; //改为:s/=10; } }

void main() { long s, t;

scanf(\ fun(s, &t);

printf(\}

下列程序功能是对M行M列整数方阵求两条对角线上各元素之和。请改正程序中的错误,使它能得出正确的结果。 #include #define M 5

int fun(int n, int x[ ][ ]) //改int fun(int n,int x[][M]) { int i, j, sum=0,*p; //改int i,j,sum=0,(*p)[M];

for( p = 1,i= 1;i <= M ; i++ ) //改for(p=x,i=0;i

void main( )

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

8.4 编程题

8.4.1 通过键盘输入10整数在一维数组中,并且把该数组中所有为偶数的数,放在另一个

数组中,用指针的方法进行编程。 #include void main() { int a[10],*p,*q; int b[10]; for (p=a;p

8.4.2 对在一维数组中存放的10整数进行如下的操作:从第3个元素开始直到最后一个元

素,依次向前移动一个位置,输出移动后的结果,用指针的方法进行编程。 #include void main() { int a[10],*p; for (p=a;p

8.4.3 在一个字符数组中存放“AbcDEfg”字符串,编写程序,把该字符串中的小写字母变为

大写字母,把该字符串中的大写字母变为小写字母,用指针的方法进行编程。 #include void main() { char a[10]=\

for (p=a;*p!='\\0';p++) { if(*p>='a'&& *p<='z') *p=*p-32; else if(*p>='A'&& *p<='Z') *p=*p+32; } printf(\ puts(a); printf(\ }

8.4.4 用字符指针变量,进行5个字符串的输入,字符串大小的比较,并且输出5个字符串

中最小的字符串。 #include #include void main() { char a[5][20],*p; int i; for (i=0;i<5;i++) { gets(a[i]); } for (i=1,p=a[0];i<5;i++) { if (strcmp(a[i],p)>0) p=a[i]; } printf(\ puts(p); printf(\ }

8.4.5 在主函数中随机输入20个数在一个数组中, 通过运算处理输出该数组中的最小值。其

中确定最小值的下标的操作在子函数实现,请给出该函数的主函数与子函数的完整程序。

#include

int fun(int a[],int n) { int i,maxi; for (i=1,maxi=0;ia[maxi]) maxi=i; return(maxi); }

void main() { int a[20],maxi; int i; for (i=0;i<20;i++) { scanf(\ } maxi=fun(a,20); printf(\ }

8.4.6 在主函数中有30个学生,三门课程,用二维数组存放该信息;用子函数对数组的信

息分别进行如下的操作:(1)输出每门课程的平均分(2)输出每门课程的最高分、最低分(3)统计每门课程不及格人数。 #include #define N 30

void average(int a[][3],int n) {int i,j;

float ave[3],num[3];

for (i=0;i<3;i++) num[i]=0.0;

for (j=0;j<3;j++) for (i=0;i

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

printf(\ }

void max(int a[][3],int n) { int i,j; int max[3],min[3]; for (j=0;j<3;j++) { max[j]=min[j]=a[0][j]; for (i=1;imax[j]) max[j]=a[i][j]; if(a[i][j]

void count(int a[][3],int n) {int i,j,num[3];

for (i=0;i<3;i++) num[i]=0;

for (j=0;j<3;j++) for (i=0;i

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

void main() {

}

int a[N][3]; int i,j;

for (i=0;i

8.4.7 编写函数fun(char *str, int num[10]),它的功能是:分别找出字符串中每个数字字符

(0,1,2,3,4,5,6,7,8,9)的个数,用num[0]来统计字符0的个数,用num[1]来统计字符1的个数,用num[9]来统计字符9的个数。字符串由主函数从键盘读入。 #include

void fun(char *str, int num[10]) {int i;

char *s=str;

for (i=0;i<10;i++) num[i]=0; for (;*s!='\\0';s++) num[s[i]-'0']++; }

void main() { char a[80]; int b[10]; int i; gets(a); fun(a,b); for (i=0;i<10;i++) { printf(\ }

}

习题9

9.1 选择题

9.1.1 在宏定义#define PI 3.14159 中,宏名PI代替的是一个( D )。 A) 常量 B) 单精度数 C) 双精度数 D) 字符串

9.1.2 定义一个名为NEW(X)的宏,产生它的参数的负值,正确的语句是( C )。 A) #define NEW(X) -x B)#define NEW(X) x

C) #define NEW(X) (-x) D)#define NEW(X) (-x);

9.1.3 定义一个名为ABSVAL(X)的宏,产生它的参数的绝对值,正确的语句是( D )。 A) #define ABSVAL(X) (-x)

B) #define ABSVAL(X) (x<0 ? –x:x) C) #define ABSVAL(X) (x>0 ? x:-x) D) #define ABSVAL(X) ((x)<0 ?(-x):(x)) 9.1.4 下列格式中哪个是合法的( D)。

A) #define PI=3.14159 B) include "string.h" C) #include math.h; D) #define s(r) r*r 9.1.5 以下程序的输出结果是( B )。

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

{ int i=10,j=15,k; k=10*MIN(i,j);

printf("%d\\n",k); }

A) 10 B) 15 C) 100 D) 150 9.1.6 以下有关宏替换的叙述不正确的是( C )。

A) 宏替换只是字符替换 B) 宏名无类型

C) 宏名必须用大写字母表示 D) 宏替换不占用运行时间 9.1.7 设有以下宏定义,则执行语句“z=2*(N+Y(5+1));”后,z值为( C )。 #define N 3

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

A) 42 B) 15 C) 48 D) 出错

9.1.8 设有以下定义:#define F(n) 2*n ,则表达式F(4+2)的值是( B )。 A) 12 B) 10 C) 22 D)20 9.1.9 关于预处理,以下叙述正确的是( B )。

A. 可以把define和if定义为用户标识符(即宏名或常量符号名)

B. 可以把define定义为用户标识符,但不能把if定义为用户标识符 C. 可以把if定义为用户标识符,但不能把define定义为用户标识符 D. define和if都不能定义为用户标识符 9.1.10 关于预处理,以下叙述正确的是( B )。

A. 预处理命令行必须位于C源程序的起始位置 B. 在C语言中,预处理命令行都以“#”开头

C. 每个C程序必须在开头包含预处理命令行:#include D. C语言的预处理不能实现宏定义和条件编译的功能

9.2 编程题

9.2.1 写出下列程序的运行结果,并上机予以验证。

#define LETTER 0 void main( )

{ char str[20]= "C Language",c; int i=0;

while( (c=str[i])!= '\\0' ) { i=i+1; #if LETTER

if( c>='a' &&c<='z' ) c=c-32; #else

if( c>='A' &&c<='Z') c=c+32; #endif

printf("%c",c); } }

运行结果: c language

9.2.2 写出下列程序的运行结果,并上机予以验证。

#define EXCH(a,b) { int t;t=a;a=b;b=t;} void main( ) { int x=5,y=9; EXCH(x,y);

printf("x=%d,y=%d\\n",x,y);

运行结果: x=9,y=5

9.2.3 写出下列程序的运行结果,并上机予以验证。 #define PR(x) printf("%d,",x) void main( )

{ int i,a[ ]={1,3,5,7,9,11,13,15},*p=a+5; for(i=3;i;i--) switch( i ) { case 1:

case 2: PR(*p++);break; case 3: PR(*(--p)); } }

运行结果: 9,9,11

9.2.4 编程,定义一个带参数的宏MAXD,计算从键盘输入两个数值中的最大值。 #include

#define maxd(x,y) x>y? x:y void main() {

int x,y;

printf(\ scanf(\

printf(\}

9.2.5 编程,定义一个带参数的宏,用来判断整数n是否能被5和7同时整除,其中n是由键盘任意输入的整型数据。

#include

#define cube(n) (n%5==0)&&(n%7==0)? 1:0 void main() {int n,t;

printf (\ scanf(\ t=cube(n); if (t==1) printf(\ else printf (\ }

9.2.6 编程,用条件编译方法实现以下功能:

输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如?a?变成?b?,……,?z?变成?a?),其他非字母字符不变。用#include命令来控制是否要译成密码。例如: #define CHANGE 1 则输出密码。若 #define CHANGE 0

则不译成密码,按原码输出。 #include \ #include \void main() {

char str[80],c; int i=0; gets(str);

while(str[i]!='\\0') { #if CHANGE if(str[i]==90||str[i]==122) str[i]=str[i]-25; else if(str[i]>=65&&str[i]<90||str[i]>=97&&str[i]<122) str[i]=str[i]+1; #endif i++; }

puts(str); }

习题10

10.1 填空题

10.1.1 C语言允许定义由不同数据项组合的数据类型,称为 结构 。 10.1.2 结构体 、 共用体 和 数组 都是C语言的构造类型。 10.1.3 结构体变量成员的引用方式是使用 · 运算符。

10.1.4 结构体指针变量成员的引用方式是使用 -> 运算符。

10.1.5 若有定义:

struct num {

int a ; int b ; float f ; }n={1,3,5.0};

struct num *pn=&n ;

则表达式pn->b/n.a*(++pn->b)的值是 12 , 表达式(*pn).a+pn->f的值是 6.00000 。

10.1.6 C语言可以定义共用体类型,其关键字为 union 。

10.1.7 C语言允许用 typedef 声明新的类型名来代替已有的类型名。

10.1.8 链表中,每个结点包括两个部分:一个是存储数据元素的 数据域 ,另一

个是存储下一个结点地址的 指针域 。

10.1.9 相比于线性表顺序结构,链表比较方便 插入 和 删除 操作。 10.1.10 常用的内存管理函数有 malloc 、 calloc 、 free 。 10.2 选择题

10.2.1 有如下说明语句,则下面叙述不正确的是 。

struct stu {

int a ; float b ; }stutype;

A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型

C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名 10.2.2 以下对结构类型变量的定义中不正确的是 。

A)#define STUDENT struct student B)struct student STUDENT { { int num;

int num ; float age ; float age;

}std1 ; }std1;

C)struct { D)struct {

int num ; int num ; float age ;

float age ; }student;

} std1 ; struct student std1 ;

10.2.3 当定义一个结构体变量时,系统分配给它的内存是 。

A)各成员所需内存量的总和 B)结构中第一个成员所需内存量 C)成员中占内存量最大的容量 D)结构中最后一个成员所需内存量 10.2.4 已知学生记录描述为:

struct student

{

int no ; char name[20]; char sex; struct {

int year; int month ; int day ; } birth ;

} s ;

设结构变量s中的“birth”应是“1985年10月1日”,则下面正确的赋值方式是 。

A)year=1985 B)birth.year=1985 month=10 birth.month=10 day=1 birth.day=1

C)s.year=1985 D)s.birth.year=1985 s.month=10 s.birth.month=10 s.day=1 s.birth.day=1 10.2.5 下面程序的运行结果是 。

main ( ) {

struct complx { int x; int y ;

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

printf(“%d\\n”,cnum[0].y/cnum[0].x*cnum[1].x) ; }

A)0 B)1 C)2 D)6 10.2.6 以下对结构体变量成员不正确的引用是 。

struct pupil {

char name[20]; int age; int sex ; } pup[5], *p=pup ;

A)scanf(“%s”,pup[0].name); B)scanf(“%d”,&pup[0].age);

C)scanf(“%d”,&(p->sex)); D)scanf(“%d”,p->age); 10.2.7 若要利用下面的程序段使指针变量p指向一个存储整型变量的存储单元,则

在【】中应有的内容是 。 int *p ; p = 【】malloc(sizeof(int));

A)int B)int * C)(*int) D)

(int*)

10.2.8 当定义一个共用体变量时,系统分配给它的内存是 。

A)各成员所需内存量的总和 B)结构中第一个成员所需内存量 C)成员中占内存量最大的容量 D)结构中最后一个成员所需内存量 10.2.9 以下对C语言中共用体类型数据的叙述正确的是 。

A)可以对共用体变量直接赋值

B)一个共用体变量中可以同时存放其所有成员 C)一个共用体变量中不能同时存放其所有成员 D)共用体类型定义中不能出现结构体类型的成员 10.2.10 下面对typedef的叙述中不正确的是 。

A)用typedef可以定义多种类型名,但不能用来定义变量 B)用typedef可以增加新类型

C)用typedef只是将已存在的类型用一个新的标识符来代表 D)使用typedef有利于程序的通用和移植