第8回演習問題


問1(基礎):5行の文字列の入力を受け付け,最長の行を表示せよ.
各行の入力にはgets関数を使うこと.

問2(基礎):二つの文字列str1とstr2を与えると,お互いを入れ替える関数
void swap_str(char str1[255], char str2[255])
を作成せよ.なお,main関数では以下の処理を行うこと.
main() {
2つの文字列をユーザから受け取り,str1, str2に入れる.
str1, str2 をこの順で表示する.
swap_str(str1, str2) を呼び出す.
str1, str2 をこの順で表示する(この時順番が入れ替わっていること).
}
ヒント:strcpy()を使う.

問3(基礎):講義の最後の例題を拡張して,ファイルの文字数(空白文字含む)も数えるようにせよ.ただし,全角文字は1つで2文字と数えてよい.
ヒント:strlen()を使う.

問4(応用): 文字列の入力を受け付け,それを逆にした文字列を連結し表示せよ.ただし,入力文字列に空白は含まれないものとする.
例1:"pow" --> "powwop"
例2:"foo" --> "foooop"

問5(応用): 次のプログラムを作成せよ.
・文字列の入力を受け付け,配列str1に入れよ.
・次に,配列str1中の空白' 'をすべて,マイナス3文字"---"に置き換えて
別の配列str2に入れよ.
・配列str2を出力せよ.
例:
入力:"This is a pen."
出力:"This---is---a---pen."

問6(応用): 与えられた文字列が回文(左右対称)であるかどうか判断し,結果を
表示せよ.
例1:"poop" --> 回文である.
例2:"non" --> 回文である.
例3:"abcd" --> 回文ではない.

問7(応用):問4と問5のプログラムの入力を,コマンドライン引数を用いるプログラムに変更せよ.
ただし,空白が'__'二つ以上の場合などに関しては対応する必要は無い.

問8(応用):ランダムな迷路を作成するプログラムを作成せよ.プログラムは以下の順番に作成すること
(1)左上をStart,右下がGoalとなっている5×5の迷路をランダムに作成し,表示するプログラムを作成せよ(ただし,必ずしもStartからGoalまでたどり着けない迷路でも良い).また,srand()に与えるseedはtime(NULL)を利用すること.
(2)5×5ができたらマクロ定義を利用してMAZE_SIZEを定義して任意のサイズの迷路をランダムで作成するプログラムにせよ.
(3)迷路を作成する部分を関数にしたvoid makeMaze(char meiro[MAZE_SIZE][MAZE_SIZE])関数を作成せよ.

出力例:
* * * * * * *
* S * *   * *
*     *     *
*   *   *   *
* *         *
* *   *   G *
* * * * * * *
↑外側は外壁で中の5×5の部分が迷路になっている.*は壁で空白の部分が通れる.
この例ではGoalへは辿り着けない


問9(発展):迷路を解くプログラムを作成せよ.プログラムは以下の順番に作成すること
(1)5×5の迷路を二次元配列を利用して例えば以下のように定義し,左上([1][1])をStartとして右下([5][5])をGoalとしてそこまでの経路を出力するプログラムを作成せよ.また,この時最初に初期化された迷路がGoalに辿り着けないような迷路であった場合には,"到達できません"と出力するようにしておくこと.
(2)(1)のプログラムで利用する迷路を問8(3)で作成する任意の迷路と置き換えてプログラムせよ.また,Goalに到達できない迷路であれば到達できるものができるまで作り直すようにすること

char meiro[7][7]=
{{*,*,*,*,*,*,*},
{*, ,*, , , ,*},
{*, ,*, ,*, ,*},
{*, , ,*, ,*,*},
{*,*, ,*, ,*,*},
{*, , , , , ,*},
{*,*,*,*,*,*,*},};
出力例:
(1,1)(2,1)(3,1)(3,2)(4,2)(5,2)(5,3)(5,4)(5,5)


問10(発展):第7回で作成したPokerのプログラムを改良し,配られた5枚のトランプに対してユーザが最高3回まで交換ができるようにせよ.交換は1回で辞めることもでき,交換が終わった時点で役を表示し,カードが残っている限り新しく5枚のカードがユーザに配られるものとする.また,オープン(交換が終わったことを宣言)した時の役をファイル入出力関数を用いて"pokerscore.dat"というファイルに記録せよ.この時,ユーザの総プレイ数,各役(ブタ含む)の上がり回数を記録していくこと.また,一度作成された"pokerscore.dat"ファイルはその後プログラムを起動するたびにユーザの成績を累積して記録していくようにせよ.

出力例:
  ハート  スペード    ハート    クラブ    ダイヤ
    K        10          6         7         K
Trade(1~5)?, Open(7)?, End(9)?:2,4,5      ←ユーザ入力

  ハート   ハート     ハート     ハート    ハート
    K        Q          6          3         J
Trade(1~5)?, Open(7)?, End(9)?:7          ←ユーザ入力

役:フラッシュ

Next Game !!
  クラブ  スペード    ダイヤ    クラブ    スペード
    Q        3          A          5         A
Trade(1~5)?, Open(7)?, End(9)?:           ←ユーザ入力

masa-n@cs.kobe-u.ac.jp
(C) Masahide Nakamura, Kobe University