关键点 转换说明 输出 %a 浮点数、十六进制数和P计数法 %A 浮点数、十六进制数和P计数法 %c 单个字符 %d 十进制数字 %e 浮点数 e计数法 %E 浮点数 e计数法 %f 浮点数 十进制计数法 %g %G %i 有符号十进制数 %o 八进制数字 %p 地址 %s 字符串 %u 无符号十进制 %x 十六进制 %X 十六进制 %% 百分号 转换说明的意义 转换说明把以二进制格式存储在计算机中的值转传承一些列字符便于显示 复习题 1.再次运行程序清单4.1,但是在要求输入名时,请输入名和姓(根据 英文书写习惯,名和姓中间有一个空格),看看会发生什么情况?为什么? 答:程序不能正常运行。第1个scanf()语句只读取用户输入的名,而用户 输入的姓仍留在输入缓冲区中(缓冲区是用于储存输入的临时存储区)。下 一条scang()语句在输入缓冲区查找重量时,从上次读入结束的地方开始读 取。这样就把留在缓冲区的姓作为体重来读取,导致 scanf()读取失败。另一 方面,如果在要求输入姓名时输入Lasha 144,那么程序会把144作为用户的 体重(虽然用户是在程序提示输入体重之前输入了144)。 2.假设下列示例都是完整程序中的一部分,它们打印的结果分别是什 么? a.printf("He sold the painting for $%2.2f.\n", 2.345e2); b.printf("%c%c%c\n", 'H', 105, '\41'); c.#define Q "His Hamlet was funny without being vulgar." printf("%s\nhas %d characters.\n", Q, strlen(Q)); d.printf("Is %2.2e the same as %2.2f?\n", 1201.0, 1201.0); 答:a.He sold the painting for $%2.2f.He sold the painting for $234.50. b. H i ) c.His Hamlet was funny without being vulgar. has 41 d.Is 12e3 the same as 1201.00? 3.在第2题的c中,要输出包含双引号的字符串Q,应如何修改? 答:printf("%c\n", 81); 4.找出下面程序中的错误。 define B booboo define X 10 main(int) { int age; char name; printf("Please enter your first name."); scanf("%s", name); printf("All right, %c, what's your age?\n", name); scanf("%f", age); xp = age + X; printf("That's a %s! You must be at least %d.\n", B, xp); rerun 0; } 正确的程序应该为 #define B "booboo" #define X 10 int main () { int age; int xp; char name; printf("Please enter your first name.\n"); scanf("%s", &name); printf("All right, %c, what's your age?\n", name); scanf("%f", age); xp = age + X; printf("That's a %s! You must be at least %d.\n", B, xp); rerun 0; } 5.假设一个程序的开头是这样: #define BOOK "War and Peace" int main(void) { float cost =12.99; float percent = 80.0; 请构造一个使用BOOK、cost和percent的printf()语句,打印以下内容: This copy of "War and Peace" sells for $12.99. That is 80% of list. 答:printf("his copy of "War and Peace" sells for $%0.2f.\nThat is %%d of list.", cost, percent) 6.打印下列各项内容要分别使用什么转换说明? a.一个字段宽度与位数相同的十进制整数 %d b.一个形如8A、字段宽度为4的十六进制整数 %4x c.一个形如232.346、字段宽度为10的浮点数%10.3f d.一个形如2.33e+002、字段宽度为12的浮点数%12.2e e.一个字段宽度为30、左对齐的字符串%-30s 7.打印下面各项内容要分别使用什么转换说明? a.字段宽度为15的unsigned long类型的整数 %15ud b.一个形如0x8a、字段宽度为4的十六进制整数 %4x c.一个形如2.33E+02、字段宽度为12、左对齐的浮点数%-12e d.一个形如+232.346、字段宽度为10的浮点数%+10.3f e.一个字段宽度为8的字符串的前8个字符%8.8s 8.打印下面各项内容要分别使用什么转换说明? a.一个字段宽度为6、最少有4位数字的十进制整数%6.4d b.一个在参数列表中给定字段宽度的八进制整数%#o c.一个字段宽度为2的字符%2c d.一个形如+3.13、字段宽度等于数字中字符数的浮点数%+0.2f e.一个字段宽度为7、左对齐字符串中的前5个字符%+7.5s 9.分别写出读取下列各输入行的scanf()语句,并声明语句中用到变量和 数组。 a.101 b.22.32 8.34E−09 c.linguini d.catch 22 e.catch 22 (但是跳过catch) 10.什么是空白? 答:空白包括空格、制表符和换行符。C 语言使用空白分隔记号。scanf() 使用空白分隔连续的输入项。 11.下面的语句有什么问题?如何修正? printf("The double type is %z bytes..\n", sizeof(double)); 答:printf("The double type is %s bytes..\n", sizeof(double)); 12.假设要在程序中用圆括号代替花括号,以下方法是否可行? #define ( { #define ) } 编程练习 1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出 来。 #includeint main (void) { char first[10]; char second[10]; printf("please input first\n"); scanf("%s",first); printf("please input scond\n"); scanf("%s",second); printf("%s,%s\n", second, first); return 0; } 2.编写一个程序,提示用户输入名和姓,并执行一下操作: a.打印名和姓,包括双引号; b.在宽度为20的字段右端打印名和姓,包括双引号; c.在宽度为20的字段左端打印名和姓,包括双引号; d.在比姓名宽度宽3的字段中打印名和姓。 #include int main (void) { char first[10]; char second[10]; printf("please input first\n"); scanf("%s",first); printf("please input scond\n"); scanf("%s",second); printf("\"%s,%s\"\n", second, first); printf("\"%+20s,%+20s\"\n", second, first); printf("\"%3s,%3s\"\n", second, first); return 0; } 3.编写一个程序,读取一个浮点数,首先以小数点记数法打印,然后以 指数记数法打印。用下面的格式进行输出(系统不同,指数记数法显示的位 数可能不同): a.输入21.3或2.1e+001; b.输入+21.290或2.129E+001; #include int main (void) { float value; printf("please input value\n"); scanf("%f",&value); printf("%0.1e\n", value); printf("%+0.3e\n", value); return 0; } 4.编写一个程序,提示用户输入身高(单位:英寸)和姓名,然后以下 面的格式显示用户刚输入的信息: Dabney, you are 6.208 feet tall 使用float类型,并用/作为除号。如果你愿意,可以要求用户以厘米为 单位输入身高,并以米为单位显示出来。 #include int main (void) { char name[10]; float height; printf("please input name\n"); scanf("%s",name); printf("please input height\n"); scanf("%f",&height); printf("%s,you are %0.3f feet tall\n", name, height/100); return 0; } 5.编写一个程序,提示用户输入以兆位每秒(Mb/s)为单位的下载速度 和以兆字节(MB)为单位的文件大小。程序中应计算文件的下载时间。注 意,这里1字节等于8位。使用float类型,并用/作为除号。该程序要以下面 的格式打印 3 个变量的值(下载速度、文件大小和下载时间),显示小数点 后面两位数字: At 18.12 megabits per second, a file of 2.20 megabytes downloads in 0.97 seconds. #include int main (void) { float speed; float total; printf("please input speed\n"); scanf("%f",&speed); printf("please input total\n"); scanf("%f",&total); printf("At %0.f megabits per second, a file of %0.f megabytes downloads in 0.97 seconds.\n", speed, total, total/speed); return 0; } 6.编写一个程序,先提示用户输入名,然后提示用户输入姓。在一行打 印用户输入的名和姓,下一行分别打印名和姓的字母数。字母数要与相应名 和姓的结尾对齐,如下所示: Melissa Honeybee 7 8 接下来,再打印相同的信息,但是字母个数与相应名和姓的开头对齐, 如下所示: Melissa Honeybee 7 8 #include #include int main (void) { char first[10]; char second[10]; printf("please input first\n"); scanf("%s",first); printf("please input scond\n"); scanf("%s",second); printf("%5s %5s\n", second, first); printf("%5d %5d\n",strlen(second),strlen(first)); return 0; } 7.编写一个程序,将一个double类型的变量设置为1.0/3.0,一个float类 型的变量设置为1.0/3.0。分别显示两次计算的结果各3次:一次显示小数点 后面6位数字;一次显示小数点后面12位数字;一次显示小数点后面16位数 字。程序中要包含float.h头文件,并显示FLT_DIG和DBL_DIG的值。1.0/3.0 的值与这些值一致吗? #include #include double a=1.0/3.0; float b=1.0/3.0; int main(void) { printf("%.6lf\n",a);printf("%.12lf\n",a);printf("%.16lf\n",a); printf("%.6f\n",b);printf("%.12f\n",b);printf("%.16f\n",b); printf("FLT_ DIG: %d\n", FLT_DIG); printf("DBL_DIG: %d\n", DBL_DIG); } 8.编写一个程序,提示用户输入旅行的里程和消耗的汽油量。然后计算 并显示消耗每加仑汽油行驶的英里数,显示小数点后面一位数字。接下来, 使用1加仑大约3.785升,1英里大约为1.609千米,把单位是英里/加仑的值转 换为升/100公里(欧洲通用的燃料消耗表示法),并显示结果,显示小数点 后面 1 位数字。注意,美国采用的方案测量消耗单位燃料的行程(值越大越 好),而欧洲则采用单位距离消耗的燃料测量方案(值越低越好)。使用 #define 创建符号常量或使用 const 限定符创建变量来表示两个转换系数。