※各問に対する正しいプログラムを記述しなさい。
各問題には、条件、ヒントとして条件文、図、動作結果、プログラムの例を表示しています。
実行すると動作結果通りまたは、問に正対する動作結果が得られたら正解です。
(標準問題10番の問題の応用)
条件:
①枚数は、考えられる数の最小になるようにすること。また今回は、一万円、五千円、千円、五百円、百円、五十円、十円、五円、一円を考えること。(二千円は考えない)
②プログラムは、最大10人分のデータが入るようにすること。
③プログラムでは構造体を用いてデータを作成すること、データの内訳は、図1-1のようにすること。
④一連の処理が完了したとき、「別データを入力しますか?」と問い、ユーザーがYES(1)を入力したら、入力処理から再開し、NO(0)が入力されたら終了するようにしなさい。その処理は、図1-2の処理文を利用し、main関数内に記述すること。(文中の変数名は変更しても構わない)
⑤プログラムの自作関数は、図1-3のように構成し、main関数内に記述するのは、変数宣言と自作関数、と図1-2の処理文とそれに関連する文のみとし、それ以外の入力、演算、出力は、それぞれの自作関数内で行うこと。
⑥プログラム上では次の文の記述を禁止する。
・goto構文とラベル文
・switch構文(else ifによるスイッチも含む【if、elseは可】)
⑦プログラム上では次の要素を入れること。
・ポインター([*][&]間接参照演算子等)
・構造体(typedef struct ~等)
・文字列配列
⑧出力は、画面に表示するのとtxt出力もすること。またそれぞれの出力には、それぞれ別の関数を作成すること。(呼び出しの順序は問わない)
⑨出力の際には、図1-4のように「一万円は、XXXX枚」のように表記し、体裁をそろえること。
⑩テキスト出力の際、テキストファイルには、日付、時刻データも記入すること。またそのために「time.h」をインクルードし、「tm構造体(time.hで定義されている構造体)」を使用し、「time関数、localtime関数(time.hで定義されている関数)」を使用すること。
また「time.h」を用いたプログラムの例を図1-5を参考に添付する。
⑪その他の各宣言(配列)の例として、図1-6のようにする。
⑫プログラムの例として、図1-7(画面表示)、図1-8(テキスト出力)に示す。
⑬プログラムは200行以内で記述すること。
こいこい役判定、文数についてのルール
※図2-1にも絵付で説明しています。
①判定する役と文数は、次の13種類とする。
(1)、五光(10文)
・光札5枚
(2)、四光(8文)
・光札4枚但し「小野道風に蛙」を含まない
(3)、雨四光(7文)
・光札4枚但し「小野道風に蛙」を含む
(4)、三光(5文)
・光札3枚但し「小野道風に蛙」を含まない
(5)、花見で一杯(5文)
・「菊に盃」「桜に幕」
(6)、月見で一杯(5文)
・「菊に盃」「芒に月」
(7)、猪鹿蝶(5文+猪鹿蝶以外のタネ札の数)
・「萩に猪」「紅葉に鹿」「牡丹に蝶」
(8)、赤短青短(10文+赤短、青短以外の短冊札の数)
・赤短札3枚と青短札3枚
(9)、赤短(5文+赤短以外の短冊札の数)
・赤短札3枚
(10)、青短(5文+青短以外の短冊札の数)
・青短札3枚
(11)、タネ(1文)
・タネ札(10点札)5枚以上、6枚目から1枚毎に+1文
(12)、タン(1文)
・短冊札5枚以上、6枚目から1枚毎に+1文
(13)、カス(1文)
・カス札10枚以上、11枚目から1枚毎に+1文
②①以外の役、手四、くっつきの判定は行わない。
③役ルールとして次の条件を考慮すること。
・(7)猪鹿蝶が成立した時点で(11)タネ消滅
・(8)赤短青短が成立した時点で(9)赤短、(10)青短、(12)タン消滅
・(9)赤短が成立した時点で(12)タン消滅
・(10)青短が成立した時点で(12)タン消滅
④札のルールについて次のように定義する。
・光札:「鶴に松」「桜に幕」「芒に月」「小野道風に蛙」「桐に鳳凰」
・タネ札(10点札):「梅に鶯」「藤にほととぎす」「菖蒲に八ツ橋」「牡丹に蝶」「萩に猪」「芒に雁」「菊に杯」「紅葉に鹿」「柳に燕」
・短冊札:芒(8月)、桐(12月)以外に1枚づつ計10枚
・カス札:上記以外
・「小野道風に蛙」は、カス札、タネ札に計上される。
※詳細は、図2-1参照
⑤各月毎の花鳥風月を次のように定義する。
1月:松
2月:梅
3月:桜
4月:藤
5月:菖蒲(アヤメ)
6月:牡丹(ボタン)
7月:萩
8月:芒(ススキ)
9月:菊
10月:紅葉(モミジ)
11月:柳
12月:桐
⑥合計7文以上の場合は、文数は2倍になる。
⑦こいこいルールは次のURLを参考に定義するものとする。
http://www.nintendo.co.jp/n09/hana-kabu_games/
条件:
①役と文数、札については、全て上記ルールに従うものとする。
②プログラムでは配列(文字列配列含む)、列挙体を用いてデータを作成すること、但し列挙体は、プログラムを明確にするために使用する、データの内訳は、図2-2のようにすること。
③プログラムの処理構成は、入力、計算、出力共すべて自作関数で行うものとする。
④プログラム上では次の文の記述を禁止する。
・goto構文とラベル文
・switch構文(else if、if、elseは可)
⑤プログラム上では次の要素を入れること。
・ポインター([*][&]間接参照演算子等)
・列挙体(enum)
・文字列配列
⑥main関数に記述するのは、タイトル「こいこい役計算機」とデータの宣言と自作関数のみとする。
⑦入力処理の関数(Input_data)は、各月毎に取得したパターン(16通り)を明示し、数字0~15で解答させる。12回行い、データを16進数で保存するようにする。但、全てのパターンは、281,474,976,710,656通り(=6byte)でint型では最大2,147,483,647bit(=4byte-符号ビット(1bit))の値しか保存できないので、パターンは、(unsigned) long long型(=8byte)を使うこと。メモリの仕様を図2-3で示す。(解答例ではunsigned long long型で記述しています。)
また、0~15以外の数字が入力されたら、再入力させること。
⑧入力処理が終了したら、取得したパターンを基に、取得した札を明示したうえで、このパターンで処理を実行するか尋ねる事。
⑨計算処理を行う関数(Calc_Fuda)では、札種別の枚数[13]、48枚の所持の有無[48]、役別文数[13](全て配列)の値を計算すること。
⑩出力処理(Output_data)では、計算処理で計算した、役別文数を使い、出力を行う、またその際所持している札も明示すること。
⑪所持している札を明示する際、月ごとに表示し、その時その月の花鳥風月、札の名前を明示すること。明示は、入力の最後の確認、出来役を表示するときに行う。
明示の例を図2-4で示す。
役がない時は、「*出来役はありません*」と表示する。
⑫関数の定義を図2-5で示す。
⑬データを格納する配列の例を図2-2で示す。
⑭図2-2データの定義、図2-5関数の定義で使用した名前(関数名、配列名、列挙体名及び列挙体で定義される文字)は、変更しても構わない。
⑮図では、列挙体の文字は明確にするために日本語で表記していますが、コンパイラによっては日本語表記ができない場合があるので、その場合は、ローマ字や英語表記で記述しても構わない。
⑯出力結果の例を図2-6(あまりにも長いので簡略してある)に示す。(図2-7で、全部を示す)
⑰プログラムは、300行以内で記述すること。
※仮にすべて取得(48枚所持してる)時の役、文数は、次のようになる。
五光 10文
花見で一杯 5文
月見で一杯 5文
猪鹿蝶+タネ6 11文
赤短青短+タン4 14文
カス 15文
———————————————————————
合計 60文×2=120文
「図2-8 実行例その2(一部)参照」
図2-7(長いので別ページで示す)
図2-8 実行例その2(一部)