1、第四章 C 程序设计一、填空【例 4-1】已知 boy=54,girl=46,(1)如果想输出 boy=54%,girl=46%,则输出部分应为: ;(2)如果想输出 boy=54%,girl=46% 则输出部分应为: ;解析:(1)中的“boy=” 、 “, ”、 “girl=”为普通字符,原样输出,在格式串中直接写出, “%” 在格式串中用“%”表示, “54 ” 在格式串中用%d 控制,与输出项 boy 对应,“46 ” 在格式串中也用 %d 控制,与输出项 girl 对应。 (2)与(1)不同之处在于分两行输出,用“n”控制。答案:(1)printf(“boy=%d%,girl=%d%
2、”,boy,girl) ;(2)printf(“boy=%d%ngirl=%d%”,boy,girl) ;【例 4-2】若有程序main() int i,j;scanf(“i=%d,j=%d“, printf(“i=%d,j=%dn“,i,j);要求给 i 赋 10,给 j 赋 20,则应该从键盘输入 。解析:scanf 函数中的格式串中的“i=,j=”为普通字符,原样输入,其中“,j=”又在两个%d 中间起分隔作用。答案:i=10,j=20【例 4-3】若使用语句:scanf(“ %d ,%d “, scanf(“ %3c%c “,将 10、20、a、b 分别赋值给整型变量 x1、x2、x3
3、、x4,应按 方式输入数据。解析:本题考查的是 scanf 函数的数据输入间隔问题。“ %d ,%d “用普通字符“, ”间隔,输入时,原样输入;%d 和%3c 之间属于不同数据类型的控制字符,自动分隔,不用间隔符;%3c%c 用字符宽度间隔,也不用间隔符。答案:10,20a*b (说明:*也可换成其它字符)【例 4-4】以下程序运行后的输出结果是 _ 。main() int x,y;x=97;y=097;printf(“%d %dn”,x,y);printf(“%c %cn”,x,y);解析:x,y 均为整型变量,第一个输出语句按十进制整型输出,且数据之间有一个空格,按原样输出, 第二个输出
4、语句按字符型数据输出。注意:y 应转成十进制形式输出。答案:97 79a 0【例 4-5】写出下面程序的结果 。main() int x=34;float y=45.9867;printf(“%6D,%6.2Fn”,x,y); /* 输出为:%6D,%6.2F */printf(“%6d,%6.2fn”,x,y); /* 输出为:, */printf(“%-6dn”,x); /* 输出为: (右补 4 个空格)*/printf(“%06dn”,x); /* 输出为:(左补 4 个 0)*/printf(“%-06dn”,x); /* 输出为:(0 将失去作用) */解析:格式控制符应为小写字母
5、,输出语句由于 D、F 是大写字母,所以它们被当成普通字符,原样输出;输出语句的 d、f 是格式控制字符,6 和 6.2 是附加格式说明符,要求 x 按 6 位输出, (左补 4 个空格) ,y 按 6 位输出,四舍五入保留 2 位小数(左补一个空格,小数点占一位) ;输出语句要求 x 按 6 位输出,附加格式说明符-要求右补 4 个空格;输出语句要求 x 按 6 位输出,附加格式说明符 0 要求左补 4 个 0;输出语句要求x 按 6 位输出,附加格式说明符-0 要求右补 4 个 0,0 将失去作用,否则出现错误。答案:输出结果在题右侧。【例 4-6】以下程序段的输出结果是 。int a,c
6、; unsigned d; float b,e;a=3.5+3/2; b=23; c=xe0;d=-1; e=2.555555555;printf(“n%d,%f,%d,%u,%f”,a,b,c,d,e);解析:(1)变量 a 的值是 4(3.5+3/2=3.5+1 再取整,而不是 3.5+1.5) 。 (2)b=23;将整形数据转换成实型数据后再输出。 (3)转义字符xe0在内存中占一位,其存储形式为:1110 0000,将其赋值给 int 型变量 c,系统将其赋给 c 的低八位,自动将高八位补1111 1111,即 c 变量的值为 1111 1111 1110 0000,十进制输出是-32
7、。 (4)d=-1;-1 在内存中表示为:1111 1111 1111 1111,数据中 16 位原样赋值给变量 d。输出 65535。 (5)e=2.555555555;将 double 浮点数按四舍五入转换成单精度赋值给变量 e。本题主要考查不同类型的数据之间的赋值、数据在内存中的存储形式。提示:我们在编写程序时也应像本题一样,注意输出项的数据类型与格式控制符保持一致。答案:4,23.000000,-32,65535,2.555556二、选择【例 4-1】下列语句中,不正确的是 。Ac=2*5; Bx+= =8; x/=4; C ; Dc=a+b解析:本题主要考查语句的基本概念,c 语句由
8、分号(;)结尾,表示一个语句的终结,分号必不可少,所以 D 错。B 是复合语句; C 是空语句。答案:D【例 4-2】以下 是非法函数调用语句。Achar c=T; Bchar c;putchar(c); getchar(c) ;Cputchar(0x61); Dputchar(a+1);解析:getchar 函数没有参数,调用函数形式为 getchar( )putchar 函数有参数,调用函数形式为 putchar(c), c 可以是字符型常量、字符型变量、整型常量及其表达式。答案:B【例 4-3】若输入 12345、abc 下列程序的输出结果为: 。main() int a;char ch
9、;scanf(“%3d%3c” ,double x ;unsigned y ;char ch;则 是合法的输入语句。A. scanf(“ %ld %lf%x%c “,a,x, y,ch);B. scanf(“ %d%5.2f %d%c “,C. scanf(“ %ld %lf %o%c“,D. scanf(“ %ld%f %x%c“,解析:本题考查的是输入语句的格式控制字符串应与输入项在数据类型上应保持一致。,所以 B 错,另外 B 的%5.2f 加了精度限制,也属于错误之处;双精度型变量 x 应与格式控制符%lf 对应,所以 D 错;无符号型变量 y 应与格式控制符%u、%x 或%o 对应;
10、字符型变量 ch 应与格式控制符%c 或%d 对应,用%d 作为格式控制符时,从键盘上输入的数据应为输入字符的 ASCII 码值。A 错在输入项是变量名本身,应该是变量的地址。答案:C【例 4-5】有如下定义和输入语句,若要求 a,b,c,d 的值分别为 23,45, M,N,正确的输入应该是 。int a,b;char c,d;scanf(“%d%d”,scanf(“%c%c”,A.2345MN B.23 45 MN C.23 45 MN D.23 45MN解析:A 是错误的,它使 a=2345。因为输入数据时,23 和 45 之间没有数据分隔符。选项 B 是错误的,它使 a=23,b=45
11、,c 是“回车” ,d=M 。选项 C 也是错误的,它使a=23,b=45,c= ,d=M 。因为以%c 格式输入字符数据时,对应的变量只接收一个字符。 “空格”和“回车”也是字符数据。本题主要考查 scanf 函数的使用。注意:以%c 格式输入字符数据时,对应的变量只接收一个字符。 “空格”和“回车”也是字符数据。答案:D【例 4-6】以下程序段的输出结果是 。float x=32.76888888;printf(“%6.3f,%f”,x,x);A32.769,32.76888888 B 32.769,32.768890 C 32.76888888,32.7688888 D有语法错误,无输出
12、解析:%6.3f 要求输出占 6 位(包括小数点) ,小数部分按四舍五入取值,占 3 位,输出 32.769。%f 要求正常按实数输出,7 位有效数字,小数部分取 6 位,输出32.768890,3,2,7,6,8,8,9 为有效数字,0 为随机值。答案:B【例 4-7】若 int 类型数据占两个字节,则执行以下语句的输出为 。int x=-7;printf(“%d,%un”,x,x);A. -7,-7 B.-7,32762 C.-7,-32762 D.-7,65529解析:首先明确变量的值在内存中的存放形式(以补码存放) ,x=-7 在内存中的存放形式是:1111 1111 1111 100
13、1,当把 x 的值按“%d”格式(有符号整数)输出时为-7;按“%u”格式(无符号整数)输出时为 65529。本题如果将 k 以无符号整数格式“%o”和 “%x”输出时结果为 17771 和 fff9。答案:D【例 4-8】以下程序段的输出结果是 。int k=32768;printf(“%d”,k);A0 B-32768 C-1 D有语法错误,无输出解析:int 型数据的范围是:-3276832767,k 值超出了 int 型数据的范围,系统做出了溢出处理,将该数减去整型数据类型的模(即该类型数据能表示的数据的个数,基本整形的模为 65536) ,所以 32768-65536=-32768。
14、答案:B【例 4-9】在下述输出语句的输出结果中,正确的是 。int x=0xabcdefL;long int y=0x11;printf(“%x,%ld”,x,y);A输出值为 cdef,17 B非法赋值 C输出值不确定 D输出值为 0xabcdef,0x11解析:Long 型数据 0xabcdef 赋给 int 型变量 x,系统自动对其进行类型转换,将数据中低 16 位 cdef 赋值给 x,舍弃高 16 位的 0x00ab。将 0x11 赋值给 long 型变量 y,其值送到 y 的低 16 位,因为 0x11 是正数,所以,变量 y 的高 16 位补 0。高 16 位 低 16 位整形
15、变量 0xabcdefL 0x00ab 0xcdefint 型变量 x 得到 - 0xcdef整形常量 0x11 - 0x0011long 型变量 y 得到 0x0000 0x0011答案:A【例 4-10】已知字母a的 ASC码值是 97,以下程序的输出是 。#includemain()char a=A;int b=20;printf(“%d,%o”,(a=a+1,a+b,b),a+a-A,b);A.66,141 B.20,141 C.20,141,20 D.66,97解析:本题 printf 函数的格式控制字符串“%d,%o”有两个格式描述项,输出项有三个(a=a+1,a+b,b),a+a
16、-A,b,那么,只能有两个数据输出,多余的输出项 b 不输出。第一个输出项是逗号表达式,其值为 20;第二个输出项是 char 型数据参与算术运算,a的 ASCII 码值是 97,所以第二个输出项的值的十进制表示是 97,以八进制格式输出为 141。本题主要考查格式输出 printf 函数。如果输出项的个数多余格式控制说明符的个数,没有格式控制说明符的输出项不输出;如果格式控制说明符的个数多余输出项的个数,按格式控制说明符输出对应的输出项的值,对应多余的格式控制说明符输出随机值。答案:B【例 4-11】已知:a的 ASC码值为 97, 0的 ASC码值为 48,下述程序的输出结果是 。#inc
17、ludemain()printf(“%s”,”tabc%L”060x61081”);A.abc%L ”0a B.tabc%L”060x61081C.abc%L”0a D.abc%L”0a081解析:(1)转义字符“t” (横向跳格,跳 8 个字符)使后面的输出跳到下一个输出位(第 9 个字符位置) 。 (2)abc 为普通字符,原样输出。 (3)对应“” ”的输出是“ ”。 (4) “%”后面“L”不是格式字符,所以“%”作为普通字符原样输出。也可以用连续两个“%” ,输出一个“%” 。 (5) “060”和“x61”是转义字符, “060”是八进制的转义字符,八进制数“060”作为 ASCI
18、I 码值表示的是字符0 , “x61”是十六进制的转义字符,十六进制数“61”作为 ASCII 码值表示的是字符a 。 (6)081 不是八进制数“081”作为 ASCII 码值表示的转义字符,因为数字 8 不是八进制数码,所以0 、 8、 1分别作为字符处理, 0是空字符,字符串到此结束,因此, 8、 1没有输出。本题主要考查 printf 函数及转义字符。%s 格式表示输出字符串,遇到第一个空字符0结束。注意0和0是不同的两个字符, 0的 ASCII 码值为 0, 0的 ASCII 码值为 48。特别提醒:读者在输出“、 、 ”、%”等符号时,最好加在“”之后,但在能够分辨它是普通字符时,
19、不加“”也可以,如“ab”能够认出这里的“ ”是普通字符。在不能够分辨时,就会成为错误常量,如”a”b” ,不能够认出这里的“” ”是普通字符,还是括起字符串的双引号,此时必须写成”a”b” ,才能认为是要输出“” ”号。答案:A三、判断下列叙述是否正确,错的加以改正【例 4-1】语句 printf(“%s”,a); 的输出结果为字符 a。解析:此语句是错误的,因为a是一个字符,占用一个字节,而%s 是字符串格式控制符,二者类型不一致,输出结果不确定。改正:语句 printf(“%s”,”a”); 的输出结果不确定。【例 4-2】语句 printf(“%c”, ”a”); 的输出结果为字符 a。解析:错误。 因为”a”是字符串,占用两个字节,而%c 是单个字符格式控制符。与上题错误类型一样,编写程序时要注意:输出项和格式控制符在数据类型上应保持一致。改正:语句 printf(“%c”,a);的输出结果不确定。