このディレクトリの索引

# 入力件数nをキーボードより入力し、n人分のテストデータを入力する。
# その際、合計点、最高点、最低点を求め、最後に平均点を計算しそれぞれを出力するプログラムを作成せよ。
# ただし、平均点は実数型とし小数点第2位まで出力する。
# 平均点以外の変数は整数型とする。
#
# 問?棒グラフ出力プログラム
# 値2つを入力し、*を横に並べて棒グラフ状に出力するプログラム。
# 大きい値の方の棒グラフが上に来るようにすること。
# (値として0〜50までしか入力されないものとする)


'値2つを入力し(値として0〜50までしか入力されないものとする)、*を横に並べて棒グラフ状に出力するプログラム。大きい値の方の棒グラフが上に来るようにすること。' :-
        '値2つを入力し(値として0〜50までしか入力されないものとする)'(_値1,_値2),
        '大きい順に*を横に並べて棒グラフ状に'(_値1,_値2,_星文字列1,_星文字列2),
        出力する(_星文字列1,_星文字列2).

'値2つを入力し(値として0〜50までしか入力されないものとする)'(_値1,_値2) :-
        整数を得る('整数(0-50)',between(0,50,_値1),_値1),
        整数を得る('整数(0-50)',between(0,50,_値2),_値2).

'大きい順に*を横に並べて棒グラフ状に'(_値1,_値2,_星文字列1,_星文字列2) :-
        _値1 >= _値2,
        二つの星表示文字列(_値1,_値2,_星文字列1,_星文字列2).
'大きい順に*を横に並べて棒グラフ状に'(_値1,_値2,_星文字列1,_星文字列2) :-
        _値1 < _値2,
        二つの星表示文字列(_値2,_値1,_星文字列1,_星文字列2).

二つの星表示文字列(_等しいか大きい値,_小さい値,_星文字列1,_星文字列2) :-
        星表示文字列(_等しいか大きい値,_星文字列1),
        星表示文字列(_小さい値,_星文字列2).

星表示文字列(_値,_星文字列) :-
        findall(*,between(1,_値,_),_星ならび),
        atomic_list_concat(_星ならび,_星文字列).

出力する(_星文字列1,_星文字列2) :-
        writef('%t\n%t\n',[_星文字列1,_星文字列2]).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

縦方向に棒グラフ状出力(A,B) :-
    星ならびを得る(50,A,B,L),
    棒グラフ状に印字(L).

星ならびを得る(0,_,_,[]).
星ならびを得る(N,A,B,[[X1,X2]|R]) :-
    空白か星か(N,A,B,X1,X2),
    N2 is N - 1,
    星ならびを得る(N2,A,B,R).

空白か星か(N,A,B,' ',' ') :-
        N > A,
        N > B.
空白か星か(N,A,B,' ','*') :-
        N > A,
        N =< B.
空白か星か(N,A,B,'*',' ') :-
        N =< A,
        N > B.
空白か星か(N,A,B,'*','*') :-
        N =< A,
        N =< B.

棒グラフ状に印字([]).
棒グラフ状に印字([L|R]) :-
    writef(' %t %t\n',L),
    棒グラフ状に印字(R).