構造体と関数を使うとプログラムがとても見やすくなります。また、メンテナンスもしやすくなります。今回はその確認の意味も含めて、実力確認していきたいと思います。このテストでは前回のテストの結果で公開した Q18-1.cpp を改造して行います。そのため、こちらのアーカイブから Q18-1.cpp を取り出して、あわせて確認するようにしてください。
- 問19-1. 座標構造体定義
座標を定義する TPoint 構造体と、typedef で型定義された Point を記述せよ。構造体メンバは int 型で定義して X と Y を内包すること。
- 問19-2. 艦船構造体定義
艦船を定義する TShip 構造体と、typedef で型定義された Ship を定義せよ。構造体メンバは Name(名前)、Type(艦船種別)、Position(座標)、IsVertical(true なら縦方向)というメンバを内包する。艦船種別は以下の enum 列挙体を使用する。
enum EShip { NONE, CARRIER, BATTLE, CRUISER1, CRUISER2, DSTSHIP, DESTROY = -1 };
- 問20. 構造体配列定義と初期化
グローバル変数として 5隻の艦船を構造体配列で宣言する。艦船で使用する構造体は、問19-2 で定義した Ship を使用して、配列名称は gShips とする。また、艦船最大数は別途 #define で以下のように定義しておく。
また、C言語016 配列の初期化で解説した初期化子を用いて、構造体メンバ Name と Type は宣言時に初期化するようにせよ。初期化する 5隻の艦船情報は以下の通り。
#define MAX 5
"空母" CARRIER "戦艦" BATTLE "巡洋艦1" CRUISER1 "巡洋艦2" CRUISER2 "駆逐艦" DSTSHIP
※ 座標 Position と向き IsVertical は 0 のままで構わない。
※ 結束ケーブルをまとめる結束バンドはこういう汎用的なモノを買っておくと片付ける時に便利です。
- 問21. 関数定義
艦船種別を引数としてその艦船の長さを返却する関数 GetShipLength を作成する。返却の型は int とする。さらに下記のプログラムで、艦船の長さを使用している箇所 szShip[i] を GetShipLength 関数に置き換える。単純な置き換えではなく処理速度的に効果的な使い方に変えられればベストとする。
// 配置する srand((unsigned)time(NULL)); for (int i = 0; i < (int)MAX; ++i) { EShip ship = (EShip)(i + 1); // 配置対象船舶番号 while (true) { int posX, posY; // 配置座標 int dir = rand() % 2; // 縦配置か横配置か int exist = 0; // 配置済み判定用チェックサム // 配置位置を決める if (dir == 0) { // 縦配置 posX = rand() % FIELD_WIDTH; posY = rand() % (FIELD_HEIGHT - szShip[i] + 1); } else { // 横配置 posX = rand() % (FIELD_WIDTH - szShip[i] + 1); posY = rand() % FIELD_HEIGHT; } // 配置が可能か for (int ii = 0; ii < szShip[i]; ++ii) { exist += nSea[posX + ofst[dir][0] * ii][posY + ofst[dir][1] * ii]; } if (exist) continue; // 0以外なら他の船舶と重なっている // 配置する for (int ii = 0; ii < szShip[i]; ++ii) { nSea[posX + ofst[dir][0] * ii][posY + ofst[dir][1] * ii] = ship; } break; } }
- 問22. 艦船の配置を反映する
上記 問21-2.のプログラムではコメント「配置する」で艦船の座標と方向が確定している。そこでこの確定した情報を、問20 で宣言した構造体配列 gShips のメンバ Position と IsVertical に反映させよ。なお、追加するプログラムは最後の break; の直前とする。
問23. プログラムの全体構造
Q18-1.cpp のプログラムを drawGameFiled 関数と deployShips 関数に分解せよ。結果、main 関数の内容は下記となる。
/// <summary> /// メイン関数 /// </summary> /// <returns>終了コード</returns> int main(void) { // 配置する deployShips(); // 表示する drawGameFiled(); return EXIT_SUCCESS; }
※ PS5御用達のSSDです。非公式ながらGen3 でも認識したという報告あります。Gen3 専用のキオクシアSSDと比べると少し高価ですが、使用期間などを考慮するとオススメはこちらですねー
コメント