C Primer Plus 第3章习题

你该逆袭了

红色标注的是:错误的答案
蓝色标注的是:正确的答案

零、知识点总结

1、

目前一个整形数据用 32 位二进制数表示,因此其取值范围是:-2 ^ (31) ~ 2 ^(31) - 1

2、

浮点型数据在计算机中不是精确数值,而是存在一定的有效位数。C语言规定 float 类型数据有 6 位有效数字,double 类型数据有 10 位有效数字。因此浮点数运算过程中会产生浮点数的舍入错误。浮点型数据计算过程中可能产生上溢或者下溢,其中上溢表述数据无穷大(inf 表示),下溢则表示计算过程中损失了末尾的有效数字。

3、

浮点型常量默认均为 double 类型,除非以 6.0f 的形式显示表示 float 类型的数据。
2.9e05 默认是 double 类型浮点数,其后的L, 2.9e05L 表示其是 long double 类型。

4、

012 中以 0 开头表示八进制数据,八进制和十六进制常量通常优先选择 unsigned int 类型,因此使用转换说明符 %#o 。同理,unsigned int 类型数据 0x44 需要使用 %#x 。

5、

‘\n’:换行符:将当前位置移到本行开头。又叫回车,对应键盘上的return键
‘\r’:回车字符:将当前位置移到下一行开头。又叫换行,newline。

这时候可能就有人陷入了思考中,在文本中回车不就相当于换行了吗?换行不就相当于到了下一行了吗?其实按道理说这样理解是没有问题的,但是在不同的操作系统中,换行是由不同的方式来表示的。

Linux中\n表示回车并换行;
Windows中\r\n表示回车并换行。
Mac中\r表示回车并换行。

以上这种表示方式的理解可以通过打开一个文本文件来进行理解,但是需要引入三个概念。CR、LF、CRLF。

三、CR、LF、CRLF
CR:Carriage Return,对应ASCII中转义字符**\r**,表示回车
LF:Linefeed,对应ASCII中转义字符**\n**,表示换行
CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行

四、举例理解
随便编辑打开一个txt文件,然后选择菜单栏中的编辑----->档案格式转换---->转换为Windows格式

在这里插入图片描述

然后选择菜单栏中的视图---->显示符号---->显示行尾符
在这里插入图片描述

这样就可以看到行尾符了,可以看到每一行的末尾都有CRLF这就代表回车并换行
在这里插入图片描述

一、复习题

1、

在这里插入图片描述
a:int
b:float
c:char
d:int

2、

在这里插入图片描述
答:int 表示的整形容纳不下时,用 long int 类型。

3、

在这里插入图片描述
由于C语言中数据类型实际所占存储位数和精度和具体平台相关,C语言的规范并没有强制和详细的规定,因此C语言程序在移植过程中可能会出现不同平台数据类型不兼容的状况。为了解决这个问题,C语言在可移植类型 stdint.h 和 inttypes.h 中规定了精确宽度整数类型,以确保C语言的类型在各系统内功能相同。为了获得32位有符号整数,可以使用 int32_t 作为标准32位整形数据,使用 int_32least_t 获得至少32位整形数据,int_fast32_t 获得32位整形数据的最快计算速度。

4、

在这里插入图片描述
答:a:退格
b:int 整数1066
c:float 浮点数
d:int 十六进制整数
e:double 指数

5、

在这里插入图片描述

#include <stdio.h>

int main()
{
	float g;h;  //g 后面应该是 逗号
	float tax, rate;

	g = e21;   //不能同时省略e前面的小数点和数值  //e 的前面应有数值
	tax = rate * g;  //rate 没有被赋值

	return 0;
}

6、

在这里插入图片描述
浮点型常量默认均为 double 类型,除非以 6.0f 的形式显示表示 float 类型的数据。

12 int %d

0X3 错误答案:int %#d
正确答案unsigned int %#X

‘C’ char %c

2.34E07 double 错误答案:%f
正确答案:%e

‘\040’ 八进制int 错误答案:%d
正确答案:%c

