第3 章顺序结构
【学习要点】
● 字符的输入与输出。
● 数据的格式化输出。
● 数据的格式化输入。
● 顺序结构程序设计。
3.1 字符的输入与输出
在C语言中,字符有字符常量和字符型变量两种表示方法。字符常量是用单引号引
起来的一个字符。例如,'A'是一个字符常量,而语句“charA;”中的A 是一个字符型变
量,可以用来存储任意一个字符。9' '是一个字符常量,而9则是一个整型常量。
C语言的标准库函数中,有专门用于字符的输入函数getchar()和输出函数putchar()。
3.1.1 字符常量的输出
字符常量的值是固定不变的,其值不能修改,可用putchar()函数将一个字符常量输
出到屏幕上。字符常量的输出主要有以下两种方法。
1.单引号表示的字符常量的输出
putchar()的参数可以是字符常量,必须加单引号,例如: 
putchar('a'); //输出字符a 
putchar('9'); //输出字符9 
putchar('\\'); //输出字符\ 
putchar('\101'); //输出字符A。'A'的ASCII 码为65,其八进制表示为101 
putchar('\x42'); //输出字符B。'B'的ASCII 码为66,其十六进制表示为0x42 
putchar('\n'); //输出换行符
2.整型表达式表示的字符常量的输出
putchar()的参数也可以直接是字符常量的ASCII码(不能加单引号),或者是计算结
字符常量
的输出课
堂练习

60 C 语言程序设计
果为整数的表达式。例如: 
putchar(97); //输出字符a,97 是'a'的ASCII 码
putchar(57); /*输出字符9,57 是'9'的ASCII 码。若写成putchar(9);错误
但输出的是ASCII 码为9 的字符,它是一个不可见字符*/ 
putchar('a'-32); /*输出字符A, 'a'的ASCII 码为97,减32 得到65, 
即'A'的ASCII 码*/ 
3.1.2 字符型变量的输入/输出
1.字符型变量的输入 
若要输入字符型变量的值,可用getchar()函数实现。当程序调用getchar()函数时, 
该函数会从输入缓冲区(也称为标准输入流)中读取字符,每调用一次就读取一个字符,即
getchar()函数一次读取一个字符,函数调用的返回值是其读取到的字符的ASCII码。如
果用户一次输入了多个字符,则未被读取的字符会保留在输入缓冲区中,后续调用
getchar()函数时将被读取。
2.字符型变量的输出
与字符常量相同,字符型变量的输出仍然可以使用putchar()函数。例如: 
char ch ='A'; //定义字符型变量ch 并进行初始化
putchar(ch); //输出大写字母A。变量名不能加单引号
putchar(ch+32+1); /*输出小写字母b。计算表达式ch+32+1 时,会进行自动类型转换, 
用ch 中所存字符A 的ASCII 码65 参与运算,即65+32+1=98, 
98 为小写字母b 的ASCII 码*/ 
【例3.1】 从键盘输入由3个小写字母构成的人名,将其第一个字母转换成大写后输
出完整的人名。
【问题分析】
大小写字母的ASCII码相差32,即C大=C小-32。英文名的3个英文字母可以用3 
个字符型变量来接收,然后将第一个变量转换成大写字母,再输出3个变量的值即可。
【编程实现】 
123456789 10 
11 
12 
13 
14 
15 
16 
#include <stdio.h> 
int main() 
{ 
char ch1,ch2,ch3; 
printf("请输入由3 个小写字母构成的人名: "); 
ch1=getchar(); //接收第一个英文字母 
ch2=getchar(); //接收第二个英文字母 
ch3=getchar(); //接收第三个英文字母 
ch1=ch1-32; //将第一个小写字母转换为大写字母 
printf("处理后的人名: "); 
putchar(ch1); //输出第一个英文字母 
putchar(ch2); //输出第二个英文字母 
putchar(ch3); //输出第三个英文字母 
putchar('\n'); //输出一个换行符 
return 0; 
} 
【运行结果】
字符型变
量的输入/ 
输出课堂
练习

