②地址表列由若干个地址组成,可以是变量的地址(如&a)或已经赋值的指针变 量(第十章介绍)。 ③在输入数据时,数据分隔方法。 1)当格式控制字符之间不包括其它字符,且输入的是数值型数据(整形或浮点型)时, 数据之间可以用空格、Iab键或回车键(<CR>)分隔; 2)当指定了数据宽度时,可连续输入数据 例如:假设inta: float b,c;执行 scanf(“%2d%3%64f”,&a,&b,&c);语句 时,输入数据123456789<CR>,相当于a=12,b=345.00000c=678900000 3)当输入的是数值型(整形和浮点型)和字符型,且两种类型交错出现,可连续输入, 系统自动识别。 例如:假设inta: char b; float c;执行 scanf(“%d%c%f”,&a,&b,&c);语句 时,输入数据1234c6789CR>,相当于a=1234,b=c,c=678900000遇到“c” 时,系统知道相应于“&x”项的输入已经结束,“c”是相应于“&y”项的输入,只接 收一个字符,余下的是相应于“&z”的输入 4)如果格式控制字符串中有其它字符,输入数据时必须在相应位置输入这些字符。 当这类普通字符出现在数值型数据之间时,可以当成数据分隔符 例如:假设intx; float z:执行 scanf“%d,%”,&x,&z);语句时,输入数据 12,34<CR>,相当于x=12,z=34.00000普通字符“,”看成数据间隔符 5)当输入字符数据时,空格、回车、Tab键和转义字符均为有效字符输入,所以 此时不能使用间隔符, 例如: scanf(“%c%c%c”,&cl,&c2,&c3);当输入数据abc<CR>,相当于cl=‘a 2=‘b’,c3=‘c ④输入数据时不能规定实型(即浮点型)数据精度,例如: scanf(“%7.2f”,&a) 是不合法的。 ⑤输入数据时遇到下列情况之一,认为输入数据结束。 空格、回车、Iab键 遇到宽度满足时,例如:“%4d”,只取4列 ·遇到非法输入。例如: scanf(“%d%oc%f”,&x,&y,&z);当输入数据 12345a12o.56CR>(其中把数字0错打为英文字母o,则x=12345,y=‘a', z=12.000000。 ⑥“%”后的附加说明符“*”用来表示本输入项在读入后不赋值给相应的变量, 即跳过它对应的数据 例如:inta:; char c: scanf(“%2c:%*2d%d”,&c,&a) 运行时,输入数据AB:1020<CR> AB”是对应格式“%2c“的输入,则c=‘A’,普通字符“:”原样输入,“10 是对应格式“%*d”的输入,跳过这两位数10,将20赋值给变量a,使a=20
26 ②地址表列由若干个地址组成,可以是变量的地址(如&a)或已经赋值的指针变 量(第十章介绍)。 ③在输入数据时,数据分隔方法。 1)当格式控制字符之间不包括其它字符,且输入的是数值型数据(整形或浮点型)时, 数据之间可以用空格、Tab 键或回车键(<CR>)分隔; 2)当指定了数据宽度时,可连续输入数据。 例如:假设 int a;float b,c;执行 scanf(“%2d%3f%4f”,&a,&b,&c);语句 时,输入数据 123456789<CR>,相当于 a=12,b=345.000000, c=6789.000000 3)当输入的是数值型(整形和浮点型)和字符型,且两种类型交错出现,可连续输入, 系统自动识别。 例如:假设 int a;char b;float c;执行 scanf(“%d%c%f”,&a,&b,&c);语句 时,输入数据 1234c6789<CR>,相当于 a=1234,b=’c’, c=6789.000000。当遇到“c” 时,系统知道相应于“&x”项的输入已经结束,“c”是相应于“&y”项的输入,只接 收一个字符,余下的是相应于“&z”的输入。 4)如果格式控制字符串中有其它字符,输入数据时必须在相应位置输入这些字符。 当这类普通字符出现在数值型数据之间时,可以当成数据分隔符。 例如:假设 int x;float z;执行 scanf(“%d,%f”,&x,&z);语句时,输入数据 12,34<CR>,相当于 x=12,z=34.000000,普通字符“,”看成数据间隔符。 5)当输入字符数据时,空格、回车、Tab 键和转义字符均为有效字符输入,所以 此时不能使用间隔符, 例如:scanf(“%c%c%c”,&c1,&c2,&c3);当输入数据 abc<CR>,相当于 c1=‘a’, c2=‘b’,c3=‘c’。 ④输入数据时不能规定实型(即浮点型)数据精度,例如:scanf(“%7.2f”,&a) 是不合法的。 ⑤输入数据时遇到下列情况之一,认为输入数据结束。 ⚫ 空格、回车、Tab 键 ⚫ 遇到宽度满足时,例如:“%4d”,只取 4 列。 ⚫ 遇到非法输入。例如:scanf (“%d%c%f”,&x,&y,&z);当输入数据 12345a12o.56<CR>(其中把数字 0 错打为英文字母 o,则 x=12345,y=‘a’, z=12.000000。 ⑥“%”后的附加说明符“*”用来表示本输入项在读入后不赋值给相应的变量, 即跳过它对应的数据。 例如:int a;char c;scanf(“%2c:%*2d%d”,& c,& a); 运行时,输入数据 AB:1020<CR> “AB”是对应格式“%2c“的输入,则 c=‘A’,普通字符“:”原样输入,“10” 是对应格式“%*2d”的输入,跳过这两位数 10,将 20 赋值给变量 a,使 a=20
4.2例题 、填空 【例4-1】已知boy=54,gir1=46, (1)如果想输出boy=54%,girl=46%,则输出部分应为: (2)如果想输出boy=54%,girl=46%则输出部分应为: 解析:(1)中的“boy=”、“,”、“girl=”为普通字符,原样输出,在格式串中直接 写出,“%”在格式串中用“%”表示,“54”在格式串中用%d控制,与输出项boy 对应,“46”在格式串中也用%d控制,与输出项gir对应。(2)与(1)不同之处在 于分两行输出,用“\n”控制 谷案:(1) printf(“boy=%d%,gir1=%d%”,boy,girl) (2) printf(“boy=%d%% girl=%d%”,boy,gir1) 【例4-2】若有程序 main scanf("i=%d, j=%d",&i, &j) printf( i=%d, j=%d\n", 1, j) 要求给i赋10,给j赋20,则应该从键盘输入 解析: scanf函数中的格式串中的“i=,j=”为普通字符,原样输入,其中“,j=” 又在两个%d中间起分隔作用 谷案:i=10,j=20<CR 【例4-3】若使用语句: scanf("%d,%d",&x1,&x2); scanf( 3c% &x3,&x4); 将10、20、a、b分别赋值给整型变量x1、x2、x3、x4,应按」 方式输入数 据 解析:本题考查的是 scanf函数的数据输入间隔问题。"%d,%d"用普通字符“,” 间隔,输入时,原样输入:%和%3c之间属于不同数据类型的控制字符,自动分隔,不 用间隔符:%3c%c用字符宽度间隔,也不用间隔符。 答案:10,20a*b(说明:*也可换成其它字符) 【例4-4】以下程序运行后的输出结果是 Int x,y; printf(%d%dn”,x,y) printf(%c%cⅦn”,x,y);
27 4.2 例题 一、填空 【例 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%%”,boy,girl); (2)printf(“boy=%d%%\ngirl=%d%%”,boy,girl); 【例 4-2】若有程序 main() { int i,j; scanf("i=%d,j=%d", &i,&j); printf("i=%d,j=%d\n",i,j); } 要求给 i 赋 10,给 j 赋 20,则应该从键盘输入 。 解析:scanf 函数中的格式串中的“i=,j=”为普通字符,原样输入,其中“,j=” 又在两个%d 中间起分隔作用。 答案:i=10,j=20<CR> 【例 4-3】若使用语句:scanf(" %d ,%d ",&x1,&x2); scanf(" %3c%c ",&x3,&x4); 将 10、20、a、b 分别赋值给整型变量 x1、x2、x3、x4,应按 方式输入数 据。 解析:本题考查的是 scanf 函数的数据输入间隔问题。" %d ,%d "用普通字符“,” 间隔,输入时,原样输入;%d 和%3c 之间属于不同数据类型的控制字符,自动分隔,不 用间隔符;%3c%c 用字符宽度间隔,也不用间隔符。 答案:10,20a**b (说明:**也可换成其它字符) 【例 4-4】以下程序运行后的输出结果是 _______ 。 main() { int x,y; x=97; y=097; printf(“%d %d\n”,x,y); printf(“%c %c\n”,x,y);
解析:x,y均为整型变量,第一个输出语句按十进制整型输出,且数据之间有一个空 格,按原样输出,第二个输出语句按字符型数据输出。注意:y应转成十进制形式输出 谷案 【例4-5】写出下面程序的结果。 main I int x=34: float y=45.9867 printf(“%6D,‰6.2F\n”,x,y);/*①输出为:%6D,‰6.2F*/ 9 rinf(“%6d,%6.2f\n”,x,y);/*②输出为:口口口口34,口45.9 printf(“%-6dn”,x); /*③输出为:34口口口口(右补4 个空格)* printf(“%06d\n”,x) /*④输出为:000034(左补4个 printf(“%-06dln”,x);} /*⑤输出为:34(0将失去作用)*/ 解析:格式控制符应为小写字母,输出语句①由于D、F是大写字母,所以它们被 当成普通字符,原样输出:输出语句②的d、f是格式控制字符,6和6.2是附加格式 说明符,要求ⅹ按6位输出,(左补4个空格),y按6位输出,四舍五入保留2位小数 (左补一个空格,小数点占一位);输出语句③要求ⅹ按6位输出,附加格式说明符 要求右补4个空格:输出语句④要求ⅹ按6位输出,附加格式说明符0要求左补4个0 输出语句⑤要求x按6位输出,附加格式说明符-0要求右补4个0,0将失去作用,否 则出现错误 答案:输出结果在题右侧。 【例4-6】以下程序段的输出结果是 int a,c 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’在内存中占一位,其存储 形式为:11100000,将其赋值给int型变量c,系统将其赋给c的低八位,自动将高 八位补111111,即c变量的值为111111000进制输出是-32。(4)d=-1 1在内存中表示为:1111.数据中16位原样赋值给变量d。输出65535 (5)e=2.55:3将 double浮点数按四舍五入转换成单精度赋值给变量e 本题主要考查不同类型的数据之间的赋值、数据在内存中的存储形式。提示:我们 在编写程序时也应像本题一样,注意输出项的数据类型与格式控制符保持一致 答案:4,23.00000,0-32,65535,2.55556
28 } 解析:x,y 均为整型变量,第一个输出语句按十进制整型输出,且数据之间有一个空 格,按原样输出, 第二个输出语句按字符型数据输出。注意:y 应转成十进制形式输出。 答案:97 79 a 0 【例 4-5】写出下面程序的结果 。 main() { int x=34;float y=45.9867; printf(“%6D,%6.2F\n”,x,y); /* ①输出为:%6D,%6.2F */ printf(“%6d,%6.2f\n”,x,y); /* ②输出为:□□□□34,□45.9 9 */ printf(“%-6d\n”,x); /* ③输出为:34□□□□ (右补 4 个空格)*/ printf(“%06d\n”,x); /* ④输出为:000034(左补 4 个 0)*/ printf(“%-06d\n”,x);} /* ⑤输出为:34(0 将失去作用) */ 解析:格式控制符应为小写字母,输出语句①由于 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; 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。(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】下列语句中,不正确的是 A.c=2*5:B.{x+==8;x/=4:}C.:D.C=a+b 解析:本题主要考查语句的基本概念,c语句由分号(:)结尾,表示一个语句的 终结,分号必不可少,所以D错。B是复合语句:C是空语句 答案:D 【例4-2】以下 是非法函数调用语句 A. char c=’T B. char c getchar(c) C. putchar(x61) D. putchar(‘a’+1) 解析: getchar函数没有参数,调用函数形式为 getchar() putchar函数有参数,调用函数形式为 putchar(c),c可以是字符型常量、字符 型变量、整型常量及其表达式 谷案: 【例4-3】若输入12345、abc下列程序的输出结果为:。 I int a scanf(“%3d%3c”,&a,&ch); printf (“ a ch) A.123,abcB.123,4C.123,a D.12345,abc 解析:本题输入项为两个不同的数据类型,且指定了数据宽度,所以按指定宽度截 取数据为变量赋值,整形变量a=123,字符型变量ch为一个字符,取截取的三个字符 中的第一个,即ch=‘4’;输出时,注意“,”原样输出。 答案:B 【例4-4】有如下语句:1 ong int a; double x; unsigned y; char ch;则 是 合法的输入语句。 A. scanf ("%ld %1f%x%c", a, x, y, ch) B. scanf ("%d%5. 2f %d%c", &a, &x, &y, &ch) C. scanf("%ld %lf %o%c", &a, &x, &y, &ch) D. scanf(%1d%f %x%c", &a, &x, &y, &ch 解析:本题考查的是输入语句的格式控制字符串应与输入项在数据类型上应保持一 致。,所以B错,另外B的%5.2f加了精度限制,也属于错误之处:双精度型变量ⅹ应 与格式控制符%lf对应,所以D错:无符号型变量y应与格式控制符‰、‰或‰对应 字符型变量ch应与格式控制符%c或%对应,用%d作为格式控制符时,从键盘上输入 的数据应为输入字符的 ASCII码值。A错在输入项是变量名本身,应该是变量的地址。 谷案:C
29 二、选择 【例 4-1】下列语句中,不正确的是 。 A.c=2*5; B.{x++= =8; x/=4; } C.; D.c=a+b 解析:本题主要考查语句的基本概念,c 语句由分号(;)结尾,表示一个语句的 终结,分号必不可少,所以 D 错。B 是复合语句; C 是空语句。 答案:D 【例 4-2】以下 是非法函数调用语句。 A.char c=’T’; B.char c; putchar(c); getchar(c) ; C.putchar(0x61); D.putchar(‘a’+1); 解析:getchar 函数没有参数,调用函数形式为 getchar( ) putchar 函数有参数,调用函数形式为 putchar(c), c 可以是字符型常量、字符 型变量、整型常量及其表达式。 答案:B 【例 4-3】若输入 12345、abc 下列程序的输出结果为: 。 main() { int a; char ch; scanf(“%3d%3c”,&a,&ch); printf(“%d,%c”,a,ch); } A.123,abc B.123,4 C.123,a D.12345,abc 解析:本题输入项为两个不同的数据类型,且指定了数据宽度,所以按指定宽度截 取数据为变量赋值,整形变量 a=123,字符型变量 ch 为一个字符,取截取的三个字符 中的第一个,即 ch=‘4’;输出时,注意“,”原样输出。 答案:B 【例 4-4】有如下语句:long int a;double x ;unsigned y ;char ch;则 是 合法的输入语句。 A. scanf(" %ld %lf%x%c ",a,x, y,ch); B. scanf(" %d%5.2f %d%c ",&a,&x,&y,&ch); C. scanf(" %ld %lf %o%c",&a,&x,&y,&ch); D. scanf(" %ld%f %x%c",&a,&x,&y,&ch); 解析:本题考查的是输入语句的格式控制字符串应与输入项在数据类型上应保持一 致。,所以 B 错,另外 B 的%5.2f 加了精度限制,也属于错误之处;双精度型变量 x 应 与格式控制符%lf 对应,所以 D 错;无符号型变量 y 应与格式控制符%u、%x 或%o 对应; 字符型变量 ch 应与格式控制符%c 或%d 对应,用%d 作为格式控制符时,从键盘上输入 的数据应为输入字符的 ASCII 码值。A 错在输入项是变量名本身,应该是变量的地址。 答案:C
【例4-5】有如下定义和输入语句,若要求a,b,C,d的值分别为23,45,’M’,’N 正确的输入应该是 char c, d: scanf(“%d%d”,&a,&b) scanf(“%c%c”,&c,&d) A. 2345MN<CR> B.2345<CR MN<CR> C 23 45 MN<CR> D 23 45MN<CR> 解析:A是错误的,它使a=2345。因为输入数据时,23和45之间没有数据分隔符。 选项B是错误的,它使a=23,b=45,c是“回车”,d=’M’。选项C也是错误的,它使 a=23,b=45,c=’口’,d=’M'’。因为以%c格式输入字符数据时,对应的变量只接收 一个字符。“空格”和“回车”也是字符数据。 本题主要考查 scanf函数的使用。注意:以%格式输入字符数据时,对应的变量 只接收一个字符。“空格”和“回车”也是字符数据。 答案:D 【例4-6】以下程序段的输出结果是 float x=32.76888888 printf(“%6.3f,%f”,x,x) A.32.769,32.76888888 B.32.769,32.768890 C.32.7688,32.76888D.有语法错误,无输出 解析:%6.3f要求输出占6位(包括小数点),小数部分按四舍五入取值,占3位, 输出32.769。%f要求正常按实数输出,7位有效数字,小数部分取6位,输出32.768890, 3,2,7,6,8,8,9为有效数字,0为随机值 谷案:B 【例47】若int类型数据占两个字节,则执行以下语句的输出为 int x=-7 printf(“%d,%uⅦn”,x,x) A.-7,-7B.-7,32762 D.-7,65529 解析:首先明确变量的值在内存中的存放形式(以补码存放),x=7在内存中的存 放形式是:11111111001,当把x的值按“%d”格式(有符号整数)输出时为 7:按“‰u”格式(无符号整数)输出时为65529。本题如果将k以无符号整数格式“% 和“%x”输出时结果为17771和fff9 谷案:D 【例4-8】以下程序段的输出结果是 intk=32768; printf( B.-32768 D.有语法错误,无输出
30 【例 4-5】有如下定义和输入语句,若要求 a,b,c,d 的值分别为 23,45,’M’,’N’, 正确的输入应该是 。 int a,b; char c,d; scanf(“%d%d”,&a,&b); scanf(“%c%c”,&c,&d); A.2345MN<CR> B.23 45<CR> MN<CR> C.23 45 MN<CR> D.23 45MN<CR> 解析:A 是错误的,它使 a=2345。因为输入数据时,23 和 45 之间没有数据分隔符。 选项 B 是错误的,它使 a=23,b=45,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); A.32.769,32.76888888 B. 32.769,32.768890 C. 32.76888888,32.7688888 D.有语法错误,无输出 解析:%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,%u\n”,x,x); A. -7,-7 B.-7,32762 C.-7,-32762 D.-7,65529 解析:首先明确变量的值在内存中的存放形式(以补码存放),x=-7 在内存中的存 放形式是:1111 1111 1111 1001,当把 x 的值按“%d”格式(有符号整数)输出时为 -7;按“%u”格式(无符号整数)输出时为 65529。本题如果将 k 以无符号整数格式“%o” 和 “%x”输出时结果为 17771 和 fff9。 答案:D 【例 4-8】以下程序段的输出结果是 。 int k=32768; printf(“%d”,k); A.0 B.-32768 C.-1 D.有语法错误,无输出