7.0 错误答案:float %f
正确答案:double %f

6L long int %ld
6.0f float %f

0x5.b6p12 float 错误答案: %#a (C99才支持,P 计数法) 十六进制指数
正确答案:%a

7、

在这里插入图片描述
在这里插入图片描述
012 中以 0 开头表示八进制数据,八进制和十六进制常量通常优先选择 unsigned int 类型,因此使用转换说明符 %#o 。同理,unsigned int 类型数据 0x44 需要使用 %#x 。
2.9e05 默认是 double 类型浮点数,其后的L, 2.9e05L 表示其是 long double 类型。

012 错误答案:八进制int %d
正确答案:unsigned int %#o

2.9e05L long double %lf
正确答案:%Le

‘s’ char %c
100000 int %d
‘\n’ char %c
20.0f float %f

0x44 错误答案:十六进制int %#d
正确答案:unsigned int %#x

-40 int %d

8、

在这里插入图片描述
%d %ld
%f %c

9、

在这里插入图片描述

错误的代码:

#include <stdio.h>

int main()
{
	char ch = 0;

	ch = 10;   //错误
	printf("1%c1", ch);

	ch = 012;    //错误
	printf("2%c2", ch);

	ch = 0xa;    //错误
	printf("3%c3", ch);

	ch = '\n';   //错误
	printf("4%c4", ch);

	return 0;
}

正确的代码:

#include <stdio.h>

int main()
{
	char ch = 0;

	printf("%d\n", '\r');  //回车字符

	ch = 13;
	printf("1%c1", ch);

	ch = '\015';    //纠正
	printf("2%c2", ch);

	ch = '\xd';    //纠正
	printf("3%c3", ch);

	ch = '\r';
	printf("4%c4", ch);

	return 0;
}

‘\n’:换行符:将当前位置移到本行开头。又叫回车,对应键盘上的return键
‘\r’:回车字符:将当前位置移到下一行开头。又叫换行,newline。

这时候可能就有人陷入了思考中,在文本中回车不就相当于换行了吗?换行不就相当于到了下一行了吗?其实按道理说这样理解是没有问题的,但是在不同的操作系统中,换行是由不同的方式来表示的。

Linux中\n表示回车并换行;
Windows中\r\n表示回车并换行。
Mac中\r表示回车并换行。

以上这种表示方式的理解可以通过打开一个文本文件来进行理解,但是需要引入三个概念。CR、LF、CRLF。

三、CR、LF、CRLF
CR:Carriage Return,对应ASCII中转义字符**\r**,表示回车
LF:Linefeed,对应ASCII中转义字符**\n**,表示换行
CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行

四、举例理解
随便编辑打开一个txt文件,然后选择菜单栏中的编辑----->档案格式转换---->转换为Windows格式

在这里插入图片描述

然后选择菜单栏中的视图---->显示符号---->显示行尾符
在这里插入图片描述

这样就可以看到行尾符了,可以看到每一行的末尾都有CRLF这就代表回车并换行
在这里插入图片描述

10、

在这里插入图片描述

#include <stdio.h>

int main(void)
{
	int cows, legs;

	printf("how many cow legs did you count?\n");
	scanf("%d", &legs);
	cows = legs / 4;
	printf("that implies there are %d cows.\n", cows);

	return 0;
}

11、

在这里插入图片描述
a:换行符
b:
c:“
d:水平制表符

二、编程练习

1、

在这里插入图片描述

我的答案:

#include <stdio.h>

