![]() |
Top > 授業 > Delphi プログラミング >Lesson 6b Lesson 6b(2004/09/24) |
![]() |
![]() |
![]() |
![]() 1.このLesson 6b では Lesson 6a での提出用課題に当たるサンプルプログラムを解説します。 2.サンプルプログラムを眺め、自分の練習問題の結果と比較してください。 3.Lesson 6a の練習問題に当たるサンプルプログラムをまずダウンロードしてください(クリック)。解凍して出てくるのは、P603、P605 のDelphi プログラムです。なお、解凍するにはパスワードが必要です。パスワードは Lesson 6a の提出用課題を出した人には伝えてあります。 |
![]() ・P602 の練習問題の解答例です。 ・このプログラムは乱数を一様乱数から正規乱数に変えるだけですから、課題をこなす上で特筆する問題はなかったと思います。 ・乱数の分布に関する感覚を体験できればよいと思います。 |
![]() ・P604 の練習問題3の解答例です。P604 と P605 では内容的にだいぶ跳んでいます。だからこの課題は難しかったと思います。 ・この課題は次の2点の練習だと思ってください。第1に TopDown design の練習です。まず全体の作業をイメージし、次にその全体の作業をどのような部分プログラム(モジュール、今の場合は手続き)に分割するかという練習です。第2はそのモジュール化の練習、つまり個々の部分プログラムをどのように構想するかの練習です。 ・原則として私が示した実行プログラムと同じ動作をするプログラムを書けばよいのですから、同じ作業をしている限りで、特に「正解」はありません。今のところ提出したのは上野君だけですが、上野君のプログラムは私のプログラムより良くできていると思います。上記の2つの課題をどのように処理するかはプログラマによって異なるのは当然です。 ・私のプログラムの主要部分(手続きStartBtnClickのメインプログラム)は次のようになっています。 begin Initialize; while DoLoop(BallCount) do begin WhileInit(BallCount, StepCount); Falling; repeat RepInit(StepCount); NewPosition(CPos); Movement(StepCount, CPos); for i := 1 to 10000 do for j := 1 to 5000 do; until RepEnd(StepCount); Placement(CPos); end; { of while DoLoop } Finale; end; まず、while文で条件(DoLoop(BallCount))が充たされるまでボールを1つずつ落とします。条件とは、一番高くなったボールの場所が枠の上限に至ったときです。1個のボールの落下を while 文のループで実行させます。手続き Falling はボールが釘に当たるまでの落下です。次の repeat…until のループで釘に当たるボールの動作を決めます。釘に当たる機会ごとに、手続きNewPosition でボールの新たな位置が決まります。釘に当たった後のボールの動きを表示するのが手続きMovementです。ブールが釘を抜けた後の動きを表示するのが手続きPlacement です。このようにしてボールが1個1個落下し、条件が充たされると while ループが終わって全体が終了します。 ・このプログラムは「パチンコのシミュレーション」です。が、重要な点を省略しています。ボールの落下が物理の法則に従っていない点です。ボールには加速度はなく、ぶつかってもバウンドしません。ですからボールの落下のようには見えないと思います。そうした点が気になる人は、物理シミュレーションの参考書を参照してください。自己弁護するなら、シミュレーションとは対象の現象のある部分をシミュレートしても別の面は捨象するのが常です。このシミュレーションでは、加算的な誤差がランダムに加われば(そしてその誤差の数が多ければ)、分布は正規分布に近づく、という点を実感できればよい、と思っています。 |
![]() Lesson 6 では2種類の系列の練習を混ぜています。第1は乱数を用いた確率分布の表現です。もう1つは擬似的なアニメの作成です。 そこでこれ以後の予定ですが、まずLesson 7 ではLesson 6 の第1点、乱数の確率分布についてもう少し練習することにします。Lesson 8 では擬似的なアニメである種のランダムウォークで乱数の練習を重ねることにします。 |