栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《C Primer Plus(第六版)》第三章 数据和C-------编程练习答案(仅供参考,内含个人关于整数上溢和下溢的理解)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《C Primer Plus(第六版)》第三章 数据和C-------编程练习答案(仅供参考,内含个人关于整数上溢和下溢的理解)

注:以下代码仅供参考,该博客为个人自学C语言的学习记录。如有代码或其他错误的地方请各位大佬批评指正。

1.通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢
和浮点数下溢的情况。

 相关知识:在《C Primer Plus(第六版)》中对上溢和下溢的定义是这样的:

                 上溢:当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。

                 下溢:以十进制为例,把一个由4位有效数字的数(如:0.1234E-10)除以10,得到的结果是 0.0123E-10。虽然得到了结果,但计算过程中损失了原末尾有效位上的数字,这种情况叫作下溢。

接下来上代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include 

//浮点数上溢
int main() {
	//当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。
	//float类型的长度是4个字节,数值范围为 -3.4E+38 到3.4E+38。
    //这个例子是书中的
	float toobig = 3.4E38 * 100.0f;
    float toobig1 = 3.4E38 * 2;
	printf("%en", toobig); //运行结果:inf(具有无穷的含义)
    printf("%en", toobig1); //运行结果:inf(具有无穷的含义)
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include 

//浮点数下溢
int main() {
	//在计算过程中损失了原末尾有效位上的数字,这种情况叫做下溢。
    //书中摘抄:把最小的正浮点数除以2将得到一个低于正常的值。如果除以一个非常大的值,会导致所有的位都为0。
	float toosmall = 0.4E-50 / 100.f;
	printf("%en",toosmall);  //运行结果:0.000000e+00
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include  //该文件专门用于检测整型数据类型的表达值范围

//整型的上溢和下溢
int main(){
    //short的范围为: -32768 —— 32767
	printf("short的范围为: %hd —— %hdn", SHRT_MIN, SHRT_MAX);
    //上溢
	short up = 32767;
	printf("%hd", up+1);  //-32768
 
    //下溢
	short down= -32768;
	printf("%hd", down-1); //32767
	return 0;
}

以下是个人关于整数上溢和下溢的理解:

整数的上溢和下溢就像时钟一样,时钟里有12个刻度,一个刻度表示一个小时,当时钟的时针从1点转到12点时,刚好转完一圈,此时已经是时针的最大值12(相当于整数的最大值),那么当时针转到12点之后,它不会转到13点,因为根本没有13点,所以时针只能继续循环,再从1点转到12点。

上溢和下溢也是如此,当所定义的数超过了该数据类型的最大值,那么就会回到该数据类型的最小值;如果所定义的数太小了,比该数据类型的最小值还小,最小值前面已经没数了,所以就回到了最大值,就像圆一样周而复始。

也可以通过数据结构里的循环队列(当队满时,某个位置可能既是头指针,又是尾指针)来更好的理解。

 2.编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。

#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main() {
	char a;

	//获取用户的输入
	printf("输入一个ASCII码值:");
	scanf("%d", &a);
	printf("该值所对应的ASCII码为%cn",a);
	return 0;
}

3.编写一个程序,发出一声警报,然后打印下面的文本:
        Startled by the sudden sound, Sally shouted,
        "By the Great Pumpkin, what was that!"

#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main() {
	printf("a");  //该转义字符可以发出警报声
	printf("Startled by the sudden sound, Sally shouted,n");
    //"--使用转义字符打印出引号
	printf(""By the Great Pumpkin, what was that!"");
	return 0;
}

4.编写一个程序,读取一个浮点数,先打印成小数点形式,再打印成指

数形式。然
后,如果系统支持,再打印成p记数法(即十六进制记数法)。按以下格式输出(实际显
示的指数位数因系统而异):
        Enter a floating-point value: 64.25
        fixed-point notation: 64.250000
        exponential notation: 6.425000e+01
        p notation: 0x1.01p+6

#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main() {
	float a;
	//读取一个浮点数
	printf("Enter a floating-point value: ");
	scanf("%f", &a);
	//打印成小数点形式
	printf("fixed-point notation:%fn",a);
	//打印成指数形式
	printf("exponential notation:%En", a);
	printf("exponential notation:%en",a);
	//打印成p计数法(即十六进制计数法)
	//如果系统支持十六进制格式的浮点数,可用a和A分别代替e和E
	printf("p notation:%An", a);
	printf("p notation:%an", a);
	return 0;
}

5.一年大约有3.156×10 7 秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应
的秒数。

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main() {
	float sec = 3.156E+7;
	float totalSec;
	int age;

	printf("请输入您的年龄:");
	scanf("%d", &age);

	totalSec = sec * age;

	printf("该年龄对应的秒数为:%f", totalSec);
	return 0;
}

6.1个水分子的质量约为3.0×10 −23 克。1夸脱水大约是950克。编写一个程序,提示用
户输入水的夸脱数,并显示水分子的数量。

#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main() {
	float waterQuantity = 3.0e-23;  //水分子质量
	float inputNum;  //输入的数--水的夸脱数
	float waterNum;  //水分子数量
	printf("请输入水的夸脱数:");
	scanf("%f", &inputNum);
	waterNum = inputNum * 950 / waterQuantity;
	printf("水分子的数量为:%e", waterNum);
	return 0;
}

7.1英寸相当于2.54厘米。编写一个程序,提示用户输入身高(/英寸),然后以厘米
为单位显示身高。

#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main() {
	float heighInch,heighcm;
	printf("请输入您的身高(单位:英寸):");
	scanf("%f", &heighInch);
	//1英寸等于2.54厘米
	heighcm = heighInch * 2.54;
	printf("您的身高为%f厘米。", heighcm);
	return 0;
}

8.在美国的体积测量系统中,1品脱等于2杯,1杯等于8盎司,1盎司等于2大汤勺,1
大汤勺等于3茶勺。编写一个程序,提示用户输入杯数,并以品脱、盎司、汤勺、茶勺为
单位显示等价容量。思考对于该程序,为何使用浮点类型比整数类型更合适?

#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main() {
	float cupNum;

	printf("请输入杯数:");
	scanf("%f", &cupNum);

	float pint = cupNum / 2;
	printf("以品脱为单位:%fn", pint);
	float ounce = cupNum * 8;
	printf("以盎司为单位:%fn", ounce);
	float bigspoon = ounce * 2;
	printf("以大汤勺为单位:%fn", bigspoon);
	float teaspoon = bigspoon * 3;
	printf("以茶勺为单位:%fn", teaspoon);

	return 0;
}

使用浮点类型比整数类型计算出来的值更准确

如果使用整数类型在做相关运算(例如除法运算)时只能得到整数

例如:如果用户输入的数值为“7”,那么当换算为品脱单位(此时品脱被定义为int类型)时,得到的数值为“3”,但准确的值应该为“3.5”,所以使用浮点类型比整数类型更合适。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号