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

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

C++ | 07 | 標準入力cin

↓↓クリックして頂けると励みになります。



06 | for】 << 【ホーム】 >> 【08 | 論理演算

標準入力cinを使用したプログラム
標準入力cinを使用したプログラム



C++の標準入力 cin は、キーボードや他の入力装置からのデータをプログラムに読み込むための標準入力ストリームです。
cin は、C++の標準ライブラリである ヘッダーファイルに定義されています。

cin を使用すると、ユーザーによるキーボード入力をプログラム内の変数に割り当てることができます。
通常、cin は >> 演算子と組み合わせて使用されます。


Visual Studio Codeで以下の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 = 」と表示され続けるため、このプログラムを強制終了する必要があります。
  • 強制終了するには、「Ctr+C」を押してください。
  • 整数が入力されたらfor文を抜け「 a = 入力した整数」と画面に表示されます。


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

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile && "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile
    整数を入力してください。 a =  2
     a = 2
    



    Visual Studio Codeで以下の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を計算し、もし割り切れていれば、「割り切れました。」と表示され答えも表示されます。
    余りがある場合は、商と余りを表示します。

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile 
    && "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile
    
     a/b の a を整数で入力してください a = 5
     a/b  の b を整数で入力してください。 b = 3
    5/3=1
    余りは2です。
     
    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile && "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile
    
     a/b の a を整数で入力してください a = 4
     a/b  の b を整数で入力してください。 b = 2
    割り切れました。
    4/2=2
    
    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile && "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile
    
     a/b の a を整数で入力してください a = あ
    入力が間違ってます。
     a = 入力が間違ってます。
     a = 入力が間違ってます。
     a = ^C
    



    Visual Studio Codeで以下のcppファイルを作成して下さい。


    新規作成 【CinTest3.cpp】

    #include <iostream>
    
    int main() {
    
    	std::cout << "問題 " << "C(C++)言語では、真であるというのは次のうちどの数で表されるか?" << std::endl;
    	std::cout << "次の4つの中から正解と思われるものを選び、その番号を入力せよ。" << std::endl;
    
    	std::cout << "(1) 2 " << std::endl;
    	std::cout << "(2) 0 " << std::endl;
    	std::cout << "(3) 1 " << std::endl;
    	std::cout << "(4) -1 " << std::endl;
    
    	int a;
    
    	std::cout << std::endl;
    	std::cout << "答えを整数で入力してください--->  ";
    
    	for (std::cin >> a ; !std::cin ; std::cin >> a){
    		std::cin.clear();
    		std::cin.ignore();
    		std::cout << "入力が間違ってます" << std::endl << "答えを整数で入力してください--->  ";
    
    	}
    
    	for ( ; a!=3 ; ) {
    		std::cout << "答えが間違っています。" << std::endl;
    		std::cout << "もう一度、答えを整数で入力してください--->  ";
    		std::cin >> a;
    	}
    	
    	if ( a == 3 ) {
    		std::cout << "正解です" << std::endl;
    	}
    }
    



    選択が4つ以上あるクイズを考え、答えの番号を入力させるプログラムです。
    正しければ正解であることを表示して終了し、間違っていれば誤答であることを表示して正解が入力されるまで終了しません。

    【問題】 
    C(C++)言語では、真であるというのは次のうちどの数で表されるか?次の4つの中から正解と思われるものを 選び、その番号を入力せよ。
    
     (1)2
     (2)0
     (3)1
     (4)−1
    



    論理演算で真(true)であるというのは、数字で表すと1になります。
    逆に偽(false)であるということは0になります。


    サンプルプログラムを実行してみましょう。
    選択が4つ以上あるクイズを考え、答えの番号を入力させるプログラムです。
    正しければ正解であることを表示して終了し、間違っていれば誤答であることを表示して正解が入力されるまで 終了しません。

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile && "/Users/**/Desktop/Programming/CPP/"tempCodeRunnerFile
    
    問題 C(C++)言語では、真であるというのは次のうちどの数で表されるか?
    次の4つの中から正解と思われるものを選び、その番号を入力せよ。
    (1) 2 
    (2) 0 
    (3) 1 
    (4) -1 
    
    答えを整数で入力してください--->  2
    答えが間違っています。
    もう一度、答えを整数で入力してください--->  3
    正解です
    



    Visual Studio Codeで以下のcppファイルを作成して下さい。


    新規作成 【CinTest4.cpp】

    #include <iostream>
    
    int main() {
    
    	 double year, car, maitsuki, hensai, nenri;
    
    	std::cout << "購入したい車の値段を整数で入力してください--->" << std::endl;
    
    	for (std::cin >> car ; !std::cin ; std::cin >> car){
    
    		std::cin.clear();
    		std::cin.ignore();
    		std::cout << "入力が間違ってます" << std::endl <<  "購入したい車の値段を整数で入力してください--->";
        }
    
    	std::cout << "1ヶ月分の返済金額の上限を入力してください--->" << std::endl;
    
    	for (std::cin >> maitsuki ; !std::cin ; std::cin >> maitsuki){
    
    		std::cin.clear();
    		std::cin.ignore();
    		std::cout << "入力が間違ってます" << std::endl << "1ヶ月分の返済金額の上限を入力してください--->";
        }
    
    	std::cout << "年利を入力してください(例 3%の場合0.03)--->" << std::endl;
    
        for (std::cin >> nenri ; !std::cin ; std::cin >> nenri){
    
            std::cin.clear();
            std::cin.ignore();
            std::cout << "入力が間違ってます" << std::endl << "年利を入力してください(例 3%の場合0.03)--->";
    
        }
    
        for (year=1; ; year=year+1) {
    
            car = car * (1 + nenri/100.0);
            hensai = car/(year*12);
    
            if (hensai <= maitsuki) {
    
                std::cout << "返済年数は " << year << "年です。" << std::endl;
                std::cout << "返済金額は " << hensai << "円です。" << std::endl;
                break;
            }
        }
    }
    



    サンプルプログラムを実行してみましょう。
    最初に購入したい車の値段、1ヶ月分の返済金額の上限、年利をキーボードに入力するようにします。
    値段、返済金額、年利に間違って文字を入力した場合に正しい数値が入力されるまで繰り返し再入力を促すプログラムです。
    最後に返済金額と年数が表示されます。

    ~/Desktop/Programming/CPP $ cd "/Users/heyjude/Desktop/Programming/CPP/" && g++ CinTest4.cpp -o CinTest4 && "/Users/heyjude/D
    esktop/Programming/CPP/"CinTest4
    
    購入したい車の値段を整数で入力してください--->
    5000000
    1ヶ月分の返済金額の上限を入力してください--->
    36000
    年利を入力してください(例 3%の場合0.03)--->
    0.036
    返済年数は 12年です。
    返済金額は 34872.5円です。
    


    06 | for】 << 【ホーム】 >> 【08 | 論理演算




    ↓↓クリックして頂けると励みになります。