C言語-インタプリタminiCASL
前へ 目次へ 次へ 

 1. メニュープログラムは言語処理プログラムの基本 (2)

キーボード入力scanf()とgets()

 キーボードからのデータ入力に関数scanfを使用している。入力データはすべて整数であり、整数が入力されるものとしてプログラミングしている。例えば、入力データとして文字を入力すると、このプログラムは暴走する可能性がある(暴走したときはCTRL+Cで中断)。
 これは、関数scanfの引数に%dを指定しているので、入力データが10進整数でなければ入力データを無視して未知の数値を返す。入力データはバッファと呼ばれる領域に残ったままなので、次の関数scanfがその入力データを取り込もうとするが、入力データは10進整数ではないので入力データを無視して未知の数値を返す。これが繰り返されるからである。(キーボードなどから入力されたデータは、一度、バッファと呼ばれる領域に記憶される。)
 解決方法の一例として、数値も文字として入力した後、数値に変換する。

変換    scanf("%d", &data1); → gets(buff); データを文字列として入力
data1 = atoi(buff); 文字列を整数に変換

 入力データを関数getsで文字列として入力するので、入力データは必ず変数buffに格納される。変数buffは、char型配列として宣言しておく(例:char buff[80];)。
 関数atoiは文字列を整数に変換する関数である。ただし、数字以外の文字の場合は、0を返す。同じように文字列を実数に変換する関数atofもある。いずれも #include <stdlib.h> が必要である。

 次に、入力に関数getsを使い、さらに実数(double型)の計算ができるように変更する。

[mc03.c]  (プログラムリスト中の\は\と同じ)
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

30:
31:

38:
39:

46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
#include <stdio.h>
#include <stdlib.h>

void main(void)
{
    int     num;
    @           data1, data2, ans;
    A           buff[80];

    while(1){
        printf("  1.ADD\n  2.SUB\n  3.MUL\n  4.DIV\n  0.END\n");
        printf("\n Number : ");
        gets(buff);
        num = atoi(buff);
        if(num == 1){               /* 計算処理 */
            printf("Data1 : ");
            B                ;       /* 文字列入力 */
            C                ;       /* 実数値に変換 */
            printf("Data2 : ");
            D                ;       /* 文字列入力 */
            E                ;       /* 実数値に変換 */
            ans = data1 + data2;
        }else if(num == 2){
            <<赤色の部分(16〜21行)と同じ>>
            ans = data1 - data2;
        }else if(num == 3){
            <<赤色の部分(16〜21行)と同じ>>
            ans = data1 * data2;
        }else if(num == 4){
            <<赤色の部分(16〜21行)と同じ>>
            ans = data1 / data2;
        }else if(num == 0){ 
            break;
        }else{
            printf("Error : Number 0 - 4\n");
            continue;
        }
        printf("Answer = %f\n\n", ans);     /* 結果表示 */
    }
}
実行結果
  1.ADD
  2.SUB
  3.MUL
  4.DIV
  0.END

 Number : 1
Data1 : 12.34
Data2 : 11.11
Answer = 23.450000

  1.ADD
  2.SUB
  3.MUL
  4.DIV
  0.END

 Number : 0
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B
C   D   E
     



前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system