第四章    字符串和格式化输入/输出


编程练习

  1. 编写一个程序,要求输入名字和姓氏,然后以“名字,姓氏”的格式打印。

#include <stdio.h>
#define LEN 21

int main(void)
{
	char last_name[LEN];
	char first_name[LEN];

	printf("请输入你的名字和姓氏:\n");
	scanf("%s%s", &first_name, &last_name);

	printf("%s, %s\n", first_name, last_name);

	return 0;
}


2.编写一个程序,要求输入名字,并执行以下操作:

a.把名字引在双引号中打印出来。

b.在宽度为20个字符的字段内打印名字,并且整个字段引在引号内。

c.在宽度为20个字符的字段左端打印名字,并且整个字体段引在引号内。

d.在比名字宽3个字符的字段内打印它。

#include <stdio.h>
#include <string.h>
#define LEN 21

int main(void)
{
	char first_name[LEN];
	int a;

	printf("请输入你的名字:\n");
	scanf("%s", &first_name);

	printf("\"%s\"\n", first_name);
	printf("\"%20s\"\n", first_name);
	printf("\"%-20s\"\n", first_name);
	a = strlen(first_name)+3;
	printf("%*s\n", a, first_name);
	return 0;
}


3.编写一个程序,读取一个浮点数,并且首先以小数点记数法,然后以指数记数法打印之,输出使用下列形式(在指数位置显示的数字的位数可能会随系统而不同)

a.The input is 21.3 or 2.13e+001

b.The input is +21.290 or 2.129e+001

#include <stdio.h>

int main(void)
{
	float num;

	printf("请输入一个浮点数:\n");
	scanf("%f", &num);
	printf("a.The input %.2f or %.1e\n", num, num);

	printf("请输入一个浮点数:\n");
	scanf("%f", &num);
	printf("b.The input %+.3f or %.3E\n", num, num);

	return 0;
}


4.编写一个程序,要求输入身高(以英寸为单位)和名字,然后以如下形式显示:

Dabney, you are 6.208 feet tall

#include <stdio.h>
#define LEN 41

int main(void)
{
	float height;
	char name[LEN];

	printf("请输入您的身高:");
	scanf("%f", &height);
	printf("请输入你的名字:");
	scanf("%s", &name);
	printf("%s, you are %.3f feet tall\n", name, height);

	return 0;
}


5.

编写一个程序,首先要求用户输入名字,然后要求用户输入姓氏。在一行打印输入的姓名,在下行打印每个名字中字母的个数。把字母个数与相应名字的结尾对齐,如下所示:

          Melissa  Honeybee

              7       8

然后打印相同的信息,但是字母个数与相应单词的开始对齐。

#include <stdio.h>
#include <string.h>
#define LEN 41

int main(void)
{
	char last_name[LEN];
	char first_name[LEN];
	int ln, fn;

	printf("请输入您的名字和姓氏:");
	scanf("%s%s", &first_name, &last_name);

	ln = strlen(last_name);
	fn = strlen(first_name);

	printf("%s %s\n", first_name, last_name);
	printf("%*d %*d\n", fn, fn, ln, ln);

	printf("%s %s\n", first_name, last_name);
	printf("%-*d %-*d\n", fn, fn, ln, ln);

	return 0;
}


6.编写一个程序,设置一个值为1.0/3.0的double类型变量和一个值为1.0/3.0的float类型变量。每个变量的值显示三次:一次在小数点右侧显示4个数字,一次在小数点右侧显示12个数字,另一次在小数点右侧显示16个数字。同时要让程序包括float.h文件,并显示FLT_DIG和DBL_DIG的值。1.0/3.0的显示值与这些值一致吗?

#include <stdio.h>
#include <float.h>

int main(void)
{
	double d = 1.0 / 3.0;
	float f = 1.0 / 3.0;

	/* 体现float 和 double 类型的有效位数*/
	printf("%.4f %.12f %.16f\n", f, f, f);
	printf("%.4lf %.12lf %.16lf\n", d, d, d);
	printf("%d  %d\n", FLT_DIG, DBL_DIG);

	return 0;
}


7.

编写一个程序,要求用户输入行驶的英里数和消耗汽油的加仑数。接着应该计算和显示消耗每加仑汽油行驶的英里数,显示方式是在小数点右侧显示一个数字。然后,根据l加仑约等于3.785升,l英里约等于1.609公里的规则,它应该把每加仑英里数转换成每100公里的升数(欧洲通用的燃料消耗表示法),并显示结果,显示方式是在小数点右侧显示一个数字(请注意,美国方案测量每单位距离消耗的燃料数,而欧洲方案测量每单位燃料的行驶距离)。用符号常量表示两个转换系数(使用const或#define)。

#include <stdio.h>
#define LITRE 3.785
#define KM 1.609

int main(void)
{
	//此处注释部分可替代前面的两个#define
	//const float LITRE = 3.785;
	//const float KM = 1.609;
	
	float mile;
	float gallon;

	printf("请输入行驶的英里数:");
	scanf("%f", &mile);
	printf("请输入消耗省油的加仑数:");
	scanf("%f", &gallon);
	printf("消耗每加仑汽油行驶的里数为:%.1f\n", mile / gallon);
	printf("每100公里需消耗的汔油的升数为:%.1f\n", 
		100 * ((gallon * LITRE) / (mile * KM)));

	return 0;
}