問 9(提出プログラム名:ex1009a.c)
※上級クラスは必須(中級クラスはできる人だけでよい)
(いずれも加点対象)
このプログラム(ex1009a.c)をダウンロードし,この中の関数 walk を完成させなさい.
このプログラムは,X-Y 平面上を走行するロボットの動きを表すものである.
ロボットの動きは単純であり,1 回の命令で X 方向または Y 方向のいずれかに 1 [m] だけ移動できる.
ただし,1 [m] 移動するたびにバッテリーを消費する.しかも,バッテリーには最大で B_LIMIT [m] 進む分しか充電できない(B_LIMIT はマクロで定義されている).
幸い,特定の条件を満たす地点では充電ができるようになっているが,逆に放電させられる罠も仕掛けられている.
以下の仕様に従って,関数 walk を完成させなさい.
main, charge, damage の内容は変更しないこと.
[関数 walk] void walk(int *px, int *py, int *pb, int move)
px, py はそれぞれ移動前の x, y 座標に対応するポインタ(それぞれの参照先が x, y 座標)
pb は移動前のバッテリー残量するポインタ(参照先がバッテリー残量)
move は移動方向:+1 で右,-1 で左,+2 で上,-2 で下
いずれの方向にも 1 [m] だけ移動し,バッテリー残量が 1 だけ減る.
ただし,バッテリー残量が 0 の場合は移動できなくなる.
移動した後の (x,y) 座標について,
|x| == |y| + 2 ならば以下の damage を呼出してバッテリーを放電する.
|x| == |y| + 1 ならば以下の charge を呼出してバッテリーに充電する.
[関数 charge] void charge(int *pb)
バッテリー残量を B_CHARGE だけ増やす(B_CHARGE はマクロで定義されている).
ただし,B_LIMIT を超えることはできない.
[関数 damage] void damage(int *pb)
バッテリー残量を B_DAMAGE だけ減らす(B_DAMAGE はマクロで定義されている).
ただし,バッテリー残量は 0 が下限である.
【注意】
C 言語では絶対値を求める標準ライブラリ関数として abs というものが用意されているのでそれを使ってもよい.ただし,stdlib.h をインクルードする必要がある.
- 【プログラムの実行結果】(その1)※赤字は実行時にキーボードから入力する内容
現在地:(0,0); バッテリー残量: 5⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > 2 現在地:(0,1); バッテリー残量: 4⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > 1 現在地:(1,1); バッテリー残量: 3⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > 1 現在地:(2,1); バッテリー残量: 2⏎ 充電しました(バッテリー残量:4)⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > 1 現在地:(3,1); バッテリー残量: 3⏎ 放電されました(バッテリー残量:0)⏎ バッテリー切れです⏎ 終了します⏎
- 【プログラムの実行結果】(その2)※赤字は実行時にキーボードから入力する内容
現在地:(0,0); バッテリー残量: 5⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > 1 現在地:(1,0); バッテリー残量: 4⏎ 充電しました(バッテリー残量:5)⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > 2 現在地:(1,1); バッテリー残量: 4⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > -2 現在地:(1,0); バッテリー残量: 3⏎ 充電しました(バッテリー残量:5)⏎ どの方向に移動しますか?(1:右,-1:左,2:上,-2:下,0:終了)⏎ > 0 終了します⏎
【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 上の実行例と出力が違っていることを見落としている.
■ インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).
問 4 ~問 9 は 7/2(火)12:00 までに提出を済ませてください.※23:59 ではないので注意!
(ex1004a.c ~ ex1009a.c を Moodle から提出してください.)
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.
← [ 問 7 (ex1007a.c) ]
← [ 問 8 (ex1008a.c) ]