ロゴ ロゴ

プログラム日記~計算機~

こんにちは、『じゃた。』です。最近プログラムを書く機会が全くないので、書き方を忘れないために簡単な計算機のプログラム(C)を作りました。さらにしっかり復習するため、このプログラムの解説をしていきます!では、今回もよろしくお願いします!!

作製した計算機のプログラム

まずはプログラムをどーんとのっけちゃいます!!今回準備したヘッダーファイル(calculator.h)はこれ。

#include<stdio.h>
#include<string.h>

int input = 0; //input = 0で数字入力, 1で演算子入力, -1で終了
//数字, 演算子記録用配列
int num[10];
char sign[10];

//関数宣言
int DrawFormula();

続いて、ソースコードがこれ。

#include "calculator.h" //ヘッダーファイルに書いたものを読み込む

int main(void) {
    printf("[操作説明]\n入力はすべて半角で行ってください.\n終了時は「exit」を入力してください.\n\n");

    //一度目(数字入力)
    scanf_s("%d", &num[0]);
    input = 1;

    while (input != -1) {
        //数字入力時
        if (input == 0) {
            scanf_s("%d", &num[1]);
            printf("\n現在の数値:%d\n", DrawFormula()); //現在の計算結果を表示
        }
        //演算子入力時
        else if (input == 1) {
            scanf_s("%s", sign, 10);
            //終了処理
            if (strcmp("exit", sign) == 0) {
                input = -1;
            }
        }
        //入力用変数操作
        if (input == 0) {
            input = 1;
        }
        else if (input == 1) {
            input = 0;
        }
    }
    return 0;
}

int DrawFormula() {
    int ans = 0;
    if (strcmp("+", sign) == 0) {
        ans = num[0] + num[1];
        num[0] = ans;
    }
    else if (strcmp("-", sign) == 0) {
        ans = num[0] - num[1];
        num[0] = ans;
    }
    else if (strcmp("*", sign) == 0) {
        ans = num[0] * num[1];
        num[0] = ans;
    }
    else if (strcmp("/", sign) == 0) {
        // 0で割った時の処理
        if (num[1] == 0) {
            printf("計算式に間違いがあります.\n");
            //一時停止用
            getchar();
            getchar();
            input = -1;
        }
        else {
            ans = num[0] / num[1];
            num[0] = ans;
        }
    }
    return ans;
}

実際の実行結果は以下のようになります。

大復習大会!!

ソースコードの基本の形

基本の基本から復習していきましょう!初めの一歩はソースコードの基本中の基本、インクルードとメイン関数から!まずは以下のソースコードを見てください。

#include<stdio.h>
int main(void) {
    //ここに実行するものを書く
    retuen 0;
}

1行目の「#include」は、コンパイル(ソースコードを機械語に書き換える)前に「stdio.h」というファイルを読み込むという処理です。簡単にしか言いませんが、この「stdio.h」とはパソコンがプログラムを実行するための辞典みたいなものです。めちゃくちゃわかりやすい表現ですよね!!(先輩から受け継ぎし比喩です。)
2行目から5行目がメイン関数で、3, 4行目がメイン関数の中身ですね。メイン関数とは、命令を受けて実行する部分のことです。ちゃんと説明したらまだまだ話さなくてはいけないところもありますが、長くなってしまうので次へいきます!

画面に表示(printf)

printf文は、画面に文章を表示する処理です。

printf("ここに文章を記入\n");

最後につけるセミコロンを忘れないようにしましょう。ちなみに、「\n」は改行です。「バックスラッシュ+n」なのですが、バックスラッシュが¥マークで表示されることが多々あります。改行したくないなら書かなくても大丈夫ですが、常に書く癖をつけておくことをおすすめします。

繰り返し処理(while)

while文は、ループ処理、繰り返しの処理を行います。間違えて無限ループを作ってしまうのが怖いですよね・・・。

while (条件) {
    //処理文
}

(条件)の部分に、繰り返すための条件を書きます。今回のプログラムでは(input != -1)となっているので、「変数inputが-1以外の時に繰り返す」となっています。ここで、演算子についても復習しておきましょう。

  • == → イコール
  • != → ノットイコール
  • >, < → 大なり, 小なり
  • >=, <= → 以上, 以下

条件分岐(if)

if文は、条件分岐の処理です。「もし~だったら」というやつですね。ちなみにelse ifは「じゃなくてもし~だったら」、elseは「全部違ったら」です。

if (条件) {
    //処理文
}
else if (条件) {
    //処理文
}
else {
    //処理文
}

条件を書くときに「または」や「かつ」等のものもあるんですが、今回は使用していないので省きます!

入力(scanf_s)

いわゆるscanfが、DXライブラリではscanf_sになります。文字入力の時だけ、書き方がちょっと違うんですよね・・・。

//数字(整数)入力時(tempに代入とする)
scanf_s("%d", &temp);

//文字列入力時(str[10]に代入とする)
scanf_s("%s", str, 10);

数字入力時は”&”が必要ですが、文字列入力の時は必要ないってやつですね。

文字列の比較(strcmp)

二つの文字列を比較して、同じであれば0を、違うものであれば1を返してくれる関数です。ちなみにこれは、「string.h」ファイルにあるものです。「str(比較するもの1, 比較するもの2)」という風に使用します。

関数

関数については以下の図を見てみてください。

入力と出力の部分は、入力するもの、出力するものの”型”ですね。整数であればint型、文字型であればchar型、小数であればfloat型、double型とかですね。この関数を呼び出して実行すると、最終的に「変数ans」の値をint型で返してくれるわけです。

今回のプログラムの動作

どういった動きをするプログラムを書いたのか、簡単に説明していきます。
まず現在入力するものが何であるかを把握するための変数をinputとし、inputが0の時を数字入力時、1の時を演算子入力時、-1を終了時としておきます。数字と演算子は交互に入力を行うので、一度の入力ごとにinputの値が0であれば1に、1であれば0にすることで計算式を入力します。100均とかで売っている電卓では数字入力時に勝手に計算結果が表示されるので、そうなるように数字入力後に現在の計算結果を計算、表示する関数を呼び出します(DrawFormula)。ですが一発目の数字入力後にいきなり計算結果が表示されてしまってはおかしいので、一回目だけはwhile文の外に出しておきました。あとは演算子入力用の文字列入力処理の下に終了処理を入れて完成です。
ですが今回この終了処理、文字入力時に”exit”と打ち込んでもちゃんと動くのか・・・??結果から言ってしまうと、数字入力時でもちゃんと終了します。変換仕様として”%d”を用いたscanf_s(scanf)に対して文字を打ち込んだ場合、入力が受け付けられずに0や1が入力されます。そして入力が受け付けられなかった文字が変換仕様として”%s”を用いた次のscanf_sで入力され、終了処理へ到達します。私もこの仕組みが最初はわからず、どうしてなのかとぐるぐる悩んでいました。結局一人では解決できず、協力をしていただいて理解ができました。ふとした瞬間に「あれ?」ってなることって、意外と多いですよね・・・。勉強不足です💦
DrawFormulaの中身は、入力された演算子を文字列比較で判別して、二つの数字を計算するようにしています。num[0]が一つ目の数字、num[1]が二つ目の数字で、計算結果をansに代入した後さらにansの数値をnum[0]に代入します。次の計算式では前回のansが一つ目の数字になるからですね。ちなみに0で割った時は終了するようになってます。

おわりに

一体どこに需要があるのか全く分からないものを書いてしまいましたが、誰かのお役に立てたらいいなあと思います。
では、またの機会に!See You Next Time!
special thanks : みかんさん

コメント入力

関連サイト