以下の問題は,全て結合して1個のプログラムなることを想定している. これは迷路(上下左右全方向に進める)を解くプログラムである. - (問題1) 以下の様な10行の内容の "map.txt" というテキストファイルを作成せよ.---- は含まない. ファイルはプログラムと同じディレクトリ(同じフォルダ)に作成せよ. ------ ############ # # # # ## ## # # # # #G # # # ### # # #### # # # # # # # # # ## # # # # ############ ------ 以下の様な関数 void read_map() を作成し,main関数より呼び出せ. ファイル "map.txt" を "rt" モードで開く. 開けなかったら,下記の様に表示して,exit(1)を呼び出し強制終了. perror("ファイルを開けない."); 文字を読み込めなくなるまで読み込み, 読み込めたら その内容を printf() で表示する. ファイルの読み込みは ch = fgetc( fp ); で可能.fp はファイルポインタ.ch は int 型の変数. 正しく読めたら ch に 読み込んだ文字の文字コードが代入され, 正しく読めなかったら ch には -1 が代入される. 文字コードの表示は printf("%c", ch); で,可能.%d でなく %c である点に注意. - (問題2) 以下のプログラムを記述せよ. プログラムの先頭近辺(#includeの直後)に以下を記述せよ. #define W 12 #define H 10 グローバル変数として,以下を宣言せよ. char map[H][W]; 関数 read_map() を,以下の様な関数に修正せよ. ファイル "map.txt" を "rt" モードで開く. 開けなかったら,下記の様に表示して強制終了. perror("ファイルを開けない."); ファイルの中身を fgetc で1文字ずつ読み込み, その中身が ' ' であれば,map[y][x] に 0 を, その中身が '#' であれば,map[y][x] に 1 を, その中身が 'G' であれば,map[y][x] に 2 を,代入する. その中身が '\n' であれば,何もしない. その中身が 上記以外であれば,下記の様に表示して強制終了. printf("不正なデータ.(%d,%d) %d %c\n", x, y, ch, ch); ただし,ch は fgetc で取得したデータ. 注意:正しく読み込めた場合は,画面に何も表示されない. 全て読み込み終わって,改行を含めずに120文字(改行を含めて130文字)未満であれば, 下記の様に表示して,exit(1)を呼び出し強制終了. printf("mapが足りない\n"); 読み込んだ値(文字コード)が '#'の文字コード と等しいか否かは,以下の様に確認可能. if( ch == '#' ) 全マス分読み込み終わったら ファイルを閉じる. 続いて,以下の様な 関数 void print_map() を作成し, main()関数 にて read_map の次に呼び出せ. read_map()関数で読み込んだ データ(map)を, 以下の様に 横 W マス,縦 H マスの長方形型に表示する ############ # # # # ## ## # # # # #G # # # ### # # #### # # # # # # # # # ## # # # # ############ ただし,map[y][x] のデータは,長方形の横座標x,縦座標y に対応する. 横座標は 最左列が 0 で,右に行くにつれて横座標は増加していく. 縦座標は 最上段が 0 で,下に行くにつれて縦座標は増加していく. G のマークは 横座標 6, 縦座標 3 である. 配列 map の対応する値が 0 であれば その場所には空白を表示し, 値が 1 であれば # を表示し, 値が 2 であれば G を表示し, 値が 3 であれば . を表示する. (表示は 全角でも半角でも構わない) 0:空白 は通れる場所を, 1:# は通れない場所を, 2:G は ゴールを, 3:. は 通った場所を, 意味している. - (問題3) 以下の 関数を作成せよ. この関数は,迷路の(x,y)の状況を調べ, そこが通れる場所であった場合は そのマスの上下左右も調べる関数である. ただし,この関数は正しく動作しない. 名前が maze0 で,引数が int x, int y で,戻り値が void で, 呼び出されると,以下の様に動作する関数. map[y][x] が 0 であれば, ・"( x座標, y座標) 改行"を表示する. ・その上のマスに対して maze0 を呼び出し,その上のマスも調べる.  (つまり, maze0( x, y-1) を呼び出す. ・その下のマスに対して maze0 を呼び出し,その下のマスも調べる. ・その左のマスに対して maze0 を呼び出し,その左のマスも調べる. ・その右のマスに対して maze0 を呼び出し,その右のマスも調べる. map[y][x] が 1 であれば, ・"( x座標, y座標)X 改行"を表示する. map[y][x] が 2 であれば, ・"( x座標, y座標)OK 改行"を表示する. ・exit(0)を呼び出し,プログラムを終了. exit() を用いるために, プログラムの先頭近辺(#includeの直後)に #include を以下を記述せよ. そして,この maze0 関数を main より呼び出せ. ただし,迷路のスタートは (1,1)として,そこから調査を開始する. つまり maze0( 1,1) を呼び出す. 注意:このプログラムは (異常終了するまで)終わらない. - (問題4) 上記のmaze0が,正しく動作しない理由を説明せよ.日本語で記述せよ. - (問題5) 以下の 関数を作成せよ. この関数は,迷路の(x,y)の状況を調べ, そこが通れる場所であった場合は そのマスの上下左右も調べる関数である. ただし,「自分がこれまでに通ったマス」を管理しており,一度通ったマスは再度調べない. 具体的には,his[y][x] == 0 なら,そのマスはまだ通っておらず, his[y][x] == 1 なら,そのマスは既に通っている. 名前が maze1 で,引数が int x, int y, char his[H][W] で,戻り値が void で, 呼び出されると,以下の様に動作する関数. map[y][x] が 0 であれば, ・"( x座標, y座標) 改行"を表示する. ・通ったマスの情報 char his[H][W] を char newhis[H][W] にコピーする.  具体的には,  新たにローカル変数 char newhis[H][W] を宣言(作成)する.  そして,his[H][W]の中身全てを newhis[H][W]にコピーする. (コピーは memcpy(newhis, his, H*W) で可能である.) ・newhis[y][x] を 1 にして,通ったマスとして登録する. ・その上のマスをまだ通っていなければ,  その上のマスに対して maze1 を呼び出し,その上のマスも調べる.  通ったマスの情報としては,コピーしたnewhisを用いる.  (つまり, maze1( x, y-1, newhis) を呼び出す. ・その下のマスをまだ通っていなければ,  その下のマスに対して maze1 を呼び出し,その下のマスも調べる. ・その左のマスをまだ通っていなければ,  その左のマスに対して maze1 を呼び出し,その左のマスも調べる. ・その右のマスをまだ通っていなければ,  その右のマスに対して maze1 を呼び出し,その右のマスも調べる. map[y][x] が 1 であれば, ・"( x座標, y座標)X 改行"を表示する. map[y][x] が 2 であれば, ・"( x座標, y座標)OK 改行"を表示する. ・exit(0)を呼び出し,プログラムを終了. main関数内のローカル変数として,char his[H][W] を作成する. 全て 0 で初期化される様に, char his[H][W]; または static char his[H][W]; の適切な方を選択せよ. memcpy() を用いるために, プログラムの先頭近辺(#includeの直後)に #include そして,この maze1 関数を main より呼び出せ. ただし,迷路のスタートは (1,1)として,そこから調査を開始する. つまり maze1( 1,1, his) を呼び出す. - (問題6) 上記の maze1 の「map[y][x] が 2 であれば,」の処理を 下記の様に改めた maze2 を作成せよ. map[y][x] が 2 であれば, ・"( x座標, y座標)OK 改行"を表示する. ・char his[H][W] の内容を調べ,通ったことがあるマス(x,y)に関しては,  map[y][x] の値を 3 にする. ・print_map を呼び出し,表示する.  通ったマスは . として表示されるはずである. ・exit(0)を呼び出し,プログラムを終了. - (問題7) "map.txt"の内容を以下の様な状態に修正し,動作を確認. ・マップが足りない状態 (例. 2行しかない) ・マップに不正な( ' ' と '#' と 'G' 以外)が含まれている. ・マップが正しい,別の迷路