このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/383
#   
#  [1] 授業単元:プログラミング演習 
#   
#  [2] 問題文(含コード&リンク): 
#   
#   
#  http://ime.nu/codepad.org/bMCs37CD 
#   
#  
#  1):
#  n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力するプログラムを作成し、動作を確認せよ。
#  ただし、整数nと入力ファイル名はコマンドライン引数とすること。
#  また、プログラム内ではn個の実数は配列x[]に読み込むこと、すなわち、
#  double *x;
#  int n;
#  n=atoi(argv[1]);
#  x=(double *)malloc(sizeof(double)*n);
#  
#  2):
#  #include 
#  int main(){
#  int x=100;
#  int y=500;
#  int *ptr=&x;
#  
#  printf("*ptr=%d\n",*ptr);
#  *ptr=400;
#  printf("x=%d\n",x);
#  printf("y=%d\n",y);
#  
#  return 0;
#  }
#  を関数化せよ。
#  すなわち、実数からなる配列x[]とその要素数nが与えられたとき、それらnこの実数の最大値、採草地、および平均値を求める関数。
#  void max_min_mean(double x[],int n,double *a,double *b,,double *c)
#  を作成し、動作を確認せよ。
#  
#  3):
#  西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。
#  ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。
#  
#  int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}};
#  
#  結果は標準入出力とする。
#  
#  
#  4):
#  身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求めるプログラムを作成する。身長検査データは標準入力からでもプログラムに記述でもどちらでもいい。
#  
#  結果 平均身長 〇〇cm
#     視力の分布 0.0〜:○人
#           0.1〜:○人(以下略
#  
#  struct{
#  
#  }

'n個の実数からなるファイルを読み込み、それらの最大値、最小値、および平均値をディスプレイに出力する'(_n個,_残り実数ならび) :-
        'n個の実数からなるファイルを読み込み'(_実数ならび,_残り実数ならび),
        'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび).

'n個の実数からなるファイルを読み込み'(_n個,_ファイル,_実数ならび),
        get_lines(_ファイル,Lines),
        'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび).

'n個の実数ならびを生成'(_n個,Lines,_実数ならび,_残り実数ならび) :-
        length(_実数ならび,_n個),
        findall(_実数,(
                    append(L0,[_実数|_],Lines),
                    float(_実数)),
                _実数ならびの一),
        append(_実数ならび,_残り実数ならび,_実数ならびの一),!.

'それらの最大値、最小値、および平均値をディスプレイに出力する'(_実数ならび) :-
        最大値(_実数ならび,_最大値),
        最小値(_実数ならび,_最小値),
        平均値(_実数ならび,_平均値),
        writef('最大値 = %t,最小値 = %t,平均値 = %t\n',[_最大値,_最小値,_平均値]).

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

最大値([A|L],_最大値) :- !.
        最大値(L,A,_最大値),

最大値([],_最大値,_最大値) :- !.
最大値([A|R],_最大値_1,_最大値) :-
        A @> _最大値_1,
        最大値(R,A,_最大値).
最大値([A|R],_最大値_1,_最大値) :-
        最大値(R,_最大値_1,_最大値).

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

最大値([_最大値],_最大値) :- !.
最大値([A1,A2],_最大値) :-
        大きい方が最大値(A1,A2,_最大値),!.
最大値(_実数ならび,_最大値) :-
        append(L1,L2,_実数ならび),
        length(L1,N),
        length(L2,N),
        最大値(L1,Max1),
        最大値(L2,Max2),
        大きい方が最大値(Max1,Max2,_最大値),!.
最大値([A|_実数ならび],_最大値) :-
        最大値(_実数ならび,Max1),
        大きい方が最大値(A,Max1,_最大値).

大きい方が最大値(Max1,Max2,Max1) :-
        Max1 @>= Max2,!.
大きい方が最大値(Max1,Max2,Max2) :-
        Max1 @< Max2.

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

最小値([A|L],_最小値) :- !.
        最小値(L,A,_最小値),

最小値([],_最小値,_最小値) :- !.
最小値([A|R],_最小値_1,_最小値) :-
        A @< _最小値_1,
        最小値(R,A,_最小値).
最小値([A|R],_最小値_1,_最小値) :-
        最小値(R,_最小値_1,_最小値).

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

最小値([_最小値],_最小値) :- !.
最小値([A1,A2],_最小値) :-
        小きい方が最小値(A1,A2,_最小値),!.
最小値(_実数ならび,_最小値) :-
        append(L1,L2,_実数ならび),
        length(L1,N),
        length(L2,N),
        最小値(L1,Max1),
        最小値(L2,Max2),
        小きい方が最小値(Max1,Max2,_最小値),!.
最小値([A|_実数ならび],_最小値) :-
        最小値(_実数ならび,Max1),
        小きい方が最小値(A,Max1,_最小値).

小きい方が最小値(Max1,Max2,Max1) :-
        Max1 @< Max2,!.
小きい方が最小値(Max1,Max2,Max2) :-
        Max1 @> Max2.

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

平均値(L,_平均値) :-
        sum(L,_合計),
        length(L,_要素数),
        _平均値 is _合計 / _要素数.

sum([],0).
sum([A|R],S) :-
        sum(R,S1),
        S is A + S1.