このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/278
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク) : 起動するとローマ字で姓と名を入力、
#  姓と名の合計ポイントが基本のポイント、姓と名の合計が7の倍数なら最終ポイントは1.5倍、
#  姓と名にl,u,c,k,yが含まれていたら追加で、lとcは1ポイント、他は1ポイント、
#  tとbが文字に含まれていた場合3ポイント追加するプログラムの作成 
#   

'起動するとローマ字で姓と名を入力、姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。合計点が7の倍数なら最終ポイントは1.5倍にする。' :-
        起動するとローマ字で姓と名を入力(_姓,_名),
        '姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点),
        '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_合計点,_最終ポイント),
        writef('最終ポイントは %t 点です。',[_最終ポイント]).

起動するとローマ字で姓と名を入力(_姓,_名) :-
        write('ローマ字で姓を入力してください : '),
        get_line(_姓),
        write('ローマ字で名を入力してください : '),
        get_line(_名).

'姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点) :-
        姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント),
        '姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点),
        _合計点 is _基本ポイント + _追加点.

姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント) :-
        atomic_list_concat([_姓,_名],_姓名),
        char_codes(_姓名,Codes),
        標準偏差(Codes,_基本ポイント_1),
        _基本ポイント is truncate(_基本ポイント_1).

'姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点) :-
        姓と名にlが含まれていたら1ポイント追加する(_姓,_名,_追加点_1),
        姓と名にcが含まれていたら1ポイント追加する(_姓,_名,_追加点_2),
        他はどれかが入っていたら1ポイント追加する(_姓,_名,_追加点_3),
        姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,_追加点_4),
        _追加点 is _追加点_1 + _追加点_2 + _追加点_3 + _追加点_4.

姓と名にlが含まれていたら1ポイント追加する(_姓,_名,1) :-
        sub_atom(_姓,_,1,_,'l'),
        sub_atom(_名,_,1,_,'l'),!.
姓と名にlが含まれていたら1ポイント追加する(_,_,0).

姓と名にcが含まれていたら1ポイント追加する(_姓,_名,1) :-
        sub_atom(_姓,_,1,_,'c'),
        sub_atom(_名,_,1,_,'c'),!.
姓と名にcが含まれていたら1ポイント追加する(_,_,0).

他はどれかが入っていたら1ポイント追加する(_姓,_名,1) :-
        member(A,[u,k,y]),
        sub_atom(_姓,_,1,_,A),
        sub_atom(_名,_,1,_,A),!.
他はどれかが入っていたら1ポイント追加する(_,_,0).

姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,3) :-
        sub_atom(_姓,_,1,_,t),
        sub_atom(_名,_,1,_,g),
        sub_atom(_姓,_,1,_,t),
        sub_atom(_名,_,1,_,g),!.
姓と名にtとgが含まれていたら3ポイント追加する(_,_,0).

'姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_最終ポイント) :-
        0 is _点数 mod 7,
        _最終ポイント is truncate(_点数 * 1.5),!.
'姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_点数).
        

標準偏差(L,V) :-
        length(L,N),
        相加平均(L,M),
        標準偏差(L,N,M,0.0,V).

標準偏差([],N,M,S,V) :-
        V is sqrt(S / (N - 1)),!.
標準偏差([A|R],N,M,S,V) :-
        S1 is (A - M) ^ 2,
        S2 is S + S1,
        標準偏差(R,N,M,S2,V).

相加平均(L,M) :-
        length(L,N),
        相加平均(L,N,0.0,M).

相加平均([],N,S,M) :-
        M is S / N,!.
相加平均([A|R],N,S,M) :-
        S1 is S + A,
        相加平均(R,N,S1,M).