第3 章 顺序结构 61 
【关键知识点】
(1)代码第6~8行调用getchar()函数分别接收3个英文字母,将接收字母的ASCII 
码分别赋值给对应的字符型变量ch1、ch2、ch3。
(2)调用getchar()或putchar()函数一次只能输入或输出一个字符,若要处理多个
字符,必须多次调用函数才能实现。
【延展学习】
(1)getchar()函数能否接收不可显示的字符? 
(2)若每次输入的人名长度不相等,该如何处理? 详见7.4节。
3.2 数据的格式化输出
在C语言的标准库函数中,专门用于格式化输出的函数为printf(),在头文件stdio.h 
中声明,主要功能是向标准输出设备(一般指显示器)按规定格式输出信息。
1.printf()函数的一般格式
printf()函数的调用格式为: 
printf(格式控制字符串,输出数据项参数表); 
(1)格式控制字符串是双引号引起来的字符串,包含两部分:普通字符和格式控制
符。在输出时,普通字符将按原样输出,格式控制符并不直接输出,而是用于控制printf()函
数中参数的转换和输出。每个格式控制符都由一个百分号(%)开始,以转换说明字符结
束,说明输出数据项的类型、宽度、精度等输出格式,如表3.1所示。
表3.1 printf()函数的格式控制符
格式控制符数据类型描 述
%d int 输出有符号十进制整数,正数的符号省略
%u unsigned 输出无符号十进制整数
%o unsigned 输出无符号八进制整数(没有前导0) 
%x unsigned 输出无符号十六进制整数(没有前导0x),十六进制的数码abcdef以
小写形式输出
%X unsigned 输出无符号十六进制整数(没有前导0X),十六进制的数码ABCDEF 以大写形式输出
%f float或double 输出十进制表示的浮点数,默认输出6位小数
数据的格
式化输出
课堂练习

62 C 语言程序设计
续表
格式控制符数据类型描 述
%lf double 输出十进制表示的浮点数,默认输出6位小数(lf从C99开始加入C 语言标准) 
%e float或double 输出科学记数法表示的浮点数,默认输出6位小数,e以小写形式输
出,如3.500000e-3 
%E float或double 输出科学记数法表示的浮点数,默认输出6位小数,E以大写形式输
出,如3.500000E-3 
%g float或double 自动选取%f或%e格式输出宽度较小的一种使用,且不输出无意义的0 
%c char 输出一个字符
%s 输出一个字符串
%% 输出一个百分号% 
(2)输出数据项可以是常量、变量或表达式,多个输出数据项之间用逗号隔开,每个
数据项与格式控制字符串中的格式控制符一一对应。
例如,若有 
int age=18; 
char sex='M'; 
float score=98.5; 
则相应的输出语句及其输出结果如图3.1所示,图中标明了格式控制说明符与输出参数
表之间的一一对应关系,例如,第一个输出数据项"张三",是字符串,因此双引号中的第一
个格式控制符应为%s;第二个输出数据项age+1的计算结果为int型,因此双引号中的
第二个格式控制符应为%d;以此类推,sex对应格式控制符为%c,score对应格式控制符
为%f。
图3.1 基本数据格式输出
【例3.2】 从键盘输入一个B~Z的大写英文字母,输出该英文字母,及其前驱字母、
后继字母的基本信息(包括字母及其ASCII码)。
【问题分析】
从ASCII码表可以看出,大写英文字母的ASCII码是连续的,即'A'的ASCII码是
65,'B'的ASCII码是66,以此类推。故除'A'和'Z'之外,所有字母的前驱字母的ASCII码就
是该字母的ASCII码减1,后继字母的ASCII码就是该字母的ASCII码加1。

第3 章 顺序结构 63 
【编程实现】 
123456789 10 
11 
12 
13 
#include<stdio.h> 
int main() 
{ 
char ch1,ch2,ch3; 
printf("请输入一个大写英文字母: "); 
ch1=getchar(); //接收一个英文字母 
ch2=ch1-1; //得到ch1 的前驱字母 
ch3=ch1+1; //得到ch1 的后继字母 
printf("字母%c 的ASCII 码是: %d。\n",ch1,ch1); 
printf("字母%c 的前驱字母是: %c,其ASCII 码是: %d。\n",ch1,ch2,ch2); 
printf("字母%c 的后继字母是: %c,其ASCII 码是: %d。\n",ch1,ch3,ch3); 
return 0; 
} 
【运行结果】
【关键知识点】
(1)语句printf("%c",ch)和语句putchar(ch)等价,都是输出一个字符。
(2)语句printf("\n")和语句putchar(\' n')等价,都是在屏幕上输出一个换行符。请
注意两条语句中分别用的是双引号、单引号。
(3)字符型变量,可以用格式控制符%c进行输出,输出的是字符;也可以用格式控制
符%d进行输出,输出的是该字符的ASCII码。
2.printf()函数的格式修饰符
在printf()函数的格式说明中,在%和格式符中间插入如表3.2所示的格式修饰符, 
可以对输出格式进行控制,如设置数据的域宽(输出宽度)、输出精度、左右对齐方式等。
表3.2 printf()函数的格式修饰符
格式修饰符用 法
l 修饰格式符d、o、x、u时,表示输出数据类型为long 
L 修饰格式符f、e、g时,表示输出数据类型为longdouble 
h 修饰格式符d、o、x时,表示输出数据类型为short 
输出宽度m(m 为整数) 
指定输出项输出时所占的列宽,即域宽
(1)若m>0时,当输出数据宽度小于m 时,在域内向右对齐,输出数据左边多余位
补空格;若m 前有前导符0,则输出数据左边多余位补0;当输出数据宽度大于或等
于m 时,按实际宽度全部输出数据; 
(2)若m<0,则输出数据在域内向左对齐,输出数据右边多余位补空格