int main()
{
	printf("%zd\n", sizeof(int));  //4
	printf("%zd\n", sizeof(float));  //4
	printf("%zd\n", sizeof(double));  //8

	//signed int max = 2147483647  // 7FFFFFFF
	//unsigned int max = 4294967295  // FFFFFFFF

	//整数上溢
	unsigned int ua = 4294967295;
	printf("ua = %u\n", ua);  //ua = 4294967295
	printf("ua+1 = %u\n", ua + 1);  //ua + 1 = 0
	printf("ua+2 = %u\n", ua + 2);  //ua + 2 = 1

	signed int a = 2147483647;
	printf("a = %d\n", a);  //a = 2147483647
	printf("a+1 = %d\n", a + 1);  //a + 1 = -2147483648
	printf("a+2 = %d\n", a + 2);  //a + 2 = -2147483647

	//float max = 4294967295;

	//浮点数上溢
	float fup = 4294967295.0f;
	printf("%f\n", fup + 1000.0);    //4294968296.000000
	                                 //系统警告:显示已经算数溢出了 //并且计算结果错误

	//浮点数下溢
	float flow = 2.0e18f;
	float flow_sum, flow_res;
	flow_sum = flow + 1;
	flow_res = flow_sum - flow;
	printf("%f\n", flow_res);  //0.000000  


	return 0;
}

标准答案:

c 语言在limit.h 和 float.h 头文件中,预先定义了常见数据类型的限制。

#include <stdio.h>
#include <float.h>   //c 语言在limit.h 和 float.h 头文件中,预先定义了常见数据类型的限制。
#include <limits.h>

//INT_MAX
//FLT_MAX

int main(void)
{
	int big_int = 2147483647;
	//有符号整数数据最大值是 2 的 31 次方
	
	float big_float = 3.402823466e+38F;
	//浮点型数据的最大值一般为 3.4E38
	
	float small_float = 10.0 / 3;
	//浮点型数据的有效位数为 6 位
	
	printf("the big int data is %d\n", big_int + 1);
	//整形数据最大值 加1,会造成越界,结果为 -2147483648
	
	printf("the big float data is %f\n", big_float * 10);
	//浮点型最大数据乘以10造成越界,输出 inf。
	
	//如果浮点型数据只 加1个 小数据,由于其精确度限制,不会造成越界。
	printf("the big float data is %f\n", big_float + 1);
	//340282346638528859811704183484516925440.000000
	
	printf("the big float data is %f\n", small_float);
	//打印 3.333333 ,精度损失
	
	printf("the max float data is %f\n", FLT_MAX);
	//340282346638528859811704183484516925440.000000
	
	printf("the max int data is %d\n", INT_MAX);
	//2147483647

	return 0;
}

2、

在这里插入图片描述

#include <stdio.h>

int main()
{
	int input = 0;

	printf("请输入一个ACSII值:");
	scanf("%d", &input);
	printf("%c\n", input);

	return 0;
}

3、

在这里插入图片描述

#include <stdio.h>

int main()
{
	printf("\a");
	printf("startled by the sudden sound,sally shouted,\n");
	printf("\"by the great pumpkin,what was that!\"");
	
	return 0;
}

4、

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

#include <stdio.h>

int main()
{
	float input = 0;

	printf("enter a floating-point value:");
	scanf("%f", &input);
	printf("fixed-point notation:%f\n", input);
	printf("exponential notation:%e\n", input);
	printf("p notation:%.2a\n", input);

	return 0;
}

5、

在这里插入图片描述

#include <stdio.h>
#define YEAR_SEC 3.156e+07

int main()
{
	int year = 0;
	double sec = 0;

	
	printf("请输入你的年龄:");
	scanf("%d", &year);
	sec = (double)year * YEAR_SEC;
	printf("你的年龄:%d 对应的秒数:%f", year, sec);

	return 0;
}

6、

在这里插入图片描述

#include <stdio.h>
#define MOLE 3.0e-23
#define QUART 950

int main()
{
	float quart, quantity;
	printf("请输入:");
	scanf("%f", &quart);
	quantity = quart * QUART / MOLE;
	printf("%e\n", quantity);

	return 0;
}

7、

在这里插入图片描述

#include <stdio.h>
#define INCH 2.54

int main()
{
	float height = 0;
	float cm = 0;
	printf("请输入身高(英寸):");
	scanf("%f", &height);
	cm = height * INCH;
	printf("厘米:%.2f", cm);

	return 0;
}
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值