用户输入两个四位数以内的整数,请你对两个整数进行四则运算(为保证除法能正确计算,输入的第二个整数不能为0),要求输出的四则运算表达式是完整对齐的。
例如,给定输入1256和20,其符合上述对齐要求的四则运算的输出格式应该如下所示(为了让空格显示的更直观,这里暂用下划线_表示空格):
_1256 + 20___ = _____1276 _1256 - 20___ = _____1236 _1256 * 20___ = ____25120 _1256 / 20___ = _______62
程序的输出格式对用户体验影响很大,用户往往因为输出格式不美观便抱怨软件设计的不好。
那么,如何对程序的输出格式进行控制呢?接下来我们介绍一下格式化输入输出,格式化输入输出可以用函数库stdio.h中的 scanf 和 printf 两个函数来实现。
scanf 函数按照一定的格式从键盘输入数据。函数形式为:
scanf (<格式控制串> , <参数列表>) ;
<格式控制串> 是一个字符串,说明了输入数据要遵循的格式; <参数列表> 是存放输入数据地址的列表,有多个输入数据时,参数之间用,分隔。 如果要把输入的数据写入一个变量,参数列表中需要使用变量的地址。 获取变量地址的方法为:&变量名,其中&是地址运算符,其运算结果是后面的变量的地址
例如从命令行读入一个整数、一个浮点数、一个整数,分别赋值给 num1、num2 和 num3。如下代码:
scanf(″%d%f%d″, &num1, &num2, &num3); //其中 %d 和 %f 均为转换说明符,分别表示读取的数据为整型和浮点型。
如果命令行输入为:12 34.5 678
,则该函数执行的效果是:系统读取整数12并赋值给 num1,读取浮点数34.5并赋值给 num2,读取整数678并赋值给 num3。
scanf 函数常用的转换说明符如下表(省略%):
类型字符 | 含义 |
---|---|
d | 十进制整型量 |
o | 八进制整型量 |
x | 十六进制整型量 |
u | 无符号十进制整型 |
i | 整型 |
f | 实型的小数形式 |
e | 实型的指数形式 |
g | f 和 e 的较短形式 |
c | 字符 |
s | 字符串 |
l 或 h | 放在任何整数转换说明符之前,用于输入 short 或 long 类型数据 |
l 或 L | 放在任何浮点转换说明符之前,用于输入 double 或 long double类型数据 |
printf 函数按照指定的格式向屏幕输出数据。函数形式为:
printf (<格式控制串>, <参数列表>) ;
<格式控制串> 一般是一个字符串,描述输出数据的格式。 格式控制串可以包含3种类型的字符:格式指示符、转义字符、普通字符(除格式指示符和转义字符外的其他字符)。其中: 格式指示符的作用是将参数列表中相应的输出数据转换为指定的格式输出 转义字符按照其含义输出相应的特殊符号 普通字符则按照原样输出 <参数列表> 存放输输出数据列表,有多个输出数据时,中间用,分隔。 格式指示符的数量、顺序与输出数据相对应。
printf 函数执行时,根据格式控制串中的格式指示符、转义字符和普通字符等,从左到右依次进行处理:遇到普通字符,则按照原样输出;遇到转义字符,则按照其含义输出相应的符号;遇到格式指示符,则将对应的输出数据按照格式指示符指定的方式输出。
格式指示符的一般形式为:
% <标志> <域宽> <精度> <转换说明符>
其中,<标志>、<域宽>和<精度>
都是可选项,可以不出现。
printf 函数常用的标志如下表:
标志 | 含义 |
---|---|
- | 输出在域宽内左对齐 |
+ | 在正数值之前显示一个加号,在负数值之前显示一个减号 |
空格 | 在正数值之前显示一个空格 |
# | 与八进制转换说明符 0 一起使用时,在输出值之前加 0;与十六进制转换说明符 x 或 X 一起使用时,在输出值之前加 0x 或 0X |
0 | 用 0 填充域宽 |
多个标志可以联合使用
域宽一般为一个整数,指明了数据输出的宽度。
如果数据实际长度小于域宽,则数据输出右对齐,即数据仍然按照域宽规定输出,在数据左边用空格补齐; 如果数据实际长度大于域宽,那么系统将自动突破域宽的限制,按照数据的实际长度进行输出。
【负号要占据一个字符位置。如果没有指明域宽,系统则按照数据的实际长度输出。】
精度一般也是一个整数,对于不同类型的数据,精度的含义也不一样。
1.对于整数,精度表示至少要输出的数字个数。 如果数据实际长度小于精度,则左边用0补齐,使得数据长度等于精度; 如果数据实际长度大于精度,则自动突破精度限制,按照数据的实际长度输出。 省缺情况下整数的精度为1。 2.对于浮点数,有两种情况。 (1)如果转换说明符为 e、E 和 f,精度表示小数点后的有效位数。 如果数据小数部分的实际长度小于精度,则在右边补齐0,使得小数部分长度等于精度; 如果数据小数部分的实际长度大于精度,则按照精度对数据进行舍入输出; (2)如果浮点数的转换说明符为 g 和 G,精度表示打印数据的最大的长度。 3.对于字符串数据,精度表示字符串输出的最大长度。 如果输出字符串的实际长度小于精度,则按照字符串的实际长度输出; 如果字符串的实际长度大于精度,则按照精度截取输出字符串开头的 n 个字符(假设精度为 n )输出。
转换说明符指明了输出数据的类型信息。printf 函数常用的转换说明符如下表:
类型字符 | 含义 |
---|---|
d | 十进制整型量 |
o | 八进制整型量 |
x | 十六进制整型量 |
u | 无符号十进制整型 |
i | 整型 |
f | 实型的小数形式 |
e | 实型的指数形式 |
g | f 和 e 的较短形式 |
c | 字符 |
s | 字符串 |
% | 输出%本身 |
l 或 h | 放在任何整数转换说明符之前,用于输出 short 或 long 类型数据 |
L | 放在任何浮点转换说明符之前,用于输出 long double类型数据 |
例如以域宽为10、右对齐的方式输出15,然后再输出换行符(\n):
printf("%10d\n",15);
结果为:
(1)两个整数各占5个字符的位置,如果整数不足5位,则第一个整数在前面用空格补齐,第二个整数在后面用空格补齐,运算符(+、 -、 *、 /、 =都是运算符)占1个字符,且运算符前后各留一个空格位置; (2)输出结果占10个字符位置,不足10位时前面用空格补齐。
//包含标准输入输出函数库 #include <stdio.h> int main() { //声明两个整型变量,用于存储输入的两个整数 int x,y; //请在Begin-End之间添加你的代码,按要求格式输出四则运算式子 /********** Begin *********/ int s, d, p, c; scanf("%d\n", &x); scanf("%d", &y); s = x + y; d = x - y; p = x * y; c = x / y; printf("%5d + %-5d = %10d\n", x, y, s); printf("%5d - %-5d = %10d\n", x, y, d); printf("%5d * %-5d = %10d\n", x, y, p); printf("%5d / %-5d = %10d\n", x, y, c); /********** End **********/ return 0; }
测试结果为:
其中值得注意的是scanf
函数后的变量前需要加取地址符&
,而printf
函数后的变量不需要加&
;这是因为printf
函数只需要获得参数的数值,而scanf
需要拥有修改变量参数的能力。
如果对printf
后的变量取地址,则会出现以下的情况:
系统提示的错误是 类型不匹配,即printf
所需要的类型是int
,而输出&x
后的类型是int *
,并且图中&x
所对应的数值出现了很大的偏差,其中可能有宽度对其造成的影响。
在输出符号%
后加上-
可使输出字符为左对齐,如果不加则默认为右对齐。