第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を書き換えてみましょう。


第25講第1話へ 第25講第3話へ

戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座