谭浩强C语言程序设计习题集 下载本文

目录

重要 次重要 重复或欲删除 基础 第一章 C语言概述

1.1 选择题 1.2 填空题

第二章 数据类型、运算符与表达式

2.1 选择题 2.2 填空题

第三章 最简单的C程序设计

3.1 选择题 3.2 填空题

第四章 逻辑运算和判断选取控制

4.1 选择题 4.2 填空题 4.3 编程题 第五章 循环控制

5.1 选择题 5.2 填空题 5.3 编程题 第六章 数组

6.1 选择题 6.2 填空题 6.3 编程题 第七章 函数

7.1 选择题 7.2 填空题 7.3 编程题 第八章 编译预处理

8.1 选择题 8.2 填空题 8.3 编程题 第九章 指针

9.1 选择题 9.2 填空题

第一章 C语言概述

1.1 选择题

*1.1一个C程序的执行是从 。

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

B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C)本程序的main函数开始,到本程序文件的最后一个函数结束 D)本程序文件的第一个函数开始,到本程序main函数结束 参考答案:A

参考分析:C语言总是从main函数开始,main函数结束。但是C语言中存在一个exit(0)函数,它可以使得程序在任何时候、任何位置结束程序的运行。如果不考虑exit(0)等函数的特殊作用,C则总是在main函数结束。 *1.2以下叙述正确的是 。

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

D)在对一个C程序进行编译的过程中,可发现注释中的拼写错误 参考答案:C

参考分析:C程序对main函数的位置没有任何要求;其书写格式自由,一行可以写多条语句,一条语句(多关键字语句)可以写在多行;C语言忽略注释,把注释看作是一个空格,不会对注释中的内容进行语法检查。因此,如果注释中存在错误,系统是不可能发现的。另外,C语言的I/O操作均通过函数实现,系统本身未提供相应的语句。 1.3以下叙述不正确的是 。

A)一个C源程序可由一个或多个函数组成 B)一个C源程序必须包含一个main函数 C)C程序的基本组成单位是函数

D)在C程序中,注释说明只能位于一条语句的后面 参考答案:D

参考分析:C语言中,注释语句的位置是任意的,当然,它不能破坏标识符的完整性。C语言只是将一个注释看作是一个空格,因此对注释内的任何错误都不作检查。 1.4 C语言规定:在一个源程序中,main函数的位臵 。 A)必须在最开始 B)必须在系统调用的库函数的后面 C)可以任意 D)必须在最后 参考答案:C

*1.5一个C语言程序是由 。

A)一个主程序和若干个子程序组成 B)若干函数组成 C)若干过程组成 D)若干子程序组成 参考答案:B

参考分析:通常许多语言程序由主程序和子程序构成,但是C语言是函数式语言,整个程序由众多函数组成。尽管有时习惯上称main函数为主程序,显然,严格地讲还是B更

为符合C语言的规则。 1.2 填空题

1.6C源程序的基本单位是【 】。 参考答案:函数

1.7一个C源程序中至少应包括一个【 】。 参考答案:main()函数

1.8在一个C源程序中,注释部分两侧的分界符分别为【1】和【2】。 参考答案:【1】/* 【2】*/

1.9在C语言中,输入操作是由库函数【1】完成的,输出操作是由库函数【2】完成的。 参考答案:【1】scanf 【2】printf

第二章 数据类型、运算符与表达式

2.1 选择题

**2.1C语言中(以16位PC机为例),各数据类型的存储空间长度的排列顺序为 。

A)char

分析:在不同的计算机系统中,不同的C语言系统中,其各种数据类型所占据的存储空间是不同的,但是有一个总的原则,即:char<=short<=int<=long<= float<=double,只有A符合16位PC机中的具体环境。

*2.2若x、i、j和k都是int型变量,则计算下面表达式后,x的值为 。

x=(i=4,j=16,k=32)

A)4 B)16 C)32 D)52 参考答案:C

参考分析:逗号表达式的计算结果是最后一个表达式的值。k=23是括号内最后一个表达式,因此x变量的值来自k变量的值。

**2.3假设所有变量均为整型,则表达式(a=2,b=5,a+b++,a+b)的值是 。 A)7 B)8 C)5 D)2 参考答案:B

参考分析:逗号表达式的计算结果是最后一个表达式的值。b++在所在表达式参与运算时的值是5,该表达式计算完成后,b进行自增运算,故a+b的值为2+6=8。 2.4下列四组选项中,均不是C语言关键字的选项是 。

A)define B)getc C)include D)while IF char scanf go type printf case pow 参考答案:A

参考分析:是关键字的有:char、case、while。

2.5下列四组选项中,均是C语言关键字的选项是 。

A)auto B)switch C)signed D)if enum typedef union struct include continue scanf type 参考答案:B

参考分析:不是关键字的:include、scanf、type

*2.6下面四个选项中,均是不合法的用户标识符的选项是 。

A)A B)float C)b-a D)_123 P_0 la0 goto temp

do _A int INT 参考答案:C

参考分析:合法的有:A、P_0、la0、_A、_123、temp、INT。

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

A)必须为字母 B)必须为下划线 C)必须为字母或下划线 D)可以是字母、数字和下划线中的任一种字符 参考答案:C

参考分析:教材中只是强调首字符必须为字母,我们应当知道,在语言系统中,下划线和字母具有同等的―法律效力‖。

*2.8 下面四个选项中,均是合法整型常量的选项是 。

A)160 B)-0xcdf C)-01 D)-0x48a -0xffff 01a 986,012 2e5 011 0xe 0668 0x 参考答案:A

参考分析:不合法的B2,C2,C3,D2。解释:A2:-0xffff十六进制数本身已经包含了符号位,一般不前面加符号位,但加上符号位也不错误;C3:0668在有些C系统中,八进制数中允许出现8,但是通常不允许使用8;D3:0x显然后面缺少数值,但在TC中是允许的。 *2.9下面四个选项中,均是不合法的整型常量的选项是 。

A)--0f1 B)-0Xcdf C)-018 D)-0x48eg -0xffff 017 999 -068 0011 12,456 5e2 03f 参考答案:D

参考分析:不合法的A1,B3,C1,C3,D。解释:A1:--0f1十六进制数没有0x,显然不合法,这里需要讨论的是常量前面允许不允许加上--号,是否可以负负得正,显然不可以,--在C中是自减运算,它只适用于变量;B1:0Xcdf X大写也可以!C3:5e2是个实型数。 *2.10下面四个选项中,均是不合法的浮点数的选项是 。

A)160. B)123 C)-.18 D)-e3 0.12 2e4.2 123e4 .234 e3 .e5 0.0 1e3 参考答案:B

参考分析:不合法的有A3,B,D1。部分解释:A1,D2:C语言中小数点前面或后面的0可以省略。但是不能只有小数点自身;A3,B3,D1:e的前后必须有合法数字。1.e2 .1e2合法,.e2不合法;B1:123是整型数,不是浮点数。

*2.11下面四个选项中,均是合法的浮点数的选项是 。

A)+1e+1 B)-.60 C)123e D)-e3 5e-9.4 12e-4 1.2e-.4 .8e-4 03e2 -8e5 +2e-1 5.e-0

参考答案:B

参考分析:不合法的有A2:阶码不能为小数;A3:浮点数的尾数及阶码不能用八进制数表示;C1:e后必须有整数,C2:阶码不能为小数;D1:缺少尾数。 *2.12下面四个选项中,均是合法转义符的选项是 。 A)'\\'' B)'\\' C)'\\018' D)'\\\\0' '\\\\' '\\017' '\\f' '\\101' '\\n' '\\\ 'xab' 'x1f' 参考答案:A

参考分析:\后面的数字,c总是按照八或十六进制解释。由于c支持扩展ASCII字符集,所以,八进制数范围在0~377,十六进制数范围在00~ff。 *2.13下面四个选项中,均是不合法的转义符的选项是 。 A)'\\\ B)'\\1011' C)'\\011' D)'\\abc' '\\\\' '\\' '\\f' '\\101' '\\xf' '\\a' '\\}' 'x1f' 参考答案:B

参考分析:不合法的有B1,B2,B3,C3,D1,D3;但B3和C3值得讨论,实际上,'\\a'是一个转义字符(07 beep)。C中只有少数字母是转义字符,大多数字母不是。像'\\c'就不是,它就是字符c自身,非转义字母加\也仅表示它本身。C3'\\}'也表示自身。本题的命题人显然不知道'\\a'也是转义字符。

*2.14下面正确的字符常量是 。

A)\ B)'\\\\'' C)'W' D)\参考答案:C

*2.15下面四个选项中,均是不正确的八进制或十六进制数的选项是 。

A)016 B)0abc C)010 D)0a12 0x8f 017 -0x11 7ff 018 0xa 0x16 -123 参考答案:D

参考分析:不正确的有A3:非法八进制数;B1、D1、D2:缺少x;D3是十进制数。 2.16下面四个选项中,均是正确的八进制或十六进制数的选项是 。

A)-10 B)0abc C)0010 D)0a12 0x8f -017 -0x11 -0x123 -011 0xc 0xf1 -0xa 参考答案:C

参考分析:不正确的有A1:这是十进制数;B1、D1:缺少x

2.17下面四个选项中,均是正确的数值常量或字符常量的选项是 。

A)0.0 B)\ C)'3' D)+001 0f 3.9e-2.5 011 0xabcd 8.9e 1e1 0xFF00 2e2 '&' '\\\ 0a 50. 参考答案:D

参考分析:不正确的有A2、C4:不是ox打头;A3:e后不是整数; B1是字符串;B2:2.5不是整数。

2.18下面不正确的字符串常量是 。

A)'abc' B)\ C)\ D)\参考答案:A

参考分析:与PASCAL不同,B)字符串内的单引号不需双写。C语言中,在不引起误解的情况下,双引号界定的字符串里的单引号可以不加转义标志\单引号界定的双引号字符也可以不加转义标志\。

