C語言初學者通過編寫小程序鞏固語法與邏輯思維。本文精選五個經典練習:九九乘法表、水仙花數、銀行密碼系統、平方數求解、平均值計算,逐步講解實現思路與代碼細節。
#include <stdio.h>
int main(void) {
int a[9], c[9];
int x, y;
// 初始化數組
for (x = 1; x <= 9; x++) a[x] = x;
for (y = 1; y <= 9; y++) c[y] = y;
// 雙重循環輸出
for (x = 1; x <= 9; x++) {
for (y = 1; y <= x; y++) {
printf("%d * %d = %d\t", a[x], c[y], a[x] * c[y]);
}
printf("\n");
}
return 0;
}
要點:數組下標從1開始為了直觀對應乘數,實際開發通常從0開始。內層循環y <= x實現三角形輸出。
#include <stdio.h>
int main(void) {
int a, b, c, sum;
for (a = 1; a <= 9; a++) { // 百位 1-9
for (b = 0; b <= 9; b++) { // 十位 0-9
for (c = 0; c <= 9; c++) { // 個位 0-9
sum = a*100 + b*10 + c;
if (sum == a*a*a + b*b*b + c*c*c) {
printf("%d\n", sum);
}
}
}
}
return 0;
}
輸出:153, 370, 371, 407。優化思路:預計算0-9的立方存入數組,避免重複乘法運算。
#include <stdio.h>
int main(void) {
long password; // 注意:密碼可能超過int範圍,用long
int count = 0;
const long CORRECT = 123456;
printf("密碼最多輸入三次,超過將鎖定!\n");
do {
if (count < 3) {
printf("請輸入密碼: ");
scanf("%ld", &password);
if (password == CORRECT) break;
printf("密碼錯誤,請重試\n");
} else {
printf("密碼錯誤三次,卡已鎖定!\n");
break;
}
count++;
} while (1);
if (password == CORRECT) {
printf("歡迎進入銀行系統!\n");
}
return 0;
}
改進點:原代碼邏輯有缺陷(while(123456!=password)與內部count判斷衝突),重寫為清晰的狀態機邏輯。實際系統應對密碼加密存儲、防暴力破解。
題目:一個數加100是完全平方數,再加168(即加268)也是完全平方數,求該數。
#include <stdio.h>
#include <math.h>
int main(void) {
long i, x, y;
for (i = 1; i < 100000; i++) {
x = sqrt(i + 100);
y = sqrt(i + 268);
if (x*x == i + 100 && y*y == i + 268) {
printf("%ld\n", i);
}
}
return 0;
}
數學優化:設i+100 = m², i+268 = n² → n² - m² = 168 → (n-m)(n+m) = 168。枚舉168的因子對可O(√168)求解,比暴力O(N)快得多。
#include <stdio.h>
int main(void) {
int count = 0, sum = 0, input;
printf("輸入整數(負數結束):\n");
while (1) {
printf("第%d個數: ", count + 1);
if (scanf("%d", &input) != 1) break; // 輸入失敗保護
if (input < 0) break; // 負數結束
sum += input;
count++;
}
if (count > 0) {
printf("平均值: %.2f\n", (double)sum / count);
} else {
printf("未輸入有效數據\n");
}
return 0;
}
關鍵點:(double)sum / count強制浮點除法,避免整數截斷。增加scanf返回值檢查防非數字輸入導致死循環。
| 練習 | 核心知識點 | 進階優化方向 |
|---|---|---|
| 乘法表 | 數組、嵌套循環、格式化輸出 | 動態內存分配、遞歸實現 |
| 水仙花數 | 三重循環、數字拆解、條件判斷 | 預計算查表、位運算優化 |
| 密碼系統 | do-while、計數器、分支控制 | 輸入掩碼、哈希驗證、鎖定解鎖邏輯 |
| 平方數 | 數學建模、sqrt函數、暴力搜索 | 因子分解法、數論優化 |
| 平均值 | 哨值循環、類型轉換、輸入驗證 | 動態數組存儲、統計方差/中位數 |
這五個練習涵蓋了C語言基礎語法的核心:變量、循環、條件、數組、函數、輸入輸出。建議初學者手敲代碼、單步調試、嘗試修改邏輯觀察結果,構建扎實的編程直覺。