C Primer Plus(第6版)第六章程式設計練習答案
阿新 • • 發佈:2018-12-15
好久沒發啦,這是第六章的答案。之前人生髮生了頗大的變故,不提也罷。
之前發現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;
}