Thinkers'Studio
JavaとC言語の自習ツール
電卓プログラムの考え方、書き方例

 2つの数値の加減乗除をする電卓のようなプログラムを作ります。
 簡単なようですが、多くの話題(データ型の選択、入力、判断や繰り返しなど)を含んでおり、学習に役立つ例題です。
 今回は、プログラムをつくる流れも分かるように、どんなプログラムにするか検討するところから始めます。 それを処理手順に書き、C言語のコードに直します。

プログラムの機能を考える

 まずは、どんなプログラムにするかを考え、前提とすることや制約についても検討します。
  1. 数や演算の指定はどうする?
     たとえば「2 + 5」のように、「数値1 演算記号 数値2」の順に入力すると計算結果が表示されるようにする。
     演算記号は、+, -, *, / のみとする。
  2. 繰り返して計算できるようにする
     繰り返しの終了は、指定が上記の書式でなかったときとしよう。
  3. 他に考えておくことは?
     (1) 浮動小数点数でも計算できるようにする
     (2) 加減乗除以外の演算記号が指定されたらどうする?
     (3) 割り算で、ゼロ割しようとしたときはどうする?
     (4) 電源ON の代わりに指定の書式を示すメッセージを表示しよう。電源OFF のメッセージも表示しよう
    (2) と (3) のケースは、エラー・メッセージを表示して、指定し直せるようにしよう。

処理手順として書く

 上の検討結果を踏まえて、処理内容を具体的かつ端的に書きます。 判断や繰り返し、データの入出力も分かるようにします。
 下記では、チャートを使わずに書きます。

電卓プログラムの処理手順 】
 指定の書式を示すメッセージを表示する
 <繰り返し>
  |  「数値1 演算記号 数値2」の指定を受け取る --> 変数 a, op, b へ
  |    指定の書式でなかったとき) 繰り返しを抜ける
  |  演算記号 op に応じた計算をする --> ans へ結果を入れる
  |    + のとき) a + b を求める
  |    - のとき) a - b を求める
  |    * のとき) a * b を求める
  |    / のとき) b がゼロでないかチェックする
  |          ゼロのとき) エラー・メッセージを表示して繰り返しの先頭に戻る
  |          a / b を求める
  |    それ以外) エラー・メッセージを表示して繰り返しの先頭に戻る
  -  答え ans を表示する
 電源OFF のメッセージを表示する

プログラムコードに直す

 上記の手順を素直にC言語で書きます。

電卓プログラムの書き方例 】
#include <stdio.h>
main()
{
    double  a, b, ans;
    char    op;

    printf( "加減乗除(+,-,*,/)ができます。指定例:2+5、終了時はq\n" );
    while( 1 ) {
        printf( "ready : " );
        if( scanf( "%lf %c %lf", &a, &op, &b ) != 3 ) break;
        switch( op ) {
        case '+': ans = a + b; break;
        case '-': ans = a - b; break;
        case '*': ans = a * b; break;
        case '/': if( b == 0.0 ) {
                     printf( "Error!(ゼロでの割算はできません)\n" );
                     continue;
                  }
                  ans = a / b; break;
        default:  printf( "Error!(演算記号の指定が誤りです)\n" );
                  continue;
        }
        printf( "--> %g\n", ans );
    }
    printf( ".... Power OFF\n" );
}

データ型は

 浮動小数点数も計算できるように、a, b, ans は float か double、ここでは double とします。演算記号は char型です。 浮動小数点数の表示には %f がよく使われますが、整数でも小数部があっても自動的に桁数を調整してくれる %g としました。

繰り返し処理について

 繰り返しは while( 1 ) の無限ループとし、scanf の戻り値が 3 でないとき、break で抜けます。 入力待ちと分かるように、先頭で readyメッセージを表示します。 指定のエラーで繰り返しの先頭からやり直すときは、continue を使います。

キーボードからの入力

 前回Tips の scanf を使います。 ここでは、scanf の読み残しには対応しません(scanf は空白類が来ると入力を終了し、その後ろに指定があってもそれらを読み残します。対応を入れるなら、読み残しを改行の手前まで読み飛ばすなどが考えられます)。

計算処理の分岐には何を使う?

 判断の構文には if〜else と switch がありますが、分岐が多数で op は整数として判定できることから、switch を使います。

実行例
加減乗除(+,-,*,/)ができます。指定例:2+5、終了時はq
ready : 6.5 * 3
--> 19.5
ready : 7 % 4
Error!(演算記号の指定が誤りです)
ready : 123 / 2
--> 61.5
ready : 7 + 16
--> 23
ready : q
.... Power OFF

  (今回のクイズはありません)

[ 関連記事 ] scanf の使い方, break と continue, switch の default

前回のクイズの答え: (前回の問題を見る
(1) scanf( "%s", msg ) または最大入力文字数を指定して scanf( "%23s", msg )
(2) scanf( "%c", &moji )
(3) scanf( "%d/%d/%d", &yy, &mm, &dd )
 (1) で文字配列 msg を渡すときは、& は不要です。配列名を書くと、その先頭のアドレスが渡るためです。