2.19 对应以下各代数式中,若变量a和x均为double类型,则不正确的c语言表达式是 。

A) ex^2/2 exp(x*x/2)/sqr(2*3.14159) √2π

B)?(ax+a+x/4a) 1.0/2.0*(a*x+(a+x)/(4*a))

C)√sinx2.5 sqrt((pow(sin(x*3.14159/180),2.5)) D)x2-e5 x*x-exp(5.0) 参考答案:C

2.20若有代数式3ae/bc,则不正确的C语言表达式是 。

A)a/b/c*e*3 B)3*a*e/b/c C)3*a*e/b*c D)a*e/c/b*3 参考答案:C

参考分析:注意表达式的计算顺序

2.21已知各变量的类型说明如下,则不符合C语言语法规定的表达式是 。 int k,a,b;

unsigned long w=5; double x=1.42;

A)x%(-3) B)w+=-2 C)k=(a=2,b=3,a+b) D)a+=a-=(b=4)*(a=3) 参考答案:A

参考分析:不符合C语法规定的只有A,因为X为实型数。

2.22已知各变量说明如下,则符合C语言语法规定的表达式是 。 int i=8,k,a,b;

unsigned long w=5; double x=1.42,y=5.2;

A)a+=a-=(b=4)*(a=3) B)a=a*3=2 C)x%(-3) D)y=float(i) 参考答案:A

参考分析:B)表达式不能出现在赋值号右侧;C)x是实型数,不能进行取余运算;D)应将float用括号扩起来(强制类型转换)。 *2.23以下不正确的叙述是 。

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

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

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

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

参考分析:整型变量可以输入实型数值,实型变量也可以输入整型数值 2.24以下正确的叙述是 。

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

B)若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数

C)在C程序中,无论是整数还是实数,都能被准确无误地表示 D)在C程序中,%是只能用于整数运算的运算符 参考答案:D

参考分析:注意它的描述,是只能用于整数运算,而不是整型数运算。 *2.25以下符合C语言语法的有赋值能力的表达式是 。

A)d=9+e+f=d+9 B)d=9+e,f=d+9 C)d=9+e,e++,d+9 D)d=9+e++=d+7 参考答案:B

参考分析:C不是赋值表达式,是逗号表达式,赋值仅是其中的一部分。严格说来,B也不是赋值表达式,它是由两个赋值表达式组成的逗号表达式。

**2.26已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句c2='A'+'6'-'3';后,c2的值为 。

A)D B)68 C)不确定的值 D)C 参考答案:A

参考分析:表达式中的各字符以各自的ASCII码参与运算。

*2.27在C语言中,要求运算数必须是整型(数)的运算符是 。

A)/ B)++ C)!= D)% 参考答案:D 参考分析:理论上++运算都是针对整型(含字符型)的,尽管现在很多系统提供了对实型变量的增量运算。

*2.28若以下变量均是整型,且num=sum=7;则计算表达式sUM=num++, sUM++,++num后sum的值为 。

A)7 B)8 C)0 D)10 参考答案:A

参考分析:注意sum和sUM不是一个变量(区分大小写)。

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

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

C)是任意的 D)由所用机器的字长决定 参考答案:D 参考分析:参考答案很明确地表明了,C语言中各种类型在内存中所占用的字节数由所用机器字长决定。通常在PC机中字符、整型、实型所占用的内存空间大小为1、2、4个字节。

2.30若有说明语句:char c='\\72';则变量c 。

A)包含1个字符。 B)包含2个字符。

C)包含3个字符。 D)说明不合法,c的值不确定。 参考答案:A

参考分析:转义字符'\\72'为字符':'。

2.31若有定义:int a=7; float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是 。 A)2.500000 B)2.750000 C)3.500000 D)0.000000 参考答案:A

参考分析:计算时要注意其结合性和优先级。 *2.32 sizeof(float)是 。

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

参考答案:B

参考分析:算术表达式的类型由表达式计算结果的类型决定

*2.33设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的数据类型为 。

A)int B)float C)double D)不确定 参考答案:C

参考分析:实型只要参与运算就自动转换为double型。 2.34下面四个选项中,均是非法常量的选项是 。

A)'as' B)'\\\\' C)-0x18 D)0xabc -0fff '\\01' 01177 '\\0' '\\0xa' 12,456 0xf \参考答案:A

参考分析:A3转义字符以十六进制描述时,前面不能加0。非法的还有B3 *2.35若有代数式√yx+log10y,则正确的C语言表达式是 。 A) sqrt(fabs(pow(y,x)+log10(y))) B) sqrt(abs(pow(y,x)+log10(Y))) C) sqrt(fabs(pow(x,y)+log10(y))) D) sqrt(abs(pow(x,y)+log10(y))) 参考答案:A

参考分析:c语言中整型和实型的绝对值函数各自独立,为abs和fabs;pow为一系统函数pow(y,x)=>yx。

2.36 若有代数式|x3+lgx|,则正确的C语言表达式是 。

A)fabs(x*3+log10(x)) B)abs(pow(x,3)+log10(x)) C)abs(pow(x,3.0)+log10(x)) D)fabs(pow(x,3.0)+log10(x)) 参考答案:D

参考分析:以上两题均未说明x,y的类型,从表达式的性质可分析隐含为实型,因此应使用fabs。

*2.37在C语言中,char型数据在内存中的存储形式是 。

A)补码 B)反码 C)原码 D)ASCII码 参考答案:D

参考分析:计算机系统不能存储字符本身,存储的是字符的ASCII码。

*2.38设变量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 参考答案:B

参考分析:m=n*100+0.5赋值过程中有实型转整型的自动转换。 2.39表达式18/4*sqrt(4.0)/8值的数据类型为 。

A)int B)float C)double D)不确定 参考答案:C

参考分析:表达式的类型由表达式结果的类型决定。

2.40设C语言中,一个int型数据在内存中占2个字节,则unsigned int型数据的取值范围为 。

A)0-255 B)0-32767 C)0-65535 D)0-2147483647 参考答案:C

参考分析:各种数据类型的取值范围是由其字长决定,字长确定的情况下,有符号数与无符号数的范围应当容易计算得知。

2.41设有说明:char w;int x;float y;double z;则表达式w*x+z-y值的数据类型为 。

A)float B)char C)int D)double 参考答案:D 参考分析:表达式的类型由表达式结果的类型决定。虽然本题各变量没有具体的变量值,由于参与运算的变量中z变量为double型,表达式计算的结果肯定为double型。 2.42若有以下定义,则能使值为3的表达式是 。 int k=7,x=12;

A)x%=k%=5 B)x%=k-k%5 C)x%=(k-k%5) D)(x%=k)-(k%=5) 参考答案:D

参考分析:A的值为0,B、C两个表达式相同,值为2,只有D的值为3。 2.43设以下变量均为int类型,则值不等于7的表达式是 。

A)x=y=6,x+y,x+1 B)x=y=6,x+y,y+1 C)x=6,x+1,y=6,x+y D)y=6,y+1,x=y,x+1 参考答案:C

参考分析:经计算可知,只有C的值为12,不为7。 2.2 填空题

2.44 在C语言中(以16位PC机为例),一个char型数据在内存中所占的字节数为【1】;一个int型数据在内存中所占的字节数为【2】。 参考答案:【1】1 【2】2 2.45 在C语言中(以16位PC机为例),一个float型数据在内存中所占的字节数为【1】;一个double型数据在内存中所占的字节数为【2】。 参考答案:【1】4 【2】8

2.46 若有以下定义,int m=5,y=2;则计算表达式y+=y-=m*=y后y的值是【 】。 参考答案:-16 2.47 设C语言中,一个int型数据在内存中占2各字节,则int型数据的取值范围为【 】。 参考答案:-32768~32767

2.48 在C语言中的实型变量分为两种类型,它们是【1】和【2】。 参考答案:【1】float 【2】double

*2.49 C语言所提供的基本数据类型包括:单精度型、双精度型、【1】、【2】和【3】。 参考答案:字符型 整型 枚举

参考分析:基本类型又称简单类型,若分为四种则为字符、整型、实型和枚举,若分为五种,则将实型分为单精度型和双精度型两种。

*2.50 若s是int型变量,则表达式s%2+(s+1)%2的值为【 】。 参考答案:1

参考分析:无论s是奇数还是偶数表达式的值只能是1。

*2.51 若a是int型变量,则表达式(a=4*5,a*2),a+6的值为【 】。 参考答案:26

*2.52 若x和a均是整型变量,则计算表达式(1)后的x值为【1】,计算表达式(2)后x的值为【2】。 (1)x=(a=4,6*2) (2)x=a=4,6*2

参考答案:【1】12 【2】4

2.53 若a、b和c均是int型变量,则计算表达式a=(b=4)+(c=2)后,a的值为【1】,b的值为【2】,c的值为【3】。 参考答案:【1】6 【2】4 【3】2

2.54 若a是int 型变量,且a的初值为6,则计算表达式a+=a-=a*a后a的值为【 】。 参考答案:-60

2.55 若a是int型变量,则计算表达式a=25/3%3后a的值为【 】。 参考答案:2

2.56 若x和n均是int型变量,且x和n的初值均为5,则计算表达式x+=n++后x的值为【1】,n的值为【2】。 参考答案:【1】10 【2】6

2.57 若有定义:int b=7;float a=2.5,c=4.7;则表达式a+(int)(b/3*(int)(a+c)/2)%4的值为【 】。 参考答案:5.5

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

参考答案:3.5

2.59 若有定义:char c='\\010';则变量c中包含的字符个数为【 】。 参考答案:1

2.60 若有定义:int x=3,y=2;float a=2.5,b=3.5;则表达式(x+y)%2+(int)a/(int)b的值为【 】。 参考答案:1

