このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/573
#  [1] 授業単元: STL  
#  [2] 問題文(含コード&リンク):  
#  問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, 
#  キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 
#  問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 
#  それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 
#  問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 
#  '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 
#  問 キーボードから入力した行数と空白以外の文字数を求め, 
#  行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。  
#  

数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字列) :-
        atom_chars(_文字列,_文字ならび),
        length(_文字ならび,_総文字数),
        数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字ならび,[[],[],[],[],[],[],[],[],[],[]],_出現度数ならび),
        '*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび).

数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :-
        出現回数ならびを得る(L1,L).
数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :-
        度数加算(_文字,L1,L2),
        数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L2,L),!.
数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :-
        数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L1,L).

出現回数ならびを得る(L1,L) :-
        findall(N,(
                    member(L0,L1),
                    length(L0,N)),
                L).

度数加算('0',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[[_|_0],_1,_2,_3,_4,_5,_6,_7,_8,_9]).
度数加算('1',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,[_|_1],_2,_3,_4,_5,_6,_7,_8,_9]).
度数加算('2',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,[_|_2],_3,_4,_5,_6,_7,_8,_9]).
度数加算('3',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,[_|_3],_4,_5,_6,_7,_8,_9]).
度数加算('4',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,[_|_4],_5,_6,_7,_8,_9]).
度数加算('5',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,[_|_5],_6,_7,_8,_9]).
度数加算('6',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,[_|_6],_7,_8,_9]).
度数加算('7',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,[_|_7],_8,_9]).
度数加算('8',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,[_|_8],_9]).
度数加算('9',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,_8,_[_|9]]).

'*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび) :-
        append(L0,[_出現度数|R],_出現度数ならび),
        length(L0,N),
        '百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_出現度数,_百分率),
        R = [].

'百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_総文字数,_出現度数) :-
        星表示文字列(_出現度数,_星表示文字列),
        _百分率 is _出現度数 / _総文字数,
        format(S,'~4.1f',[_百分率]),
        writef('[%t] %t%% %t\n',[N,_百分率,_星表示文字列]).

星表示文字列(_出現度数,_星表示文字列) :-
        length(L,_出現度数),
        all(L,'*'),
        atomic_list_concat(L,_星文字列).