64 C 语言程序设计
续表
格式修饰符用 法
显示精度.n(n 为大于或等于0 的整数) 
由一个圆点及其后的整数构成,若与输出宽度同时使用,应写在输出宽度的后面, 
即形式为m.n 
(1)对于浮点数,用于指定输出的小数位数
(2)对于字符串,用于指定从字符串左侧开始截取的子串的字符个数 
【例3.3】 输入球的半径,求其体积与表面积。要求将圆周率定义为常量,输出结果
保留2位小数。
【问题分析】
根据球的体积公式V=43
πR3 与表面积公式S=4πR2 即可求解。
【编程实现】 
123456789 10 
11 
12 
13 
14 
15 
#include<stdio.h> 
#define PI 3.1415926 
int main() 
{ 
double R,S,V; 
printf("请输入球的半径R: "); 
scanf("%lf",&R); //输入球的半径 
V=4.0/3*PI*R*R*R; //求球的体积 
S=4*PI*R*R; //求球的表面积 
printf("默认输出: \n"); 
printf("球的体积: %f;表面积: %f。\n\n", V, S); 
printf("设置为保留2 位小数: \n"); 
printf("球的体积: %.2f;表面积: %7.2f。\n", V, S); 
return 0; 
} 
【运行结果】
【关键知识点】
(1)对于double型变量,输入时(程序第7行)必须使用格式符%lf,其详细解释见
3.3节);而输出时可以用%f或%lf,即第11、13行的%f都可改为%lf。
(2)第8行求体积的公式中,若写成4/3,表示整除法,其计算结果为1,无法求出正
确的体积。所以应写成4.0/3或4/3.0,表示普通除法。
(3)从第11行代码对应的输出可以看到,浮点数默认输出6位小数。

第3 章 顺序结构 65 
(4)第13行,输出球的体积时,将输出格式设置为%.2f,表示不设置输出宽度(按实
际宽度输出),设置小数位数为2位,因此,输出值38.79紧挨着前面的中文冒号。输出表
面积时,将输出格式设置为%7.2f,表示输出宽度为7,小数位数为2位,而输出值55.42 
已经占了5个字符的宽度(包括小数点),故需要在该数前补充2个空格。在输出时,会进
行四舍五入。
3.3 数据的格式化输入
在C语言的标准库函数中,专门用于格式化输入的函数为scanf(),在头文件stdio.h 
中声明,主要功能是从标准输入设备(一般指键盘)按规定格式读取信息。
1.scanf()函数的一般格式
scanf()函数的调用格式为: 
scanf(格式控制字符串,输入项参数地址表); 
(1)格式控制字符串指定了输入的格式,它包含格式控制符和分隔符两部分。格式
控制符用于指定各参数的输入格式,通常由%开始,并以一个格式字符结束,如表3.3所
示。分隔符是指输入数据时两个数据之间的分隔符号,如空格、#号、逗号等。
表3.3 scanf()函数的格式控制符
格式控制符描 述
%d 十进制整数的输入
%o 八进制整数的输入
%x 十六进制整数的输入
%c 一个字符的输入,空白字符也会作为一个有效字符输入
%f或%e float型实数的输入
%% 输入一个百分号
%s 一个字符串的输入(字符串以空格、回车、制表符结束) 
(2)输入项参数地址表是由变量地址组成的列表,参数之间用逗号隔开。通过取地
址运算符& 获取变量的地址,例如,&age表示变量age的地址。scanf()函数要求必须
指定接收数据的变量地址,否则数据不能读入到指定的内存单元。变量的地址列表必须
与格式说明符依次对应。
2.scanf()函数的格式修饰符
与printf()函数一样,在scanf()函数的%和格式符中间也可以加入相关的格式修饰
符,如表3.4所示。scanf()函数在输入数值型数据时,一般遇到回车符、空格符、制表符
(Tab)、非数值字符时表示数据输入结束,而这些字符出现在数值前面时被忽略;在scanf() 
函数中出现域宽修饰符时,当输入的数据达到输入域宽时,数据输入也会结束。
数据的格
式化输入
课堂练习