2.61 若有定义:int x=12,n=5;则计算表达式x%=(n%=2)后x的值为【 】。 参考答案:0

2.62 若有定义:int a,b;表达式a=2,b=5,a++,b++,a+b的值为【 】。 参考答案:9

2.63 C语言中的标识符只能由三种字符组成,它们是【1】、【2】和【3】。 参考答案:【1】字符 【2】数字 【3】下划线 *2.64 已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch='a'+'8'-'3'的值为【 】。 参考答案:f

参考分析:表达式计算中取各个字符的ASCII码值进行计算,但ch的值是以计算结果为码值的字符。

2.65 把以下多项式写成只含七次乘法运算,其余皆为加、减运算的表达式为【 】。 参考答案:((((((5*x+3)*x-4)*x+2)*x+1)*x-6)*x+1)*x+10

2.66 若double x=3.0,y=2.0;则表达式pow(y,fabs(x))的值为【 】。 参考答案:8.0

2.67 若有定义: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.68 表达式8/4*(int)2.5/(int)(1.25*(3.7+2.3))值的数据类型为( )。 参考答案:int型

*2.69 表达式pow(2.8,sqrt(double(x)))值的数据类型为【 】。 参考答案:double型

*2.70 假设m是一个三位数,从左到右用a、b、c表示各位的数字,则从左到右各个数字是bac的三位数表达式是【 】。

参考答案:m/10*100+m/100*10+m

参考分析:数字各个位的分离可以先整除再取余,也可以先取余再整除。

第三章 最简单的C程序设计

3.1 选择题

3.1 putchar函数可以向终端输出一个 。

A)整型变量表达式 B)实型变量值

C)字符串 D)字符或字符型变量值 参考答案:D

参考分析:putchar函数的作用是输出一个字符,可以是常量或变量。 *3.2以下程序的输出结果是 。

printf(\ printf(\

A)*s1=chinabeijing□□□* B)*s1=chinabeijing□□□*

*s2=**chi* *s2=chi□□*

C) *s1=□□chinabeijing* D) * s1=□□□chinabeijing*

*s2=□□chi* *s2=chi□□* 参考答案:D

参考分析:-:数据左齐,右补空格。

3.3 printf函数中用到格式符%5s,其中数字5表示输出的字符串占用5列。如果字符串长度大于5,则输出按方式 【1】 ;如果字符串长度小于5,则输出按方式 【2】 。

A)从左起输出该字符串,右补空格 B)按原字符串长从左向右全部输出 C)右对齐输出该字符串,左补空格 D)输出错误信息 参考答案:【1】B 【2】C

*3.4已有定义int a=-2;和输出语句:printf(\以下正确的叙述是 。

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

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

C)%x是格式符的一种,其变量的值按十六进制输出,但%8lx是错误的 D)%8lx不是错误的格式符,其中数字8规定了输出字段的宽度 参考答案:D

参考分析:答案B基本上是正确的,但是%x不能正确的输出长整型数据。 *3.5以下C程序正确的运行结果是 。

main()

{ long y=-43456;

printf (\printf (\printf (\printf (\}

A)y=□□-43456 B)y=-43456 y=-□□43456 y=-43456 y=-0043456 y=-0043456 y=-43456 y=+□-43456 C)y=-43456 D) y=□□-43456 y=-43456 y=-0043456 y=-0043456 y=00043456

y=□□-43456 y=+43456 参考答案:C

参考分析:0:数据左侧必须充满,给定数据不足时,前面补0。

+:数据前面显示符号位。

*3.6以下C程序正确运行的结果是 。

main()

{ int y=2456;

printf(\printf(\printf(\}

A)y=□□□2456 B)y=□□□4630 y=□□□□□□□□2456 y=□□□□□□□□4630

y=########2456 y=########4630 C)y=2456 D)y=4630 y=□□□□2456 y=□□□□4630 y=□□□02456 y=□□□04630 参考答案:D

参考分析:#要求输出数据的类型特征符号。 3.7以下C程序正确的运行结果是 。

main()

{long y=23456;

printf(\lx\\n\printf(\lx\\n\printf(\lx\\n\}

A)y=5ba0 B)y=□□□5ba0 y=□□□□5ba0 y=□□□□□□□□5ba0 y=□□0x5ba0 y=□□0x5ba0 C)y=5ba0 D)y=5ba0

y=5ba0 y=□□□□5ba0 y=0x5ba0 y=####5ba0 参考答案:A

分析:长整型数据输出应当加修正字符l,如果不加l仅能输出数据的低两个字节,高字节数据不能输出。

*3.8 若x,y均定义为int型,z定义为double型,以下不合法的scanf函数调用语句是 。

A)scanf(\B)scanf(\C)scanf(\

D)scanf(\参考答案:D 参考分析:A)首先读第一个十进制数赋给变量x,读第二个长十六进制数赋给变量y(此时有自动赋值转换),再读入格式规定的第二和第三个数据间的间隔符号逗号,最后读入第三个double型数据赋给变量z。B)首先读入2个宽度的十进制数赋给变量x,再读入格式规定的第一和第二数据间的间隔符号星号,然后读入第二个十进制整数赋给变量y,然后读入第三个double型数据赋给变量z。C)读入第一个十六进制数赋给变量x,然后虚读一个十进制数不赋给任何变量,最后读入一个八进制数赋给变量y。D)%6.2f不符合格

式规定,即不能规定读入数据的小数点后的数字位数。

*3.9 已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A和B,当从第一列开始输入数据时,正确的数据输入方式是 。 int a1,a2;char c1,c2;

scanf(\

A)10A□20B B)10□A□20□B C)10□A20B D)10A20□B 参考答案:A

*3.10 已有定义int x;float y;且执行scanf(\语句时,从第一列开始输入数据12345□678,则x的值为 ⑴ ,y的值为 ⑵ 。

⑴ A)12345 B)123 C)45 D)345 ⑵ A)无定值 B)45.0 C)678.0 D)123.0 参考答案:B B

参考分析:读取数据格式中规定域宽时,系统仅读取指定宽度的数据。

**3.11 已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A和B,当从第一列开始输入数据时,正确的数据输入方式是 。 int a1,a2;char c1,c2;

scanf(\scanf(\

A)1020AB B)10□20AB C)10□□20□□AB D)10□20AB 参考答案:D 参考分析:A)a1为1020,a2为随机值,c1为A,c2为B。B)a1为10,a2为20,c1为,c2为A。C)a1为10,a2为20,c1、c2均为□。

3.12 已有程序段和输入数据的形式,程序中输入语句的正确形式应当为 。

main()

{ int a;float f;

printf(\(输入语句)

printf(\}

Input number:4.5□□2

A)scanf(\ B)scanf(\C)scnaf(\ D)scanf(\参考答案:D

3.13 根据定义和数据的输入方式,输入语句的正确形式为 。

已有定义:float f1,f2; 数据的输入方式:4.52 3.5

A)scanf(\ B)scanf(\

C)scanf(\ %2.1f\ D)scanf(\参考答案:B

*3.14 阅读以下程序,当输入数据的形式为:25,13,10,正确的输出结果为 。

main() {int x,y,z;

scanf(\printf(\

}

A)x+y+z=48 B)x+y+z=35 C)x+z=35 D)不确定的值 参考答案:D

参考分析:由于提供数据的格式与规定格式不一致,变量y,z不能获取正确的数据,均为随机值,故三变量之和也是随机数。

3.15 根据题目中已给出的数据输入和输出形式,程序中输入输出语句的正确内容是 。

main()

{int x;float y;

printf(\输入语句 输出语句 }

输入形式:enter x,y:2 3.4 输出形式:x+y=5.40

A)scanf(\ B)scanf(\ printf(\ printf(\C)scanf(\ D)scanf(\ printf(\ printf(\参考答案:B

3.16 以下说法正确的是 。

A)输入项可以为一个实型常量,如scanf(\

B)只有格式控制,没有输入项,也能进行正确输入,如scanf(\C)当输入一个实型数据时,格式控制部分应规定小数点后的位数,如scanf(\

D)当输入数据时,必须指明变量的地址,如scanf(\参考答案:D

*3.17 根据下面程序及数据的输入和输出形式,程序中输入语句的正确形式应该为 。

main()

{char ch1,ch2,ch3; 输入语句

printf(\}

输入形式:A□B□C 输出形式:A□B

A)scanf(\B)scanf(\C)scanf(\D)scanf(\参考答案:A

参考分析:字符控制格式中有无空格对数据的读取有影响,B)ch1读取A,ch2和ch3为随机字符。C)三个变量分别为A、B、C。D)ch3为随机字符。

3.18 有输入语句:scanf(\为使变量a的值为1,b为3,c为2,从键盘输入数据的正确形式应当是 。

A)132 B)1,3,2

C)a=1□b=3□c=2 D)a=1,b=3,c=2

参考答案:D

3.19 以下能正确地定义整型变量a,b和c并为其赋初值5的语句是 。

A)int a=b=c=5; B)int a,b,c=5; C)int a=5,b=5,c=5; D)a=b=c=5; 参考答案:C

*3.20已知ch是字符型变量,下面不正确的赋值语句是 。 A)ch='a+b'; B)ch='\\0'; C)ch='7'+'9'; D)ch=5+9 参考答案:A

参考分析:B)为转义字符。C)为7和9两个字符ASCII码值之和的字符。D)为码值为14的字符(控制字符)。

3.21 已知ch是字符型变量,下面正确的赋值语句是 。

A)ch='123'; B)ch='\\xff'; C)ch='\\08'; D)ch=\参考答案:B

3.22 若有以下定义,则正确的赋值语句是 。

int a,b;float x;

A)a=1,b=2, B)b++; C)a=b=5 D)b=int(x); 参考答案:B

参考分析:这里强调的是赋值语句,请注意赋值表达式与赋值语句的区别。 3.23设x、y均为float型变量,则以下不合法的赋值语句为________。 A) ++x; B)y=(x%2)/10; C)x*=y+8 D)x=y=0 参考答案:B

*3.24 设x、y和z均为int型变量,则执行语句x=(y=(z=10)+5)-5;后,x、y和z的值是 。

A)x=10 B)x=10 C)x=10 D)x=10 y=15 y=10 y=10 y=5 z=10 z=10 z=15 z=10 参考答案:A

3.25 设有说明:double y=0.5,z=1.5;int x=10;则能够正确使用C语言库函数的赋值语句是 。

A)z=exp(y)+fabs(x); B)y=log10(y)+pow(y); C)z=sqrt(y-z);

D)x=(int)(atan2((double)x,y)+exp(y-0.2)); 参考答案:D

参考分析:本题有些偏,其他选项错误的原因为A)fabs(x),x不是double型。B)pow(y)其格式原型为double pow(double y,double x)。C)y-z为负数。 3.2 填空题

*3.26以下程序的输出结果为( )。

main() {short i; i=-4;

printf(\}

参考答案:i:dec=-4, oct=177774, hex=fffc, unsigned=65532 *3.27 以下程序的输出结果为( )。

main()

{printf(\

}

参考答案:*3.140000,3.142*

分析:不能输出的位会向前一位四舍五入输出。 3.28以下程序的输出结果为( )。

main() {char c='x';

printf(\}

参考答案:c:dec=120, oct=170, hex=78, ASCII=x

*3.29 已有定义int d=-2;执行以下语句后的输出结果是( )。

printf(\printf(\参考答案:*d(1)=-2*d(2)=□-2*d(3)=-2□*

*d(4)=177776*d(5)=□177776*d(6)=177776□* 3.30已有定义int d=-2;执行以下语句后的输出结果是( )。

printf(\printf(\参考答案:*d(1)=-2*d(2)=□-2*d(3)=-2□*

*d(4)=fffe*d(5)=□□fffe*d(6)=fffe□□*

*3.31已有定义float d1=3.5,d2=-3.5;执行以下语句后的输出结果是( )。

printf(\printf(\

参考答案:*d(1)=3.50000e+00*d(2)=3.500e+00*d(3)=□3.500e+00*

*d(4)=-3.50000e+00*d(5)=-3.50000e+00*d(6)=-3.5000e+00□*

参考分析:通过本题应注意%f和%e在规定小数点后位数的区别。%e小数位后面位数含e标志。

3.32 以下程序的输出结果是( )。

main()

{int x=1,y=2;

printf(\printf(\}

参考答案:x=1 y=2 *sum*=3 10 Squared is :100

*3.33 以下程序的输出结果是( )。

#include main()

{int x=10;float pi=3.1416; printf(\printf(\printf(\printf(\printf(\printf(\printf(\printf(\}

参考答案:(1)10

(2)□□□□10 (3)56.100000

(4) □□□□□□3.141600 (5)5.68100e+02

(6) □□□3.14160e+00 (7)3.1416

(8) □□□□□□3.1416

参考分析:采用g格式输出数据时,当数据<=10-5或>=107时,按指数方式输出(缺省正数11位,负数12位),否则按小数方式输出(缺省含小数点总宽度最多7位)。且不输出无意义的0(后面)和小数点。 3.34 以下程序的输出结果是( )。

#include main()

{float a=123.456;double b=8765.4567; printf(\printf(\printf(\printf(\printf(\printf(\printf(\}

参考答案:(1)123.456000

(2) □□□□□□□123.456 (3)123.4560 (4)8765.456700

(5) □□□□□□8765.456 (6)8765.4560 (7)8765.4560

*3.35 以下printf语句中*的作用是( ),输出结果是( )。

#include main() {int i=1;

printf(\i++;

printf(\i++;

printf(\}

参考答案:

(1)可使同一或相同输出格式数据输出宽度得以改变(动态域宽控制) (2)##1 ##□2 ##□□3

3.36 以下printf语句中的\的作用是( ),该程序的输出结果是( )。

#include main()

{int x=12;double a=3.1415926; printf(\

printf(\printf(\printf(\}

参考答案:

(1)输出数据左对齐 (2) □□□□12##

12□□□□##

□□3.1415926000## 3.1415926000□□##

*3.37 以下程序的输出结果是( )。

#include main()

{int a=325;double x=3.1415926; printf(\ x=%+e\\n\}

参考答案:a=+00325 x=+3.14159e+00 *3.38以下程序的输出结果是( )。

#include main() {int a=252;

printf(\ a=%#o\\n\printf(\ a=%#x\\n\}

参考答案:a=374□□a=0374 a=fc□□a=0xfc

3.39以下程序的输出结果是( )。

int x=7281;

printf(\

printf(\printf(\printf(\printf(\

参考答案:(1)x=7281,x=□□7281,x=□16161,x=□□1c71,x=□□7281 (2)x=7281,x=7281□□,x=$7281□□,x=$007281,x=d (3)x=+7281,x=□+7281,x=+0007281 (4)x=16161,x=016161 (5)x=1c71,x=0x1c71

**3.40 假设变量a和b均为整型,以下语句可以不借助任何变量把a、b中的值进行交换。请填空。

a+=( );b=a-( );a-=( ); 参考答案:b b b

3.41 假设变量a、b和c均为整型,以下语句借助中间变量t把a、b和c中的值进行交换,即把b中的值给a,把c中的值给b,把a中的值给c。例如:交换前a=10、b=20、c=30,交换后a=20,b=30,c=10。请填空。

( );a=b;b=c;( ); 参考答案:t=a c=t;

**3.42 设x、y和z都是int型变量,m为long型变量,则在16位微型机上执行下面赋

值语句后,y值为( ),z值为( ),m值为( )。

y=(x=32767,x-1); z=m=oxffff;

参考答案:32766、-1、65535

3.43 若x为int型变量,则执行以下语句后x的值为( )。

x=7;

x+=x-=x+x; 参考答案:-14

3.44 若a和b均为int型变量,则以下语句的功能是( )。

a+=b;b=a-b;a-=b;

参考答案:交换a、b变量的值 *3.45 在scanf函数调用语句中,可以在格式字符和%号之间加一星号,它的作用是( ),当输入以下数据:10□□20□□30□□40,下面语句的执行结果是( )。

int a1,a2,a3;

scanf(\参考答案:读入数据后不赋给相应的变量 把10给a1,把20不给任何变量,把30给a2,把40给a3

3.46有一输入函数scanf(\则不能使float类型变量k得到正确数值的原因是( )和( ),正确的语句应为( )。

参考答案:格式字符不正确 缺少&符号 scanf(\

3.47 已有定义int a;float b,x;char c1,c2;为使a=3,b=6.5,x=12.6,c1='a',c2='A',正确的scanf函数调用语句是( ),输入数据的方式为( )。 参考答案:

scanf(\3□6.5□12.6aA

参考分析:该题目不好,读取数据语句和提供数据方式全部由做题者决定,这会出现各式各样的答案。

*3.48 若有以下定义和语句,为使变量c1得到字符'A',变量c2得到字符'B',正确的格式输入形式是( )。

char c1,c2;

scanf(\参考答案:A□□□B□□□

参考分析:读取字符数据指定数据宽度时,系统读取第一个字符

*3.49 执行以下程序时,若从第一列开始输入数据,为使变量a=3,b=7,x=8.5, y=71.82, c1='A',c2='a',正确的数据输入形式是( )。 int a,b;float x,y;char c1,c2; scanf(\scanf(\

scanf(\

参考答案:a=3□b=7x=8.5□y=71.82c1=A□c2=a

*3.50 已有定义int i,j;float x;为将-10赋给i,12赋给j,410.34赋给x;则对应以下scanf函数调用语句的数据输入形式是( )。

scanf(\参考答案:-12□c□4.1034e2

参考分析:第一个数也可给17776,第二个数也可给0xc,第三个数也可给410.34。

第四章 逻辑运算和判断选取控制

4.1 选择题

**4.1逻辑运算符两则运算对象的数据类型 。

A)只能是0或1 B)只能是0或非0正数 C)只能是整型或字符型数据 D)可以是任何类型的数据 参考答案:D 参考分析:c语言中没有专用的逻辑量,任何数值类型的数据都可以作为逻辑数据使用,判断时0为假,非零为真,计算时真置1,假置0。 *4.2以下关于运算符优先顺序的描述中正确的是

A)关系运算符<算术运算符<赋值运算符<逻辑运算符 B)逻辑运算符<关系运算符<算术运算符<赋值运算符 C)赋值运算符<逻辑运算符<关系运算符<算术运算符 D)算术运算符<关系运算符<赋值运算符<逻辑运算符 参考答案:C

4.3 下列运算符中优先级最高的是 。

A)< B)+ C)&& D)!= 参考答案:B

*4.4能正确表示―当x的取值在[1,10]和[200,210]范围内为真‖的C语言表达式为 。 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) 参考答案:B

参考分析:C语言中实际上与运算和或运算优先级相等,由于C采用短路算法,所以不会影响B的结果,即不需要改成((x>=1)&&(x<=10))||((x>=200) &&(x<=210)) 4.5 表示图中坐标轴上阴影部分正确的表达式是 。 | | | a b c A)(x<=a)&&(x>=b)&&(x<=c) B)(x<=a)||(b<=x<=c) C)(x<=a)||(x>=b)&&(x<=c) D)(x<=a)&&(b<=x<=c) 参考答案:C

4.6判断char型变量ch是否为大写字母的正确表达式为 。

A)'A'<=ch<='Z' B)(ch>='A')&(ch<='Z') C) (ch>='A')&&(ch<='Z') D)('A'<=ch)AND('Z'>=ch) 参考答案:C

4.7 有int x=3,y=4,z=5;则下面表达式中值为0的是 。

A)'x'&&'y' B)x<=y C)x||y+z&&y-z D)!((x

4.8 已知x=43,ch='A',y=0;则表达式(x>=y&&ch<'B'&&!y)的值是 。

A)0 B)语法错误 C)1 D)\假\参考答案:C

4.9若希望当A的值为奇数时,表达式的值为―真‖,A的值为偶数时,表达式的值为―假‖。则以下不能满足要求的表达式是 。

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

参考答案:C

*4.10设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后n的值为 。

A)1 B)2 C)3 D)4 参考答案:B

参考分析:本题为标准的短路算法,由于第一个表达式m=a>b为真,故第二个表达式n=c>d被短路不再计算。因此,n值仍然保持原来的值2不变。 4.11判断char型变量ch是否为小写字母的正确表达式为 。

A)'a'<=ch<='z' B)(ch>=a)&&(ch<=z) C) (ch>='a')||(ch<='z') D)(ch>='a')&&(ch<='z') 参考答案:D

*4.12 以下程序的运行结果是 。

#include main()

{int a,b,d=241; a=d/100%9; b=(-1)&&(-1);

printf(\}

A)6,1 B)2,1 C)6,0 D)2,0 参考答案:B

参考分析:计算时,非零为真。

*4.13 执行以下语句后a的值为 ,b的值为 。

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

++a||++b&&++c;

A)0 B)1 C)2 D)错误 参考答案:C B

参考分析:c语言在计算表达式时采用短路算法。 4.13-改 执行以下语句后,a,b,c的值分别为 。

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

++a||++b&&++c;

A)1,1,1 B)2,1,1 C)2,2,1 D)2,2,2 参考答案:B

4.14 执行以下语句后a的值为 ,b的值为 。

int a=5,b=6,w=1,x=2,y=3,z=4; (a=w>x)&&(b=y>z);

(1)A)5 B)0 C)2 D)1 (2)A)6 B)0 C)1 D)4 参考答案:B A

