第50回
プログラミング・クイズで腕試し~簡易積算プログラムを作ろう

getnum関数を作る

演算する数値を入力するgetnum関数を作ってみましょう。

関数の仕様

先に紹介したgetnum関数の仕様を、もう一度確認しておきましょう。

機能 :
long型の数値を受け取る。許容範囲以内の数値または[Enter]のみが入力されるまで入力を受け付ける。
戻り値 :
入力された数値を返す。
[Enter]のみの場合は、記号常数“L_ERR”を返す。
“L_ERR”はlong int型の-1とする。
宣言 :
long getnum(void);
入力される値を無制限に受け付けることはできません。数値はlong型(signed long int型)で返しますが、その範囲で実用的な最小値~最大値の範囲を決めておきましょう。

ここでは、-15000~+15000までとしておきます。この値には特に意味がないので、もっと範囲を広げても構いません。但し、ここで受け取った値を元に四則演算が延々と行われる可能性があるため、数値の範囲をあまり大きく広げると、最終的な演算結果がlong型の範囲をはみ出してしまう場合があります。

記号定数の定義

この関数では、先に掲げた記号定数の他に以下のような記号定数を定義します。
#define  BUFSIZE  128+1  -------- 入力用文字列バッファのバイト数
#define  DATMAX   15000L -------- 入力できる値の最大値
#define  DATMIN  -15000L -------- 入力できる値の最小値

具体的な機能とヒント

この関数は、単純に演算のための数値を受け取るだけです。当然、複数桁の数値に備えなければならないので、getch関数は使えません。

そこで、まず数値を文字列として受け取り、関数内でそれをlong型の整数に変換して、呼び出し元に返すようにします。数値入力の最後には、当然[Enter]キーが必要になります。

それ以外は、先に作ったgetexp関数とほぼ同じループ構造となります。異なるのは以下の2点です。

  1. 何も入力されずに[Enter]だけが押されたら記号定数“L_ERR”を返す。
  2. 入力された数値が最小値~最大値の範囲外ならメッセージを表示して再入力する。

  • ヒント
    この処理は、以下のようなループとなります。

    (1) 文字列入力を受け付ける。
    (2) 入力された文字列の長さを調べる
       サイズが0([Enter]のみの入力)なら
          → “L_ERR”を返して終了
    (3) 入力された文字列を整数値に変換する。
    (4) 数値が最小値~最大値の範囲に収まっているか調べる。
       範囲内なら
          → 数値を返して終了
       範囲外なら
          → メッセージを表示して(1)に戻る

---------------------------------------------------------------------

●問題:getnum関数を作る

では、getnum関数のソースを考えてみましょう。

------------------------ thinking time --------------------------------

●解答

リスト3のようなソースが考えられます。

リスト3:数値を受け取るgetnum関数のソース
long  getnum(void)
{
  char    buf[BUFSIZE];
  long    num;

  while(1) {
    printf("数 値([Enter]で演算子変更) : ");
    gets(buf);    /* 文字列として入力 */
    /* [Enter]のみの場合 */
    if (strlen(buf) == 0)
      return (L_ERR);
    /* 数値に変換 */
    num = atol(buf);
      if ((num < DATMIN) || (num > DATMAX))
        printf("%ld ~ %ld の範囲で入力してください.¥n",
                DATMIN, DATMAX);
      else
        return (num);
  }
}