1. 程式人生 > >C Primer Plus(第6版)第四章程式設計練習答案+一些思考

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