参考分析:短路算法。

*4.15 以下不正确的if语句形式是 。

A)if (x>y&&x!=y); B)if (x==y) x+=y;

C)if(x!=y) scanf(\D)if(x

4.16 下列运算符中优先级最低的是 ,优先级最高的是 。

A)? : B)&& C)+ D)!= 参考答案:A C

*4.17 已知int x=10,y=20,z=30;以下语句执行后x,y,z的值是 。

if(x>y)

z=x;x=y;y=z;

A)10,20,30 B)20,30,30 C)20,30,10 D)20,30,20 参考答案:C

4.18 以下if语句语法正确的是 。

A)if (x>0) printf(\

B)if(x>0){x=x+y;printf(\C)if(x>0){x=x+y;printf(\D)if(x>0){x=x+y;printf(\参考答案:B

*4.19有程序:main()

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

if (a=b+c) printf(\ else printf(\该程序 。

A)有语法错误不能通过编译 B)可以通过编译,但不能通过连接 C)输出:*** D)输出:$$$ 参考答案:C

参考分析:注意条件表达式不是a= =b+c。 *4.20 以下程序的运行结果是 。

main() {int m=5;

if(m++>5) printf(\ else printf(\}

A)4 B)5 C)6 D)7 参考答案:C

参考分析:m先与5进行关系比较,然后进行增量运算,m值为6,因比较结果为假,执行else,输出为6,m为7。

4.21 当a=1,b=3,c=5,d=4时,执行完下面一段程序后x的值是 。

if(a

if(c

if(a

if(b

A)1 B2 C)3 D)6 参考答案:B

**4.22有函数关系如下,能正确表示该关系的程序段是 。

x y

x<0 x-1

x=0 x

x>0 x+1

A)y=x+1; B)y=x-1; if(x>=0) if(x!=0)

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

else y=x; if (x<0) y=x-1; else y=x+1 else y=x+1; 参考答案:C

*4.23 以下程序的输出结果是 。

main()

{int a=100,x=10,y=20,ok1=5,ok2=0; if(x

if(ok2) a=10; a=-1;

printf(\}

A)1 B)0 C)-1 D)值不确定 参考答案:C

参考分析:无论前面的分支如何执行,由于a=-1和上面的语句为顺序关系,因此不会影响到a的值。

4.24 以下程序的输出结果是 。

main()

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

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

A)3 B)2 C)1 D)0 参考答案:B

*4.25为了避免在嵌套的条件语句if-else中产生二义性,C语言规定:else子句总是与 配对。

A)缩排位臵相同的if B)其之前最近的没有else配对的if C)其之后最近的if D)同一行上的if 参考答案:B

参考分析:本题表述不严谨。

*4.26以下不正确的语句为 。

A)if (x>y);

B)if (x=y)&&(x!=0) x+=y; C)if (x) z=z/x;

D)if (x>y) {x++;y++;}

参考答案:B

4.27 请阅读以下程序:

#include main() {float a,b;

scanf(\if(a<0.0) b=0.0;

else if((a<0.5)&&(a!=2.0)) b=1.0/(a+2.0); else if(a<10.0) b=1.0/a; else b=10.0; printf(\}

若运行时输入2.0,则上面程序的输出结果是 。 A)0.000000 B)0.500000 C)1.000000 D)0.250000 参考答案:B

**4.28 若有条件表达式(exp)?a++:b--,则以下表达式中能完全等价于表达式(exp)的是 。

A)exp==0 B)exp!=0 C)exp==1 D)exp!=1 参考答案:B

参考分析:在C语言中,当一个表达式不等于0时,可以将不等于部分省略,其效果完全一样。

*4.29 若运行时给变量输入12,则以下程序的运行结果是 。

main() {int x,y;

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

A)0 B)22 C)12 D)10 参考答案:A

参考分析:x>12为假,取x-12。 4.30 以下程序的运行结果是 。

main()

{int k=4,a=3,b=2,c=1;

printf(\}

A)4 B)3 C)2 D)1 参考答案:D

**4.31执行下列程序段后,变量a,b,c的值分别是 。

int x=10,y=9; int a,b,c;

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

A)a=9,b=9,c=9 B)a=8,b=8,c=10 C)a=9,b=10,c=9 D)a=8,b=8,c=9 参考答案:B

参考分析:首先x进行--操作,x为9,然后与y进行等于比较,即9==9,然后y++为10。由于比较结果为真,故计算--x,为8,赋给a。

4.32 阅读以下程序,则执行下面语句后m的值是 。

int w=1,x=2,y=3,z=4,m; m=w

A)1 B)2 C)3 D)4 参考答案:A

4.33 若有int w=1,x=2,y=3,z=4;则表达式w

A)4 B)3 C)2 D)1 参考答案:D

*4.34 执行以下程序后的输出结果是 。

int w=3,z=7,x=10;

printf(\printf(\printf(\printf(\

A)0111 B)1111 C)0101 D)0100 参考答案:C 4.2 填空题

*4.35 若int a=3,b=2,c=1,f;表达式f=a>b>c的值是( )。 参考答案:0

参考分析:计算过程如下,a>b计算为真,然后计算 真(1)>c,结果为假 4.36 若int a=5,b=4,c=2;表达式a>b!=c的值是( )。 参考答案:1

*4.37 以下程序的运行结果是( )。

#include main()

