Borland C++ による開発, ランダムウォークの履歴の保存 目次 解答例(ないかも)

課題16_01(ta102)Borland C++ による開発

大学の Linux で書き始めたプログラムを, 家の Windows で作り続けることを想定して, 実習室の Windows 上で開発してみよう.

Linux の実行ファイル ( a.out のようなもの)を Windows 上で実行することはできない. 逆に Windows の実行ファイル( program.exe のようなもの)を Linux 上で実行することはできない.

しかし, 適切に書かれた C のプログラム program.cなら, 変更なしに, Linux で cc (gcc=GNU cc)でコンパイルすれば Linuux の実行ファイル, Windows で Borland C++ Builder Command Line Tool の bcc32 でコンパイルすれば Windows の実行ファイルが, できる.

なお, Linux でコンパイルする場合と Windows でコンパイルする場合とを 特に区別してプログラムを書くには, "

#ifdef __unix__
  return drand48();                        /* Linux での処理 */
#else
  return (double)rand()/((double)RAND_MAX+1.0);  /* Windows での処理 */
#endif
" のようにする.

  1. 課題15_01 を思い出しつつ, ファイルを Windows に移そう. まず, randomtest.c, rw1d2.c, anim1d1.c, anim2d1.c, その他, 自分で完成させた, あるいは書きかけのプログラムをフロッピーに移そう. 今回は, ファイル内に日本語が含まれているため, フロッピーにコピーしたあと, 漢字コードをシフトJIS に直す必要がある. 漢字コード変換を参照.
  2. Linux を終了して Windows を起動し, 家の PC を使っている気分に切り替えよう. 家で課題をするにはも参照. Internet Explorer または Netscape Navigator で再びこのページ( http://www.math.ryukoku.ac.jp/~hig/からたどって, bookmark しよう) を表示しよう. 上でフロッピーに移したデータを, Q:\に, (家の PC なら c:\My Documentsなどに. 以下読み替えてね)コピーしよう.
  3. ここまでで時間の余った人は, Windows の FFFtp を使っても Linux からファイルを取得できることを体験しよう. ftp server 名は master.roes.ryukoku.ac.jp. ただしこの方法は家との間では使えない.
  4. Windows のスタートメニューからエディタ (メモ帳, Meadow(=emacs と同じもの),秀丸などのいずれか)を起動し, 上で Q:\にコピーしたファイルを開き, 変更を加えてみよう.
  5. Windows のスタートメニューからコマンドプロンプトを起動する.
    Q:\> dir 
    
    として, 正しくコピーされているかチェックしよう.

    家では,

    C:\WINDOWS> cd C:\"My Documents"
    C:\My Documents>
    
    のように, 自分でカレントディレクトリを移す.

  6. Q:\> bcc32 randomtest.c
    
    とすると, コンパイルが行われ, 実行ファイル randomtest.exe ができる. あるいは, この Makefileを同じディレクトリに保存すれば
    Q:\> make  randomtest.exe
    
    よい(Linux の Makefile と共通じゃないよ). コンパイルできたら,
    Q:\> randomtest
    
    で実行できるはず.
  7. 他のプログラムについても試そう.

(なお, Java の場合は, 漢字コードを除けば, Program.java, Program.class とも OS によらずに共通)

課題16_02(ta120)ランダムウォークの履歴の保存1

課題15_02で完成させた anim2d1.c では, ウォーカーは (0,0) -> (x',y') -> (x'',y'') -> ... と移動していく. これに加筆して, 次のようなアニメーション anim2d2.c を作ろう.

表示できる範囲内には, ウォーカーが訪れることのできる点 (格子点とよぼう)が, 201 x 201 個ある. ウォーカーの現在地点に点を打つのに加え, 過去に訪れたことのある点すべてに, 小さな, あるいは色の異なる点を打とう.

完成例: ~hig/cs2/rw/anim2d2

Hint: 各格子点に対応するグローバル変数配列(すべての関数の外で宣言する変数)

int visitted[201][201];
/* int visitted[2*MAXX+1][2*MAXX+1]; のほうがよい? */
を用意して, (x,y) に対応する点を訪れた回数を記憶すれば? ウォーカーの座標は負にもなるが, 配列添字は 0 以上であることに注意してね.

課題16_03(ta122)ランダムウォークの履歴の保存2

課題15_02で完成させた anim2d1.c では, ウォーカーは (0,0) -> (x',y') -> (x'',y'') -> ... と移動していく. これに加筆して, 次のようなアニメーション anim2d3.c を作ろう.

完成例: ~hig/cs2/rw/anim2d3

ウォーカーの点が移動していくのに加え, それまでに訪れた点 (0,0) -> (x',y') -> (x'',y'') -> ... を順に 折れ線でつなごう. ウォークの長さ(ステップ数)は適当に制限してよい. あるいは, 100回前までに訪れた点を結ぶが, その前は忘れる, とか.

Hint: グローバル変数(すべての関数の外で宣言する変数)

int pathx[100],pathy[100];
を用意して,(pathx[0],pathy[0]) を現在の位置, (pathx[1],pathy[1]) を1回前の位置,... など直前100歩分を記憶し, 1歩歩くごとに中身をずらしていけば?

Hint: 見易くするために, Window のサイズを大きくするか, MAXX を小さくするかしよう.

Hint:

glBegin(GL_LINE_STRIP);
glVertex2d(..,..)
...
glEnd();

時間と興味があれば, 課題16_02と組み合わるとか?


Copyright © 2002 Saburo Higuchi. All rights reserved.
Saburo HIGUCHI, hig mail address
最後の更新は次の時刻以降 2002/10/05 Sat 11:34