3.1 tprintf.c
程序 用printf 函数格式化数
下面的程序举例说明了用printf 函数以各种格式显示整数和浮点数的方法。
/* Prints int and float values in various formats */
#include
int main(void)
{
int i;
float x;
i = 40;
x = 839.21f;
printf("|%d|%5d|%-5d|%5.3d|\n", i, i, i, i);
printf("|%10.3f|%10.3e|%-10g|\n", x, x, x);
return 0;
}
在显示时,printf 函数格式串中的字符| 只是用来帮助显示每个数所占用的空格数量;不同于% 或\ ,字符| 对printf 函数而言没有任何特殊意义。此程序的输出如下:
|40| 40|40 | 040|
| 839.210| 8.392e+02|839.21 |
下面仔细看一下上述程序中使用的转换说明。
%d ——以十进制形式显示变量i ,且占用最少的空间。
%5d ——以十进制形式显示变量i ,且至少占用5个字符的空间。因为变量i 只占两个字符,所以添加了3个空格。
%-5d ——以十进制形式显示变量i ,且至少占用5个字符的空间。因为表示变量i 的值不需要用满5个字符,所以在后续位置上添加空格(更确切地说,变量i 在长度为5的字段内是左对齐的)。
%5.3d ——以十进制形式显示变量i ,且至少占用5个字符的空间并至少有3位数字。因为变量i 只有2个字符长度,所以要添加一个额外的零来保证有3位数字。现在只有3个字符长度,为了保证占有5个字符,还要添加2个空格(变量i 是右对齐的)。
%10.3f ——以定点十进制形式显示变量x ,且总共用10个字符,其中小数点后保留3位数字。因为变量x 只需要7个字符(即小数点前3位,小数点后3位,再加上小数点本身1位),所以在变量x 前面有3个空格。
%10.3e ——以指数形式显示变量x ,且总共用10个字符,其中小数点后保留3位数字。因为变量x 总共需要9个字符(包括指数),所以在变量x 前面有1个空格。
%-10g ——既可以以定点十进制形式显示变量x ,也可以以指数形式显示变量x ,且总共用10个字符。在这种情况下,printf 函数选择用定点十进制形式显示变量x 。负号的出现强制进行左对齐,所以有4个空格跟在变量x 后面。
3.2 addfrac.c
程序 分数相加
为了显示scanf 函数的模式匹配能力,考虑读入由用户键入的分数。分数通常的形式为分子/分母 。scanf 函数允许读入整个分数,而不用将分子和分母视为两个整数分别读入。下面的分数相加程序体现了这一方法。
/* Adds two fractions*/
#define _CRT_SECURE_NO_WARNINGS
#include
int main(void)
{
int num1, denom1, num2, denom2, result_num, result_denom;
printf("Enter first fraction: ");
scanf("%d/%d", &num1, &denom1);
printf("Enter second fraction: ");
scanf("%d/%d", &num2, &denom2);
result_num = num1 * denom2 + num2 * denom1;
result_denom = denom1 * denom2;
printf("The sum is %d/%d\n", result_num, result_denom);
return 0;
}
注意,结果并没有化为最简分数
练习题-
下面的printf 函数调用产生的输出分别是什么?
(a) printf(“%6d,%4d”, 86, 1040);
(b) printf(“%12.5e”, 30.253);
© printf(“%.4f”, 83.162);
(d) printf(“%-6.2g”, .0000009979);
Solution
(a)86,1040
(b)3.02530e+01
©83.1620
(d)1e-06
-
编写printf 函数调用,以下列格式显示float 型变量x:
(a) 指数表示形式,字段宽度8,左对齐,小数点后保留1位数字。
(b) 指数表示形式,字段宽度10,右对齐,小数点后保留6位数字。
© 定点十进制表示形式,字段宽度8,左对齐,小数点后保留3位数字。
(d) 定点十进制表示形式,字段宽度6,右对齐,小数点后无数字。
Solution
(a)printf("%-8.1e", x);
(b)printf("%10.6e", x);
©printf("%-8.3f", x);
(d)printf("%6.0f", x);
-
说明下列每对scanf 格式串是否等价?如果不等价,请指出它
们的差异。
(a) “%d” 与" %d" 。
(b) “%d-%d-%d” 与"%d -%d -%d" 。
© “%f” 与"%f " 。
(d) “%f,%f” 与"%f, %f" 。
Solution
(a), (b) and (d) are equivalent, because thescanf
function matches zero or more whitespace characters on each whitespace character, except the final character, as shown in ©. © is not equivalent because the trailing space will require the user to input a non-whitespace character at the end of the input signifying the end of the whitespace sequence matched by the space. -
假设scanf函数调用的格式如下:
scanf(“%d%f%d”, &i, &x, &j);
如果用户录入10.3 5 6
调用执行后,变量i 、x 和j 的值分别是多少?(假设变量i 和变量j 都是int 型,而变量x 是float 型。)
i = 10
x = 0.3
j = 5 -
假设scanf 函数调用的格式如下:
scanf(“%f%d%f”, &x, &i, &y);
如果用户录入12.3 45.6 789
调用执行后,变量x 、i 和y 的值分别是多少?(假设变量x 和变量y 都是float 型,而变量i 是int 型。)
i = 10
x = 0.3
j = 5 -
指出如何修改3.2节中的addfrac.c 程序,使用户可以输入在字符/的前后都有空格的分数。
Add a space after the first%d
for eachscanf
statement. This will allow
pattern matching for whitespace between the two%d
s and the/
character.
/* Adds two fractions */
#include
int main(void) {
int num1, denom1, num2, denom2, result_num, result_denom;
printf("Enter first fraction: ");
scanf("%d /%d", &num1, &denom1);
printf("Enter second fraction: ");
scanf("%d /%d", &num2, &denom2);
result_num = num1 * denom2 + num2 * denom1;
result_denom = denom1 * denom2;
printf("The sum is %d/%d\n", result_num, result_denom);
return 0;
}
编程题
- 编写一个程序,以月/日/年(即 )的格式接受用户录入的日期信息,并以年月日(即 )的格式将其显示出来:
Enter a date (mm/dd/yyyy): 2/17/2011
You entered the date 20110217
#define _CRT_SECURE_NO_WARNINGS
#include
int main(void)
{
int year, month, day;
printf("Enter a date (mm/dd/yyyy) : ");
scanf("%d /%d /%d", &month, &day, &year);
printf("You entered the date %.4d%.2d%.2d\n", year, month, day);
return 0;
}
- 编写一个程序,对用户录入的产品信息进行格式化。程序会话应类似下面这样:
Enter item number: 583
Enter unit price: 13.5
Enter purchase date (mm/dd/yyyy): 10/24/2010
Item Unit Purchase
Price Date
583 $ 13.50 10/24/2010
其中,产品编号和日期项采用左对齐方式,单位价格采用右对齐方式,允许最大取值为9999.99的美元。提示 :各个列使用制表符控制。
#define _CRT_SECURE_NO_WARNINGS
#include
int main(void)
{
int year, month, day, itemNumber;
float unitPrice;
printf("Enter item number: ");
scanf("%d", &itemNumber);
printf("Enter unit price: ");
scanf("%f", &unitPrice);
getchar();
printf("Enter purchase date (mm/dd/yyyy) : ");
scanf("%d /%d /%d", &month, &day, &year);
printf("\nItem\t\tUnit\t\tPurchase\n");
printf("%d\t\t$%7.2f\t\t%d/%d/%d\n", itemNumber, unitPrice, month, day, year);
return 0;
}
存在问题:
不知道怎么显示第二行;显示对齐问题;
-
图书用国际标准书号(ISBN)进行标识。2007年1月1日之后分配的ISBN包含13位数字(旧的ISBN使用10位数字),分为5组,如978-0-393-97950-3。第一组(GS1前缀 )目前为978或979。第二组(组标识 )指明语言或者原出版国(如0和1用于讲英语的国家)。第三组(出版商编号 )表示出版商(393是W. W. Norton出版社的编号)。第四组(产品编号 )是由出版商分配的用于识别具体哪一本书的(97950)。ISBN的末尾是一个校验数字 ,用于验证前面数字的准确性。编写一个程序来分解用户录入的ISBN信息:
Enter ISBN: 978-0-393-97950-3
GS1 prefix: 978
Group identifier: 0
Publisher code: 393
Item number: 97950
Check digit: 3
注意 :每组中数字的个数是可变的,不能认为每组的长度都与示例一样。用实际的ISBN值(通常放在书的封底和版权页上)测试你编写的程序。 -
编写一个程序,提示用户以(xxx) xxx-xxxx的格式输入电话号码,并以xxx.xxx.xxxx的格式显示该号码:
Enter phone number [(xxx) xxx-xxxx]: (404) 817-6900
You entered 404.817.6900 -
编写一个程序,要求用户(按任意次序)输入从1到16的所有整数,然后用4×4矩阵的形式将它们显示出来,再计算出每行、每列和每条对角线上的和:
Enter the numbers from 1 to 16 in any order:
16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
Row sums: 34 34 34 34
Column sums: 34 34 34 34
Diagonal sums: 34 34
如果行、列和对角线上的和都一样(如本例所示),则称这些数组成一个幻方 (magic square)。这里给出的幻方出现于艺术家和数学家Albrecht Dürer在1514年的一幅画中。(注意,矩阵的最后一行中间的两个数给出了该画的创作年代。) -
修改3.2节的addfrac.c 程序,使用户可以同时输入两个分数,中间用加号隔开:
Enter two fractions separated by a plus sign: 5/6+3/4
The sum is 38/24
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)