課題 [10] ポインタ①(9/9)

問 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 から提出してください.)
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.