学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

C++プログラミング入門その8 標準入力cinを使用したプログラム1

<<前  [TOP]  次>>


Visual Studioで新規プロジェクトを作り、次のcppファイルを作成して下さい。


CinTest1.cpp 直

#include <iostream>

void main() {

	int a;
	std::cout << "整数を入力してください。 a = ";

	for ( ;!(std::cin >> a); ) {

		std::cout << "入力が間違っています" << std::endl << " a = ";

	}

	std::cout << " a = " << a << std::endl;

}



標準入力で、整数を入力して格納、表示するプログラムです。
整数を入力すると表示され、間違っていると無限に間違っていますと表示されます。


標準入力 cin とは、標準出力 cout とは反対で、プログラムに対してキーボードから入力することができます。

std::cin >> 変数名;



標準出力 coutと、リダイレクト(>)の向きが反対になっているところに注意してください。


この std::cin >> が読み込まれると、コマンドプロンプト上で、入力待ち状態になります。
キーボードから入力して、エンターキーを押すと再びそれ以降の処理が始まります。
キーボードから入力されたものは、変数名へと格納されます。


今回の変数は、int型で宣言されているため、整数以外の入力があった場合はfalse(偽)になります。
ちなみにfalse(偽)の反対は、true(真)です。


条件に当てはまると言うことは、tureということで、条件に当てはまらないということがfalseと言うことです。


for文をこのtrueとfalseで表すと、「繰り返し条件がtrueのときはループが続き、falseとなったときループから抜けます。」という感じになります。


このプログラムでは、for文の繰り返し条件が !(std::cin >> a) になっていて、「!」が前についているのが解ります。
C++では、「!」をつけると、true(真)とfalse(偽)がひっくり返ります。
なので、このfor文は「繰り返し条件がfalseのときはループが続き、trueとなったときループから抜けます。」となります。


では、プログラムの内容を順番に見ていきましょう。

  • まず、「整数を入力してください。 a = 」と画面に表示されます。
  • for文の繰り返し条件の std::cin >> a が実行され入力待ちになります。
  • 入力されたものが整数以外のものであったら、falseとなり、繰り返し条件  !(std::cin >> a) にあてはまり、ループに入ります。
  • もし整数が入力されていたらtrueとなり、for文の処理は何も実行されることなく終了します。
  • 入力が間違っていた場合は、「入力が間違っています。a = 」と無限に表示されます。
  • 間違った入力をすると無限に「入力が間違っています。a = 」と表示され続けるため、このプログラムを強制終了する必要があります。
  • 強制終了するには、「Ctrl+C」を押してください。
  • 整数が入力されたらfor文を抜け、「 a = 入力した整数 」と画面に表示されます。


    サンプルプログラムをビルドしてデバッグしてみましょう。
    「整数を入力してください。 a = 」と画面に表示され入力待ちになります。
    整数を入力すると、「a = 入力した整数」が表示されます。
    もし、間違った入力をした場合、無限に「入力が間違っています。a = 」と表示されます。
    これを強制終了するには「Ctrl+C」を押してください。プログラムが終了します。








    Visual Studioで新規プロジェクトを作り、次のcppファイルを作成して下さい。


    CinTest2.cpp 直

    #include <iostream>
    
    void main() {
    
    	int a, b, p, q;
    
    	std::cout << " a/b の a を整数で入力してください a = ";
    
    	for (std::cin >> a ; !std::cin ; std::cin >> a){
    		
    		std::cin.clear();
    		std::cin.ignore();
    		std::cout << "入力が間違ってます。" << std::endl << " a = ";
    	}
    
    	std::cout << " a/b  の b を整数で入力してください。 b = ";
    
            for (std::cin >> b ; !std::cin ; std::cin >> b){
    
    			std::cin.clear();
    			std::cin.ignore();
    			std::cout << "入力が間違ってます。" << std::endl << " b = ";
            }
    
    	p = a / b;
    	q = a - p * b;
    
    	if ( q == 0 ) {
    
    		std::cout << "割り切れました。" << std::endl;
    		std::cout << a << "/" << b << "=" << p << std::endl;
    	}
    
    	else {
    		
    		std::cout << a << "/" << b << "=" << p << std::endl;
    		std::cout << "余りは" << q << "です。 " << std::endl;
    	}
    }
    



    商と余りを表示するプログラムです。


    CinTest1.cpp 直では入力が間違った場合、無限にループしてしまいました。
    これを改善したのがこのプログラムです。


    まず、間違った入力があったときの内容を詳しく見ていきましょう。


    例えば、入力が「ab0」であったとします。
    この入力はいったん貯蔵庫に納められます。この貯蔵庫をバッファといいます。
    そして、 std::cin >> はその貯蔵庫に文字を取りに行くのだと思えばよいです。
    一回の std::cin >> で最初の一文字 ”a” だけを整数に変換しようとします。
    しかし、この処理は失敗し、”a”を貯蔵庫に返却します。
    そのために、CinTest1.cpp 直では、何度 std::cin>> を繰り返しても同じことの繰り返しになってしまい、無限ループになってしまいました。


    従って、プログラムではこの入力を捨てることが必要になってきます。


    また同時に、このエラーの状態がcin変数自体に記憶されていますので、このエラーという記憶も元に戻さないといけません。


    エラーの記憶をcin変数から消去する処理がstd::cin.clear()で、バッファに入っているものを消去する処理がstd::cin.ignore()になります。


    ところが、これでもまだ問題があります。
    std::cin.ignore()はデフォルト(規定値)では1つずつしか消去しないという性質なので、もし間違っていたものが1文字だけならうまく動作しますが、間違って入力したものが複数の文字列なら問題が生じてしまいます。
    つまり、入力された文字の数の分だけループがまわってしまうのです。


    この問題を解消するには、std::cin.ignore()に全部の入力を改行まで含めて消去せよと指示しなければならないのですが、この問題は後々説明することにします。


    ではプログラムの内容を順番に見ていきましょう。

  • 「a/b の a を整数で入力してください a =」と画面に表示されます。
  • for文の初期条件 std::cin >> a がまず最初に読み込まれ、入力待ちになります。
  • 入力をしてエンターを押すと、繰り返し条件  !std::cin が読み込まれ、入力が間違っていたらループに入ります。
  • std::cin.clear() と std::cin.ignore()で入力消去、エラー消去が行われます。
  • 「入力が間違ってます。a=」と表示され、繰り返し実行文 std::cin >> a が読み込まれ再び入力待ちになり、正しい入力があるまで繰り返されます。
  • 整数を入力したら変数 a に整数が格納され、もう一つのfor文の初期条件 std::cin >> b が読み込まれます。
  • もし、割り切れていれば、「割り切れました。」と表示され、答えも表示されます。
  • 余りがある場合は、商と余りを表示します。


    サンプルプログラムをビルドしてデバッグしてみましょう。
    変数 a と b をコマンドプロンプト上でキーボードから入力します。
    a / bを計算し、もし割り切れていれば、「割り切れました。」と表示され、答えも表示されます。
    余りがある場合は、商と余りを表示します。





    <<前  [TOP]  次>>