收錄《C語言程序設計50例》前 10 道經典習題,涵蓋排列組合、分段函數、數學性質、日期計算、排序、圖形輸出、九九乘法表、棋盤打印、樓梯圖案等核心基礎知識點。每題附帶分析思路、完整代碼與運行結果,適合初學者夯實編程基本功。
題目:用 1、2、3、4 組成互不相同且無重複數字的三位數,統計個數並列舉。
思路:三重循環遍歷百位、十位、個位,`if` 判斷三位互不相同。
代碼片段:
for (i=1; i<5; i++)
for (j=1; j<5; j++)
for (k=1; k<5; k++)
if (i!=k && i!=j && j!=k)
printf("%d,%d,%d\n", i, j, k);
輸出:24 個排列(4×3×2=24)。
題目:按利潤分段計算獎金:≤10萬提 10%,10-20萬超額提 7.5%,20-40萬提 5%,40-60萬提 3%,60-100萬提 1.5%,>100萬提 1%。
思路:預計算各段檻值獎金,用 `if-else` 定位區間,基礎獎金 + 超額部分×比率。注意用 `long` 防溢出。
關鍵代碼:
bonus1 = 100000 * 0.1;
bonus2 = bonus1 + 100000 * 0.075;
...
if (i <= 100000) bonus = i * 0.1;
else if (i <= 200000) bonus = bonus1 + (i-100000)*0.075;
...
題目:一整數加 100 後是完全平方數,再加 168(共 268)也是完全平方數,求該數。
思路:暴力枚舉 1~100000,判斷 `sqrt(x+100)` 和 `sqrt(x+268)` 是否為整數(平方後等於原數)。
數學洞察:設 x+100=a², x+268=b² → b²-a²=168 → (b-a)(b+a)=168,可轉化為因子分解問題,更高效。
題目:輸入年月日,輸出是當年的第幾天。
思路:`switch` 累加前幾月天數,加上日數。閏年判斷:`(year%400==0) || (year%4==0 && year%100!=0)`,若閏年且月份>2 則總天數+1。
代碼結構:
switch(month) { case 1: sum=0; break; case 2: sum=31; break; ... }
sum += day;
if (leap && month > 2) sum++;
題目:輸入 x,y,z,按小到大輸出。
思路:兩兩交換法:先使 x 為最小(與 y、z 比較交換),再使 y ≤ z。共 3 次比較交換。
代碼:
if (x>y) swap(x,y);
if (x>z) swap(x,z);
if (y>z) swap(y,z);
題目:用 `*` 輸出字母 C。
思路:紙上畫好逐行 `printf`。
輸出:
****
*
*
****
題目:用 ASCII 176、219 輸出對稱圖案。
思路:字符陣列直接輸出,展示擴展字符視覺效果。
代碼:
char a=176, b=219;
printf("%c%c%c%c%c\n", b,a,a,a,b);
printf("%c%c%c%c%c\n", a,b,a,b,a);
...
題目:輸出 9×9 乘法口訣表。
思路:雙層循環 `i=1..9, j=1..9`,`%-3d` 左對齊寬度 3 保證對齊。
輸出片段:
1*1=1 1*2=2 1*3=3 ...
2*1=2 2*2=4 2*3=6 ...
題目:輸出 8×8 棋盤(黑白相間)。
思路:`(i+j)%2==0` 打印雙字符塊(219,219),否則打印空格。
代碼:
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if((i+j)%2==0) printf("%c%c",219,219); else printf(" ");
printf("\n");
題目:打印樓梯,頂部兩個笑臉(ASCII 1)。
思路:外層控制行數,內層打印與行號相等數量的方塊字符。
輸出:
☻☻
██
████
██████
...
這 10 例橫跨循環控制、條件分支、數學建模、日期邏輯、排序思想、字符圖形輸出等 C 語言核心基礎。熟練掌握它們,意味著你已具備了解決實際問題的基本編程思維與語法工具。建議繼續挑戰後續 40 例,逐步進階至指針、數組、字符串、結構體、文件操作等進階主題。