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

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

C++プログラミング入門その8 標準入力cinを使用したプログラム1(2020年3月更新)

<<前  [TOP]  次>>


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


【CinTest1.cpp】

#include <iostream>

int 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」を押してください。プログラムが終了します。


    CinTest1.cpp実行結果「整数値入力」
    CinTest1.cpp実行結果「整数値入力」


    CinTest1.cpp実行結果「誤入力」
    CinTest1.cpp実行結果「誤入力」


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


    【CinTest2.cpp】

    #include <iostream>
    
    int 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を計算し、もし割り切れていれば、「割り切れました。」と表示され答えも表示されます。
    余りがある場合は、商と余りを表示します。


    CinTest2.cpp実行結果
    CinTest2.cpp実行結果


    <<前  [TOP]  次>>