66 C 语言程序设计
表3.4 scanf()函数的格式修饰符
格式修饰符描 述 
l 加在格式符d、o、x、u之前,用于输入long型数据
加在格式符f、e之前,用于输入double型数据
L 加在格式符f、e之前,用于输入longdouble型数据
h 加在格式符d、o、x之前,用于输入short型数据
域宽m(正整数) 指定输入数据的宽度,系统自动按此宽度截取所需数据
* 表示对应的输入项在读入后不赋给任何变量 
【例3.4】 演示scanf()函数的输入格式。
【编程实现】 
123456789 10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
#include<stdio.h> 
int main() 
{ 
int m, n; 
float a, b; 
double x, y; 
printf("请输入2 个整数: "); 
scanf("%d%d",&m,&n); 
printf("%d+%d=%d\n\n",m, n, m+n); 
printf("请输入2 个整数,用逗号隔开: "); 
scanf("%d,%d",&m,&n); 
printf("%d+%d=%d\n\n",m, n, m+n); 
printf("请输入2 个实数: "); 
scanf("%f%f",&a,&b); 
printf("%f+%f=%f\n\n",a, b, a+b); 
printf("请输入2 个实数,用#隔开: "); 
scanf("%lf#%lf",&x,&y); 
printf("%f+%f=%f\n",x, y, x+y); 
printf("%g+%g=%g\n",x, y, x+y); 
return 0; 
} 
【运行结果】
【关键知识点】
(1)代码第8、11、14、17行的参数地址列表,必须在参数变量名前加上地址符&,否

第3 章 顺序结构 67 
则数据不能输入。如语句scanf("%d%d",m,n)会导致程序运行时异常终止。
(2)第8行的scanf()的两个格式说明符%d之间没有任何分隔符,则输入的两个数
据之间可以用空格键、Tab键或回车键作为分隔符。通常采用空格作为分隔符输入数据, 
即65 88↙ ,其中↙表示回车键。
(3)若格式说明符之间用了指定的分隔符,输入数据时必须按照指定的分隔符(区分
中英文状态)输入,否则数据输入失败。例如,第11行的两个%d之间用英文逗号进行分
隔,则数据的输入格式为:65,88↙,即两个整数之间必须用英文逗号隔开,若使用中文逗
号、空格或其他符号隔开,则是错误的。
若将输入语句改为 
scanf("m=%d,n=%d",&m,&n); 
则数据输入格式为: 
m=65,n=88↙ 
(4)对于float型变量,输入时可以使用格式说明符%f或%e,如第14行所示;对于
double型变量,输入时可以使用%lf或%le(不能用%f或%e),如第17行所示。程序运
行时,从键盘输入的数据,既可以是普通小数(如2.3),也可以是指数形式的(如2.3e2)。
(5)不管是float型还是double型变量,输出时既可以使用%f,也可以使用%lf,因
此,第15、18行的%f也可改为%lf。
(6)对比第18、19行代码对应的输出,可以发现:用%f输出时,默认输出6位小数, 
小数不够6位时补0;用%g输出时,不会输出无意义的0。
【延展学习】
关于scanf()函数的格式控制字符串,除了本例中的基本用法以外,还有以下用法。
(1)通过格式修饰符指定输入数据的宽度(即域宽),这样,在输入数据时,将自动按
照域宽从输入的数据中截取所需数据。例如: 
scanf("%2d%2d",&m,&n); 
输入数据为:356289↙时,m 和n的宽度都为2,故m=35,n=62。
虽然在输入时可以指定域宽,但是不能指定小数的位数,例如: 
float a; scanf("%5.2f",&a); 
是错误的;将%5.2f改为%5f后,语句正确。
(2)通过忽略输入修饰符*忽略输入数据中的部分内容,例如,在输入两个数据时, 
若想以任意字符作为分隔符,则输入语句可写成: 
scanf("%d%*c%d",&m,&n); 
其中,%*c表示与其对应的输入项在读入后不赋给任何变量,也就意味着用户可以
用任意字符作为分隔符来输入数据。当用户输入65 88↙或65,88↙或65&88↙时, 
m、n均能正确获取数据65、88。
如语句:

68 C 语言程序设计 
scanf("%2d%*3d%2d",&m,&n); 
其中,%*3d表示在从输入缓冲区读入数据时,有3个字符宽度的数据在读入后不赋给
任何变量,即忽略这部分输入。若输入的数据为123456789↙,m=12,n=67。
3.用%c输入字符时存在的问题及解决方法
请对比以下两段程序及其运行结果。 
程序一: 
#include<stdio.h> 
int main() 
{ 
int a; 
char ch; 
printf("请输入一个字符: "); 
scanf("%c",&ch); 
printf("请输入一个整数: "); 
scanf("%d",&a); 
printf("输入的是: %c 和%d",ch,a); 
printf("\n"); 
return 0; 
} 
程序二: 
#include<stdio.h> 
int main() 
{ 
int a; 
char ch; 
printf("请输入一个整数: "); 
scanf("%d",&a); 
printf("请输入一个字符: "); 
scanf("%c",&ch); 
printf("输入的是: %c 和%d",ch, 
a); 
printf("\n"); 
return 0; 
} 
【运行结果】 【运行结果】 
程序一先输入字符,再输入整数,运行结果正常。程序二先输入整数,再输入字符,运
行时出现了问题:程序直接跳过字符的输入。其原因是:输入35↙后,35被变量a接收, 
但回车符仍然留在输入缓冲区,接下来执行语句 
scanf("%c",&ch); 
时,直接从缓冲区提取回车符并存入变量ch中,最终导致了不正常的运行结果。
解决该问题的方法有如下3种。
(1)在scanf("%c",&ch)前增加一条语句getchar()来接收上一次输入时存入缓冲
区的回车符,这样scanf("%c",&ch)便可正常接收用户输入的字符。
(2)将输入语句改为scanf("%*c%c",&ch),此时%*c将忽略上一次输入时存入
缓冲区的回车符。
(3)在格式说明符%c前加一个空格,即改为scanf(" %c",&ch),此处加入的空格
作为分隔符。则程序运行时,用户在输入有效字符前可以按下任意多个空格键、Tab键或
回车键,这正好对应了上一次输入时存入缓冲区的回车符。
第3种方法更为常用。

第3 章 顺序结构 69 
3.4 顺序结构程序设计
任何一个C语言源程序的整体结构都是顺序结构。顺序结构是最简单的程序结构, 
也是最常用的程序结构,只要按照解决问题的先后顺序写出相应的语句即可,其执行顺序
是自上而下,依次执行。
顺序结构的程序主要包括数据的输入、处理、输出(Input、Process、Output),可用IPO 
图表示,如图3.2所示。作为初学者,应熟悉并掌握IPO 图。
输入数据(从键盘输入初值或用“=”赋值) 
处理数据
输出结果
图3.2 顺序结构程序的IPO 图
【例3.5】 输入职工的职工号、性别、基本工资和奖励工资,计算其工资总和,输出其
工资单(保留2位小数)。
【问题分析】
根据图3.2的IPO 图,本例的N-S流程图如图3.3所示。
定义变量:职工号(int)、性别(char)、基本工资、奖励工资、工资总和(double) 
从键盘输入职工号、性别、基本工资、奖励工资
计算工资总和
输出职工的基本信息和工资总和
图3.3 例3.5算法的N-S流程图
【编程实现】 
123456789 10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
#include<stdio.h> 
int main() 
{ 
int eNo; //职工号 
char sex; //性别,M 代表男,F 代表女 
double basic, bonus, total; //依次为基本工资、奖励工资、工资总和 
printf("请输入职工号: "); 
scanf("%d",&eNo); 
printf("请输入性别: "); 
scanf("%c",&sex); //%c 前有一个空格 
printf("请输入基本工资和奖励工资: "); 
scanf("%lf%lf", &basic, &bonus); 
total=basic+bonus; 
printf("\n%14s\n","工资单"); 
printf("*************************\n"); 
printf("工资号: %-9d 性别: %c\n", eNo, sex); 
printf("本月基本工资: %8.2f 元\n", basic); 
printf("本月奖励工资: %8.2f 元\n", bonus); 
printf("本月工资总和: %8.2f 元\n", total); 
return 0; 
} 
顺序结构
程序设计
微视频

【运行结果】


【关键知识点】

(1)代码第10 行的%c 前需要加一个空格,若不加,则运行该程序时,输入工资号后
会跳过性别的输入。也可采用3.
3节介绍的其他方法来解决这一问题。

(2)第14 行的%14s表示输出一个字符串,输出宽度为14 且右对齐。本例输出字符
串“工资单”占6个字符的宽度,在其左侧补充了8个空格。
(3)第16 行的%-9d 表示输出一个整数,输出宽度为9且左对齐。因此,在输出
3852 时,在其右侧补充了5个空格。
(4)第17~19 行在输出数据时均进行了宽度设置,只要工资号不超过9位,且工资总
和在10 万元以内,那么工资单的四行数据就可以确保右侧对齐输出,以达到美观的效果。
3.常见错误小结
5 

