首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言函數練習:字元統計、圓面積、十數求和三題完整解答

     編輯:C 語言問答

C 語言函數設計練習:三題經典習題完整解析

題目要求撰寫三個函數並呼叫測試:

  1. 統計鍵盤輸入字元個數,以 # 結束
  2. 2. 計算圓面積 3. 計算十個整數的和

題目 1:字元計數器

#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 中完成讀取與比較。

題目 2:圓面積計算

#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 定義常數,輸入驗證確保半徑非負。

題目 3:十數求和

#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,除非記憶體極度受限。
  • 嘗試用遞迴重寫題目 1 與 3,體會迴圈與遞迴的等價性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved