>>この記事には書き直した新しいページがあります。<<
<<前 [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 = 」と画面に表示され入力待ちになります。
整数を入力すると、「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 / bを計算し、もし割り切れていれば、「割り切れました。」と表示され、答えも表示されます。
余りがある場合は、商と余りを表示します。
<<前 [TOP] 次>>