常见错误示例错误描述及其解决方法错误类型
printf("Welcome"); 
print("Welcome"); 
inta; 
scanf("a=%d,&m"); 
错误原因:误将printf() 函数写成print() 或printf(), 
编译系统无法识别这些函数
解决方法:printf("Welcome"); 
错误原因:误将参数地址表写入格式控制字符串的双
引号中,运行时不能输入数据到变量中
解决方法:scanf("a=%d" ,&m); 
链接错误
运行错误
inta; 
scanf("a=%d" ,m); 
错误原因:变量名前未加地址符& 解决方法:scanf("a=%d" ,&m); 编译警告
printf(Welcome); 
scanf("a=%d" ,&m); 
错误原因:缺少双引号,或者使用中文双引号
解决方法:printf("Welcome");scanf("a=%d" ,
&m); 
编译错误
intm,n; 
scanf("%2d%2d\n" ,&m,&n); 
错误原因:在scanf() 的格式说明符中出现转义字符\n 解决方法:删掉\n 运行错误
doublea; 
scanf("%f" ,&a); 
错误原因:输入double数据时,格式说明符写成了%f 解决方法:将%f 改为%lf,即格式控制字符串中的格
式说明符应与输入的数值类型一致
运行错误

70
C 
语言程序设计


第3 章 顺序结构 71 
续表
常见错误示例错误描述及其解决方法错误类型
inta=5; 
printf("a=%d"); 
printf("a=",a); 
错误原因:第1次输出,printf()函数缺少了对应的输
出项;第2次输出,printf()函数缺少了格式说明符
解决方法:printf("a=%d",a); 
运行错误
inta,b; 
scanf("%d%d",&a,&b); 
用户输入数据:23,45↙ 
错误原因:从键盘输入数据时使用的分隔符与scanf() 
函数的格式控制字符串中指定的分隔符不一致
正确输入:23 45↙ 
运行错误
floatm; 
scanf("%7.2f",&m); 
错误原因:用scanf()函数输入浮点数时不能设置精度
解决方法:scanf("%7f",&m);或者scanf("%f", 
&m); 
运行错误
3.6 练 习 题
一、单项选择题(注:□代表空格,↙代表回车) 
1.以下不能输出字符'B'的语句是( )。
A.putchar(66); B.putchar(B); 
C.putchar(\' x42'); D.putchar('A'+1); 
2.以下不能输出字符'B'的语句是( )。
A.printf("%c\n",a' '-31); B.printf("%d\n",'A'+1); 
C.printf("%c\n",66); D.printf("%c\n",'B'); 
3.以下程序段的输出结果是( )。 
int a=1, b=0; 
printf("%d,",b=a+b); 
printf("%d\n",a=2*b); 
A.1,2 B . 1,0 C.3,2 D.0,0 
4.以下程序段的输出结果是( )。 
char c1='A', c2='D'; 
printf("%d,%d", c1, c2-2); 
A.65,68 B.A,68 C.A,B D.65,66 
5.以下程序段的输出结果是( )。 
int x=32; 
double y=3.141593; 
printf("%d%8.6f",x,y); 
A.323.141593 B.32□3.141593 
C.32,3.141593 D.323.1415930 
6.以下程序段的输出结果是( )。

72 C 语言程序设计 
int x=32; 
double y=3.141593; 
printf("%d%9.5f",x,y); 
A.323.141593 B.323.14159 
C.32□3.14159 D.32□□3.14159 
7.有以下程序段: 
int a,b; 
scanf("%d;%d",&a,&b); 
若想通过键盘输入,使变量a、b的值分别为3、5,则正确的输入是( )。
A.3□5↙ B.3,5↙ C.3;5↙ D.35↙ 
8.有以下程序段: 
int m,n,p; 
scanf("m=%dn=%dp=%d",&m,&n,&p); 
若想通过键盘输入,使变量m、n、p的值分别为123、456、789,则正确的输入是( )。
A.m=123n=456p=789↙ B.m=123n=456p=789↙ 
C.m=123,n=456,p=789↙ D.123□456□789↙ 
9.有以下程序段: 
int a,b,c; 
scanf("%d,%d,%d", &a,&b &c); 
若想通过键盘输入,使变量a、b、c分别为3、4、5,则错误的输入是( )。
A.3,4,5↙ B.□□□3,4,5↙ 
C.3,□□□4,□□□5↙ D.3□4□5↙ 
10.有以下程序段: 
int a1, a2; 
char c1, c2; 
scanf("%d%c%d%c", &a1, &c1, &a2, &c2); 
printf("%d,%c,%d,%c", a1, c1, a2, c2); 
若想通过键盘输入,使变量a1、a2、c1、c2的值分别为22、44、a' '、b' ',输出结果是: 
22,a,44,b 
则正确的输入是( )。
A.22□a44□b↙ B.22□a□44□b↙ 
C.22,a,44,b↙ D.22a44b↙ 
11.有以下程序段: 
int a; float b; 
scanf("%2d%f",&a,&b); 
若从键盘输入:875□544.0↙,则变量a和b的值分别是( )。