{int x=1,y,z; x*=3+2;

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

printf(\x=y==z;

printf(\}

参考答案:5□□□□□□□25□□□□□□1(制表符为7个) 4.38 在C语言中,表示逻辑―真‖值用( )。 参考答案:非0的数值。

*4.39 设y为int型变量,请写出描述―y是奇数‖的表达式( )。 参考答案:y%2==1 y%2!=0 y%2 (y-1)%2==0 !(y%2==0) 4.40 c语言提供的三种逻辑运算符是( )、( )和( )。 参考答案:&& || !

4.41 设x,y,z均为int型变量,请写出描述―x或y中有一个小于z‖的表达式( )。 参考答案:x

*4.42设x,y,z均为int型变量,请写出描述―x,y,z中有两个为负数‖的表达式( )。 参考答案:x*y*z>=0&&((x<0&&y<0)||(x<0&&z<0)||(y<0&&z<0))

参考分析:原书提供的答案是(x<0&&y<0)||(x<0&&z<0)||(y<0&&z<0),但当三个变量均为负数时不合适,后来本人思考了一个试图简化一些的答案,即x*y*z>0&&(x<0||y<0||z<0) 可是若有一个变量为零,其他为负数时也不合适,只有参考答案才无懈可击。

4.43 已知A=7.5,B=2,C=3.6,表达式A>B&&C>A||AB的值是( )。 参考答案:0

参考分析:在本表达式的计算过程中A

4.44 若int a=6,b=4,c=2;表达式!(a-b)+c-1&&b+c/2的值是( )。 参考答案:1

4.45 若a=2,b=4,则表达式!(x=a)||(y=b)&&0的值是( )。 参考答案:0

4.46 若a=1,b=4,c=3,则表达式!(a

4.47 若a=6,b=4,c=3,则表达式a&&b+c||b-c的值是( )。 参考答案:1

4.48 若a=5,b=2,c=1,则表达式a-b

4.49 若a=3,b=4,c=5,则表达式a||b+c&&b的值是( )。 参考答案:1

4.50 条件―22&&x<3||x<-10

4.51 当m=2,n=1,a=1,b=2,c=3时,执行完d=(m=a!=b)&&(n=b>c)后,n的值为( ),m的值为( )。 参考答案:0 1

4.52 以下程序的运行结果是 。

main() {int x,y,z; x=1;y=2;z=3; x=y--<=x||x+y!=z; printf(\}

参考答案:1,1

参考分析:这是两个表达式的或运算,第一个表达式y--<=x相当于2<=1为假,y变量增为1,第二表达式x+y!=z相当于1+1!=3为真,故x的值为1。 4.53 以下程序的运行结果是 。

main()

{int a1,a2,b1,b2; int i=5,j=7,k=0; a1=!k; a2=i!=j;

printf(\b1=k&&j;

b2=k||j;

printf(\}

参考答案:a1=1 a2=1 b1=0 b2=1

*4.54 以下程序的运行结果是 。

main() {int x,y,z; x=1;y=1;z=0; x=x||y&&z;

printf(\}

参考答案:1,0

参考分析:本题采用短路算法,由于x为真,后面的或和与运算均被短路。 4.55 有int x,y,z;且x=3,y=-4,z=5,则表达式(x&&y)==(x||z)的值为( )。 参考答案:1

4.56 有int x,y,z;且x=3,y=-4,z=5,则表达式!(x>y)+y!=z)||(x+y)&&(y-z)的值为(参考答案:1

4.57有int x,y,z;且x=3,y=-4,z=5,则表达式x++-y+(++z)的值为( )。 参考答案:13

4.58 有int a=3,b=4,c=5;则表达式a||b+c&&b==c的值为( )。 参考答案:1

4.59 有int a=3,b=4,c=5,x,y;则表达式!(x=a)&&(y=b)&&0的值为( )。 参考答案:0

4.60 有int a=3,b=4,c=5;则表达式!(a+b)+c-1&&b+c/2的值为( )。 参考答案:1

4.61 若运行时输入:16,则以下程序的运行结果是 。

#include void main(void) {int year;

printf(\scanf(\if (year>=18)

printf(\else

printf(\}

参考答案:your $3.0 yuan/xiaoshi

4.62 若运行时输入:2,则以下程序的运行结果是 。

#include void main(void) {char class;

printf(\scanf(\if (class=='1')

printf(\else

printf(\

。 )

}

参考答案:2nd class postage is 14p

4.63 若运行时输入:4.4,则以下程序的运行结果是 。

#include void main(void)

{float costprice,sellingprice; printf(\scanf(\if(costprice>=5)

{sellingprice=costprice+costprice*0.25;

printf(\} else

{sellingprice=costprice+costprice*0.30;

printf(\} }

参考答案:Selling Price(0.30)$ 5.72 4.64 以下程序的运行结果是 。

main()

{if (2*2==5<2*2==4) printf(\else

printf(\}

参考答案:F

*4.65 请阅读以下程序,若运行时输入:1605时,程序的运行结果是 。

main() {int t,h,m;

scanf(\h=t/100; if(h==0) h=12; printf(\m=t0;

if(m<10) printf(\printf(\if (t<1200||t==2400) printf(\else

printf(\}

参考答案:4:05PM

4.66 以下程序实现:输入园的半径r和运算标志m,按照运算标志进行指定计算,请填空。

标志 运算 a 面积 c 周长

b 二者均计算

#define pi=3.14159 main() {char m; float r,c,a;

printf(\scanf(\if (【1】) {a=pi*r*r;printf(\if (【2】) {c=2*pi*r;printf(\if (【3】) {a=pi*r*r;c=2*pi*r;

printf(\ } }

参考答案:【1】m=='a' 【2】m=='c' 【3】m=='b'

4.67 若运行时输入:5999,则以下程序的运行结果是 。

main() {int x; float y;

scanf(\

if(x>=0&&xx<=2999) y=18+0.12*x; if(x>=3000&&x<=5999) y=36+0.6*x; if(x>=6000&&x<=10000)y=54+0.3*x; printf(\}

参考答案:3635.4

4.68 以下程序实现输出x,y,z三个数中的最大者。请分析程序填空。

main()

{int x=4,y=6,z=7;; int 【1】; if(【2】) u=x; else u=y;

if (【3】) v=u; else v=z;

printf(\}

参考答案:【1】u,v 【2】x>y【3】u>z

4.69 以下程序将输入的三个整数按从大到小顺序输出,请分析程序填空。

main() {int x,y,z,c;

scanf(\if(【1】)

{c=y;y=z;z=c;} if(【2】)

{c=x;x=z;z=c;} if(【3】)

{c=x;x=y;y=c;}

printf(\}

参考答案:【1】y

4.70 以下程序对输入的两个整数,按从大到小顺序输出,请分析程序填空。

main() {int x,y,z;

scanf(\if(【1】)

{z=x;【2】}

printf(\}

参考答案:【1】x

*4.71 以下程序对输入的一个小写字母进行循环后移5个位臵后输出。如'a'变成'f','w'变成'b'。请分析程序填空。

#include main() {char c; c=getchar();

if (c>='a'&&c<='u') 【1】; else if (c>='v'&&c<='z') 【2】; putchar(c); }

参考答案:【1】c=c+5【2】c=c+6-26

*4.72 输入一个字符,如果它是大写字母,则把它变成小写字母,如果它是一个小写字母,则把它变成大写字母,其它字符不变。请分析程序填空。

main() {char ch;

scanf(\if(【1】) ch=ch+32;

else if(ch>='a'&&ch<='z') 【2】; printf(\}

参考答案:【1】ch>='A'&&ch<='Z'【2】ch=ch-32 4.73 以下程序的运行结果是 。

main() {int a,b,c; int s,w,t; s=w=t=0; a=-1;b=3;c=3; if(c>0) s=a+b; if(a<=0) {if(b>0)

if(c<=0) w=a-b; }

else if(c>0) w=a-b; else t=c;

printf(\}

参考答案:2 0 0

4.74以下程序的运行结果是 。

main()

{int a,b,c,d; a=c=0; b=1; d=20;

if(a) d=d-10; else if(!b)

if(!c) d=15; else d=25; printf(\}

参考答案:20

4.75 以下程序的运行结果是 。

#include main()

{int x,y=1,z; if(y!=0) x=5;

printf(\if(y==0) x=4; else x=5;

printf(\x=1; if(y<0)

if(y>0) x=4; else x=5;

printf(\}

参考答案: □□□□□□□□5 □□□□□□□□5 □□□□□□□□1

*4.76以下程序的运行结果是 。

#include main()

{int x,y=-2,z=0; if((z=y)<0) x=4; else if(y==0) x=5; else x=6;

printf(\if(z=(y==0)) x=5; x=4;

printf(\if(x=z=y) x=4;

printf(\}

参考答案:

□□□□□□□□4□□□□□□□-2 □□□□□□□□4□□□□□□□0 □□□□□□□□4□□□□□□□-2

*4.77 请阅读以下程序,为使输出时t值为4,输入量a和b应满足的条件是 。

main() {int s,t,a,b;

scanf(\s=1;t=1;

if(a>0) s=s+1; if(a>b) t=s+t; else if(a==b) t=5;

else t=2*s;

printf(\}

参考答案:00&&a

4.78 请阅读下面的程序,为使输出s=1,t=5的结果,输入量a和b应满足的条件是 a=b<=0 。

main() {int s,t,a,b;

scanf(\s=1;t=1;

if(a>0) s=s+1; if(a>b) t=s+t; else if(a==b) t=5; else t=2*s;

printf(\

4.79 下面程序根据以下函数关系,对输入的每个x值,计算出y值。请分析程序填空。

x y

2

-1

x≤-1 x-1

main() {int x,y;

scanf(\if(【1】) y=x*(x+2); else if(【2】) y=x-1; else 【3】;

if(y!=-1) printf(\else printf(\}

参考答案:【1】2

4.80下面程序根据以下函数关系,对输入的每个x值,计算出y值。请分析程序填空。

x x=a或x=-a -aa y 0 sqrt(a*a-x*x) x #include main() {int x,a; float y;

scanf(\if(【1】) y=0;

else if(【2】) y=sqrt(a*a-x*x); else y=x;

printf(\}

参考答案:【1】x==-a||x==a【2】x>-a&&x

*4.81 以下程序的功能是计算一元二次方程ax2+bx+c=0的根,请分析程序填空。

#include main()

{float a,b,c,t,disc,twoa,term1,term2; printf(\

scanf(\if(【1】)

if(【2】) printf(\ else printf(\else

{disc=b*b-4*a*c; twoa=2*a; term1=-b/twoa; t=abs(disc);

term2=sqrt(t)/twoa; if(【3】)

printf(\ else

printf(\ } }

参考答案:【1】a==0 fabs(a)<1e-4【2】b==0【3】disc<0

4.82 以下程序根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型。请分析程序填空。

#include \main()

{float a,b,c,s,area;

scanf(\if(【1】)

{s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(\

if(【2】)

printf(\等边三角形\ else if(【3】) printf(\等腰三角形\

else if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c=a*a)) printf(\直角三角形\ else printf(\一般三角形\ }

else printf(\不能组成三角形\}

参考答案:【1】a+b>c&&b+c>a&&c+a>b【2】a==b&&b==c 【3】a==b||b==c||a==c

4.83 某邮局对邮寄包裹有如下规定:若包裹的长宽高任一尺寸超过1米或重量超过30千克,不予邮寄;对可以邮寄的包裹每件收取手续费0.2元,在加上根据下表按重量wei计算的邮资。请分析程序填空。 重量(千克) 收费标准 wei<10 0.80 10

main()

{float len,wei,hei,wid,mon,r;

scanf(\if(len>1||wid>1||hei>1||wei>30) 【1】; else if(wei<10) r=0.8; else if(wei<=20) r=0.75; else if(wei<=30) 【2】; if(r==-1) printf(\else

{【3】;printf(\}

参考答案:【1】r=-1【2】r=0.70【3】m=0.2+r*wei

**4.84 某服装店经营套服,也单件出售。若买的不少于50套每套80元;不足50套的每套90元;只买上衣每件60元;只买裤子每条45元。以下程序的功能是读入所买上衣c和裤子t的件数,计算应付款m。请分析程序填空。

main() {int c,t,m;

printf(\scanf(\if(【1】)

if(c>=50) m=c*80; else m=c*90; else

if(【2】)

if(t>=50) m=t*80+(c-t)*60; else m=t*90+(c-t)*60;

else

if(【3】) m=c*80+(t-c)*45; else m=c*90+(t-c)*45; printf(\}

参考答案:【1】t==c 【2】c>t 【3】c>=50

4.85 以下程序的功能是判断输入的年份是否是闰年。请分析程序填空。

main() {int y,f;

scanf(\if(y@0==0) f=1; else if(【1】) f=1; else 【2】;

if (f) printf(\else printf(\printf(\}

参考答案:【1】year%4== 0&&year0!=0【2】f=0

*4.86 以下程序段针对输入的截止日期(年:yend,月:mend,日:dend)和出生日期(yman,mman,dman),计算出实际年龄。请分析程序填空。 设有:int yend,mend,dend,yman,mman,dman;

age=yend-yman;

if(mend【1】)mman) age--;

else if(mend【2】mman&&dend【3】dman) age--; 参考答案:【1】<【2】==【3】<

4.87 有四个数a,b,c,d,要求从大到小的顺序输出。请分析程序填空。

main()

{int a,b,c,d,t;

scanf(\if(a

printf(\}

参考答案:【1】c

4.88 以下程序的运行结果是 。

main()

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

if(a>b) c=1;

else if(a==b) c=0; else c=-1 printf(\}

参考答案:-1

4.89 若a=1,b=2,则表达式a>b?a:b+1的值是 。 参考答案:3

4.90 若a=1,b=2,c=3,d=4,则表达式a>b?a:c>d?c:d的值是 。 参考答案:4

*4.91 设有变量定义:int a=10,c=9;则表达式(--a!=c++)?--a:++c的值是 。 参考答案:11

4.92 若有说明语句:int x=1,y=0;则表达式x>(y+x)?10:12.5>y++?'a':'A'的值是 。 参考答案:'a'

*4.93 若有说明语句:int a=1,b=0;则表达式++a*--a==b?12%5:'x'的值是 。 参考答案:'x'

4.94 若有x=1,y=2,z=3,则表达式(x

**4.95 若有说明语句:int x=1,y=0;则表达式x-->(y+x)?5:25>y++?'1':'2'的值是 。 参考答案:5

参考分析:增量运算在条件运算的第一个表达式中时,关系运算符两侧各为一个处理单元。x--中的值是1,然后增为0,故y+x为0+0,因此整个表达式计算结果为真。 4.96 以下程序的运行结果是 。

#include main()

{int a=-10,b=-3; printf(\printf(\printf(\}

参考答案:1,-13,-7

4.97以下程序的运行结果是 。

main()

{int x=1,y=1,z=1; y=y+z; x=x+y;

printf(\

printf(\printf(\}

参考答案:3,2,3,3

4.98 以下程序的运行结果是 。

main() {int x,y,z; x=3; y=z=4;

printf(\printf(\}

参考答案:0,1

4.99 若运行时输入:-2,则以下程序的输出结果是 。

main()

{int a,b;

scanf(\b=(a>=0)?a:-a; printf(\}

参考答案:b=2

4.100 若运行时输入:100,下面程序的运行结果是 。

main() {int a;

scanf(\

printf(\}

参考答案:yes

4.101 如果运行时输入字符'Q',则以下程序的运行结果是 。

main() {char ch;

scanf(\

ch=(ch>='A'&&ch<='Z')?(ch+32):ch; ch=(ch>='a'&&ch<='z')?(ch-32):ch; printf(\}

参考答案:Q

4.102 当运行时输入:1992,则以下程序的运行结果是 。

main() {int y,t;

scanf(\

t=((y%4==0)&&(y0!=0)||y@0==0)?1:0; if(t) printf(\else printf(\printf(\}

参考答案:1992 is a leap year

4.103 以下程序是计算x,y,z三个数中最小的。请分析程序填空。

main()

{int x=4,y=5,z=8; int u,v;

u=x

参考答案:【1】x:y【2】u:z

4.104 设有变量定义:int a=5,c=4;则(--a==++c)?--a:c++的值是【1】,此时c的存储单元的值为【2】。 参考答案:【1】5【2】6

4.105 执行以下程序后,a=【1】,b=【2】,c=【3】。

int x=10,y=9; int a,b,c;

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

b=x++; c=y; 参考答案:【1】10【2】9【3】11

*4.106 设有int x=1,y=0;则以下表达式的值为 。

x-->(y+x)?10:12.5>y++?'A':'Z' 参考答案:10

参考分析:在本题中x-->(y+x)的实际比较运算是1>0+0为真。 *4.107 设有int x=0,y=1;则以下表达式的值为 。

x++*x--!='y'?8-4:y 参考答案:4

参考分析:此处x++*x—实际计算为0*0。

4.108 若运行时输入:3 5/,则以下程序的运行结果是 。

main() {float x,y; char o; double r;

scanf(\switch(o)

{case '+':r=x+y;break; case '-':r=x-y;break; case '*':r=x*y;break; case '/':r=x/y;break; }

printf(\}

参考答案:0.600000

4.109 根据以下嵌套的if语句所给条件,填写switch语句,使它完成相同的功能。

(假设mark的取值在1-100之间) if语句:

if(mark<60) k=1; else if(mark<70) k=2; else if(mark<80) k=3; else if(mark<90) k=4; else k=5; switch语句:

switch(【1】) {【2】k=1;break; case 6 :k=2;break; case 7 :k=3;break; case 8 :k=4;break; 【3】k=5; }

参考答案:【1】mark/10 【2】default: 【3】case 9:case 10:

4.110 设有如下程序段,若grade的值为'C',则输出结果是 。

switch(grade)

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

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

参考答案: 60-69 <60 error!

4.111 以下程序段的运行结果是 。

int x=1,y=0; switch(x) {case 1:

switch(y)

{case 0:printf(\ case 1:printf(\ }

case 2:printf(\}

参考答案: **1** **3**

4.112 根据以下函数关系,对输入的每个x值,计算出相应的y值。请分析程序填空。

x y

x<0 0

0≤x<10 x

10≤x<20 10

20≤x<40 -0.5x+20

main() {int x,c; float y;

scanf(\if(【1】) c=-1; else c=【2】; switch(c)

{case –1:y=0;break; case 0:y=x;break; case 1:y=10;reak;

case 2:case 3:y=-0.5*x+20;break; default:y=-2; }

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

参考答案:【1】x<0 【2】x/10 【3】y!=-2 4.113 以下程序的运行结果是 。

main()

{int a=2,b=7,c=5;

switch(a>0)

{case 1:switch(b<0)

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

case 0:switch(c==5)

{case 0:printf(\ case 1:printf(\ default:printf(\ }

default:printf(\}

printf(\}

参考答案:#&

4.114 下面程序的运行结果是 。

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

参考答案:a=2,b=1

4.115 假设奖金税率如下(a代表奖金,r代表税率)

a<500 r=0% 500≤a<1000 r=5% 1000≤a<2000 r=8% 2000≤a<3000 r=10% 3000≤a r=15%

以下程序对输入的一个奖金数,求税率和应交税款以及实得奖金数(扣除奖金税后)。请分析程序填空。

main()

{float a,r,t,b; int c;

scanf(\if(a>=3000) c=6; else c=【1】; switch(c)

{case 0:r=0;break; case 1:r=0.05;break;

case 2:case 3:【2】;break; case 4:case 5:r=0.1;break; case 6:r=0.15;break;

} t=a*r; b=a-t;

printf(\} 参考答案:【1】a/500 【2】r=0.08

4.116 某个自动加油站有'a','b','c'三种汽油,单价分别为1.50,1.35,1.18(元/千克),也提供了―自己加‖和―协助加‖两个服务等级。这样用户可以得到5%或10%的优惠。本程序针对用户输入加油量a,汽油品种b和服务类型c('f'--自动,'m'--自己,'e'--协助),输出应付款m。请分析程序填空。

main()

{float a,r1,r2,m; char b,c;

scanf(\swith(b)

{case 'a':r1=1.5;break; case 'b': 【1】 ;break; case 'c':r1=1.18;break; }

switch(c)

{case 'f':r2=0;break; case 'm':r2=0.05;break; case【2】:r2=0.1;break; }

m=【3】; printf(\}

参考答案:【1】r1=1.35【2】'e'【3】a*r1*(1-r2) 4.117 以下程序计算某年某月有几天。其中判别闰年的条件是:能被4整除但不能被100整除的年是闰年,能被400整除的年也是闰年。请分析程序填空。

main()

{int yy,mm,len;

printf(\

scanf(\switch(mm)

{case 1: case 3: case 5: case 7:case 8: case 10:case 12:【1】;break;

case 4: case 6: case 9: case 11:len=30;break;

case 2:if(yy%4==0&&yy0!=0||yy@0==0)【2】; else【3】; break;

default:printf(\}

printf(\}

参考答案:【1】len=31【2】len=29【3】len=28

*4.118 以下程序用以计算y年m1月d1日与同年的m2月d2日之间的天数(m2>=m1),并打印计算结果。若m1=m2且d1=d2则算一天。请分析程序填空。

main()

{int y,m1,d1,m2,d2; int i,d;

scanf(\y=(y%4==0【1】y0!=0【2】y@0==0)?1:0; d=0-d1;

for(i=m1;i

{case 1:case 3:case 5: case 7:case 8: case 10:case 12:d+=31;break; case 2:d=d+28+y; break;

case 4:case 6:case 9:case 11:【3】; }

printf(\} 参考答案:【1】&&【2】||【3】d=d+30 4.3 编程题

4.119 编制程序,要求输入整数a和b,若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。 参考程序:

main() {int a,b;

printf(\scanf(\

if (a*a+b*b>100) printf(\else printf(\}

4.120 试编程判断输入的正整数是否既是5又是7的整数倍,若是输出yes,否则输出no。 参考程序:

main() {int a;

printf(\scanf(\

if (a%5==0&&a%7==0) printf(\else printf(\}

4.121 请编程序,根据以下函数关系,对输入的每个x值,计算出相应的y值。 x y x≤0 0 0

参考程序:

main() {float x,y;

printf(\scanf(\y=-1;

if(x<0) y=0;

else if(x<=10) y=x;

else if(x<=20) y=10;

else if(x<40) y=0.5*x+20 else y=-1; if (y==-1) printf(\else printf(\}

4.122 输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一: (1)能同时被3,5,7整除

(2)能被其中两数整除(要指出哪两个)。 (3)能被其中一个数整除(要指出哪一个)。 (4)不能被任何一个整除。 参考程序:

main() {int m;

printf(\scanf(\

if(m%3==0&&m%5==0&&m%7==0) printf(\能同时被3,5,7整除\

else if((m%3==0&&m%5==0)||(m%3==0&&m%7==0)||(m%5==0&&m%7==0)) {printf(\能被其中两数整除\

if(m%3==0&&m%5==0) printf(\ else if(m%3==0&&m%7==0) printf(\ else printf(\ }

else if(m%3==0||m%5==0||m%7==0) {printf(\能被其中一个数整除\

if(m%3==0) printf(\else if(m%5==0) printf(\ else printf(\

}

else printf(\不能被任何一个整除\}

4.123 将以下程序段改用非嵌套的if语句实现。

int s,t,m; t=(int)(s/10); switch(t)

{case 10:m=5;break; case 9:m=4;break; case 8:m=3;break; case 7:m=2;break; case 6:m=1;break; default: m=0; }

参考程序:

m=0;

if(s>=100&&s<110) m=5; if(s>=90&&s<100) m=4; if(s>=80&&s<90) m=3; if(s>=70&&s<80) m=2; if(s>=60&&s<70) m=1; 4.124 用switch编程实现: -1 (x<0) y={0 (x=0)

1 (x>0)

参考程序:

void main() {float x; int y;

printf(\ scanf(\ switch(x<0)

{case 1:y=-1;break; case 0:switch(x==0) {case 1:y=0;break; case 0:y=1; } }

printf(\}

4.125 将以下程序段改用嵌套的if语句实现。

int s,t,m; t=(int)(s/10); switch(t)

{case:m=5;break; case 9:m=4;break; case 8:m=3;break; case 7:m=2;break; case 6:m=1;break; default: m=0; } 参考程序:

if(s>=110&&s<60) m=0 else if(s<110) m=5; else if(s<100) m=4; else if(s<90) m=3; else if(s<80) m=2; else m=1;

4.126 请将以下语句改写成为switch语句。

if(s>0&&s<=10)

if(s>=3&&s<=6) x=2; else if(s>1||s>8) x=3; else x=1; else x=0;

参考程序:

switch(s>0&&s<=10) {case 0:x=0;break;

case 1:switch(s>=3&&s<=6) {case 1:x=2;break;

case 0:switch(s>1||s>8) {case 1:x=3;break; case 0:x=1;break; } } }

4.127编程实现以下功能:读入两个运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值,其中op可为+,-,*,/(用switch语句实现)。 参考程序:

#include #include main()

{float data1,data2,result; char op;

printf(\

scanf(\ switch(op)

{case '+':result=data1+data2;break; case '-':result=data1-data2;break; case '*':result=data1*data2;break;

case '/':if(data2==0){printf(\ result=data1/data2;break; }

printf(\}

4.128 编一程序,对于给定的一个百分制成绩,输出相应的五分值成绩。设90分以上为'A',80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'(用switch语句实现)。 参考程序: main()

{int score=-1,temp; char grade;

while(score>=0&&score<=100) { printf(\ scanf(\ }

temp=score/10; switch(temp)

{case 0:case 1:case 2:case 3:case 4:case 5:grade='E';break; case 6:grade='D';break; case 7:grade='C';break; case 8:grade='B';break; case 9:case 10:grade='A'; }

printf(\

}

第五章 循环控制

5.1 选择题

5.1 设有程序段

int k=10;

while(k=0) k=k-1;

则下面描述中正确的是 。

A)while循环执行10次 B)循环是无限循环

C)循环体语句一次也不执行 D)循环体语句执行一次 参考答案:C

5.2设有以下程序段

int x=0,s=0;

while(!x!=0) s+=++x; printf(\则 。

A)运行程序段后输出0 B)运行程序段后输出1 C)循环的控制表达式不正确 D)程序段执行无限次 参考答案:B

5.3语句while(!E);中的!E等价于 。

A)E= =0 B)E!=1 C)E!=0 D)E= =1 参考答案:A

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

a=1;b=2;c=2;

while(a

A)1,2,0 B)2,1,0 C)1,2,1 D)2,1,1 参考答案:A

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

x=y=0;

while(x<15) y++,x+=++y;

printf(\

A)20,7 B)6,12 C)20,8 D)8,20 参考答案:D

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

int n=0;

while(n++<=2); printf(\

A)2 B)3 C)4 D)语法错误 参考答案:C 5.7 设有程序段

t=0;

while(printf(\{t++;

if(t<3) break;

}

下面描述正确的是 。

A)其中循环控制表达式与0等价 B)其中循环控制表达式与'0'等价 C)其中循环控制表达式是不合法的 D)以上说法都不对 参考答案:B

参考分析:printf的返回值为数值1,恒真,故与B等价。

5.8 下面程序的功能是将从键盘输入的一对数,由小到大排序输出。当输入一对相等数时结束循环,请选择填空。

#include main() {int a,b,t;

scanf(\while( ) {if (a>b)

{t=a;a=b;b=t;}

printf(\scanf(\} }

A)!a=b B)a!=b C)a==b D)a=b 参考答案:B

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

#include \main()

{int m=0,n=0; char c; while ((【1】)!='\\n')

{ if(c>='A'&&c<='Z') m++; if (c>='a'&&c<='z') n++;

}

printf(\【2】);} 【1】A)c=getchar() B)getchar() C)c=gets() D)scanf(\ 【2】A)m:n B)m:m C)n:n D)n:m 参考答案:【1】A【2】D

5.10下面程序的功能是将小写字母变成对应大写字母后的第二个字母,其中y变成A,z变成B。请选择填空。

#include \main() { char c;

while ((c=getchar())!='\\n') {if (c>='a'&&c<='z') {【1】; if (c>'Z') 【2】; }

printf(\}

}

【1】A)c+=2 B)c-=32 C)c=c+32+2 D)c-=30 【2】A)c='B' B)c='A' C)c-=26 D)c=c+26 参考答案:【1】D【2】 C

5.11下面程序的功能是在输入一批正整数中求出最大者,输入0结束循环,请选择填空 。

#include \main()

{int a,max=0; scanf(\while ( ) {if (max

printf(\

A)a= =0 B)a C)a= =1 D)!a 参考答案:B

5.12 下面程序的运行结果是 。

#include main()

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

printf(\} }

A)1 B)1 C)1 D)1 2 2 2 3 3 4 参考答案:C

5.13若运行以下程序时,从键盘输入2473(表示回车),则下面程序的运行结果是 。

#include \{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(\

A)668977 B)668966 C)66778777 D)6688766 参考答案:A

5.14 C语言中while和do while循环的主要区别是 。

A)do-while的循环至少无条件执行一次。

B)while循环控制条件比do-while的循环控制条件严格。 C)do-while允许从外部转入到循环体内。 D)do-while的循环体不能是复合语句。 参考答案:A

5.15 以下能正确计算10!的程序段是 。

A)do {i=1;s=1; B)do{i=1;s=0; s=s*i; s=s*i; i++; i++;

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

}while(i<=10); }while(i<=10); 5.16 以下程序段 。

x=-1;

do x=x*x; while(!x);

A)是死循环 B)循环执行两次 C)循环执行一次 D)有语法错误 参考答案:C

5.17 以下描述中正确的是 。

A)由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句。

B)do-while循环由do开始,用while结束,在while(表达式)后面不能写分号。

C)在do-while循环体中,一定要有能使while后面表达式的值变为零(\假\的操作。 D)do-while循环中,根据情况可以省略while。 参考答案:C

5.18 若有语句如下,则程序段的输出是 。

int x=3;

do {printf(\

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

*5.19下面程序的功能是计算正整数2345的各位数字平方和。

#include \main()

{int n,sum=0; n=2345;

do {sum=sum+【1】; n=【2】; } while(n);

printf(\

【1】A)n B)(n)*(n) C)n/10 D)(n/10)*(n/10) 【2】A)n/1000 B)b/100 C)n/10 D)n 参考答案:【1】B 【2】C

5.20 下面程序是从键盘输入学号,然后输出学号中百位数是3的学号,输入0时结束循环。请选择填空。

#include main()

{long int num;

scanf(\do

{if(【1】) printf(\ scanf(\}while(【2】); }

【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 参考答案:【1】B 【2】C

5.21 等比数列的第一项a=1,公比q=2,下面程序的功能是求满足前n项和小于100的最大n,请选择填空。

#include main()

{int a,q,n,sum; a=1;q=2;n=sum=0; do

{【1】; ++n;a*=q;

}while(sum<100); 【2】;

printf(\}

【1】A)sum++ B)sum+=a C)sum*=a D)a+=sum 【2】A)n=n-2 B)n=n C)n++ D)n-=1 参考答案:【1】B 【2】D

5.22 下面程序的功能是把316表示为两个加数的和,使两个加数分别能被13和11整除。请选择填空。

#include main()

{int i=0,j,k; do

{i++;k=316-13*i;}while( ); j=k/11;

printf(\}

A)k/11 B)k C)k/11==0 D)k==0 参考答案:B

5.23 下面程序的运行结果是 。

#include main() {int y=10;

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

A)-1 B)1 C)8 D)0 参考答案:D