3.1 节
1. 下面的printf函数调用产生的输出分别是什么?
(a) printf("%6d,%4d", 86, 1040);
(b) printf("%12.5e", 30.253);
(c) printf("%.4f", 83.162);
(d) printf("%-6.2g", .0000009979);
86,1040
3.02530e+001
83.1620
1e-006
#include<stdio.h>
int main()
{
printf("%6d,%4d", 86, 1040);
printf("%12.5e", 30.253);
printf("%.4f", 83.162);
printf("%-6.2g", .0000009979);
return 0;
}
2. 编写printf函数调用,以下列格式显示float型变量x。
(a) 指数表示形式,栏宽 8,左对齐,小数点后保留 1 位数字。
(b) 指数表示形式,栏宽 10,右对齐,小数点后保留 6 位数字。
(c) 定点十进制表示形式,栏宽 8,左对齐,小数点后保留 3 位数字。
(d) 定点十进制表示形式,栏宽 6,右对齐,小数点后无数字。
#include<stdio.h>
int main(void)
{
float x = 4.29;
printf("%-8.1f\n",x);
printf("%10.6f\n",x);
printf("%-8.3f\n",x);
printf("%6.0f\n",x);
return 0;
}
3.2 节
3. 说明下列每对scanf格式串是否等价?如果不等价,请指出它们的差异。
(a) "%d"与" %d"。
(b) "%d-%d-%d"与"%d -%d -%d"。
(c) "%f"与"%f "。
(d) "%f,%f"与"%f, %f"。
出现空格的地方需要在用户输入界面有与之对应的空格,否则直接返回。
4. 假设scanf函数调用的格式如下:
scanf("%d%f%d", &i, &x, &j);
如果用户输入
10.3 5 6
调用执行后,变量i、x和j的值分别是多少?(假设变量i和变量j都是int型,变量x是float型。)
#include<stdio.h>
int main()
{
float x = 0;
int i = 0;
int j = 0;
printf("input:\n");
scanf("%d%f%d\n", &i, &x, &j);
printf("%d\n%f\n%d\n",i, x, j);
return 0;
}
运行结果:
input:
10.3 5 6
10
0.300000
5
答:执行后 i,x,j分别是10 ,0.300000,5。
5. 假设scanf函数调用的格式如下:
scanf("%f%d%f", &x, &i, &y);
如果用户输入
12.3 45.6 789
调用执行后,变量x、i和y的值分别是多少?(假设变量x和变量y都是float型,变量i是int型。)
#include<stdio.h>
int main()
{
float x = 0, y = 0;
int i = 0;
printf("input:\n");
scanf("%f%d%f", &x, &i, &y);
printf("x = %f\ni = %d\ny = %f", x, i, y);
return 0;
}
执行结果:
input:
12.3 45.6 789
x = 12.300000
i = 45
y = 0.600000
6. 指出如何修改 3.2 节中的 addfrac.c 程序,使用户可以输入在字符/的前后都有空格的分数。
/* Adds two fractions */
#include <stdio.h>
int main(void)
{
int num1, denom1, num2, denom2, result_num, result_denom;
printf("Enter first fraction: ");
scanf("%d /%d", &num1, &denom1);
printf("%d\n%d\n",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;
}