題目要求撰寫三個函數並呼叫測試:
# 結束#include <stdio.h>
long countChars(void); // 函數宣告
int main() {
long n = countChars();
printf("字元總數 (不含結束符 #): %ld\n", n);
return 0;
}
long countChars(void) {
long cnt = 0;
int ch;
while ((ch = getchar()) != '#') {
cnt++;
}
return cnt;
}
關鍵點:使用 getchar() 逐字讀取,回傳 int 可正確判斷 EOF,迴圈條件直接在 while 中完成讀取與比較。
#include <stdio.h>
#define PI 3.14159265358979323846 // 使用更精確的常數
double circleArea(double r) {
return PI * r * r;
}
int main() {
double radius;
printf("請輸入圓半徑: ");
if (scanf("%lf", &radius) == 1 && radius >= 0) {
printf("圓面積: %.4f\n", circleArea(radius));
} else {
printf("輸入無效,請輸入非負數字。\n");
}
return 0;
}
改進:使用 double 提升精度,#define 定義常數,輸入驗證確保半徑非負。
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int sum = 0, x;
printf("請輸入 10 個整數:\n");
for (int i = 0; i < 10; i++) {
printf("第 %d 個: ", i + 1);
while (scanf("%d", &x) != 1) { // 輸入驗證
printf("請輸入整數: ");
while (getchar() != '\n'); // 清空緩衝區
}
sum = add(sum, x);
}
printf("總和: %d\n", sum);
return 0;
}
設計重點:add 函數單一職責 (兩數相加),主程式負責迴圈與輸入控制,符合模組化原則。
#include <stdio.h>
#define PI 3.14159265358979323846
long countChars(void);
double circleArea(double r);
int add(int a, int b);
int main() {
int choice;
while (1) {
printf("\n=== 選單 ===\n");
printf("1. 字元計數 (以 # 結束)\n");
printf("2. 圓面積計算\n");
printf("3. 十數求和\n");
printf("0. 離開\n");
printf("選擇: ");
if (scanf("%d", &choice) != 1) break;
while (getchar() != '\n'); // 清除換行
switch (choice) {
case 1: printf("結果: %ld\n", countChars()); break;
case 2: {
double r; printf("半徑: ");
if (scanf("%lf", &r) == 1) printf("面積: %.4f\n", circleArea(r));
while (getchar() != '\n'); break;
}
case 3: {
int s = 0, v;
for (int i = 0; i < 10; i++) {
printf("數字 %d: ", i+1);
while (scanf("%d", &v) != 1) { while(getchar()!='\n'); printf("重輸: "); }
s = add(s, v);
}
printf("總和: %d\n", s);
break;
}
case 0: return 0;
default: printf("無效選項\n");
}
}
return 0;
}
main 只負責流程控制。scanf 留下的換行符干擾後續讀取。double 取代 float,除非記憶體極度受限。