第3 章 顺序结构 73 
A.87和5.0 B.875和544.0 C.87和544.0 D.75和544.0 
12.有以下程序段: 
char a, b, c, d; 
scanf("%c%c", &a, &b); 
c=getchar(); 
d=getchar(); 
printf("%c%c%c%c\n", a, b, c, d); 
若按下列方式输入数据(从第1列开始,↙代表回车,注意:回车也是一个字符): 
42↙ 
34↙ 
则输出结果是( )。
A.42□34 B.42 C.4234 D.423 
13.有以下程序段:(说明:字符0的ASCII码值为48) 
char c1,c2; 
scanf("%d",&c1); 
c2=c1+9; 
printf("%c,%c\n",c1,c2); 
若从键盘输入:48↙ 
则输出结果是( )。
A.48,57 B .4857 C.0,9 D.09 
14.以下输出语句中错误的是( )。
A.printf("%f\n",s' '); B .p rintf("%d%c\n",s' ',s' '); 
C.printf("%c\n",s' '-32); D .p rintf("%c\n",65); 
15.若有定义 
char ch; int a; double d; 
若从键盘输入:12345□678910.36↙ 
以下能给各个变量正确赋值的输入语句是( )。
A.scanf("%d%c%lf",&a,&ch,&d); 
B.scanf("%5d%2c%7.2lf",&a,&ch,&d); 
C.scanf("%d%c%lf",a,ch,d); 
D.scanf("5d%2c%7.2lf",&a,&ch,&d); 
二、判断题
1.scanf()函数不能实现字符数据的输入。( ) 
2.格式控制符%e表示可以以指数形式输入一个浮点数。( ) 
3.格式控制符%d%*c%d表示在输入两个整数时,这两个整数之间的间隔符可以
是任意字符。( ) 
4.%7.2f表示输出一个浮点数时,浮点数的宽度为7(不包括小数点),小数保留2位。
( )

5.对 于doule型的实数,可以在pitf()函 数的格式化字符串中使用nn2的形式
brn1.
来指定输出宽度。n1指定输出数据的宽度(包括小数点),n2指定小数点后小数位数,也
称为精度。() 

6. 格式控制符%-5f 表示输出的浮点数在域内靠右对齐。() 
7. 已定义了整型变量d1 和d2,则输入语句scanf("%d,%d\n",&d1,&d2); 可以实
现数据的输入。() 
8. 输入浮点数时,可以在scanf() 函数中设置输入浮点数的精度。() 
9. 使用getchar() 函数时,只可以接收可显示字符。() 
10. 已定义了字符型变量ch,语句scanf("%c",&ch); 中,在%c 前面加了一个空格, 
可用于忽略上一次输入的回车键。() 
11. 在输入整数或实数等数值型数据时,输入数据之间必须用空格、回车符、制表符
等间隔符隔开,间隔符个数不限。() 
12. 格式控制符%f 既可用于输出float型实数,也可用于输出double型实数。
三、编程题
() 

1. 程序功能:从键盘输入三个整数,计算其平均值并输出。要求:输出平均值时,数
据宽度为7,保留2位小数。输入/输出格式参见运行结果。
【运行结果】


2. 编程实现:有人从一山顶绝壁向下抛石头,经过t秒后听到石头落地的声音,请计
算此山的高度h(不考虑声音的传播用时)。
1

提示:自由落体公式h=2gt2。要求:将重力加速度g定义为符号常量,山的高度

保留1位小数。输入/输出格式参见运行结果。

【运行结果】


3. 编程实现:从键盘输入一角度值,计算并输出其对应的弧度值。要求:圆周率π 
使用符号常量,值取3.弧度值保留3位小数。输入/输出格式参见运行结果。
【运行结果】
14159; 


4. 编程实现:输入某人的身高、体重,求其BMI 值。BMI 称为身体质量指数,是用体
74
C 
语言程序设计


第3 章 顺序结构 75 
重(千克)除以身高(米)的平方得出的值,是目前国际上常用的衡量人体胖瘦程度以及是
否健康的一个标准。输出结果保留2位小数。输入/输出格式参见运行结果。
【运行结果】
5.编程实现:一小孩在光滑的桌面弹弹球,请输入弹球的初速度、末速度和经过的时
间,速度单位为“米/分钟”,时间单位为“分钟”,计算弹球的加速度(保留2位小数)并输
出。输入/输出格式参见运行结果。提示:加速度=(末速度-初速度)÷经过的时间。
【运行结果】
6.程序功能:从键盘依次输入3个数字字符(0' '除外),然后将这3个字符组成一个3 
位数输出。例如,输入的字符为'1'、'2'、'6',则组成的3位数为126。输入/输出格式参见运
行结果。
【运行结果】
7.程序功能:计算地球与月球之间的万有引力。万有引力公式为:F =Gm1m2 
r2 ,其
中:万有引力常量G=6.67×10-11N·m2/kg2,m1 和m2 的单位为千克(kg),r 的单位为
米(m)。从键盘输入地球质量m1、月球质量m2、地月距离r,输出地球与月球之间的万有
引力。提
示:地球质量为5.965×1024kg,月球质量为7.349×1022kg,地月距离为3.84×108m。
要求:在程序中用宏常量表示万有引力常量G。输出结果保留4位小数。
输入/输出格式参见运行结果。
【运行结果】
8.程序功能:从键盘输入某同学的学号、性别及三门课程的成绩,计算其平均成绩并
输出。输出成绩保留2位小数,并注意输出格式美观,每项对齐,输入/输出格式参见运行
结果。

