C言語で数値と演算子を入力して計算するプログラムを作る

515, 2022-07-08

目次

C言語で数値と演算子を入力して計算する

C言語で計算式を入力してそれをプログラムが計算してくれるというプログラム。
C言語の初心者用の課題として作ることがあると思います。

今回はこの計算式を計算するプログラムを作ってみたいと思います。

関連記事


ソースコード

実際に動くプログラムのソースコードは↓になります。

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

static void
die(const char *msg) {
    fprintf(stderr, "%s\n", msg);
    exit(1);
}

int
main(void) {
    int ans, lhs, rhs;
    char op;

    // 入力
    scanf("%d %c %d", &lhs, &op, &rhs);

    // 計算
    switch (op) {
    case '+': ans = lhs + rhs; break;
    case '-': ans = lhs - rhs; break;
    case '*': ans = lhs * rhs; break;
    case '/':
        if (rhs == 0) {
            die("zero division error");
        }
        ans = lhs / rhs;
        break;
    case '%':
        if (rhs == 0) {
            die("zero division error");
        }
        ans = lhs % rhs;
        break;
    }

    // 出力
    printf("%d %c %d = %d\n", lhs, op, rhs, ans);
    fflush(stdout);

    return 0;
}

このプログラムを実行すると↓のような結果になります。

1 + 2
1 + 2 = 3

プログラムを実行すると入力待ちになります。
そして「1 + 2」のような数式を入力してエンターキーを押します。
そうすると計算が始まり完了すると「1 + 2 = 3」という結果が出力されます。

また計算式の演算子は↓に対応しています。

  • + ... 足し算
  • - ... 引き算
  • * ... 掛け算
  • / ... 割り算
  • % ... 剰余算

ソースコードの解説

ソースコードを解説したいと思います。

プログラムの仕様

まず今回作ったプログラムの仕様は↓になります。

  • ユーザーが数式を入力する

  • 数式を入力すると自動で計算を行う

  • 計算が終わったら結果を出力する

これが大まかなプログラムの仕様です。
さらに細かい仕様を見てみましょう。

  • 数式は左オペランドと演算子、右オペランドを入力する

  • オペランドと演算子は半角スペース区切りで入力する

  • 対応する演算子は+, -, *, /, %

以上の仕様によりプログラムを作ります。

入力処理について

今回は入力処理にscanf関数を使います。
scanfはセキュアなプログラムを書くのが難しい関数ですが今回はセキュリティについては無視します。

入力処理は↓になります。

    int ans, lhs, rhs;
    char op;

    // 入力
    scanf("%d %c %d", &lhs, &op, &rhs);

scanf関数は標準入力から指定フォーマットの値を読み込み、それを変数に保存する関数です。

int scanf(書式, 保存先の変数...);

↑のコードで指定している書式は「"%d %c %d"」になります。
%dは整数を読み込むための書式指定子です。
%cは文字を読み込むための書式指定子です。

先頭から1つ目の書式指定子%dlhsに読み込んだデータを保存します。
先頭から2つ目の書式指定子%copに読み込んだデータを保存します。
先頭から3つ目の書式指定子%drhsに読み込んだデータを保存します。

計算処理について

次に計算処理を見てみます。

    // 計算
    switch (op) {
    case '+': ans = lhs + rhs; break;
    case '-': ans = lhs - rhs; break;
    case '*': ans = lhs * rhs; break;
    case '/':
        if (rhs == 0) {
            die("zero division error");
        }
        ans = lhs / rhs;
        break;
    case '%':
        if (rhs == 0) {
            die("zero division error");
        }
        ans = lhs % rhs;
        break;
    }

計算処理では演算子(オペレーター, op)の値によって分岐して処理を行います。
switch文でopの中身を見て演算子に対応した処理をそれぞれ実行します。

たとえばopが+だと

    case '+': ans = lhs + rhs; break;

という処理が実行されます。
opが-だと

    case '-': ans = lhs - rhs; break;

という処理が実行されます。

未対応の演算子については処理は未定義になっています。
どういった動作をさせるのか定義していません。
非対応の演算子だったらエラーを出力するという改造方針もありえます。

またopが/%でかつrhsが0だった場合は0除算エラーを発生させています。

        if (rhs == 0) {
            die("zero division error");
        }

die関数は標準エラー出力にエラーメッセージを出力してexit関数でプログラムを終了します。

static void
die(const char *msg) {
    fprintf(stderr, "%s\n", msg);
    exit(1);
}

出力処理について

計算結果を出力する処理についてですがコードは↓のようになっています。

    // 出力
    printf("%d %c %d = %d\n", lhs, op, rhs, ans);
    fflush(stdout);

出力ではlhs, op, rhs, ansを出力します。
lhsには左オペランド、opには演算子、rhsには右オペランド、ansには計算結果が入っています。

printf関数は標準出力へ指定のフォーマットで出力を行います。
このときstdoutというグローバルオブジェクトに対して出力を行います。

fflush(stdout)はstdoutに溜まっている出力を強制的に画面に反映させる処理です。
標準出力の出力は画面に反映(フラッシュ)されない場合もあるので念のためこの処理を入れています。

おわりに

今回はC言語で数値と演算子を入力して計算するプログラムを作りました。
この記事のコードのライセンスはMITです。
何か参考になれば幸いです。

(^ _ ^)

プログラムに計算処理をさせよう

(・ v ・)

プログラムは今日も働いている



この記事のアンケートを送信する