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

PAT 基礎編程題解:分支結構實現簡易計算器

     編輯:關於C語言

題目需求

讀入兩個整數與一個運算符(+、-、*、/、%),輸出運算結果。除法為整數除法,取模為整數取模。運算符非法輸出 "ERROR"。

核心邏輯:switch 分支選擇

#include <stdio.h>

int main() {
    int m, n;
    char op;
    scanf("%d %c %d", &m, &op, &n);  // 格式化讀取,自動跳過空白

    printf("m = %d\nop : %c\nn = %d\n", m, op, n);  // 題目要求回顯輸入

    switch (op) {
        case '+': printf("%d\n", m + n); break;
        case '-': printf("%d\n", m - n); break;
        case '*': printf("%d\n", m * n); break;
        case '/': printf("%d\n", m / n); break;  // 整數除法,截斷向零
        case '%': printf("%d\n", m % n); break;  // 取模,符號同被除數
        default:  printf("ERROR\n");
    }
    return 0;
}

關鍵細節與陷阱

項目說明注意事項
輸入格式%d %c %d中間空格自動跳過換行/空格,%c 讀取運算符
除法行為C99 規定向零截斷-5/2 = -2,-5%2 = -1
除零保護題目未要求實際項目必須檢查 n!=0
溢出風險int 範圍 ±21億乘法可能溢出,實際用 long long
輸出格式嚴格匹配樣例回顯輸入含換行,結果獨立行

進階優化:錯誤處理與擴展性

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

typedef enum { OK, ERR_DIV_ZERO, ERR_OVERFLOW, ERR_INVALID_OP } CalcStatus;

CalcStatus calculate(int a, int b, char op, long long *result) {
    switch (op) {
        case '+':
            if ((b > 0 && a > LLONG_MAX - b) || (b < 0 && a < LLONG_MIN - b))
                return ERR_OVERFLOW;
            *result = (long long)a + b;
            break;
        case '-':
            if ((b < 0 && a > LLONG_MAX + b) || (b > 0 && a < LLONG_MIN + b))
                return ERR_OVERFLOW;
            *result = (long long)a - b;
            break;
        case '*':
            if (a != 0 && llabs(b) > LLONG_MAX / llabs(a)) return ERR_OVERFLOW;
            *result = (long long)a * b;
            break;
        case '/':
            if (b == 0) return ERR_DIV_ZERO;
            *result = a / b;
            break;
        case '%':
            if (b == 0) return ERR_DIV_ZERO;
            *result = a % b;
            break;
        default:
            return ERR_INVALID_OP;
    }
    return OK;
}

int main() {
    int m, n; char op;
    if (scanf("%d %c %d", &m, &op, &n) != 3) return 1;

    printf("m = %d\nop : %c\nn = %d\n", m, op, n);

    long long result;
    switch (calculate(m, n, op, &result)) {
        case OK: printf("%lld\n", result); break;
        case ERR_DIV_ZERO: printf("ERROR: Division by zero\n"); break;
        case ERR_OVERFLOW: printf("ERROR: Integer overflow\n"); break;
        default: printf("ERROR\n");
    }
    return 0;
}

測試用例

輸入輸出說明
10 + 3m = 10
op : +
n = 3
13
加法
10 - 3...7
10 * 3...30
10 / 3...3 (整數除法)
10 % 3...1
10 ^ 3...ERROR
-5 / 2...-2 (C99 向零截斷)
-5 % 2...-1 (符號同被除數)

總結

本題考察 scanf 格式化輸入、switch 多分支、整數運算語義。工程化時需關注除零保護、溢出檢測、錯誤碼設計、類型擴展。掌握 long long 配合 LLONG_MAX 的溢出判斷模式,是編寫健壯數值計算代碼的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved