第7講 for文以外の繰り返し処理
第2話 while文を利用した簡単なソフトの作成
第1話問題解答例
@
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=1;
while(i<=100){
w=w+i;
i++;
}
label1->Text=w.ToString();
}
};
}
実行画面
A
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=1;
while(i<=100){
w=w+i;
i=i+1;
}
label1->Text=w.ToString();
}
};
}
実行画面
B
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=2;
while(i<=100){
w=w+i;
i=i+2;
}
label1->Text=w.ToString();
}
};
}
実行画面
一般にプログラム言語では、条件式(上例では、i<=100)は条件式自体が0または1の値をもっています。
条件式が偽すなわち間違っている場合、条件式は0の値を
条件式が真すなわち正しい場合、条件式は1の値をもちます。
例えば、i=200のときは、i<=100は200<=100で間違っているので0の値を
i=2のときはi<=100は2<=100で正しいので1の値をもちます。
この点に注意するとBの解答例は次のように変更することもできます。
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=2;
while(1){
w=w+i;
i=i+2;
if(i>100)break;
}
label1->Text=w.ToString();
}
};
}
breakは、強制的にループ処理を抜けるときに使う命令です。
これは、for文でも使えます。
while文で気をつけなければならないことは、永久ループにならないよう注意することです。
たとえば、今のコーティングでうっかりif(i>100)break;を忘れてしまうと
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=2;
while(1){
w=w+i;
i=i+2;
}
label1->Text=w.ToString();
}
};
}
永久ループになってしまいます。while(1)ですから永久に続けてしまうわけです。
ループを抜け出す条件を忘れると、永久ループになってしまいます。
また、ループを抜け出す条件が不適切な場合にも永久ループなってしまう場合があります。
実行して10秒も20秒も結果がでなければ永久ループになっている可能性を疑わなければなりません。
今作っているソフトは、ほとんどが0.001秒もかからず結果の出るものばかりだからです。
これを超えたのは、円周率πの計算ぐらいでしょう。
永久ループになると、コンピュータは無限に計算を続けます。
つまり、ソフトは永久に稼働してしまいます。
このような状態になったときは、強制的にソフトを閉じてください。
強制的にソフトを終了させる方法は、
画面の一番下の矢印のあたりを右クリックしてください。
すると、サブメニューが開きます。
それのタスクマネージャの起動をクリックします。
パフォーマンスタブをクリックして
CPU使用率が画面のように25%を超えていれば、永久ループになっている可能性が濃厚です。
25%を指標にするのは、コンピュータがCPUを4つ積んでいる場合です。
少なくともCPUひとつ分がフル稼働しているということは、コンピュータが永久ループの計算を永遠と計算している可能性を示しています。
アイドリング状態では、CPU使用率は高々数%です。
永久ループに陥ってしまった場合は、タスクマネージャーのアプリケーションタブをクリックします。
応答なしのソフトを選びタスクの終了をクリックします。
すると、プログラムの終了がでてきますので、
すぐに終了をクリックしてください。
永久ループになったソフトを終了することができます。
ループを抜け出す条件は、忘れたり不適切であることが結構ありますので慎重にしなければなりません。
さて、先のタイピングは次のようにすることも可能です。
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=2;
int f=1;
while(f){
w=w+i;
i=i+2;
if(i>b)f=0;
}
label1->Text=w.ToString();
}
};
}
if(i>b)f=0;がループを抜け出す条件です。
while文は条件式の値が1の間だけ繰り返しますので、
0なれば終了するわけです。
今回作ったソフトだといちいちプログラムソースをいじらなければなりません。
そこで、プログラムソースをいちいちいじらなくてもソフト上から条件を入力できるように改造しましょう。
例えば、次のようにForm1を改造して、実行できるようにコードをタイピングして下さい。
ここで1乗の和、2乗の和等とは、上図の実行画面例の場合それぞれ
等を表すことにします。
ソース例は、例によって30行下。
ただし、wは4乗の和などがかなり大きくなりますので、
long w;
と宣言しておくことにしましょう。
コード例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a,b,c,i;
long w;
//条件値(はじめの値、終わりの値、変化の幅)を取得
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
c=int::Parse(textBox3->Text);
//初期化
w=0;
i=a;
//1乗の和の計算と表示
while(i<=b){
w=w+i;
i=i+c;
}
textBox4->Text=w.ToString();
//2乗の和の計算と表示
w=0;
i=a; //再初期化。この2つを忘れると結果はうまく出ない。
while(i<=b){
w=w+i*i;
i=i+c;
}
textBox5->Text=w.ToString();
//3乗の和の計算と表示
w=0;
i=a; //再再初期化。この2つを忘れると結果はうまく出ない。
while(i<=b){
w=w+i*i*i;
i=i+c;
}
textBox6->Text=w.ToString();
//4乗の和の計算と表示
w=0;
i=a; //再再再初期化。この2つを忘れると結果はうまく出ない。
while(i<=b){
w=w+i*i*i*i;
i=i+c;
}
textBox7->Text=w.ToString();
}
};
}
では、課題を出してこの話を閉めましょう。
それぞれの和について、合計の上限値を超えない範囲まで合計を続けるように変更させるにはどうしたらよいでしょうか。
つまり、例えば
1+2+3+4+・・・の和の合計が100を超えない範囲で合計を続けさせるということです。
Bの別解である
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=2;
while(1){
w=w+i;
i=i+2;
if(i>100)break;
}
label1->Text=w.ToString();
}
};
}
または、
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
i=2;
int f=1;
while(f){
w=w+i;
i=i+2;
if(i>b)f=0;
}
label1->Text=w.ToString();
}
};
}
を参考にして下さい。
第1話へ 第3話へ