C Primer Plus(第6版)第四章编程练习答案+一些思考

       奉上第三章编程练习答案,同时附加一点个人讨论:

       在第七题中,题目要求我们通过float.h头文件的FLT_DIG和DBL_DIG两个明示常量了解float和double两种浮点数类型的有效数字位数,笔者手中DEV-C++,分别给出的有效数字是6位和15位。

       对于floa类型来说,小数点后显示第6位显然是可以办到的,而显示12位和16位时第6位有效位数之后就出现了随即数字(后续发现红色下划线标注的超出部分实际上不是无意义的随机数,是一个确切的计算值),明显超过了float类型的范围。

       但观察double类型的16位显示时可以发现,超过了第15位有效数字的16位依旧是正确显示,回看float发现第7位的显示也是正确(两个蓝框内依旧是3)。

       这是否代表实际上float和double的实际有效数字比头文件给出的多一位呢?

       再次通过计算9/17和5/23发现了更为有趣的部分:

       和我手中的计算器计算结果相比,对于9/17float类型能保持数据相同到第7位(计算器结果是0.5294117647),这似乎说明实际有效位数比头文件规定确实多一位。但对5/23甚至能达到第8位依旧相同(计算器结果是0.2173913043)。

       而double类型计算的结果可比计算器位数更高(计算器有效位数10位),而且反过来计算器计算的结果能拟合double类型的结果。

       这再给出了一条用double类型代替float类型的理由:计算相同的内容double比float能给出更精准的结果。

       当然,除了少部分科研领域显然是无需如此高的精确度的,而且在那些领域应该使用更为专业的计算装置。

       不过这一结果更加勾起了我的兴趣:计算机是如何在原理层次上实现乘除这种复杂运算的呢?想想就令人心潮澎湃,我觉得认真加以研究的话应该能得到一个很基础性的结论,对计算机掌握到这种程度的话应该就不输给CS专业的学生了吧。

       可惜为了生存、为了更好地生存,现在的我无暇他顾。对于计算机科学的热爱、对于科学技术本身的热爱只能放到实现财富自由之后了啊。废话到此为止,下面给出本章练习答案。

#include <stdio.h>
int main(void)
{
	char ft_name[20], lt_name[20];
	
	printf("请输入你的名和姓:"); 
	scanf("%s %s", ft_name, lt_name);
	printf("%s %s", lt_name, ft_name);
	
	return 0;
 } 
#include <stdio.h>
#include <string.h>  //提供strlen()函数满足d要求 
int main(void)
{
	int size1, size2;
	char ft_name[20], lt_name[20];
	
	printf("请输入你的姓名:");
	scanf("%s %s", ft_name, lt_name);
	size1 = strlen(ft_name);  //使用sizeof()函数会计算数组大小,而非姓名本身大小 
	size2 = strlen(lt_name);
	printf("%d %d\n", size1, size2);
	
	printf("\"%s %s\"\n", ft_name, lt_name);
	printf("\"%20s %20s\"\n", ft_name, lt_name);
	printf("\"%-20s %-20s\"\n", ft_name, lt_name);
	printf("\"%*s %*s\"\n", size1 + 3, ft_name, size2 + 3, lt_name);  // printf()函数中*修饰符用于代替字段宽度 
	
	
	return 0;
}
#include <stdio.h>
int main(void)
{
	float x; 
	scanf("%f", &x);
	
	printf("The input is %.1f or %.1e\n", x, x);
	printf("The input is %+.3f or %.3E", x, x);
	
	return 0;
}
#include <stdio.h>
int main(void)
{
	char name[20];
	float high; 
	
	printf("请输入您的姓名:");
	scanf("%s", name);
	printf("请以cm为单位输入你的身高:"); 
	scanf("%f", &high);
	
	printf("%s,你的身高是%fm\n", name, high / 100);
	
	return 0;
}
#include <stdio.h>
int main(void)
{
	float Velocity, Size;
	
	printf("请以Mb/s和MB为单位输入下载速度和文件大小\n");
	scanf("%f", &Velocity);
	scanf("%f", &Size);
	printf("At %.2f megabits per second, a file of %.2f megabytes\ndownload in %.2f second.", Velocity, Size, Size * 8 / Velocity);
	
	return 0; 
}
 
#include <stdio.h>
#include <string.h>
int main(void)
{
	char ft_name[20], lt_name[20];
	
	printf("请输入您的名:"); 
	scanf("%s", lt_name);
	printf("请输入您的名:"); 
	scanf("%s", ft_name);
	
	printf("%s %s\n", ft_name, lt_name);
	printf("%*d%*d\n", strlen(ft_name), strlen(ft_name), strlen(lt_name)+1, strlen(lt_name)); //注意本行如何办到要求的输入格式 
	printf("%s %s\n", ft_name, lt_name);	
	printf("%-*d %-*d", strlen(ft_name), strlen(ft_name), strlen(lt_name), strlen(lt_name));	

	return 0;
}
#include <stdio.h>
#include <float.h> 
int main(void)
{
	float a = 1.0 / 3.0;
	double b = 1.0 / 3.0;
	
	printf("%i\n%i\n", FLT_DIG, DBL_DIG);
	printf("%.6f\n%.7f\n%.8f\n%.12f\n%.16f\n",a, a, a, a, a);
	printf("%.6f\n%.12f\n%.16f\n%.17f\n", b, b, b, b);
	
	printf("%.6lf\n%.12lf\n%.16lf\n%.17f\n", b, b, b, b); // 看加上修饰符l后输出有无区别 

	return 0;
 } 
#include <stdio.h>
#define Js 3.785
int main(void)
{
	const int Yq = 1.609;
	float  distance, gas;
	
	printf("请输入以英里和加仑的行驶里程与耗油量:");
	scanf("%f %f", &distance, &gas) ;
	printf("消耗单位燃料的行程:%fMile/Gallon\n单位距离消耗的燃料是:%fL/100Km", distance / gas, (100 * gas * Js) / ( distance * Yq));
	 
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/LittleHaardt/article/details/79772412