第25講 様々なループ文
第2話 第1話問題解答
問題1解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int a,b,c,w=0,i;
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
c=int::Parse(textBox3->Text);
i=a;
while(i<=b){
w+=i;
i+=c;
}
textBox4->Text=w.ToString();
}
};
}
問題2解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int a,b,c,w;
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
c=int::Parse(textBox3->Text);
w=a;
while(w<=c){
w+=b;
}
if(w>c)w-=b;
textBox4->Text=w.ToString();
}
};
}
問題2解答例解説
さて、皆さんif(w>c)w-=b;の意味はおわかりですか。
これがないとと合計が100を超えてしまいます。
while(w<=c)なのになぜでしょうか。これをwhile(w<c)と修正したらどうでしょうか。残念ながら、結果は改善されません。
while(w<c){
w+=b;
}
であるにしても、やはり102になってしまいます。
理由は、先にw<cの評価が行われるからです。
15+18+21+・・・の直前までの和は、99です。
ですからw<cの条件は満たされてしまいます。
したがって、w+=b;によって99+3=102となってしまうわけです。
これは合計値が100を超えないという条件に反してしまいます。
それでやむを得ずif(w>c)w-=b;が入っているわけです。
でもこれって、明らかに無駄ですよね。
足して引くという無意味なことをやっているからです。
99+3=102,102−3=99
この無駄を改善する方法はあるのでしょうか。
無駄を改善する方法は
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int a,b,c,w;
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
c=int::Parse(textBox3->Text);
w=a;
while(w<=c-b){
w+=b;
}
textBox4->Text=w.ToString();
}
};
}
while文は、評価が先になされますが、
後で評価される命令文があります。
do{
・
・
・
}while(条件式);
です。これで、問題2を書き換えてみましょう。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座