このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/79
#  [1] 授業単元: システム開発 
#  [2] 問題文(含コード&リンク):  
#  以下のヒントを元に、生徒の成績を管理するプログラムを作りなさい 
#  http://ime.nu/codepad.org/vevYc04f 
#  http://ime.nu/codepad.org/rCOCOccX 
#  
#  /* seiseki.c 成績処理システム */
#  #include /* 標準入出力 */
#  #include /* 標準ライブラリー */
#  #include /* 数学的関数 */
#  #include /* 文字列関数 */
#  #define SEN "--------------------\n" /* マクロ定義 */
#  #define KEISEN "=====================\n" 
#  
#  /* サブルーチンの宣言 */
#  void data_write(void); /* データの書き込み */
#  void data_read(void); /* データの読み込み */
#  void data_disp(void); /* 成績一覧表の表示 */
#  void data_kensk(void); /* 検索処理 */
#  void the_end(void); /* プログラムの終了処理 */
#  
#  /* 変数, 構造体の宣言 */
#  struct seiseki{
#  char simei[20]; /* 氏名 */
#  int bango, kokugo, eigo, suugaku; /* 番号, 国語, 英語, 数学 */
#  };
#  struct seiseki a[100]; /* 登録数は100名まで */
#  int n, i, goukei; /* 変数の定義 */
#  double heikin, std;
#  
#  main()
#  {
#  int k; /* switch-case用の処理番号 */
#  do{ /* 繰り返し処理do-while */
#  /* 初期メニュー画面 */
#  printf("\n");
#  printf("☆☆ 成績処理メニュー ☆☆\n");
#  printf(SEN);
#  printf("データの書き込み・・・・・・・・・【1】\n");
#  printf("データの読み込み・・・・・・・・・【2】\n");
#  printf("成績一覧表・・・・・・・・・・・・【3】\n");
#  printf("検索処理・・・・・・・・・・・・・【4】\n");
#  printf("終わり・・・・・・・・・・・・・・【9】\n");
#  printf(SEN);
#  printf("処理番号を入力してください:");
#  scanf("%d",&k);
#  printf("\n");
#  
#  /* 関数の呼び出し */
#  switch(k){
#  case 1:data_write();break;
#  case 2:data_read();break;
#  case 3:data_disp();break;
#  case 4:data_kensk();break;
#  case 9:the_end();break;
#  default:printf("該当番号なし\n");break;
#  }
#  }while(k < 10);
#  }
#  
#  /* 成績一覧表の作成 */
#  void data_disp(void)
#  {
#  int goukei_k=0, goukei_e=0, goukei_s=0;
#  double heikin_k=0.0, heikin_e=0.0, heikin_s=0.0;
#  double std_k=0.0, std_e=0.0, std_s=0.0;
#  
#  printf("☆☆☆ 成績一覧表 ☆☆☆\n");
#  printf(KEISEN);
#  printf("番号 名前 国語 英語 数学 合計 平均\n");
#  for(i=0;i < n;i++){
#  printf("%5d %-10s %5d %5d %5d", a[i].bango, a[i].simei, a[i].kokugo, a[i].eigo, a[i].suugaku);
#  /* 3科目の合計計算 */
#  goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku);
#  printf("%5d",goukei);
#  /* キャスト:3科目の平均計算 */
#  heikin=(double)goukei/3;
#  printf("%6.1f\n",heikin);
#  }
#  printf("\n");
#  
#  /* 各科目の合計計算 */
#  for(i=0;i < n;i++){
#  goukei_k+=a[i].kokugo;
#  goukei_e+=a[i].eigo;
#  goukei_s+=a[i].suugaku;
#  }
#  
#  /* 各科目の平均計算 */
#  heikin_k=(double)goukei_k/n;
#  heikin_e=(double)goukei_e/n;
#  heikin_s=(double)goukei_s/n;
#  
#  /* 偏差の二乗和の計算 */
#  for(i=0;i < n;i++){
#  std_k+=pow((a[i].kokugo-heikin_k),2);
#  std_e+=pow((a[i].eigo-heikin_e),2);
#  std_s+=pow((a[i].suugaku-heikin_s),2);
#  }
#  
#  /* 標準偏差の計算 */
#  std_k=sqrt(std_k/n);
#  std_e=sqrt(std_e/n);
#  std_s=sqrt(std_s/n);


