C primer plus(第五版)程式設計練習第六章
第二題:使用巢狀迴圈,產生下圖案: $ $$ $$$ $$$$ $$$$$ 解: 程式碼如下: #include <stdio.h> int main(void) { int i,j; for(i = 1;i <=5;i++) { for(j = 1;j<=i;j++) printf("$"); printf("\n"); } return 0; } ———————————————分割線—————————————————
第三題:使用巢狀迴圈產生下列圖案: F FE FED FEDC FEDCB FEDCBA 請注意:如果您的系統不使用ASCII或其他以數字順序編碼的碼,您可以把一個字元數字初始化為字母表中的字母: char lets[26] = "ACBDEFGHIJKLMNOPQRSTUVWXYZ"; 然後就可以使用陣列索引來選用單個的字母,例如lets[0]的值時'A'。 解: 程式碼如下: #include <stdio.h> int main(void) { int i,j; char ch; for(i = 1;i <=6;i++) { for(j = 1,ch = 'F';j<=i;j++,ch -= 1) printf("%c",ch); printf("\n"); } return 0; } ———————————————分割線—————————————————
第四題:編寫一個程式,執行程式時,使用者輸入一個大寫字母例如'E',產生如下的金字塔: A ABA ABCBA ABCDCBA ABCDEDBCA 這種圖案需要擴充套件到使用者輸入的字元。提示:使用巢狀迴圈處理,並且擁有3個內部迴圈,一個處理空白,一個處理升序,一個處理降序。 解: 程式碼如下: #include <stdio.h> int main(void) { int row,space,up,down; char ch,up_c,down_c; printf("Input a capital:"); scanf("%c",&ch); for(row = 0;row <= ch - 'A';row++) { for(space = ch -'A';space >= row;space-- ) printf(" "); for(up = 0,up_c = 'A';up <= row;up++,up_c++) printf("%c",up_c); for(down = 0,down_c = 'A' + row -1;down < row;down++,down_c--) printf("%c",down_c); printf("\n"); } return 0; } ———————————————分割線—————————————————
第五題:編寫一個程式,列印一個表,表的每一行都給出一個整數,它的平方和它的立方。要求使用者輸入表的上限與下限,使用一個for迴圈。 解: 程式碼如下: #include <stdio.h> int main(void) { int i,low,up; printf("please Input the lower and upper:"); scanf("%d %d",&low,&up); for(i = 0;i <= up - low;i++) printf("%d\t%d\t%d\n",low + i,(low + i) * (low + i),(low + i) * (low + i)* (low + i)); return 0; } ———————————————分割線—————————————————
第六題:編寫一個程式,把一個單詞讀入一個字元陣列,然後反向列印這個詞。提示,用strlen()計算陣列中最後一個字元的索引。 解: 程式碼如下: #include <stdio.h> #include <string.h> int main(void) { char word[40]; int i; printf("Input a word:"); scanf("%s",word); for(i = strlen(word) - 1;i >= 0;i--) printf("%c",word[i]); printf("\n"); return 0; } ———————————————分割線—————————————————
第七題:編寫一個程式,要求輸入兩個浮點數,然後打印出用二者的差值除以二者的乘積所得的結果。在使用者鍵入非數字的輸入之前程式迴圈處理每對輸入值。
第八題:對第七題進行更改,讓它使用一個函式來返回計算值。 解: 程式碼如下: #include <stdio.h> float test(float a,float b); int main(void) { float a,b; printf("Input two float number:"); while(scanf("%f %f",&a,&b) == 2) printf("result is %f\nInput two float number:",test(a,b)); return 0; } float test(float a,float b)
{ return (a - b) / (a * b); } ———————————————分割線—————————————————
第九題:編寫一個程式,要求使用者輸入下限整數和上限整數,然後,依次計算從下限到上限的每一個整數的平方的加和,最後顯示結果,並可以迴圈輸入和顯示,直到下限等於或小於上限時終止程式。 解:計算較為繁瑣,建議將其作為自定義函式。 程式碼如下: #include <stdio.h> int test(int a,int b); int main(void) { int a,b; printf("Input lower and upper number:"); scanf("%d %d",&a,&b); while(b - a > 0) { printf("the sum of the squares from %d to %d is %d\nInput lower and upper number:",a,b,test(a,b)); scanf("%d %d",&a,&b); } printf("Done\n"); return 0; } int test(int a,int b)
{ int sum = 0; int i; for(i = 0;i <= b -a;i++) sum += (a + i)*(a + i); return sum; } ———————————————分割線—————————————————
第十題:編寫一個程式把8個整數讀入一個數組中,然後以相反的順序列印它們。 解: 程式碼如下: #include <stdio.h> int main(void) { int number[8]; int i; printf("Input 8 numbers:"); for(i =0;i < 8;i++) scanf("%d",&number[i]); for(i = 7;i >= 0;i--) printf(" %d",number[i]); printf("\n"); return 0; } ———————————————分割線—————————————————
第十一題:考慮這兩個無限序列: 1.0 + 1.0/2.0 + 1.0/3.0 +1.0/4.0 + ... 1.0 - 1.0/2.0 + 1.0/3.0 -1.0/4.0 + ...
編寫一個程式來計算這兩個無限序列不斷變化的總和,直到達到某個次數。使用者互動式輸入這個次數。看看在20次、100次和500次之後的總和。是否每個序列都看上去要收斂於某個值?提示:奇數個-1相乘的值為-1,偶數個為1。 解:這裡使用兩個自定義函式,分別計算各序列N個數字的和之後,再讓兩個序列的和相加,得到總和。 程式碼如下: #include <stdio.h> double list1(int n); double list2(int n);
double pow_i(int n); int main(void) { int n; printf("how many times do you want to compute:"); scanf("%d",&n); printf("the sum of two lists by %d times is %f\n",n,list1(n) + list2(n)); return 0; } double list1(int n)
{ double sum1 = 0.0; int i; for(i = 1;i <= n;i++ ) sum1 += 1.0 / (double)i; printf("sum1:%f\n",sum1); return sum1; } double list2(int n)
{ double sum2 = 0.0; int i; for(i = 1;i <= n;i++ ) sum2 += 1.0 / (double)i * pow_i(i); printf("sum2:%f\n",sum2);
return sum2; } double pow_i(int n) { int i; double result = -1; for(i = 1;i <= n;i++) result *= -1.0; return result; } ———————————————分割線—————————————————
第十二題:編寫一個程式,建立一個8個元素的int陣列,並且把元素分別設定為2的前8次冥,然後打印出他們的值,要求for迴圈設定值,do while迴圈顯示值。 解: 程式碼如下: #include <stdio.h> int main(void) { int num[8]; int i; int j = 0; int n =1; for(i = 0;i < 8;i++) { n *= 2;
第十三題:編寫一個程式,建立兩個8元素的double陣列,使用一個迴圈來讓使用者鍵入第一個陣列的8個元素的值。程式把第二個陣列的元素設定為第一個陣列元素的累積和。例如,第二個陣列的第4個元素應該等於第一個陣列的前4個元素的和,第二個陣列的第5個元素應該等於第一個陣列的前5個元素之和(可選使用巢狀迴圈可以實現這一點)。最後,使用一個迴圈來顯示兩個陣列中的內容。第一個數字在一行中顯示,第二個陣列中的每個元素在第一個陣列的對應元素之下進行顯示。 解: 程式碼如下: #include <stdio.h> int main(void) { double n1[8],n2[8],n; int i,sum; printf("Input 8 numbers:"); for(i = 0,sum = 0;i < 8;i++) { scanf("%lf",&n); n1[i] = n; sum += n; n2[i] = sum; } for(i = 0;i < 8;i++) { printf("\t%lf",n1[i]); } printf("\n"); for(i = 0;i < 8;i++) { printf("\t%lf",n2[i]); } printf("\n"); return 0; } ———————————————分割線—————————————————
第十四題:編寫一個程式讀入一行輸入,然後反向列印該行。您可以把輸入儲存在一個char陣列中;假定該行不超過255個字元。回憶一下,您可以使用具有%c說明符的scanf()在輸入中一次讀入一個字元,而且當你按下回車鍵時會產生換行符(\n)。 解: 程式碼如下: #include <stdio.h> int main(void) { char words[255]; int i; printf("Input words:\n"); for(i = 0;i < 255;i++) scanf("%c",&words[i]); printf("output:\n");
for(i = 254;i >= 0;i--) printf("%c",words[i]); printf("\n"); return 0; } ———————————————分割線—————————————————
第十五題:Daphne 以10%的單利息投資了100美元(也就是說,每年投資贏得的利息等於原始投資的10%)。Deirdre則以每年5%的複合利息投資了100美元(也就是說,利息是當前結餘的5%,其中包括以前的利息)。編寫一個程式,計算需要多少年Deirdre的投資額才會超過Daphne,並且顯示出到那時兩個人的投資額。 解: 程式碼如下: #include <stdio.h> #define CAPITAL 100.0 #define RATE1 10.0/100.0 #define RATE2 5.0/100.0 int main(void) { float t1,t2; int n = 0; t1 = t2 = CAPITAL; while(t2 <= t1) { t1 += CAPITAL * RATE1; t2 += t2 * RATE2; n++; } printf("%d years later,Daphne: %f Deirdre: %f\n",n,t1,t2 ); return 0; } ———————————————分割線—————————————————
第十六題:Chuckie Lucky贏了100萬美元,他把錢存入一個每年贏得%8的賬戶。在每年的最後一天,Chuckie取出10萬美元。編寫一個程式,計算需要多少年Chuckie就會清空他的賬戶。 解: 程式碼如下: #include <stdio.h> #define MONEY 1000000.0 #define TAKE 100000.0 #define RATE 8.0/100.0 int main(void) { float total; total = MONEY; int n = 0; while(total > 0.0) { total += total * RATE; total -= TAKE; n++; } printf("%d years later Chuckie will clear his account.\n",n); return 0; }