C Primer Plus第六版第六章程式設計練習
阿新 • • 發佈:2018-12-12
/* 編寫一個程式,建立一個包含26個元素的陣列,並在其中儲存26個小寫字母。 然後列印陣列的所有內容 */ #include <stdio.h> #define SIZE 26 int main(void) { char alphabet[26]; int index; for (char ch = 'a', index = 0; ch <= 'z'; ch++, index++) alphabet[index] = ch; for (int index = 0; index < 26; index++) printf("%c \n", alphabet[index]); return 0; }
/*
使用巢狀迴圈(nested loop)按照下面的格式列印字元:
$
$$
$$$
$$$$
$$$$$
*/
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < i+1; j++)
printf("$");
printf("\n");
}
return 0;
}
/* 使用巢狀迴圈nested loop,按下面的格式列印字母 F FE FED FEDC FEDCB FEDCBA 此程式可以修改CH來列印各種字元遞減的三角形 比如當CH改為H時,輸出效果如下: H HG HGF HGFE HGFED HGFEDC HGFEDCB HGFEDCBA */ #include <stdio.h> #define CH 'F' int main(void) { char ch = CH; for (int i = 0; i <=CH - 'A'; i++) { for (int j = 0, ch = CH; j<= i; j++, ch--)//從F開始列印,第一次列印1個 printf("%c", ch); //第二次列印兩個,利用與外層迴圈變數i的關係控制 printf("\n"); } return 0; }
- 此程式提供了3個版本,依次改進
/* 使用巢狀迴圈,按下面的格式列印字母: A BC DEF GHIJ KLMNO PQRSTU */ #include <stdio.h> int main(void) { const char end = 'U'; char start; for (int i=0, start = 'A'; ch <= 'U'; i++) { for (int j=0; j <= i; j++) //利用行數與列印字元之間的關係 { printf("%c", start); start++; //每列印一個字元,字元遞增至下一個字元 } printf("\n"); //每一行結束後,換行 } return 0; } //************************************************************************* /* 下面是增強版,簡化了程式碼行數,並可讓使用者輸入指定字元 列印三角形至輸入字元所在行 如輸入V,則列印: A BC DEF GHIJ KLMNO PQRSTU VWXYZ[\ */ #include <stdio.h> int main(void) { char end; char start; printf("Enter an character: \n"); scanf("%c", &end); for (int i = 0, start = 'A'; start <= end; i++) { for (int j=0; j<=i; j++, printf("%c", start), start++); printf("\n"); } return 0; } //************************************************************************* /* 進了上個程式,使其只會列印至使用者輸入的字元處,不同於上個程式 會完整輸出字元所在的整行 */ #include <stdio.h> int main(void) { char start; char end; printf("Enter an end of the character: \n"); scanf("%c", &end); for (int i = 0, start = 'A'; start <= end; i++) { for (int j = 0; j <= i; j++,start++) { if (start<= end) printf("%c", start); } printf("\n"); } return 0; }
/*
編寫一個程式,提示使用者輸入大寫字母
使用巢狀迴圈以下面金字塔型的格式列印字母
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
列印這樣的圖形,要根據使用者輸入的字母來決定。
例如,上面的圖形是在輸入E後的列印結果。
*/
#include <stdio.h>
int main(void)
{
char start = 'A';
char end;
char ch = start;
printf("Enter an character i will give you a surprise now: \n");\
scanf("%c", &end);
printf("It's your own alphabet tree(haha): \n");
for (int i = 0; i <= end-start; i++, ch = start)
{
for (int j = 0; j < end - start - i; j++)
printf(" ");
for (int k = 0; k <= i; k++)
{
printf("%c", ch);
ch++;
}
ch -= 2;
for (int c = 0; c < i; c++)
{
printf("%c",ch);
ch--;
}
printf("\n");
}
return 0;
}
//*************************************************************************
//下面利用for loop的特性,使程式碼更加緊湊
#include <stdio.h>
int main(void)
{
char end;
char start = 'A';
char ch = start;
printf("Enter an character i will give you a surprise now: \n");
scanf("%c", &end);
printf("It's your own alphabet tree(haha): \n");
for (int i = 0; i <= end-start; i++, ch = start)
{
for (int j = 0; j < end - start - i; j++)
printf(" ");
for (int k = 0; k <= i; k++, ch++)
printf("%c", ch);
ch = ch - 2;
for (int c = 0; c < i; c++, ch--)
printf("%c",ch);
printf("\n");
}
return 0;
}
//小結一下,此題還是利用的是內外層迴圈的數值關係,搞清楚當中的關係也就不難了
/*
編寫一個程式列印一個表格,每行列印一個整數、該數的平方、該數的立方
要求使用者輸入表格的上下限。使用一個for loop
*/
#include <stdio.h>
int main(void)
{
int start;
int end;
printf("Enter a number as start: \n");
scanf("%d", &start);
printf("Enter a number as end: \n");
scanf("%d", &end);
printf("_____________________________________\n");
for (printf("original \t suqare \t cube\n"), start; start <= end; start++)
{
printf("%8d %14d %13d\n", start, start*start, start*start*start);
}
printf("_____________________________________\n");
printf("That's all");
return 0;
}
/*
編寫一個程式把一個單詞讀入一個字元陣列中,然後倒序列印這個單詞。
提示strlen()函式可用於計算陣列最後一個字元的下標。
*/
#include <stdio.h>
#include <string.h>
#define SIZE 40
int main(void)
{
char words[SIZE];
int end_index;
printf("Please enter a word that"
"you want to know it's revers order: \n");
scanf("%s", words);
end_index = strlen(words);
for (end_index--; end_index >= 0; end_index--)
printf("%c", words[end_index]);
return 0;
}
/*
編寫一個程式,要求使用者輸入兩個浮點數,並列印兩數之差除以兩數乘積的結果
在使用者輸入非數字之前,程式應迴圈處理使用者輸入的每對值。
*/
#include <stdio.h>
int main(void)
{
float f_op;
float s_op;
int states;
do
{
printf("Please enter two number: \n");
fflush(stdin); //用來清除輸入緩衝區,否則如果輸入非float型別的值,這個值將在輸入緩衝區中一直被失敗讀取,導致無限迴圈“Please enter two number:”
states = scanf("%f %f", &f_op, &s_op);
}while (states != 2);
printf("Result: %f \n", (f_op-s_op) / (f_op * s_op));
return 0;
}
//小結:此程式有待改善
此程式有待改善
/*
修改練習8,使用一個函式返回計算的結果。
*/
#include <stdio.h>
float func1(float f_op, float s_op);
int main(void)
{
float f_op;
float s_op;
int states;
do
{
printf("Please enter two number: \n");
fflush(stdin);
states = scanf("%f %f", &f_op, &s_op);
}while (states != 2);
printf("Result: %f \n", func1(f_op, s_op));
return 0;
}
float func1(float f_op, float s_op)
{
return (f_op-s_op) / (f_op * s_op);
}
/*
編寫一個程式,要求使用者輸入一個上限整數和一個下限整數,
計算從上限到下限範圍內所有整數的平方和,並顯示計算結果
直到使用者輸入的上限整數小於下限整數為止。
程式的執行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
Enter next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
Enter next set of limits: 5 5
Done
*/
#include <stdio.h>
int main(void)
{
int lower_num;
int upper_num;
printf("Enter lower and upper integer limits: ");
scanf("%d %d", &lower_num, &upper_num);
while (upper_num > lower_num)
{
int sum = 0;
for (int count = lower_num; count <= upper_num; count++)
{
sum += count * count;
}
printf("The sums squares frome %d to %d is %d \n",
lower_num * lower_num, upper_num * upper_num, sum);
printf("Enter lower and upper integer limits: ");
scanf("%d %d", &lower_num, &upper_num);
}
printf("Done\n");
return 0;
}
/*
編寫一個程式,在陣列中讀入8個整數,然後按倒序列印這8個整數
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
int num[SIZE];
printf("Start:");
for (int i = 0; i < SIZE; i++)
scanf("%d", &num[i]);
for (int j = SIZE-1; j >= 0; j--)
printf("%d \n", num[j]);
printf("Done! \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 + ...
編寫一個程式計算這兩個無限序列的綜合,直到到達某次數。
提示:奇數個-相乘得-1,偶數個-1相乘得1
讓使用者互動的輸入指定的次數,當用戶輸入0或負值時結束輸入
檢視執行100項、1000項、10000項後的總和,是否發現每個序列都收斂於某值?
*/
#include <stdio.h>
int main(void)
{
int times;
float count1 = 1.0f;
float count2 = 1.0f;
float sum1 = 0.0;
float sum2 = 0.0;
printf("How many times adddtion you want : \n");
scanf("%d", ×);
for (int i = 1; i <= times; i++, count++)
{
sum += 1.0 / count;
}
for (int j = 1; j <= times; j++, count2++)
{
if (j % 2 == 0)
{
sum2 -= 1.0 / count2;
}
else
{
sum2 += 1.0 / count2;
}
}
printf("The first infinite series: %f\n", sum1);
printf("The second infinite series: %f \n", sum2);
return 0;
}
第二個級數是收斂的,第一個級數不收斂,數學過程怎麼證明來著我忘了 = =待我看完書再補上ORZ 13.
/*
編寫一個程式,建立一個包含八個元素的int型別陣列,
分別把陣列元素設定為2的前8次冪。
使用for迴圈設定陣列元素的值,使用do while迴圈顯示陣列的值
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
int num[SIZE];
int power_of_two;
int index = 0;
for (int i = 0; i < SIZE; i++, power_of_two = 1)
{
for (int j = 1; j < i+1; j++)
power_of_two = power_of_two * 2;
num[i] = power_of_two;
}
do
{
printf("%d \n", num[index]);
index++;
} while (index < SIZE);
return 0;
}
/*
編寫一個程式,建立兩個包含8個元素的double型別陣列
使用迴圈提示使用者為第一個陣列輸入8個值。
第二個元素的值設定為第一個陣列對應元素的累積之和。
例如:第二個陣列的第4個元素是第一個陣列前4個元素之和
(利用巢狀迴圈完成,但是第二個陣列的第5個元素是第二個陣列的第4個元素
與第一個陣列的第5個元素之和,只用一個迴圈就能完成任務,不需要使用巢狀迴圈)
最後,使用迴圈顯示兩個陣列的內容,每個陣列各佔一行且相應元素上下對齊
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
double arr1[SIZE];
double arr2[SIZE];
printf("Please input the value of the first array: \n");
for (int i = 0; i < SIZE; i++)
{
scanf("%lf", &arr1[i]);
for (int j = 1 ; j <= i; j++)
{
arr2[0] = arr1[0]; //這條初始化語句放在for loop裡會報錯,原因尚不得知
arr2[j] = arr2[j-1] + arr1[j] ;
}
}
printf("Good job ! \n");
printf("————————————————————————————————————————\n");
for (int i = 0; i < SIZE; i++)
{
printf ("%7.2f", arr1[i]);
}
printf("\n");
for (int i = 0; i < SIZE; i++)
{
printf ("%7.2f", arr2[i]);
}
printf("\n————————————————————————————————————————\n");
return 0;
}
/*
編寫一個程式,讀取一行輸入,讓後把輸入的內容倒序打印出來。
可以把輸入儲存在char型別的陣列中,假設每行字元不超過255.
回憶一下,根據%c轉換說明(conversation specification)
scanf()每次只能中輸入中讀取一個字元,
而且在使用者按下Enter鍵時,scanf()會生成一個換行字元(\n).
*/
#include <stdio.h>
#define SIZE 256
int main(void)
{
char str[SIZE];
int index = -1;
printf("Please input everyting your like,"
" but no more than 255 characters: \n");
for (int i = 0; i < SIZE; i++)
{
scanf("%c", &str[i]);
index++; //統計字元個數
if (str[i] == '\n')
break; //用到了後一章的break,暫時沒找到用前幾章的解法
}
for (int j = index - 1; j >= 0; j--) //從index處倒序列印
printf("%c", str[j]);
return 0;
}
/*
Daphne以10%的單利息投資了100美元(也就是說,每年投資獲利相當於原始投資的10%)
Deirdre以5%的複合利息投資了100美元(也就是說,利息是當前餘額的5%,包含之前的利息)
編寫一個程式,計算需要多少年Deirade的投資額才會超過Daphne,並顯示那時兩人的投資額
*/
#include <stdio.h>
#define SIMP_RATE 10%
#define COM_RATE 5%
int main(void)
{
int base_money = 100;
float simple_interest = (float)base_money;
float compound_interest = (float)base_money;
int years = 0;
while (compound_interest <= simple_interest)
{
simple_interest += base_money * (10.0 / 100);
compound_interest *= (105.0 / 100);
years++;
printf("The %d year \n", years);
printf("simple interest: %16.3f \n", simple_interest);
printf("compound interest: %14.3f \n", compound_interest);
printf("---------------------------------\n");
}
printf("Finally it spend %d Years.", years);
return 0;
}
/*
Chuckie Lucky 贏得了100萬美元(稅後),他把獎金存入年利率8%的賬戶。
在每年的最後一天,Chuckie取出10萬美元。
編寫一個程式,計算需要多少年後Chuckie會取完賬戶的錢?
*/
#include <stdio.h>
int main(void)
{
int base_money = 100;
const float RATE = 108.0 / 100;
float total = 100;
int years;
while (total > 0)
{
total *= RATE;
total -= 10;
years++;
printf("%4d years %f\n", years, total);
}
printf("%4d years later you have no money in the bank", years);
return 0;
}
/*
Rabnud博士加入了一個社交圈。起初他有5個朋友,他注意到他的朋友以下面的方式進行增長
第1周少了1個朋友,剩下的朋友數量翻倍;第二週少了兩個朋友,剩下朋友數量翻倍
一般而言,第N周少了N個朋友,剩下的朋友數量翻倍。
編寫一個程式,計算並顯示Rabnud博士每週朋友的數量。
該程式一直執行,直到超過鄧巴數(Dunbar's number)。
鄧巴數是粗略估計一個人在社交圈中有穩定關係的成員的最大值,該值大約是150
*/
#include <stdio.h>
#define DUNBAR 150
int main(void)
{
int start_f = 5;
int total_f = start_f;
int weeks = 1;
while (total_f < DUNBAR)
{
total_f = (total_f - weeks) * 2;
printf(" %d weeks later, %d friends\n", weeks, total_f);
weeks++;
}
printf("After %d weeks your have touch the Dunbar. \n", weeks-1);
return 0;
}