C Primer Plus 第4章习题

你该逆袭了

红色标注的是:错误的答案
蓝色标注的是:正确的答案
绿色标注的是:做题时有疑问的地方

一、复习题

1、

在这里插入图片描述

我的答案:

答:只会读取空格前面的字符串

#include <stdio.h>

int main()
{
	char name[20] = { 0 };

	printf("请输入你的姓名:");
	scanf("%s", name);
	printf("\n请输出你的姓名:%s\n",name);

	return 0;
}

在这里插入图片描述

正确答案:

C 语言在使用 scanf( ) 函数读取用户输入的字符串时,如果遇到第一个空白(空格、制表符、换行符),就认为完成数据读取工作,后续数据不再写入当前变量,而只保存在输入缓冲区中。
因此读取名的 scanf( ) 函数只能够在 name[ ] 中存储第一个无空白的连续单词。在空白之后用户输入的内容仍然保存在输入缓冲区内,等待下一次 scanf( ) 函数 的输入。
因此,程序中并没有等待用户输入体重数据,而直接将刚才缓冲区内的姓赋予给体重。

#include <stdio.h>

int main()
{
	char name[20] = { 0 };
	double weight = 0;

	printf("请输入你的姓名:");
	scanf("%s", name);
	printf("\n请输出你的姓名:%s\n", name);

	scanf("%f", &weight);
	printf("your weight is %f\n", weight);

	return 0;
}

2、

在这里插入图片描述
答:
a:
错误答案:
2.34e+02

正确答案:
会自动将 e 计数法 转换成 十进制,保留小数点两位数字

b:
Hi)
105 所对应的ASCII就是 ‘i’
对的

‘\41’ 的意思是 第41个ASCII字符 吗?
错误:这是八进制,一般来说写成 ‘\041’,也可以省略 0,直接写成 ‘\41’

printf("%c%c%c\n", 'H', 105, '\41');  // Hi!

正确答案:输出:Hi!,用字符型、十进制整数、八进制 转义方式打印 3 个字符。整形十进制数据 105 对应字符 ‘i’ ,‘41’ 这是八进制,一般来说写成 ‘\041’,也可以省略 0,直接写成 ‘\41’

c:
”His Hamlet was funny without being vulgar.“
has 44 characters.

预编译指令定义了 Q 为字符串 “His Hamlet was funny without being vulgar.” 。
打印时会直接通过转换说明符输出该字符串,strlen( ) 函数计算实参字符串 Q 的长度,即 42 ,并输出。
需要注意的是,strlen( ) 函数并没有计算字符串结尾 ‘\0’。

#include <stdio.h>
#define Q "his hamlet was funny without being vulgar." 

int main()
{
	printf("%s\nhas %d characters.\n", Q, strlen(Q));  //值得注意

	return 0;
}

d:
1.20e+03
1201.00

3、

在这里插入图片描述
在双引号前面加上 \

4、

在这里插入图片描述

#include <stdio.h>
#define B "booboo"   //一定要加上双引号
#define X 10

int main()
{
	int age;
	char name[20];
	int xp;

	printf("please enter your first name.");
	scanf("%s", name);
	printf("all right,%s,what's your age?\n", name);
	scanf("%d", &age);
	xp = age + X;
	printf("that's a %s! you must be at least %d.\n", B, xp);

	return 0;
}

5、

在这里插入图片描述

#include <stdio.h>
#define BOOK "War and Peace"

int main()
{
	float cost = 12.99;
	float percent = 80.0;

	printf("this copy of \"%s\" sells for $%.2f.\nthat is %.0f%% of list.", BOOK, cost, percent);

	return 0;	
}

6、

在这里插入图片描述
在这里插入图片描述
答:
a:错误答案:%10d
正确答案:%d 字段宽度 与 位数 相同不需要使用特殊修饰符

b:%4x
c:%10.3f
d:%12.2e
e:%-30s

7、

在这里插入图片描述
答:
a:%15lu
b:%#4x
c:%-12.2E
d:%+10.3f

e:%8.8s
注意:.数字 对于%s 转换,表示待打印字符的最大数量

8、

在这里插入图片描述
答:
a:%6.4d
注意:.数字 对于整形转换,表示待打印数字的最小位数。

b:错误答案:%5o
正确答案:%*o 在printf()中字段宽度由参数列表指定,使用修饰符 *

c:错误答案:%2s
正确答案:%2c 字段宽度为 2

d:%+.2f
正确答案:%+0.2f

e:%-7.5s

9、

在这里插入图片描述
a、

#include <stdio.h>

int main()
{
	int a;

	scanf("%d", &a);
	printf("%d\n", a);

	return 0;
}

b、

#include <stdio.h>

int main()
{
	float b, c;
	scanf("%f %E", &b, &c);
	printf("%f %E", b, c);

	return 0;
}

c、

#include <stdio.h>

int main()
{
	char d[20] = { 0 };
	scanf("%s", d);
	printf("%s", d);

	return 0;
}

d、

#include <stdio.h>

