このディレクトリの索引

% 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)),_n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- それらの平均と標準偏差を(_n個,_n個の実数,_平均,_標準偏差), 出力する(_平均,_標準偏差). それらの平均と標準偏差を(_n個,_n個の実数,_n個の実数の平均,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差). 出力する(_n個の実数の平均,_n個の実数の標準偏差) :- writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計), 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差). 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計) :- findsum(_個々の実数と平均の差の二乗,( 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗)),_個々の実数と平均の差の二乗の合計). 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗) :- 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2. 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差) :- _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 実数を得る(_個々の実数) :- 行入力(_行), read_term_from_atom(_行,_実数,[]), 実数診断(_行,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 実数診断(_行,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[_行]), fail. findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)), _n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差), writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), findsum(_個々の実数と平均の差の二乗,( 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2), _個々の実数と平均の差の二乗の合計), _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 実数を得る(_個々の実数) :- get_line(Line), read_term_from_atom(Line,_実数,[]), 実数診断(Line,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 実数診断(Line,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/79 # # [1] 授業単元: システム開発 # [2] 問題文(含コード&amp;リンク): # 以下のヒントを元に、生徒の成績を管理するプログラムを作りなさい # 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. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/769 # # 【お題】 # 1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、 # 2) その平均値と、 # 3) 各要素の平均値からの差の二乗値の平均の平方根(標準偏差)を算出して、 # 4) 1)〜3)の結果を出力するコードをどう書く? # # 言語のベーサルな表現実装力が見てみたいので、 # 可能であれば import や require 等の # 機能追加をしない素の状態でのチャレンジが望ましい。 # # 出力例: # [77, 62, 26, 17, 88, 40, 14, 11, 4, 49] # 38.8 # 27.85964823898536 # # 正直、デフォでこれら機能を有する統計処理のLL達のアピールを期待したお題だけれど # ループ等でしか書けそうもない普通のLL勢もひねりを加えるなどして面白くして欲しい。 # # '1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、 2) その平均値と、 3) 各要素の平均値からの差の二乗値の平均の平方根 標準偏差)を算出して、 4) 1)〜3)の結果を出力する' :- '1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、'(_整数リスト), '2) その平均値と、'(_整数リスト,_平均値), '3) 各要素の平均値からの差の二乗値の平均の平方根(標準偏差)を算出して、 '(_整数リスト,_平均値,_標準偏差), '4) 1)〜3)の結果を出力する'(_整数リスト,_平均値,_標準偏差). '1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、'(_整数リスト) :- findall(_ランダムに抽出した整数,( between(1,10,_), _ランダムに抽出した整数 is random(100) + 1), _整数リスト). '2) その平均値と、'(_整数リスト,_平均値) :- length(_整数リスト,_要素数), sum(_整数リスト,_合計), _平均値 is _合計 / _要素数. '3) 各要素の平均値からの差の二乗値の平均の平方根(標準偏差)を算出して、 '(_整数リスト,_平均値,_標準偏差) :- length(_整数リスト,_要素数), '各要素の平均値からの差の二乗値の合計'(_整数リスト,_平均値,_各要素の平均値からの差の二乗値の合計), 二乗値の平均の平方根(_要素数,_各要素の平均値からの差の二乗値の合計,_標準偏差). '各要素の平均値からの差の二乗値の合計'([],_,0). '各要素の平均値からの差の二乗値の合計'([_要素|R],_平均値,S_1) :- '各要素の平均値からの差の二乗値の合計'(R,_平均値,S_2), S_1 is (_平均値 - _要素) * (_平均値 - _要素) + S_2. 二乗値の平均の平方根(_要素数,_各要素の平均値からの差の二乗値の合計,_標準偏差) :- _二乗値の平均 is _各要素の平均値からの差の二乗値の合計 / _要素数, _標準偏差 is sqrt(_二乗値の平均). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/90 # # 助けてください! # C言語の課題です。 # # 「自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示」 # を表すソースを教えてください。 # '自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示' :- 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム), 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび), '平均、分散、標準偏差を表示'(_自分のフルネームのアスキーコードならび). 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム) :- write('自分のフルネームをアルファベット小文字で入力してください : '), get_line(_自分のフルネーム). 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- atom_codes(_自分のフルネーム,_自分のフルネームのアスキーコードならび). '平均、分散、標準偏差を表示'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- 相加平均(_自分のフルネームのアスキーコードならび,_相加平均), 分散(_自分のフルネームのアスキーコードならび,_分散), 標準偏差(_自分のフルネームのアスキーコードならび,_標準偏差), writef('自分のフルネーム = %t, 自分のフルネームのアスキーコード = %t, 平均 = %t, 分散 = %t, 標準偏差 = %t\n',[_自分のフルネーム,_自分のフルネームのアスキーコードならび,_平均,_分散,_標準偏差]). 相加平均(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). 分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 標準偏差(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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/49 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # 上記のプログラムに5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻すhensachi関数を追加せよ。 # そして5人のテストの得点を整数型配列data[5]の各要素それぞれ入力すると、5人の得点の平均点に加えて偏差値も出力するプログラムをheikin関数およびhensachi関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、5人の得点の偏差値を戻す'(_5人の得点の偏差値) :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), '5人の得点の偏差値を戻す'(_5人の得点ならび,_5人の得点の偏差値). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- length(_5人の得点ならび,5), findall(_得点,( append(Ln,[_|_],_5人の得点ならび), '得点(10点満点)を受け取る'(Ln,_得点)), _5人の得点ならび). '得点(10点満点)を受け取る'(Ln,_得点) :- length([_|Ln],_何人目), writef('%t人目の得点(10点満点)を入力してください : ',[_何人目]), get_line(Line), '診断: 得点(10点満点)を受け取る'(Line,_得点),!. '得点(10点満点)を受け取る'(Ln,_得点) :- '得点(10点満点)を受け取る'(Ln,_得点). '診断: 得点(10点満点)を受け取る'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 10,!. 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 偏差値(_標本ならび,_偏差値ならび) :- 平均値(_標本ならび,_平均値), 標準偏差(_標本ならび,_標準偏差), findall(_偏差値,( member(_値,_標本ならび), 偏差値(_値,_平均値,_標準偏差,_偏差値)), _偏差値ならび). 標準偏差(_標本ならび,V) :- length(_標本ならび,N), 平均値(_標本ならび,M), 標準偏差(_標本ならび,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). % 以下のサイトは 標準偏差(_標本ならび,_標準偏差) :- length(_標本ならび,_標本数) 相加平均(_標本ならび,_相加平均), 標準偏差(_標本ならび,_標本数,_相加平均,0.0,_標準偏差). 標準偏差([],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). 相加平均(_標本ならび,_相加平均) :- length(_標本ならび,_標本数) 相加平均(_標本ならび,_標本数,0.0,_相加平均). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). % 以下のサイトは # [1] 授業単元:プログラム設計 # [2] 問題文:以下の条件で売り上げ集計プログラムを作りなさい。 #  ・クラスを用いる(困難なら構造体で可) #  ・店舗毎に名前・売り上げを入力し、平均、標準偏差を計算 #  ・売り上げ毎に店舗を並び替える #  ・店舗数は任意。 #  ・並び替えは簡単でよい。店舗数が少ない場合、単純に比較するだけでよい。 # [3] コンパイラ名とバージョン: Microsoft Visual C++ # [4] 言語:C # [5] その他の制限: 特にありません。 '店舗(店舗数は任意)毎に名前・売り上げを入力し、平均、標準偏差を計算する'(_平均,_標準偏差) :- abolish(売り上げ/2), '店舗(店舗数は任意)毎に名前・売り上げを入力し', '平均、標準偏差を計算する'(_平均,_標準偏差), 売り上げ毎に店舗を並び替える. '店舗(店舗数は任意)毎に名前・売り上げを入力し' :- 店舗数は任意(_店舗数), length(Ln,_店舗数), '店舗(店舗数は任意)毎に名前・売り上げを入力し'(Ln,_店舗数). '店舗(店舗数は任意)毎に名前・売り上げを入力し'(Ln,_店舗数) :- append(L0,[_|R],Ln), '店舗名・売り上げを入力'(L0,_店舗数,_店舗名,_売り上げ), assertz(売り上げ(_店舗名,_売り上げ)), R = []. '店舗名・売り上げを入力'(L0,_店舗数,_店舗名,_売り上げ) :- length([_|L0],_何番目), writef('%t/%t番目の 店舗名,売り上げをカンマ区切りで入力してください : ',[_何番目,_店舗数]), readln([_店舗名,_売り上げ]). 店舗数は任意(_店舗数) :- write('店舗数を入力してください : '), get_integer(_店舗数). '平均、標準偏差を計算する'(_平均,_標準偏差) :- findall(_売り上げ,( 売り上げ(_,_売り上げ)), L), 相加平均(L,_平均), 標準偏差(L,_標準偏差). 売り上げ毎に店舗を並び替える :- 売り上げ毎に(_降順売り上げならび), 店舗を並び替える(_降順売り上げならび). 売り上げ毎に(_降順売り上げならび) :- findall([_売り上げ,_店舗名],( 売り上げ(_店舗名,_売り上げ)), _売り上げならび), sort(_売り上げならび,_昇順売り上げならび), reverse(_昇順売り上げならび,_降順売り上げならび). 店舗を並び替える(_降順売り上げならび) :- abolish(売り上げ/2), append(_,[[_売り上げ,_店舗名]|R],_降順売り上げならび), assertz(売り上げ(_店舗名,_売り上げ)), R = []. % 以下のサイトは # [1] 授業単元:プログラム設計 # [2] 問題文:以下の条件で売り上げ集計プログラムを作りなさい。 #  ・クラスを用いる(困難なら構造体で可) #  ・店舗毎に名前・売り上げを入力し、平均、標準偏差を計算 #  ・売り上げ毎に店舗を並び替える #  ・店舗数は任意。 #  ・並び替えは簡単でよい。店舗数が少ない場合、単純に比較するだけでよい。 # [3] コンパイラ名とバージョン: Microsoft Visual C++ # [4] 言語:C # [5] その他の制限: 特にありません。 '店舗(店舗数は任意)毎に名前・売り上げを入力し、平均、標準偏差を計算する'(_平均,_標準偏差) :- abolish(売り上げ/2), '店舗(店舗数は任意)毎に名前・売り上げを入力し', '平均、標準偏差を計算する'(_平均,_標準偏差). '店舗(店舗数は任意)毎に名前・売り上げを入力し' :- 店舗数は任意(_店舗数), '店舗(店舗数は任意)毎に名前・売り上げを入力し'(1,_店舗数). '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N,_店舗数) :- N > _店舗数,!. '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N,_店舗数) :- writef('%t番目の 店舗名,売り上げをカンマ区切りで入力してください : ',[N]), readln([_店舗名,_売り上げ]), assertz(売り上げ(_店舗名,_売り上げ)), N_2 is N + 1, '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N_2,_店舗数). 店舗数は任意(_店舗数) :- write('店舗数を入力してください : '), get_integer(_店舗数). '平均、標準偏差を計算する'(_平均,_標準偏差) :- findall(_売り上げ,( 売り上げ(_,_売り上げ)), L), 相加平均(L,_平均), 標準偏差(L,_標準偏差). 売り上げ毎に店舗を並び替える :- 売り上げ毎に(_降順売り上げならび), 店舗を並び替える(_降順売り上げならび). 売り上げ毎に(_降順売り上げならび) :- findall([_売り上げ,_店舗名],( 売り上げ(_店舗名,_売り上げ)), _売り上げならび), sort(_売り上げならび,_昇順売り上げならび), reverse(_昇順売り上げならび,_降順売り上げならび). 店舗を並び替える(_降順売り上げならび) :- abolish(売り上げ/2), append(_,[[_売り上げ,_店舗名]|R],_降順売り上げならび), assertz(売り上げ(_店舗名,_売り上げ)), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/858 # # # 5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求めるプログラムを作れ。 # # # 授業の課題です # 解説付きでお願いします。 # # '5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求める' :- '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび), 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散), append(_5人の学生の成績ならび,[_平均点,_分散],_表示情報), writef('%t,%t,%t,%t,%t の 平均点は %t, 分散は %t です。\n,_表示情報). '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび) :- length(_5人の学生の成績ならび,5), findall(_成績,( append(L0,[_成績|_],_5人の学生の成績ならび), length([_|L0],_何個目), write('成績(0-100点)の[%t個目]を入力してください : ',[_何個目]), 成績入力(_成績)), _5人の学生の成績ならび). 成績入力(_成績) :- get_line(Line), 成績入力診断(Line,_成績),!. 成績入力(_成績) :- 成績入力(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績), _成績 >= 0, _成績 =< 100,!. 成績入力診断(Line,_成績) :- writef('入力された %t からは成績(0-100点)が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散) :- それらの平均点と(_5人の学生の成績ならび,_平均点), 分散を求める(_5人の学生の成績ならび,_分散). それらの平均点と(_5人の学生の成績ならび,_平均点) :- findavg(_成績,( append(_,[_成績|_],_5人の学生の成績ならび)), _平均点). 分散を求める(_5人の学生の成績ならび,_平均点,_分散) :- findavg(_偏差,( append(_,[_成績|_],_5人の学生の成績ならび), _偏差 is (_成績 - _平均点) * (_成績 - _平均点)), _分散). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/143 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク):数値(1~100)を入力し、入力された数の # 平均、標準偏差、最大値、最小値を求めるプログラムを作りなさい。 # '数値(1~100)を入力し、入力された数の平均、標準偏差、最大値、最小値を求める'(平均,_標準偏差,_最大値,_最小値) :- '平均、標準偏差、最大値、最小値を求めるための対象データはリストとする'(L), '数値(1~100)を入力し、'(L), length(L,_要素数), '数の平均、標準偏差、最大値、最小値を求める'(L,_平均,_標準偏差,_最大値,_最小値). '平均、標準偏差、最大値、最小値を求めるための対象データはリストとする'([_|_]). '数の平均、標準偏差、最大値、最小値を求める'([N|R],_平均,_標準偏差,_最大値,_最小値) :- length([N|R],_要素数), '数の平均、標準偏差、最大値、最小値を求める'(R,_要素数,N,S,_平均,N,N,_最大値,_最小値), _標準偏差 is abs(sqrt((S / (_要素数 - 1)))). '数の平均、標準偏差、最大値、最小値を求める'([],_要素数,_累計,0,_平均,_最大値,_最小値,_最大値,_最小値) :- _平均 is _累計 / _要素数. '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計1,V,_平均,_最大値1,_最小値1,_最大値,_最小値) :- N > _最大値1, _累計2 is N + _累計1, '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計2,V1,_平均,N,_最小値1,_最大値,_最小値), V is (N - _平均) * (N - _平均) + V1. '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計1,V,_平均,_最大値1,_最小値1,_最大値,_最小値) :- N < _最小値1, _累計2 is N + _累計1, '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計2,V1,_平均,_最大値1,N,_最大値,_最小値), V is (N - _平均) * (N - _平均) + V1. '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計1,V,_平均,_最大値1,_最小値1,_最大値,_最小値) :- N >= _最小値, N =< _最大値, _累計2 is N + _累計1, '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計2,V1,_平均,_最大値1,_最小値1,_最大値,_最小値), V is (N - _平均) * (N - _平均) + V1. '数値(1~100)を入力し、'(L) :- write('? '), get_integer(N,L). '数値(1~100)を入力し、'(N,[]) :- 負数が入力されたら数値の入力を終了することにする(N),!. '数値(1~100)を入力し、'(N,[N|R]) :- N >= 1, N =< 100, write('? '), get_integer(N2), '数値(1~100)を入力し、'(N2,R). '数値(1~100)を入力し、'(_,R) :- write('再入力 ? '), get_integer(N), '数値(1~100)を入力し、'(N,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/143 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク):数値(1~100)を入力し、入力された数の # 平均、標準偏差、最大値、最小値を求めるプログラムを作りなさい。 # '数値(1~100)を入力し、入力された数の平均、標準偏差、最大値、最小値を求める'(平均,_標準偏差,_最大値,_最小値) :- '平均、標準偏差、最大値、最小値を求めるための対象データはリストとする'(L), '数値(1~100)を入力し、'(L), length(L,_要素数), '数の平均、標準偏差、最大値、最小値を求める'(L,_平均,_標準偏差,_最大値,_最小値). '平均、標準偏差、最大値、最小値を求めるための対象データはリストとする'([_|_]). '数の平均、標準偏差、最大値、最小値を求める'([N|R],_平均,_標準偏差,_最大値,_最小値) :- length([N|R],_要素数), '数の平均、標準偏差、最大値、最小値を求める'(R,_要素数,N,S,_平均,N,N,_最大値,_最小値), _標準偏差 is abs(sqrt((S / (_要素数 - 1)))). '数の平均、標準偏差、最大値、最小値を求める'([],_要素数,_累計,0,_平均,_最大値,_最小値,_最大値,_最小値) :- _平均 is _累計 / _要素数. '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計1,V,_平均,_最大値1,_最小値1,_最大値,_最小値) :- N > _最大値1, _累計2 is N + _累計1, '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計2,V1,_平均,N,_最小値1,_最大値,_最小値), V is (N - _平均) * (N - _平均) + V1. '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計1,V,_平均,_最大値1,_最小値1,_最大値,_最小値) :- N < _最小値1, _累計2 is N + _累計1, '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計2,V1,_平均,_最大値1,N,_最大値,_最小値), V is (N - _平均) * (N - _平均) + V1. '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計1,V,_平均,_最大値1,_最小値1,_最大値,_最小値) :- N >= _最小値, N =< _最大値, _累計2 is N + _累計1, '数の平均、標準偏差、最大値、最小値を求める'([N|R],_要素数,_累計2,V1,_平均,_最大値1,_最小値1,_最大値,_最小値), V is (N - _平均) * (N - _平均) + V1. '数値(1~100)を入力し、'(L) :- write('? '), get_integer(N,L). '数値(1~100)を入力し、'(N,[]) :- 負数が入力されたら数値の入力を終了することにする(N),!. '数値(1~100)を入力し、'(N,[N|R]) :- N >= 1, N =< 100, write('? '), get_integer(N2), '数値(1~100)を入力し、'(N2,R). '数値(1~100)を入力し、'(_,R) :- write('再入力 ? '), get_integer(N), '数値(1~100)を入力し、'(N,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/522 # # [1] 情報処理演習 # [2] 問題:何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算するプログラムを作成する.プログラムは以下の条件をみたすこと. # ・あらかじめ100個の整数型の要素を持つ配列を定義しておく. # ・scanfを用いてデータの個数を入力できること.また,scanfを用いてデータの値を配列に入力できること. # ・if文を用いて0以下,101以上のデータの個数が入力されないようにすること. # ・for文を用いること. # ・解は実数で求めること. # 実行例 # ================================ # Input integer: 5 # Input numbers: # 40 # 50 # 60 # 70 # 80 # Average: 60 # Sum: 300 # Max: 80 # Min: 40 # Standard Deviation: 14.1 # ================================ # 'あらかじめ100個の整数型の要素を持つならびを定義しておく'(_100個の整数型の要素を持つならび) :- length(_100個の整数型の要素を持つならび,100), assertz('100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび)). '何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算する' :- '100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび), データの個数を入力(_データの個数), データの入力(_データの個数,_100個の整数型の要素を持つならび), '平均・総和・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_総和,_最大値,_最小値,_標準偏差), 表示('平均: %t\n総和: %t\n最大値: %t\n最小値: %t\n標準偏差: %t\n',[_平均,_総和,_最大値,_最小値,_標準偏差]). データの個数を入力(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数入力診断(Line,_データの個数),!. データの個数を入力(_データの個数) :- データの個数を入力(_データの個数). データの個数入力診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0, _データの個数 < 101,!. データの個数入力診断(Line,_データの個数) :- writef('入力された %t はデータの個数として適切ではありません。再入力をお願いします : ',[Line]), fail. データの入力(_データの個数,_100個の整数型の要素を持つならび) :- length(L,_データの個数), findall(_整数,( append(_,[_整数|_],L), get_integer(_整数)), L), append(L,_,_100個の整数型の要素を持つならび). '平均・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_最大値,_最小値,_標準偏差) :- 平均(_100個の整数型の要素を持つならび,_平均), 総和(_100個の整数型の要素を持つならび,_総和), 最大値(_100個の整数型の要素を持つならび,_最大値), 最小値(_100個の整数型の要素を持つならび,_最小値), 標準偏差(_100個の整数型の要素を持つならび,_標準偏差). 総和([A|R],0) :- var(A),!. 総和([A|R],_総和) :- 総和(R,_総和_1), _総和 is A + _総和_1,!. 総和([],0). 平均(L,_平均) :- length(L,_要素数), _要素数 > 0, 総和(L,_総和), _平均 is _総和 / _要素数. 最大値(L,_最大値) :- append(L0,[_最大値|R],L), \+((member(V1,L0),\+(var(V1)),V1 > _最大値)), \+((member(V2,R),\+(var(V2)),V2 > 最大値)). 最小値(L,_最小値) :- append(L0,[_最小値|R],L), \+((member(V1,L0),\+(var(V1)),V1 < _最小値)), \+((member(V2,R),\+(var(V2)),V2 < 最小値)). 標準偏差([A|_],N,_,_総和,_標準偏差) :- var(A), V is sqrt(_総和 / (N - 1)),!. 標準偏差([],N,_,_総和,_標準偏差) :- V is sqrt(_総和 / (N - 1)),!. 標準偏差([A|R],N,_平均,S,_標準偏差) :- S1 is (A - _平均) ^ 2, S2 is S + S1, 標準偏差(R,N,_平均,S2,V). 標準偏差(L,_標準偏差) :- length(L,N), 算術平均(L,_平均), 標準偏差(L,N,_平均,0.0,_標準偏差). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/522 # # [1] 情報処理演習 # [2] 問題:何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算するプログラムを作成する.プログラムは以下の条件をみたすこと. # ・あらかじめ100個の整数型の要素を持つ配列を定義しておく. # ・scanfを用いてデータの個数を入力できること.また,scanfを用いてデータの値を配列に入力できること. # ・if文を用いて0以下,101以上のデータの個数が入力されないようにすること. # ・for文を用いること. # ・解は実数で求めること. # 実行例 # ================================ # Input integer: 5 # Input numbers: # 40 # 50 # 60 # 70 # 80 # Average: 60 # Sum: 300 # Max: 80 # Min: 40 # Standard Deviation: 14.1 # ================================ # 'あらかじめ100個の整数型の要素を持つならびを定義しておく'(_100個の整数型の要素を持つならび) :- length(_100個の整数型の要素を持つならび,100), assertz('100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび)). '何個かのデータをもらって,その平均,総和,最大値,最小値,標準偏差を計算する' :- '100個の整数型の要素を持つならび'(_100個の整数型の要素を持つならび), データの個数を入力(_データの個数), データの入力(_データの個数,_100個の整数型の要素を持つならび), '平均・総和・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_総和,_最大値,_最小値,_標準偏差), 表示('平均: %t\n総和: %t\n最大値: %t\n最小値: %t\n標準偏差: %t\n',[_平均,_総和,_最大値,_最小値,_標準偏差]). データの個数を入力(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数入力診断(Line,_データの個数),!. データの個数を入力(_データの個数) :- データの個数を入力(_データの個数). データの個数入力診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0, _データの個数 < 101,!. データの個数入力診断(Line,_データの個数) :- writef('入力された %t はデータの個数として適切ではありません。再入力をお願いします : ',[Line]), fail. データの入力(_データの個数,_100個の整数型の要素を持つならび) :- length(L,_データの個数), findall(_整数,( append(_,[_整数|_],L), get_integer(_整数)), L), append(L,_,_100個の整数型の要素を持つならび). '平均・最大値・最小値・標準偏差'(_100個の整数型の要素を持つならび,_平均,_最大値,_最小値,_標準偏差) :- 平均(_100個の整数型の要素を持つならび,_平均), 総和(_100個の整数型の要素を持つならび,_総和), 最大値(_100個の整数型の要素を持つならび,_最大値), 最小値(_100個の整数型の要素を持つならび,_最小値), 標準偏差(_100個の整数型の要素を持つならび,_標準偏差). 総和([A|R],0) :- var(A),!. 総和([A|R],_総和) :- 総和(R,_総和_1), _総和 is A + _総和_1,!. 総和([],0). 平均(L,_平均) :- length(L,_要素数), _要素数 > 0, 総和(L,_総和), _平均 is _総和 / _要素数. 最大値(L,_最大値) :- append(L0,[_最大値|R],L), \+((member(V1,L0),\+(var(V1)),V1 > _最大値)), \+((member(V2,R),\+(var(V2)),V2 > 最大値)). 最小値(L,_最小値) :- append(L0,[_最小値|R],L), \+((member(V1,L0),\+(var(V1)),V1 < _最小値)), \+((member(V2,R),\+(var(V2)),V2 < 最小値)). 標準偏差([A|_],N,_,_総和,_標準偏差) :- var(A), V is sqrt(_総和 / (N - 1)),!. 標準偏差([],N,_,_総和,_標準偏差) :- V is sqrt(_総和 / (N - 1)),!. 標準偏差([A|R],N,_平均,S,_標準偏差) :- S1 is (A - _平均) ^ 2, S2 is S + S1, 標準偏差(R,N,_平均,S2,V). 標準偏差(L,_標準偏差) :- length(L,N), 算術平均(L,_平均), 標準偏差(L,N,_平均,0.0,_標準偏差). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/305 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/deaimail.from.tv/up/src/up3988.jpg # # 12個の整数をxに読み込み、平均値、標準偏差を計算して、出力せよ。 '12個の整数をxに読み込み、平均値、標準偏差を計算して、出力する' :- '12個の整数をxに読み込み'(_x), 平均値を計算(_x,_平均値), 標準偏差を計算(_x,_平均値,_標準偏差), write_formatted('x=%t, 平均値=%t, 標準偏差=%t\n',[_x,_平均値,_標準偏差]). '12個の整数をxに読み込み'(_x) :- length(_x,12), 'xに読み込み'(_x). 'xに読み込み'([]) :- !. 'xに読み込み'([N|R]) :- 整数を読み込む(N), 'xに読み込み'(R). 整数を読み込む(N) :- write('整数を入力してください : '), get_line(Line), 整数入力診断(Line,N),!. 整数を読み込む(N) :- 整数を読み込む(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- write_formatted('入力された %t から整数が得られませんでした。再入力をお願いします\n',[Line]), fail. 平均値を計算(L,_平均値) :- length(L,_要素数), 合計(L,_合計値), _平均値 is _合計値 / _要素数. 合計([],0) :- !. 合計([N|R],X) :- 合計(R,Y), X is N + Y. 標準偏差を計算(L,_平均値,V) :- 標準偏差(L,N,_平均値,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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 5.1 成績データとして最初に学生数が入力され、続いてその数だけ # 0から100までの成績が入力される。入力された成績の、合計、平均、 # 標準偏差を表示するプログラムを作成せよ。ただし、学生数は100を # 越えないものとする。 '成績データとして最初に学生数が入力され、続いてその数だけ0から100までの成績が入力される。入力された成績の、合計、平均、標準偏差を表示するプログラムを作成せよ。ただし、学生数は100を越えないものとする。' :- write('学生の数を入力してください : '), get_integer(_学生の数), _学生の数 =< 100, length(L,_学生の数), その数だけ0から100までの成績が入力される(L), 合計(L,_合計), 平均(L,_平均), 標準偏差(L,_平均,_標準偏差), write_formatted('入力された成績の合計は%t,平均は%t,標準偏差は%tです。\n',[_合計,_平均,_標準偏差). 合計(L,_合計) :- 加算(L,_合計). 平均(L,_平均) :- 相加平均(L,_平均). 標準偏差(L,_平均,_標準偏差) :- length(L,_学生の数), 標準偏差(L,_学生の数,_平均,0.0,_標準偏差). 標準偏差([],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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/3 # # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイル(csv1)の中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイル(csv2)として出力せよ. #   正規化されたエクセルファイルの中にあるデータを読み込み #   そのデータをそれぞれx軸の値として #   y = x + a  の式との交点であるy軸の値をそれぞれ #   別のエクセルファイルとして出力(csv3)せよ. #   a の値は -1〜1 までの値を0.5刻みでランダムにとり #   同じ行では同じ関数を使うものとする. #   その後そのプログラムに加え #   各行に対し3つずつそれぞれランダムにaを決定した関数との接点を求め出力する. #   また6列目に使用したaの値をa1,a2,a3という形で出力(csv4)せよ. # '指定されたエクセルファイル(csv1)の中にあるデータを読み込み各列ごとにそれぞれのデータに対し[0,1]区間に正規化し別のエクセルファイル(csv2)として出力する'(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL1), 転置(LL1,LL2), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(LL2,LL3), 転置(LL3,LL4), '別のエクセルファイル(csv2)として出力する'(LL4,_別のCSVファイル). '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([],[]) :- !. '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([L1|R1],[L2|R2]) :- 相加平均(L1,_相加平均), 標準偏差(L1,_標準偏差), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(L1,_相加平均,_標準偏差,L2), '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(R1,R2). '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'([A|R1],_相加平均,_標準偏差,[B|R2]) :- B is ( A - _相加平均) / _標準偏差, '各列ごとにそれぞれのデータに対し[0,1]区間に正規化し'(R1,_相加平均,_標準偏差,R2). '別のエクセルファイル(csv2)として出力する'(_別のCSVファイル,LL) :- open(_別のCSVファイル,write,Outstream), 'CSVファイルとして出力する'(Outstream,LL), close(Outstream). 'CSVファイルとして出力する'(Outstream,[]) :- !. 'CSVファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), 'CSVファイルとして出力する'(Outstream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/956 # # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルファイルの中にあるデータを読み込み #   各列ごとにそれぞれのデータに対し[0,1]区間に正規化し #   別のエクセルファイルとして出力せよ. # '指定されたエクセルファイルの中にあるデータを読み込み各列ごとにそれぞれのデータに対し[0,1]区間に正規化し別のエクセルファイルとして出力せよ.'(_指定されたCSVファイル,_別のCSVファイル) :- get_split_lines(_指定されたCSVファイル,[' ',','],LL), 転置(LL,LL1), 行単位に正規化(LL1,LL2), 転置(LL2,LL3), csvファイルとして出力する(_別のcsvファイル,LL3). 行単位に正規化([],[]) :- !. 行単位に正規化([L1|R1],[L2|R2]) :- 相加平均(L1,_相加平均), 標準偏差(L1,_標準偏差), 正規化(L1,_相加平均,_標準偏差,L2), 行単位に正規化(R1,R2). 正規化([],_,_,[]) :- !. 正規化([A|R1],_相加平均,_標準偏差,[B|R2]) :- B is (_相加平均 - A) / _標準偏差, 正規化(R1,_相加平均,_標準偏差,R2). csvファイルとして出力する(_別のcsvファイル,LL) :- open(_別のcsvファイル,write,Outstream), append(_,[L|R],LL), concat_atom(L,',',S), write_formatted(Outstream,'%t\n',[S]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/331 # # [1] 授業単元:一般情報処理 # [2] 問題文(含コード&リンク):次のような動作をするプログラムを作成せよ。 #                配列内のデータの最小値を返す。int min() 配列内のデータの最大値を返す。int max() # 配列内のデータの平均値を返す。double mean() 配列内のデータの標準偏差を返す。double stdev() # ただしmain関数は次のものを使うこと。 #                int main(void){ # int a[15]={81,36,45,67,73,98,62,56,77,61,65,70,25,51,18}; # printf("min=%d\n",min(15,a)); # printf("max=%d\n",max(15,a)); # printf("average=%lf\n",mean(15,a)); # printf("standard deviation=%lf\n",stdev(15,a)); # return 0; } # さらに、配列a[]の各要素の偏差値を表示するプログラムを作成せよ # 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A,平均値(R,N,S1,M) . 平均値(L,M) :- length(L,N),平均値(L,N,0.0,M) . 最小値最大値([A|R],_最小値,_最大値) :- 最小値最大値(R,A,A,_最小値,_最大値). 最小値最大値([],_最小値,_最大値,_最小値,_最大値) :- !. 最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- A @> _最大値,最小値最大値(R,_最小値1,A,_最小値,_最大値),!. 最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- A @< _最小値,最小値最大値(R,A,_最大値1,_最小値,_最大値),!. 最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- 最小値最大値(R,_最小値1,_最大値1,_最小値,_最大値),!. 標準偏差(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). 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50 . 偏差値(L,_偏差値ならび) :- 平均値(L,_平均値), 標準偏差(L,_標準偏差), findall(_偏差値,(member(_値,L) ,偏差値(_値,_平均値,_標準偏差,_偏差値)),_偏差値ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/456 # # (1) 【main 関数のみ】 # int型配列 x[101] を定義し、キーボードから人数 N と N 人分の点数を入力し、平均点と # 偏差値を計算し、結果を画面に出力するプログラムを作成せよ。 # ◆ 条件 #  人数 N に負の値や101以上の値が入力されたときには、再入力するものとす # る。 #  点数 x[i] に負の値や100点を超える値が入力されたときには、再入力する # ものとする。 # ◆ 偏差値 Ti の計算式 # 10( xi   ) # Ti   50 #  # ただし # N # 1 # x #  i # N i 1 # N # 1 #  (x #   )2 # i # N i 1 # ここに、N :データの数 xi :個々の点数 μ:平均 σx:標準偏差 # # # 'int型配列 x[101] を定義し、キーボードから人数 N と N 人分の点数を入力し、平均点と偏差値を計算し、結果を画面に出力する' :- キーボードから人数Nを入力(N), キーボードからN人分の点数を入力(N,L), 相加平均(L,_相加平均), 標準偏差(L,_標準偏差), 偏差値(L,_相加平均,_標準偏差,_偏差値), write_formatted('平均点は%4.1f点です。\n',[_相加平均]), write_formatted('偏差値は%4.1fです。\n',[_偏差値]). キーボードから人数Nを入力(N) :- repeat,get_integer(N),N>=0,N=<100,!. キーボードからN人分の点数を入力(0,[]) :- !. キーボードからN人分の点数を入力(N,[I|R]) :- get_integer(I), I >= 0,I =< 100, N1 is N - 1, キーボードからN人分の点数を入力(N1,R),!. キーボードからN人分の点数を入力(N,L) :- キーボードからN人分の点数を入力(N,L). % 相加平均/3,標準偏差/2,偏差値/4の定義は http://nojiriko.asia/prolog/suchikeisan.html を参照してください。 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/685 # # 1] 授業単元: プログラム演習 # [2] 問題文(含コード&リンク): # 下記のような成績があった時、各科目の平均、各学生の合計点の偏差値、科目毎の相関係数を求めるプログラムを配列を用いて実装しなさい。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10601.txt # # 名前   点数 #     英語 数学 物理  # 学生1 80 50 60 # 学生2 60 70 80 # 学生3 50 80 90 # 学生4 60 75 80 # 学生5 50 90 75 # # 名前   点数 #     英語 数学 物理  値位置(名前,[_名前,_,_,_],_名前). 値位置(英語,[_,_英語,_,_],_英語). 値位置(数学,[_,_,_数学,_],_数学). 値位置(物理,[_,_,_,_物理],_物理). 成績(学生1,80,50,60). 成績(学生2,60,70,80). 成績(学生3,50,80,90). 成績(学生4,60,75,80). 成績(学生5,50,90,75). 各科目の平均(_各科目の平均) :- findall([_科目,_科目の平均],( 値位置(_科目,[A,B,C,D],_点数), \+(_科目=名前), findavg(_点数,成績(A,B,C,D),_科目の平均)), _各科目の平均). 各学生の合計点の偏差値(_各学生の合計点の偏差値) :- findall(_名前,成績(_名前,_,_,_),_名前ならび), 標本を集める(_母集合), 偏差値(_母集合,_偏差値ならび), 名前と符合させる(_名前ならび,_偏差値ならび,_各学生の合計点の偏差値). 偏差値(_母集合,_偏差値ならび) :- 相加平均(_母集合,_算術合計), 標準偏差(_母集合,_標準偏差), findall(_偏差値,(member(_値,_母集合),偏差値(_値,_相加平均,_標準偏差,_偏差値)),_偏差値ならび). 偏差値(_標本値,_相加平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _相加平均) / _標準偏差 + 50.0. 各学生の合計点の総和(_合計点の総和) :- findsum(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_合計点の総和). 各学生の合計点(_名前,_各学生の合計点) :- 成績(_名前,_英語,_数学,_物理), _各学生の合計点 is _英語 + _数学 + _物理. 標本を集める(_母集合) :- findall(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_母集合). 名前と符合させる([],[],[]) :- !. 名前と符合させる([A|R1],[B|R2],[[A,B]|R3]) :- 名前と符合させる(R1,R2,R3). 科目間の相関係数(_科目1,_科目2,_相関係数) :- findall(_点数,(成績(A,B,C,D),値位置(_科目1,[A,B,C,D],_点数)),_科目1の点数ならび), findall(_点数,(成績(A,B,C,D),値位置(_科目2,[A,B,C,D],_点数)),_科目2の点数ならび), 相関係数(_科目1のならび,_科目2の点数ならび,_相関係数). 相関係数(_科目1の点数ならび,_科目2の点数ならび,_相関係数) :- length(_科目1の点数ならび,Len), 相加平均(_科目1の点数ならび,_科目1の相加平均), 相加平均(_科目2の点数ならび,_科目2の相加平均), 共分散(_科目1の点数ならび,_科目2の点数ならび,_共分散), 標準偏差(_科目1の点数ならび,Len,_科目1の相加平均,0.0,_科目1の標準偏差), 標準偏差(_科目2の点数ならび,Len,_科目2の相加平均,0.0,_科目2の標準偏差), _相関係数 is _共分散 / (_科目1の標準偏差 * _科目2の標準偏差). 共分散(_標本ならび1,_標本ならび2,_共分散) :- length(_標本ならび1,Len), length(_標本ならび2,Len), 相加平均(_標本ならび1,_標本ならび1の相加平均), 相加平均(_標本ならび2,_標本ならび2の相加平均), 共分散(_標本ならび1,_標本ならび2,Len,_標本ならび1の相加平均,_標本ならび2の相加平均,0.0,_共分散). 共分散([],[],Len,_,_,S,_共分散) :- _共分散 is S / Len,!. 共分散([A|R1],[B|R2],Len,_相加平均1,_相加平均2,S1,_共分散) :- U is (A-_相加平均1) * (B-_相加平均2), S2 is S1 + U, 共分散(R1,R2,Len,_相加平均1,_相加平均2,S2,S),!. % 以下のサイトは # [1] 授業単元:fortran # [2] 問題文(含コード&リンク):配列を使わずに平均値、分散、標準偏差を表示せよ # データ数nとn個のデータを入力し、平均値、分散、標準偏差を標示せよ。なおn≧5である。 # dimension、if、go toを使ってはいけない。 '配列を使わずに平均値、分散、標準偏差を表示' :- write('データ数 : '), get_integer(N), writef('%個の数を1個1行で連続して入力してください : ',[N]), get_line(Line), read_term_from_atom(Line,X,[]), '配列を使わずに平均値、分散、標準偏差を表示'(1,N,X,0,_,Z). _分散 is Z / N, _標準偏差 is sqrt(Z / (N - 1)), writef('平均値=%t,分散=%t,標準偏差=%t\n',[_平均値,_分散,_標準偏差]),!. '配列を使わずに平均値、分散、標準偏差を表示'(M,N,X,S,_平均,0.0) :- M > N,_平均 is S / N,!. '配列を使わずに平均値、分散、標準偏差を表示'(M,N,X,S1,_平均,Z) :- get_line(Line2), read_term_from_atom(line2,X2,[]), S2 is S1 + X, M1 is M - 1, '配列を使わずに平均値、分散、標準偏差を表示'(M1,N,X2,S2,_平均,Z2), Z is (X - _平均) ^ 2 + Z2. get_line(Line) :- read_line_to_codes(current_input,Codes), atom_codes(Line,Codes). get_integer(N) :- read_line_to_codes(current_input,Codes), number_codes(N,Codes), integer(N). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/256 # # # 2変量のデータ {{x1, y1}, {x2, y2}, ... , {xn, yn}} を引数として,散布図と相関係数を出力する関数を作成せよ. 相関係数(_サンプルならび,_相関係数) :- length(_サンプルならび,Len), x要素の取り出し(_サンプルならび,LX), y要素の取り出し(_サンプルならび,LY), 標準偏差(LX,_標準偏差X), 標準偏差(LY,_標準偏差Y), 相加平均(LX,_平均値X), 相加平均(LY,_平均値Y), findsum(U,(for(1,I,Len),list_nth(I,LX,X), list_nth(I,LY,Y), U is (X-_平均値X) * (Y-_平均値Y)), S1), _相関係数 is ( 1 / ((Len-1)*_標準偏差X*_標準偏差Y)) * S1. x要素の取り出し(L,LX) :- findall(X,member([X,_],L),LX). y要素の取り出し(L,LY) :- findall(Y,member([_,Y],L),LY). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/287 # # 【 課題 】以下のプログラムを元に標準偏差も計算できるように変更せよ。 # 数値は実数を受け入れられるようにせよ。 # データはファイルで与え1.0 2,0 3,0 4,0 5,0 を試してみよ。 # 標準偏差は全体7カラム。小数点以下5桁で表せ。 '最小値・最大値・標準偏差'(L,_最小値,_最大値,_標準偏差) :- length(L,_標本数), '算術平均'(L,_算術平均), L = [A|R], '最小値・最大値・標準偏差'(L,_標本数,A,_最小値,A,_最大値,_算術平均,0.0,_標準偏差) . '最小値・最大値・標準偏差'([],_標本数,_算術平均,_最小値,_最小値,_最大値,_最大値,S,_標準偏差) :- _標準偏差 is sqrt(S / (_標本数 - 1)), ! . '最小値・最大値・標準偏差'([A|R],_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S,V) :- A < _最小値1, S2 is (A - _算術平均) ^ 2 + S, '最小値・最大値・標準偏差'(R,_標本数,A,_最小値,_最大値1,_最大値,_算術平均,S2,V),!. '最小値・最大値・標準偏差'([A|R],_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S,V) :- A > _最大値1, S2 is (A - _算術平均) ^ 2 + S, '最小値・最大値・標準偏差'(R,_標本数,_最小値1,_最小値,A,_最大値,_算術平均,S2,V),!. '最小値・最大値・標準偏差'([A|R],_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S,V) :- S2 is (A - _算術平均) ^ 2 + S, '最小値・最大値・標準偏差'(R,_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S2,V). % 以下のサイトは # 出典 #511 # [1] 授業単元:情報基礎B # [2] 問題文(含コード&リンク):試験の点数10人分をキーボードから入力し、以下の内容を出力するプログラムを作成せよ。 # 平均点、標準偏差、得点の高い順の点数リスト(出来れば、バブルソート以外の # アルゴリズムでお願いします。) t333(_点数ならび,_平均点,_標準偏差,_点数順ならび) :- 算術平均(_点数ならび,_平均点), 標準偏差(_点数ならび,_標準偏差), quicksort(_点数ならび,_点数順ならび). 算術平均([],N,S,M) :- M is S / N,!. 算術平均([A|R],N,S,M) :- S1 is S + A,算術平均(R,N,S1,M) . 算術平均(L,M) :- length(L,N),算術平均(L,N,0.0,M). 標準偏差([],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,V) :- length(L,N),算術平均(L,M),標準偏差(L,N,M,0.0,V) . quicksort([],[]) :- !. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Gigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). partition([],Y,[],[]) :- !. partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs). % 以下のサイトは 相加平均(L,_相加平均) :- 算術平均(L,_相加平均). 算術平均([],N,S,M) :- M is S / N,!. 算術平均([A|R],N,S,M) :- S1 is S + A,算術平均(R,N,S1,M) . 算術平均(L,M) :- length(L,N),算術平均(L,N,0.0,M). 標準偏差([],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,V) :- length(L,N),算術平均(L,M),標準偏差(L,N,M,0.0,V) . 平均偏差(L,_平均偏差) :- 算術平均(L,Avg), length(L,N), 平均偏差(L,Avg,0.0,Amd), _平均偏差 is Amd / N. 平均偏差([],_,X,X). 平均偏差([A|R1],Avg,Y,X) :- Y2 is Y + abs(A-Avg), 平均偏差(R1,Avg,Y2,X). 尖度(_標本,_尖度) :- length(_標本,_標本数), 算術平均(_標本,_算術平均), 分散(_標本,_分散), findsum(U,(member(A,_標本),U is (A-_算術平均) ^ 4),X1), _尖度 is X1 / ((sqrt(_分散) ^ 4) * _標本数). 尖度([],N,M,S1,S2,V) :- V is S2 / (M * S2 ^ 2). 尖度([A|R],N,M,S1,S2,V) :- S3 is (A - M) ^ 2, S4 is (A - M) ^ 4, S5 is S1 + S3, S6 is S2 + S4, 尖度(R,N,M,S5,S6,V). 分散(L,V) :- length(L,N), 算術平均(L,M), 分散(L,N,M,0.0e+00,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 相乗平均(L,_相乗平均) :- 幾何平均(L,_相乗平均). 幾何平均([],N,S,M) :- M is exp(S / N),!. 幾何平均([A|R],N,S,M) :- S0 is ln(A), S1 is S + S0, 幾何平均(R,N,S1,M). 幾何平均(_標本ならび,_幾何平均) :- length(_標本ならび,_標本数), 幾何平均(_標本ならび,_標本数,0,_幾何平均). 加重平均(_標本ならび,_加重平均) :- findsum(_重み,member([_重み,_],_標本ならび),S), findsum(M,(member([A,B],_標本ならび),M is A * B),S2), _加重平均 is S2 / S,!. 偏差値(_母集合,_偏差値ならび) :- 加算(_母集合,_算術合計), length(_母集合,_ならびの長さ), _算術平均 is _算術合計 / _ならびの長さ, 標準偏差(_母集合,_標準偏差), findall(_偏差値,( member(_値,_母集合) , 偏差値(_値,_算術平均,_標準偏差,_偏差値)), _偏差値ならび). 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 中央値(_標本ならび,_中央値) :- medium(_標本ならび,_中央値). medium(L,_中央値) :- quicksort(L,L2), length(L2,Len), Len2 is Len // 2, medium(L2,Len2,_中央値). medium(L,Len,_中央値) :- append(L1,[_中央値|L2],L), length(L1,Len), length(L2,Len),!. medium(L,Len,_中央値) :- Len2 is Len - 1, append(L1,[_中央値1,_中央値2|L2],L), length(L1,Len2), length(L2,Len2), _中央値 is (_中央値1 + _中央値2) / 2. 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X).