#  このディレクトリの索引
#  [1] 授業単元:プログラミング 
#  [2] 問題文( 
#  キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 
#  作成してください。なお、プログラム作成時は以下の仕様に従ってください。 
#  ファイル名: kadai3.c 
#  【 問題作成時の注意点 】 
#  ・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 
#  入力した値が以下の番号以外の場合、再びメニュー番号を入力するように 
#  してください。 
#  1 三角形 
#  2 四角形 
#  ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード 
#  から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で 
#  プログラムを終了してください。 
#  エラーメッセージの例) wrong number 
#  ・図形の表示には関数を利用してください。関数のプロトタイプ宣言は以下の 
#  通りとします。 
#  void DrawTriangle(int); 
#  void DrawRectangle(int); 
#  [3] 環境 
#   [3.1] OS: Windows 
#   [3.2] コンパイラ名とバージョン: gcc 3.4 
#   [3.3] 言語: C++ 
#  [4] 期限: ([2006年11月2日17:30まで 
#  [5] その他の制限:なし

'キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 
作成してください。なお、プログラム作成時は以下の仕様に従ってください。 
l・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 
入力した値が以下の番号以外の場合、再びメニュー番号を入力するように 
してください。 
1 三角形 
2 四角形 
・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード 
から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で 
プログラムを終了してください。' :-
        'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号),
        'メニュー番号に沿った図形を「*」で表示する'(_メニュー番号).

'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号) :-
        write('左側の数字で選択してください\n\n1 三角形\n2 四角形\n\n'),
        整数を得る('メニュー番号[1/2]',member(_メニュー番号,[1,2]),_メニュー番号).

'メニュー番号に沿った図形を「*」で表示する'(1) :-
        三角形の表示.
'メニュー番号に沿った図形を「*」で表示する'(2) :-
        四角形の表示.

三角形の表示 :-
        '図形の段数(高さ)を入力してください'(_図形の高さ),
        三角形の図形像(_図形の高さ,_図形像),
        図形表示(_図形像).

三角形の図形像(_図形の高さ,_図形像,_図形像) :-
        findall(_表示星列,(
                    between(1,_図形の段数,_現在の段),
                    三角形の表示星列(_現在の段,_表示星列)),
                _図形像).

三角形の表示星列(_現在の段,_表示星列) :-
        length(L,_現在の段),
        all(L,'*'),
        atomic_list_concat(L,_表示星列).

四角形の表示 :-
        幅を入力してください(_図形の幅),
        '図形の段数(高さ)は、キーボードから入力してください'(_図形の高さ),
        四角形の図形像(_図形の幅,_図形の高さ,_図形像),
        図形の表示(_図形像).

四角形の図形像(_図形の幅,_図形の高さ,_図形像) :-
        表示星列(_図形の幅,_表示星列),
        findall(_表示星列,(
                     between(1,_図形の高さ,_),
                     四角形の表示星列(_図形の幅,_表示星列)),
               _図形像).

図形の表示(_図形像) :-
        append(_,[_表示星列|R],_図形像),
        writef('%t\n',[_表示星列]),
        R = [].

四角形の表示星列(_現在の段,_表示星列) :-
        length(L,_現在の段),
        all(L,'*'),
        atomic_list_concat(L,_表示星列).

'図形の段数(高さ)を入力してください'(_図形の高さ) :-
        整数を得る(図形の段数,_図形の高さ),
        図形の高さ診断(_図形の高さ),!.
'図形の段数(高さ)を入力してください'(_図形の高さ) :-
        '図形の段数(高さ)を入力してください'(_図形の高さ).

図形の高さ診断(_図形の高さ) :-
        _図形の高さ > 1,!.
図形の高さ診断(_図形の高さ) :-
        writef('入力された図形の高さ %t はこの図形の高さとして適切でありません。\n再入力をお願いします。\n',[_図形の高さ]),
        fail.

'幅を入力してください'(_図形の幅) :-
        整数を得る(図形の段数,_図形の幅),
        図形の幅診断(_図形の幅),!.
'幅を入力してください'(_図形の幅) :-
        '幅を入力してください'(_図形の幅).

図形の幅診断(_図形の幅) :-
        _図形の幅 > 1,!.
図形の幅診断(_図形の幅) :-
        writef('入力された図形の幅 %t はこの図形の幅として適切でありません。\n再入力をお願いします。\n',[_図形の幅]),
        fail.

all([],_).
all([A|R],A) :-
        all(R).