int main()
{
	char e[20] = { 0 };
	int f = 0;
	scanf("%s %d", e, &f);
	printf("%s %d", e, f);

	return 0;
}

e、

#include <stdio.h>

int main()
{
	
	char g[20] = { 0 };
	int i = 0;
	scanf("%*s%d", &i);
	printf("%d", i);

	return 0;
}

10、

在这里插入图片描述
答:制表符、回车、空格
正确答案:
空白指的是:空格、制表符、换行符,这 3 种空白是 scanf( ) 函数进行输入分割的符号。

11、

在这里插入图片描述

sizeof 运算符对应:%zd

12、

在这里插入图片描述
不可行,在程序中,{ } 已经用来处理别的任务了

二、编程练习

1、

在这里插入图片描述

#include <stdio.h>

int main()
{
	char ming[20] = { 0 };
	char xing[20] = { 0 };

	printf("请输入名:");
	scanf("%s", ming);
	printf("请输入姓:");
	scanf("%s", xing);
	printf("名.姓:%s.%s\n", ming, xing);

	return 0;
}

2、第4问我不会

在这里插入图片描述

a、

#include <stdio.h>

int main()
{
	char ming[20] = { 0 };
	char xing[20] = { 0 };

	printf("请输入名:");
	scanf("%s", ming);
	printf("请输入姓:");
	scanf("%s", xing);
	printf("\"%s.%s\"\n", ming, xing);

	return 0;
}

b、

#include <stdio.h>

int main()
{
	char ming[20] = { 0 };
	char xing[20] = { 0 };

	printf("请输入名:");
	scanf("%s", ming);
	printf("请输入姓:");
	scanf("%s", xing);
	printf("\"%20s.%20s\"\n", ming, xing);

	return 0;
}

c、

#include <stdio.h>

int main()
{
	char ming[20] = { 0 };
	char xing[20] = { 0 };

	printf("请输入名:");
	scanf("%s", ming);
	printf("请输入姓:");
	scanf("%s", xing);
	printf("\"%-20s.%-20s\"\n", ming, xing);

	return 0;
}

d、

我不理解意思:什么是比姓名宽度宽 3 的字段中打印名和姓???
正确答案:

#include <stdio.h>

int main()
{
	char name[20] = { 0 };
	int width = 0;

	printf("请输入你的名字:");
	scanf("%s", name);

	width = printf("%s", name);  //返回字符个数

	putchar('\n');
	printf("%d\n", width);

	printf("%*s\n", (width + 3), name);  //指定宽度参数

	return 0;
}

3、

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>

int main()
{
	double a = 0;

	printf("请输入小数:");
	scanf("%lf", &a);
	printf("%+.3f,%+.3E", a,a);	

	return 0;
}

4、

在这里插入图片描述

#include <stdio.h>

int main()
{
	char name[20] = { 0 };
	float height = 0;
	float h = 0;

	printf("请输入身高:");
	scanf("%f", &height);
	printf("请输入名字:");
	scanf("%s", name);
	printf("cm 为单位输入身高:");
	scanf("%f", &h);
	printf("%s,you are %.3f feet tall.\n", name, h/100.0);
	printf("%s,you are %.3f feet tall.\n", name, height);

	return 0;
}

5、

在这里插入图片描述

错误答案:

#include <stdio.h>

int main()
{
	float  download_speed = 18.12;
	float download_context = 2.20;
	printf("at %.2f megabits per second , a file of %.2f megabytes downloads in %.2f seconds\n", download_speed, download_context, download_context /download_speed);

	return 0;
}

在这里插入图片描述

正确答案:

正确答案:megabits 和 megebytes,所以计算公式:time = size * 8 / speed ;

6、

在这里插入图片描述

#include <stdio.h>
#include <string.h>

int main()
{
	char name1[20] = { 0 };
	char name2[20] = { 0 };
	int n1 = 0;
	int n2 = 0;

	printf("请输入姓名一:");
	scanf("%s", name1);
	printf("请输入姓名二:");
	scanf("%s", name2);
	n1 = strlen(name1);
	n2 = strlen(name2);
	printf("%s %s\n", name1, name2);
	printf("%*d %*d\n", n1, n1, n2, n2);
	printf("%s %s\n", name1, name2);
	printf("%-*d %-*d\n", n1, n1, n2, n2);

	return 0;
}

7、

在这里插入图片描述
不一样

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

int main()
{
	double n1 = 1.0 / 3.0;
	float n2 = 1.0 / 3.0;

	printf("%.6f,%.6f\n", n1, n2);  //0.333333,0.333333
	printf("%.12f,%.12f\n", n1, n2);  //0.333333333333,0.333333343267
	printf("%.16f,%.16f\n", n1, n2);  //0.3333333333333333,0.3333333432674408

	printf("%d %d", FLT_DIG, DBL_DIG);  // 6 15

	return 0;
}

正确答案:
printf( ) 函数在打印浮点型数时使用转换说明符 %f ,double 类型也可以使用 %lf ,虽然编译器在打印时统一转换为 double类型,但是打印时的转换并不能提高原 float 类型数据的精度。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值