1. 程式人生 > >C Primer Plus(第6版)第六章程式設計練習答案

C Primer Plus(第6版)第六章程式設計練習答案

       好久沒發啦,這是第六章的答案。之前人生髮生了頗大的變故,不提也罷。

       之前發現CSDN上寫《C Primer Puls》這本書課後答案的不少,沒想到我居然受到到了幾位朋友點贊,看來萌新風格對萌新更友好啊。關於@天姬or田雞提到第五章第1題minute應該從>=改為>更符合題目語義我深表贊同,已加以修改。

        迴歸正題,第六章引入while、for、do  while、三種迴圈後,課後題目寫法就不像之前那樣單一了,不同的人出於數學上考慮的差異,程式的邏輯也各有不同。為寫好第六章,在自己編完後看對比別人的版本得出一個結論:簡潔。

        都說程式可讀性是最重要的,而寫迴圈最能讓人看懂的方式就是簡潔。少寫變數,少用巢狀迴圈(事實上書裡就是這樣倡導,比如第14題就要求不要用巢狀迴圈)。課後題目比起動輒上千行的實際工程簡單多了,若課後題目寫的都艱澀複雜,那實際工作豈不得要命?而且研究如何寫的輕便高效也是鍛鍊的過程。

        第六章中第5題和第14題是我個人認為最難的,均花了2個多小時才逐漸寫出來。建議和我一樣的萌新不要急著看答案,先自己寫完再比照別人的。

        第5題,最後我設計了一種輸入任意字母均可形成金字塔的寫法,而網上很多答案都是隻能輸入E形成金字塔。第14題要求不用巢狀迴圈,但我發現找到的答案几乎全部用了巢狀迴圈。當然,實際工程中不需要太多的奇技淫巧(比如最近大火的《太吾繪卷》據說被很多程式設計師吐槽寫的亂),但能寫出來還是很有意思的嘛。

#include <stdio.h>
int main(void)
{
	char Letters[26];
	int n;
	
	for(char letter = 'a',n = 0; letter <= ('a' + 26); letter++, n++) 
	{
		Letters[n] = letter;
		printf("%c", Letters[n]);
	}
		return 0;
 } 
#include <stdio.h>
int main(void)
{
	int n, m;
	
	for(n = 1; n <= 5; n++)
	{
		for(m = 1; m <= n; m++)
		printf("$");
		printf("\n");
	}
	
	return 0;
}
#include <stdio.h>
int main(void)
{
	int n, m;
	char letter;
	
	for(n = 1; n <= 6; n++)
	{
		for(letter = 'F', m = 1; m <= n; m++, letter--)
		printf("%c", letter);
		printf("\n");
	}
	
	return 0;
}
#include <stdio.h>
int main(void)
{
    int n, m, p;
	char letter;
	
	for(n = 0, m = 0; n <= 5; n++, m += n)
	{
		for(letter = 'A' + m, p = 0; p <= n; p++, letter++)
	 	printf("%c", letter); 
	 	printf("\n");
	 } 
	 return 0;
 } 
#include <stdio.h>
int main(void)
{
	int m, n, i, z, q;
	char x;
	scanf("%c", &x);
	
	n = x - 'A';
	
	for(m = 0; m < n + 1; m++)
	{
		for(i = 0; m < n - i; i++)
		printf(" ");
		for(z = 0; z <= m; z++)
		printf("%c", 'A' + z);
		for(q = 2; 'A' + z - q >= 'A'; q++)
		printf("%c", 'A' + z - q);
		printf("\n");
	}
return 0;
}
#include <stdio.h>
#include <math.h>
int main(void)
{
	long a, b ,c;
	long max, min;
	
	scanf("%ld", &a);
	b = pow(a, 2);//關於pow函式可以參考P105內容。 
	c = pow(a, 3);
	
	for(scanf("%ld %ld", &min, &max) ; a >= max, c <= max; ) 
	{
	printf("%15ld %15ld %15ld\n", a, b, c);
	scanf("%ld", &a);/*往下三行放入for迴圈更新部分,可以使迴圈部分簡潔明瞭。我的放法只是一種嘗試,沒有特別用意。*/
	b = pow(a, 2);
	c = pow(a, 3);
	}
	printf("over");
	return 0;
 } 
#include <stdio.h>
#include <string.h>
int main(void)
{
	int i;
	char voc[25];
	
	for(i = 0, scanf("%s", voc); i <= strlen(voc); i++)
	printf("%c", voc[strlen(voc)-1-i]);//-1是因為陣列從0算順序,而strlen從1開始 
	
return 0;
}
#include <stdio.h>
int main(void)
{
    double x, y, z;
	
	printf("請輸入兩個浮點數:\n");
	
	
	while( scanf("%lf %lf", &x, &y) == 2)
	{
	z = (x - y) / (x * y);
	printf("%lf\n", z);
	}
	printf("您輸入的不是浮點數。"); 
	return 0; 
 } 
#include <stdio.h>
double txt(double x, double y);
int main(void)
{
    double x, y, z;
	
	printf("請輸入兩個浮點數:\n");
	
	
	while( scanf("%lf %lf", &x, &y) == 2)
	{
	printf("%lf\n", txt(x, y));
	}
	printf("您輸入的不是浮點數。"); 
	return 0; 
 } 
 double txt(double x, double y)
 {
 	double z;	
 	z = (x - y) / (x * y);
 	
 	return z;
 }
#include <stdio.h>
#include <math.h>
int main(void)
{
	long x, y, i, z;

	printf("Enter lower and upper integer limits:");
	scanf("%ld %ld", &x, &y); 
	
	for(; x < y; scanf("%ld %ld", &x, &y)) 
	{
		for(z = 0, i = x; i <= y; i++)
		{
			z += pow(i, 2);
		}
	printf("The sums of the squares from %ld to %ld is %ld\n", x*x, y*y, z);//別把這裡的x*x和y*y換成pow(x,2)和pow(y,2),可以試著換看看結果然後思考原因 
	printf("Enter lower and upper integer limits:");
	} 
	printf("Done");
	return 0; 
 } 
#include <stdio.h>
int main(void)
{
	int num[8], i;
	
	for(i = 1; i <= 8; i++)
	{
		printf("請輸入第%d個數:\n", i);
		scanf("%d", &num[i-1]);
		printf("第%d個數是%d\n", i, num[i-1]);
	}
	for(i = 7; i >= 0; i--)
	{
		printf("%d\t", num[i]);
	}
	return 0;
 } 
#include <stdio.h>
#include <math.h>
int main(void)
{
	int n, x, y; 
	float i1, i2;
	
	
	printf("請輸入制定次數:");
	scanf("%d", &n); 
	
	for(i1 = 0, i2 = 0, x =1, y = 1; x <= n, y <= n;  x++, y++)
		{
		i1 += 1.0 / x;//這裡和下面的1不用浮點形式,會導致除以2以上的數只能得到0,而浮點型加減乘除整型都得到整型 
		i2 += (pow(-1, (y+1))*(1.0 / y));
		}
	printf("%lf\n%lf", i1, i2);
	
	return 0;
 } 
#include <stdio.h>
int main(void)
{
	int num[8], i;
	
	for(i = 1; i <= 8; i++)
	{
		num[i-1] = pow(2, i);
	}
	do
	{
		printf("%d\t", num[i-2]);//經過上面的迭代i已經變成9,對此要有清醒認識 
		i--;
	}
	while(i > 1);
	
	return 0; 
 } 
#include <stdio.h>
int main(void)
{
	double fir[8], sec[8];
	int i, k;
	
	printf("請輸入第1個數:\n");
	scanf("%lf", &fir[0]);
	sec[0] = fir[0];
	printf("fir[8]的第1個元素是:%lf,sec[8]的第1個元素是:%lf\n", fir[0], sec[0]);
		
	for(i = 2, k = 1; i <=8, k <= 7; i++, k++)
	{
		printf("請輸入第%d個數:\n", i);
		scanf("%lf", &fir[k]);
		sec[i-1] = sec[i-2]+ fir[k];  
		printf("fir[8]的第%d個元素是:%lf,", i, fir[k]);
		printf("sec[8]的第%d個元素是:%lf\n", i, sec[i-1]);
	}
	
	i = 0;
	while(i <= 7)
	{
		printf("%lf\t", fir[i]);
		i++;
	}
	printf("\n");
	
	i = 0;
	while(i <= 7)
	{
		printf("%lf\t", sec[i]);
		i++;
	}
	return 0;
 } 
#include <stdio.h>
#include <string.h>
int main(void)
{
	int i;
	char voc[255];
	
	for(i = 0, scanf("%s", voc); i <= strlen(voc); i++)//scanf函式讀取一行時用%s遇到空白字元就斷開,也就是說只能讀取無間斷的一行 
	{
		for(n=0; str)
	}
	printf("%c", voc[strlen(voc)-1-i]);
	
return 0;
}
#include <stdio.h>
int main(void)
{
	float Dei, Dap, x;
	int n;
	
	for(Dap = 100.0, Dei = 100.0, n = 1, x = 0.0; x <= Dap; n++)
	{
		Dap = 0.1 * 100 * n;
		Dei *= 1.05 ;
		x = Dei - 100.0;
	}
	printf("%f\t%f\n", Dap, x);
	printf("%d", n-1);//注意for迴圈順序:當經過某次迴圈實現反超後仍會迭代n再繼續比較,得到反超結論退出迴圈後,此時n已經+1了 
	
	return 0;
 } 
#include <stdio.h>
int main(void)
{
	double x;
	int n;
	
	x = 100.0;
	n = 1; 
	
	while(x >= 0.0)
	{
		x *= 1.08;
		x -= 10.0;
		n++;
	}
	printf("最後還剩下%lf萬元。\n", x + 10);
	printf("共計%d年。", n - 1);
	return 0;
}
#include <stdio.h>
# define Dun 150
int main(void)
{
	int n, i;
	
	for(i = 1, n = 5; n <= Dun; i++)
	{
		n = n - i;
		n = n * 2;
		printf("第%d周Rabnud博士的朋友數量:%d\n", i, n);
	}
	printf("花了%d周超過了鄧巴數", i - 1);
	return 0;
}