このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/959
#  [1] 授業単元:  c言語演習 
#  [2] 問題文(含コード&リンク): 整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示するプログラムを作成しなさい、ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了するようにしなさい。 
#   
#  [実行例] 
#   
#  3        ←nの入力 
#  n=3 
#  *** 
#   * 
#  *** 
#  4 
#  n=4 
#  **** 
#     * 
#   * 
#  **** 
#  0      ←データの終わり(2以下の値) 
#     ← n=0は表示しない 
#   
#  

'整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。' :-
        '整数nを入力する'(_整数n),
        'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n).

'整数nを入力する'(_整数n) :-
        write('図形を表示するためのnの値を入力してください : '),
        get_line(Line),
        整数n入力診断(Line,_整数n),!.
'整数nを入力する'(_整数n) :-
        '整数nを入力する'(_整数n).

整数n入力診断(Line,_整数n) :-
        atom_to_term(Line,_整数n,_),
        integer(_整数n),!.
整数n入力診断(Line,_整数n) :-
        writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :-
        _整数n =< 2,
        write('2以下が入力されました。終了します。\n'),!.
'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :-
        図形を描く(_整数n,_図形),
        図形を表示する(_図形).

図形を描く(_整数n,_図形) :-
        writef('n = %t\n',[_整数n]),
        '斜めの*を描く'(_整数n,_図形),
        '最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形),!.

'斜めの*を描く'(_整数n,_図形) :-
        findall(L,(
                    length(L,_整数n),
                    append(_,[*|_],L)),
                _図形1),
        reverse(_図形1,_図形).

'最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形) :-
        append([L1],_中間部分,[L2],_図形),
        中間部分の変数を空白に変換する(_中間部分),
        all(L1,*),
        all(L2,*).

中間部分の変数を空白に変換する([]).
中間部分の変数を空白に変換する([L|R]) :-
        変数を空白に変換する(L),
        中間部分の変数を空白に変換する(R).

変数を空白に変換する([]).
変数を空白に変換する([' '|R]) :-
        変数を空白に変換する(R),!.
変数を空白に変換する([_|R]) :-
        変数を空白に変換する(R).

図形を表示する([]).
図形を表示する([L|R]) :-
        atomic_list_concat(L,S),
        writef('%t\n',[S]),
        図形を表示する(R).