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;
}