'繰り返し処理do-while'(P) :-
        'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P).

初期メニュー画面(_k) :-
        '/* 初期メニュー画面 */
printf("\n");
printf("☆☆ 成績処理メニュー ☆☆\n");
printf(SEN);
printf("データの書き込み・・・・・・・・・【1】\n");
printf("データの読み込み・・・・・・・・・【2】\n");
printf("成績一覧表・・・・・・・・・・・・【3】\n");
printf("検索処理・・・・・・・・・・・・・【4】\n");
printf("終わり・・・・・・・・・・・・・・【9】\n");
printf(SEN);
printf("処理番号を入力してください:");
scanf("%d",&k);
printf("\n");'(_k).

関数の呼び出し(_k) :-
        '/* 関数の呼び出し */
switch(k){
case 1:data_write();break;
case 2:data_read();break;
case 3:data_disp();break;
case 4:data_kensk();break;
case 9:the_end();break;
default:printf("該当番号なし\n");break;
}'(_k).

'3科目の合計計算'(_i,_a,_goukei) :-
        '/* 3科目の合計計算 */
goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku);
printf("%5d",goukei);'(_i,_a,_goukei).

'キャスト:3科目の平均計算'(_goukei,_heikin) :-
        '/* キャスト:3科目の平均計算 */
heikin=(double)goukei/3;
printf("%6.1f\n",heikin);'(_goukei,_heikin).

