<<前 [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 = 」と画面に表示され入力待ちになります。
整数を入力すると「a = 入力した整数」が表示されます。
もし間違った入力をした場合、無限に「入力が間違っています。a = 」と表示されます。
これを強制終了するには「Ctrl+C」を押してください。プログラムが終了します。
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 / bを計算し、もし割り切れていれば、「割り切れました。」と表示され答えも表示されます。
余りがある場合は、商と余りを表示します。
↓↓クリックして頂けると励みになります。