【运行结果】


第3章练习题答案与解析

扫描二维码获取练习题答案与解析。


第3章练习题答案与解析

76
C 
语言程序设计


第4 章选择结构
【学习要点】
在解决实际问题时,经常需要根据某个判断条件是否成立来选择执行不同的操作,此
时需要用到选择结构。其中,简单的判断条件可以用关系表达式表示,复杂的判断条件通
常用逻辑表达式表示。在C语言中,用于实现选择结构的语句有单分支语句if、双分支语
句if-else和开关语句switch。本章的学习要点如下: 
● 关系运算符与关系表达式。
● 逻辑运算符与逻辑表达式。
● 用if语句实现单分支选择结构。
● 用if-else语句实现双分支选择结构。
● 条件运算符与条件表达式。
● 用if-else嵌套语句实现多分支选择结构。
● 用switch语句实现多分支选择结构。
4.1 关系运算符与关系表达式
4.1.1 关系运算符 
如果需要比较两个数据的大小,可以使用关系运算符。C语言提供的关系运算符如
表4.1所示。
表4.1 关系运算符
运 算 符含 义优 先 级结合方向
<、<= 小于、小于或等于
>、>= 大于、大于或等于
==、!= 等于、不等于 
7
8 
自左至右 
关系运算符的优先级高于赋值运算符、低于算术运算符。关系运算符的两个字符之
间不能加空格,如>=不能写成> =。

78 C 语言程序设计
4.1.2 关系表达式
用关系运算符将两个表达式连接起来的式子称为关系表达式,语法格式如下: 
<表达式>关系运算符<表达式> 
其中,表达式可以是常量、变量、算术表达式、关系表达式、赋值表达式等。
关系表达式通常用于表示一个判断条件,判断的结果只有两种可能性:条件成立
(真)或条件不成立(假)。在C语言中,用整数1表示“真”,用整数0表示“假”,即关系表
达式的值是整数1或0。
例如,若判断条件为“n不能被3整除”,可以用以下两个表达式来表示: 
(1)n%3!=0 //若n 除以3 的余数不等于0,则表达式的值为真
(2)n%3 //当n%3 的结果等于1 或2 时,为真;当n%3 的结果等于0 时,为假
在C语言中,当数值型数据直接作为判断条件时,非0(含正数、负数)等价于“真”,0 
等价于“假”。
例如,已知 
int A=5, B=9, C=2; 
求下列各关系表达式的值。 
(1)A<B //比较结果为真,表达式的值为1 
(2)A==B<C //等价于A==(B<C),B<C 的值为假(0),A==0 为假(0),表达式的值为0 
(3)A<B<C //等价于(A<B)<C,A<B 的值为真(1),1<C 为真(1),表达式的值为1 
在上例(3)中,B的值并不在A 和C之间,但表达式A<B<C的值为真,即数学中的不
等式A<B<C在C程序中不能直接书写,那么这种情况应该如何表示呢? 详见4.2节。
使用关系运算符时应注意: 
(1)=与==的区别:=为赋值运算符,其作用是将=右侧表达式的值(即右值)赋给
其左侧的变量(即左值);==为关系运算符,其作用是比较其左右两侧的值是否相等。= 
=的左右两侧可以是常量、变量或表达式。
(2)编程时对浮点数一般不用==进行判断,原因是十进制的浮点数转换成二进制存
储时有精度损失,无法精确表示。一般通过判断两数之差的绝对值是否在可接受的范围内, 
从而确定两个浮点数是否相等。例如,比较两个double型变量a和b是否相等,可以通过判
断关系表达式fabs(a-b)<1e-8是否成立来确定,若表达式成立,则表示a与b之差小于
10-8,可以认为a和b相等。其中,fabs()函数的功能是求浮点数的绝对值,详见6.3节。
4.2 逻辑运算符与逻辑表达式
4.2.1 逻辑运算符 
经过前面的分析可知,在C语言中,关系表达式A<B<C无法表示“B大于A 且B小
关系表达式
课堂练习