奉上第三章编程练习答案,同时附加一点个人讨论:
在第七题中,题目要求我们通过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
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
#include //提供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
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
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
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
#include
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
#include
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
#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;
}