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

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

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

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

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

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

接下来上代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

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

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

//整型的上溢和下溢
int main(){
    //short的范围为: -32768 —— 32767
	printf("short的范围为: %hd —— %hd\n", 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 <stdio.h>

int main() {
	char a;

	//获取用户的输入
	printf("输入一个ASCII码值:");
	scanf("%d", &a);
	printf("该值所对应的ASCII码为%c\n",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 <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.编写一个程序,读取一个浮点数,先打印成小数点形式,再打印成指数形式。然后,如果系统支持,再打印成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 <stdio.h>

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

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

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

int main() {
	float cupNum;

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

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

	return 0;
}

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

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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《C Primer Plus第六》是一本面向初学者的C语言教材,由Stephen Prata撰写。这本书深入浅出地介绍了C语言的基本概念、语法和应用,给读者提供了扎实的编程基础。 该书共分为27章,每章都有清晰的目标、易于理解的示例和练习题。从第一章的入门介绍开始,到最后一章的高级主题讨论,书中的内容依次递进,系统完整地覆盖了C语言的方方面面。本书有助于读者逐步掌握C语言的基础知识,从简单的输出语句到复杂的函数调用和指针使用。 《C Primer Plus第六》的特点是其清晰的讲解风格和丰富的实例。作者通过通俗易懂的语言和生动形象的例子,帮助读者理解和掌握C语言的各种概念和语法。此外,书中还提供了许多练习题和编程项目,供读者巩固所学知识和提高编程能力。 作为一本经典的C语言教材,《C Primer Plus第六》被广泛用于学校和个人学习。它不仅适用于初学者,也对有一定编程基础的读者有所帮助。读者通过学习本书,可以建立起对C语言编程的扎实基础,为深入学习其他编程语言打下坚实的基础。 综上所述,《C Primer Plus第六》是一本权威、经典的C语言教材,通过清晰的讲解和丰富多样的示例帮助读者深入理解C语言的基本概念和应用。无论是初学者还是有一定编程基础的读者,都可以从中获益,打下良好的编程基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值