各科目の合計計算(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :-
        '/* 各科目の合計計算 */
for(i=0;i < n;i++){
goukei_k+=a[i].kokugo;
goukei_e+=a[i].eigo;
goukei_s+=a[i].suugaku;
}'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s).

各科目の平均計算(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :-
        '/* 各科目の平均計算 */
heikin_k=(double)goukei_k/n;
heikin_e=(double)goukei_e/n;
heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s).

偏差の二乗和の計算(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :-
        '/* 偏差の二乗和の計算 */
for(i=0;i < n;i++){
std_k+=pow((a[i].kokugo-heikin_k),2);
std_e+=pow((a[i].eigo-heikin_e),2);
std_s+=pow((a[i].suugaku-heikin_s),2);
}'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s).

標準偏差の計算(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :-
        '/* 標準偏差の計算 */
std_k=sqrt(std_k/n);
std_e=sqrt(std_e/n);
std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s).


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

'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P) :-
        between(1,10,N),
        call(P),
        N = 10.

'/* 初期メニュー画面 */
printf("\n");
printf("☆☆ 成績処理メニュー ☆☆\n");
printf(SEN);
printf("データの書き込み・・・・・・・・・【1】\n");
printf("データの読み込み・・・・・・・・・【2】\n");
printf("成績一覧表・・・・・・・・・・・・【3】\n");
printf("検索処理・・・・・・・・・・・・・【4】\n");
printf("終わり・・・・・・・・・・・・・・【9】\n");
printf(SEN);
printf("処理番号を入力してください:");
scanf("%d",&k);
printf("\n");'(_k) :-
        write('\n'),
        writef('☆☆ 成績処理メニュー ☆☆\n'),
        write('%t',['--------------------\n']),
        write('データの書き込み・・・・・・・・・【1】\n'),
        write('データの読み込み・・・・・・・・・【2】\n'),
        write('成績一覧表・・・・・・・・・・・・【3】\n'),
        write('検索処理・・・・・・・・・・・・・【4】\n'),
        write('終わり・・・・・・・・・・・・・・【9】\n'),
        write('--------------------\n'),
        write('処理番号を入力してください:'),
        整数を得る(_k),
        write('\n').

'/* 関数の呼び出し */
switch(k){
case 1:data_write();break;
case 2:data_read();break;
case 3:data_disp();break;
case 4:data_kensk();break;
case 9:the_end();break;
default:printf("該当番号なし\n");break;
}'(_k) :-
        '_kの値によって述語を呼び出す'(_k).

'_kの値によって述語を呼び出す'(1) :-
        data_write.
'_kの値によって述語を呼び出す'(2) :-
        data_read.
'_kの値によって述語を呼び出す'(3) :-
        data_disp.
'_kの値によって述語を呼び出す'(4) :-
        data_kensk.
'_kの値によって述語を呼び出す'(9) :-
        the_end.

'/* 3科目の合計計算 */
goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku);
printf("%5d",goukei);'(_i,_a,_goukei) :-
        nth0(_i,_a,[_kokugo,_eigo,_suugaku]),
        _goukei is _kokugo + _eigo + _suugaku,
        writef('%t',[_goukei]).

'/* キャスト:3科目の平均計算 */
heikin=(double)goukei/3;
printf("%6.1f\n",heikin);'(_goukei,_heikin) :-
        _heikin is _goukei / 3,
        format('~1f\n',[_heikin]).

'/* 各科目の合計計算 */
for(i=0;i < n;i++){
goukei_k+=a[i].kokugo;
goukei_e+=a[i].eigo;
goukei_s+=a[i].suugaku;
}'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :-
        各科目の合計計算(0,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s).

各科目の合計計算(_n_1,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :-
        _n_1 < _n,
        nth1(_nth1,_a,[_kokugo,_eigo,_suugaku]),
        _goukei_k_2 is _goukei_k_1 + _kokugo,
        _goukei_e_2 is _goukei_e_1 + _eigo,
        _goukei_s_2 is _goukei_s_1 + _suugaku,
        _n_2 is _n_1 + 1,
        各科目の合計計算(_n_2,_n,_a,_goukie_k_2,_goukei_e_2,_goukei_s_2,_goukie_k,_goukei_e,_goukei_s).
各科目の合計計算(_n_1,_n,_a,_goukie_k,_goukei_e,_goukei_s,_goukie_k,_goukei_e,_goukei_s) :-
        _n_1 >= _n.

'/* 各科目の平均計算 */
heikin_k=(double)goukei_k/n;
heikin_e=(double)goukei_e/n;
heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :-
        _heikin_k is _heikin_k_1 + _goukei_k / _n,
        _heikin_e is _heikin_e_1 + _goukei_e / _n,
        _heikin_s is _heikin_s_1 + _goukei_s / _n.


'/* 偏差の二乗和の計算 */
for(i=0;i < n;i++){
std_k+=pow((a[i].kokugo-heikin_k),2);
std_e+=pow((a[i].eigo-heikin_e),2);
std_s+=pow((a[i].suugaku-heikin_s),2);
}'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :-
        偏差の二乗和の計算(0,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s).

偏差の二乗和の計算(_i_1,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :-
        _i_1 < _n,
        偏差の二乗を加える(_i_1,_n,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2),
        _i_2 is _i_1 + 1,
        偏差の二乗和の計算(_i_2,_n,_a,_std_k_2,_std_e_2,_std_s_2,_std_k,_std_e,_std_s).
偏差の二乗和の計算(_i_1,_n,_a,_std_k,_std_e,_std_s,_std_k,_std_e,_std_s) :-
        _i_1 >= _n.

偏差の二乗を加える(_i_1,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2) :-
        nth1(_i_1,_a,[_kokugo_heikin_k,_eigo_heikin_e,_suugaku_heikin_s]),
        _std_k_2 is _std_k_1 + _kokugo_heikin_k ^ 2,
        _std_e_2 is _std_e_1 + _eigo_heikin_e ^ 2,
        _std_s_2 is _std_s_1 + _suugaku_heikin_s ^ 2.



'/* 標準偏差の計算 */
std_k=sqrt(std_k/n);
std_e=sqrt(std_e/n);
std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :-
        _std_k is sqrt(_std_k_1) / _n,
        _std_e is sqrt(_std_e_1) / _n,
        _std_s is sqrt(_std_s_1) / _n.