[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/19 21:59 / Filesize : 314 KB / Number-of Response : 617
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

いろんな言語で宿題スレ



1 名前:a36 ◆K0BqlCB3.k [2009/05/21(木) 12:30:47 ]
他の宿題スレで出された問題を各々好きな言語で解答して言語の良さを競い合うスレです。
なお、宿題スレが存在する言語についてはその言語のスレで解答してください。

C/C++の宿題片付けます 126代目
pc12.2ch.net/test/read.cgi/tech/1242655611/

Python の宿題ここで答えます Part 1
pc12.2ch.net/test/read.cgi/tech/1153585095/

★★ Java の宿題ここで答えます Part 67 ★★
pc12.2ch.net/test/read.cgi/tech/1232627790/

Pascalの宿題は俺にやらせろ!!Part2
pc12.2ch.net/test/read.cgi/tech/1136994325/

BASICの宿題はお前にまかせた
pc12.2ch.net/test/read.cgi/tech/1136788500/

Rubyの宿題教えてください。2限目
pc12.2ch.net/test/read.cgi/tech/1200175247/

C#,C#の宿題片付けます。
pc12.2ch.net/test/read.cgi/tech/1197620454/

348 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:16:30 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/547
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 下に示すように,非負の整数値を読み込んで,その数を逆順に表示するプログラムを作成せよ。
# なお,負の値を読み込んだ場合は,再入力を促すメッセージを表示すること。
#
# 非負の整数を入力してください: 1963
# 1963 を逆から読むと3691 です.

349 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:32:40 ]
>348
% Prolog

t348 :-
  整数の入力(N),
  number_chars(N,L),
  reverse(L,L1),
  number_chars(N2,L1),
  write_formatted('逆に表示すると %t\n',[N2]).>348

整数の入力(N) :-
  write('非負の整数を入力してください(入力後ピリオドと改行) : '),
  read(N),
  integer(N),
  N >= 0,!.
整数の入力(N) :-
  write('入力されたのは非負の整数ではありませんでした\n'),
  整数の入力(N).

350 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:36:51 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/552
# [1] 授業単元:情報処理
# [2] 問題文(含コード&リンク):
# (1)
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9670.txt
# (2)
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9671.txt

351 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:40:36 ]
>>350 (2)
% Prolog

:- op(450,xfx,分の).

分数の積(A 分の B,C 分の D,X 分の Y) :-
  X is A * C,
  Y is B * D.

352 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 06:03:29 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/559
# [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):url.txtに書き込まれている"ttp://〜をhttp://〜に書き換えresult.txtに出力せよ

353 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 06:13:37 ]
>>352
# python2.x
fin = file('url.txt')
fout = file('result.txt','w')
for line in fin.readlines():
fout.write(line.replace('ttp://','http://'))
fout.close()
fin.close()


354 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 06:17:58 ]
>>352
% Prolog

t352 :-
  get_chars('url.txt',Chars),
  t352(Chars,Chars2),
  put_chars('result.txt',Chars).

t352([],[]) :- !.
t352(['h','t','t','p',':','/','/'|R1],['h','t','t','p',':','/','/'|R2]) :-
  t352(R1,R2),!.
t352(['t','t','p',':','/','/'|R1],['h','t','t','p',':','/','/'|R2]) :-
  t352(R1,R2),!.
t352([A|R1],[A|R2]) :-
  t352(R1,R2).

355 名前:354 mailto:sage [2009/07/04(土) 06:20:33 ]
>>352
% Prolog
>>352
また間違い。訂正,Chars -> Chars2 のところがある。

t352 :-
  get_chars('url.txt',Chars),
  t352(Chars,Chars2),
  put_chars('result.txt',Chars2).


356 名前:354 mailto:sage [2009/07/04(土) 06:55:43 ]
>>352
% Prolog ' は要らなかった。

t352 :-
  get_chars('url.txt',Chars),
  t352(Chars,Chars2),
  put_chars('result.txt',Chars2).

t352([],[]) :- !.
t352([h,t,t,p,:,/,/|R1],[h,t,t,p,:,/,/|R2]) :-
  t352(R1,R2),!.
t352([t,t,p,:,/,/|R1],[h,t,t,p,:,/,/|R2]) :-
  t352(R1,R2),!.
t352([A|R1],[A|R2]) :-
  t352(R1,R2).



357 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:30:39 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/586
# [1] 授業単元:C+
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9676.txt

358 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:33:18 ]
>>357
% Prolog
% 1.
% sum1toN(n)と呼び出すと(nは正の整数)、戻り値として 1 から n までの
% 和が返ってくる関数sum1toNを作成せよ。(関数の部分のみ書くこと。)

sum1toN(1,1) :- !.
sum1toN(N,X) :- M is N - 1,sum1toN(M,Y),X is N + Y.


359 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:35:53 ]
>>357
% Prolog
% 2.
% 円の半径をキーボードから入力し、円周の長さと面積を求めて表示する プログラムを次のように作成した。
% 円周の長さと面積を求める部分は関数 circleを使用している。この関数を書け。
% 円周率は#defineで定義している PAI を使ってよい。

% #include <stdio.h>
% #define PAI 3.14159
% 関数circleのプロトタイプ宣言 (省略)
% int main(void ){
% double r, enshu, menseki;
% printf("半径を入力 >>");
% scanf("%lf", &r);
% circle(r, &enshu, &menseki);
% printf("円周 = %f 面積 = %f\n"
% , enshu, menseki);
% return 0;
% }
%
% │ │
% │    関数 circle │
% │ │

pi(3.14159).

circle(_半径,_円周,_面積) :-
  pi(PI),
  _円周 is 2 * _半径 * PI,
  _面積 is _半径 ^ 2 * PI.

360 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:49:25 ]
>>357
% Prolog
% 3.
% 大きさ8のint型配列aに初期値として
% 1 2 3 4 5 6 7 8
% を設定する。これを
% 0 0 1 2 3 4 5 6
% のように要素を右に2つシフトして a[0],a[1]には 0 を入れ、
% その後配列の各要素を
% a[0]=0
% a[1]=0
% <略>
% a[7]=6
%
% のように表示するプログラムを書け。
t357_3 :-
  右にシフト(2,[1,2,3,4,5,6,7,8],_シフトされたならび),
  表示(1,_シフトされたならび).

表示(_,[]) :- !.
表示(N,[A|R]) :-
  M is N - 1,
  write('a[%t]=%t',[M,C]),
  N2 is N + 1,
  表示(N2,R).

右にシフト(0,X,X) :- !.
右にシフト(N,L,X) :-
  append(Y,[_],[0|L]),
  M is N - 1,
  右にシフト(M,Y,X).

361 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:53:20 ]
>>357
% Prolog
% 4.
% 文字列(最大80文字)をキーボードから読み込み、
% その文字列中で文字コードが最大の文字とその文字コードを
%
%   文字コード最大はY <89>
%
% (Yが最大の文字、89がその文字コードを意味する。)
% のように表示するプログラムを次のように作成した。空欄を埋めてプログラム
% を完成せよ。

最大の文字コード(_文字列,_最大の文字コード) :-
  atom_codes(_文字列,[C|R]),
  最大の文字コード(R,C,_最大の文字コード).

最大の文字コード([],X,X) :- !.
最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-
  C > _現在の最大コード,
  最大の文字コード(R,C,_最大の文字コード),!.
最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-
  C =< _現在の最大コード,
  最大の文字コード(R,_現在の最大コード,_最大の文字コード),!.

362 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:12:40 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/606
# [1] 授業単元:C
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9680.txt
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9678.txt

363 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:14:39 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/607
# 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で
考えてください.
#   (住所録,商品の在庫,図書,ワールドカップの勝敗....)
#  以下の要件を示します.
#
# 1. ファイルからデータを読み込む機能をつけること.
# 2. データは4つ以上の項目を保持させること.
#  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上)
# 3. 並び替えの機能をつけること.また並び替える項目が指定できること.
# 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ
せることができること.
#  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま
る 等)
# 5. データは半角英数字(英語やローマ字)で扱ってよい
# 6. データの追加ができること.
# 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に
合致したデータを削除できること.
# 8. 追加・削除した結果をファイルに保存できること.

364 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 04:45:28 ]
>>362
% Prolog
nojiriko.asia/prolog/t362.html

365 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 23:48:47 ]
場違いか心配ですが・・・。
質問です

?- search(a, f, Path).
Path = [f, d, e,c, b, a] ;
Path = [f, d, b, a]

arc(b,c).
arc(b,d).
arc(c,e).
arc(e,d).
arc(d,f).
arc(e,b).

あるノードから、あるノードまでが到達可能かどうかを調べ経路も表示するプログラムを
作りたいのですがどうすれば良いのでしょうか?memberを使えば良いと言われたのですが
よくわかりません・・・。

366 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 06:37:37 ]
>>365
一番基本的なものは以下のようなものでしょう。

到達可能(A,B,Log) :-
到達可能(A,B,[A],Log).

到達可能(A,B,L1,Log) :-
  arc(A,B),
  \+ member(B,L1),
  append(L1,[B],Log).
到達可能(A,B,L1,L) :-
  arc(A,C),
  \+ member(C,L1),
  append(L1,[C],L2),
  到達可能(C,B,L2,L).



367 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 06:47:50 ]
>>365
一般に以下の方を使うのではないかと思います。

到達可能(A,B,Log) :-
  到達可能(A,B,[A],_逆順Log),
  reverse(_逆順Log,Log).

到達可能(A,B,L1,[B|L1]) :-
  arc(A,B),
  \+ member(B,L1).
到達可能(A,B,L1,L) :-
  arc(A,C),
  \+ member(C,L1),
  到達可能(C,B,[C|L1],L).

368 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 09:15:54 ]
>>363
% Prolog
nojiriko.asia/prolog/t363.html

369 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 14:49:42 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/673
# [1] 授業単元: 構造体
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bi
n/joyful/img/9688.txt

370 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:26:42 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/660
# [1] 授業単元:情報
# [2] 問題文(含コード&リンク):
# パソコン甲子園 2008 予選問題 問7 ふしぎな虫
# www.pref.fukushima.jp/pc-concours/2009/03/pdf/2008yosen.pdf

371 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:28:07 ]
>>370
% Prolog
nojiriko.asia/prolog/t370.html

372 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:51:59 ]
>>369
# 次の各プログラムを作成
#
# 1.線分の長さを求める
#  -両端点の座標値(浮動小数点)を入力
#  -線分の長さを計算、表示
#
# 2.三角形の面積を求める
#  -3頂点の座標軸(浮動小数点)を入力
#  -面積を計算、表示
#
# 2では1つの点を原点に移動させてあとはS=1/2|ad-bc|でお願いします
#
# 補足でこれがありました
# ◆ 平方根を求める関数
#
# double型の関数 sqrt() を使います.仮引数もdouble型です.
#
# 例えばdouble型の変数 len の平方根を求める場合には,次のように呼び出
# します.
#
# sqrt(len)# 関数sqrt()を使用するソースプログラムをコンパイルするときには,
#
# gcc -lm ***.c
#
# のように,コンパイルオプション「-lm」が必要です.
#
#
#
# ・main関数の座標値読み込み部分を省略したものは以下の通りです

373 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:54:54 ]
>>369 (1)
% Prolog
線分の長さ(X1,Y1,X2,Y2,_線分の長さ) :-
  _線分の長さ is sqrt((X2-X1)^2 + (Y2-Y1)^2).

374 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 18:13:01 ]
>>369 (2)
% Prolog

三角形の面積(X1,Y1,X2,Y2,X3,Y3,_三角形の面積) :-
  一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33),
  _三角形の面積 is abs(X22 * Y33 - Y22 * X33) / 2.

一角を原点へ移動((X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33) :-
  X22 is X2 - X1,
  Y22 is Y2 - Y1,
  X33 is X3 - X1,
  Y33 is Y3 - X1.


375 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 18:21:05 ]
>>374 訂正
一角を原点へ移動((X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33) :-
  X22 is X2 - X1,
  Y22 is Y2 - Y1,
  X33 is X3 - X1,
  Y33 is Y3 - Y1.

376 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 00:47:46 ]
>>366-367さん
回答ありがとうございます。しかし
arc(a,b).
arc(b,c).
arc(b,d).
arc(c,e).
arc(e,d).
arc(d,f).
arc(d,e).

member(X,[X|_]).
member(X,[_|T]) :-
member(X,T).



seach(A,B,Log) :-
search(A,B,[A],_逆順Log),
reverse(_逆順Log,Log).

seach(A,B,L1,[B|L1]) :-
arc(A,B),
\+ member(B,L1).
search(A,B,L1,L) :-
arc(A,C),
\+ member(C,L1),
search(C,B,[C|L1],L).
と作って| ?- search(a, f, Path).
と聞くとnoと出てしまいます・・・。
あと_逆順Logは普通にSとかに置き換えてもいいのですか?



377 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 03:30:34 ]
>>376
seach と search とありますが,seach/4の定義はsearch/4だと思いますが、
単なる誤植でしょうか。

?- listing(search).
で正しく定義ができているか確認してください。

もしできていないなら、
\+member(B,L1) と \+member(C,L1) を not(member(B,L1)) not(member(C,L1))
に置き換えてみてください。
それから_逆順Log は S でも問題ありません。なぜ最後にreverseするのか
わからない人が多いと思ったのでこの変数名を使いました。

378 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 06:57:09 ]
>>350 (1)
% Prolog
:- op(300,fx,i).

複素数の割り算(A + iB,C + iD,X + iY) :-
X is (A * C + B * D) / ( C ^ 2 + D ^ 2),
Y is (B * C - A * D) / ( C ^ 2 + D ^ 2).


379 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 07:59:46 ]
>>350 (1) 書き直し
% Prolog
:- op(300,fx,i).

複素数の割り算(A+iB,C+iD,X+iY) :-
  X is (A * C + B * D) / ( C ^ 2 + D ^ 2),
  Y is (B * C - A * D) / ( C ^ 2 + D ^ 2).

380 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:08:47 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/725
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): 整数 nissu をキー入力して、
# 1 月1 日から数えて nissu 日目が何月何日かを表示
# したい。

381 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:14:42 ]
>>380
% Prolog
t380 :- get_line(Line),atom_to_term(Line,Nissu,_),
  'N日後は'(0,Nissu,2009/1/1,_年/_月/_日),
  write_formatted('%t月%t日\n',[_月,_日]).

'N日後は'(N,N,_年/_月/_日,_年/_月/_日).
'N日後は'(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :-
前日・今日(_年_1/_月_1/_日_1,_年_2/_月_2/_日_2),
M2 is M + 1,
'N日後は'(M2,N,_年_2/_月_2/_日_2,_年/_月/_日).
前日・今日(_前日の年 / 12 / 31,_年 / 1 / 1) :- 一つ違い(_前日の年,_年),!.
前日・今日(_年 / 2 / 29,_年 / 3 / 1) :- うるう年(_年),!.
前日・今日(_年 / 2 / 28,_年 / 3 / 1) :- \+(うるう年(_年)),!.
前日・今日(_年 / _前月 / 30,_年 / _月 / 1) :- 一つ違い(_前月,_月),member(_前月,[4,6,9,11]),!.
前日・今日(_年 / _前月 / 31,_年 / _月 / 1) :- 一つ違い(_前月,_月),member(_前月,[1,3,5,7,8,10,12]),!.
前日・今日(_年 / _月 / _前日,_年 / _月 / _日) :- 一つ違い(_前日,_日),!.

うるう年(_年) :- 0 is _年 mod 400,! .
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- \+(0 is _年 mod 4),fail.

一つ違い(M,N) :- integer(M),!,N is M + 1 .
一つ違い(M,N) :- integer(N),!,M is N - 1 .

382 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:18:05 ]
>>381 ちょっと読みづらかったか。

'N日後は'(N,N,_年/_月/_日,_年/_月/_日).
'N日後は'(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :-
  前日・今日(_年_1/_月_1/_日_1,_年_2/_月_2/_日_2),
  M2 is M + 1,
  'N日後は'(M2,N,_年_2/_月_2/_日_2,_年/_月/_日).

383 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:21:40 ]
>>381 もう一度訂正。バックトラックしてくると具合の悪いことになる。

'N日後は'(N,N,_年/_月/_日,_年/_月/_日) :- !.
'N日後は'(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :-
  前日・今日(_年_1/_月_1/_日_1,_年_2/_月_2/_日_2),
  M2 is M + 1,
  'N日後は'(M2,N,_年_2/_月_2/_日_2,_年/_月/_日).


384 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 15:03:39 ]
# pc12.2ch.net/test/read.cgi/tech/1232627790/904
# ・課題の内容
# TCP/IPプロトコルを用い、通信するプログラムを作成せよ。
# ・条件
# キーボードから文字列を1行入力し、それを送信するプログラム(tcp_snd1)と、
# それを受信するプログラム(tpc_rec1)の2つを作成せよ。
# tcp_snd1では、送信先の計算機の名前をプログラムの引数で指定できるようにせよ。
# tcp_rec1では、コネクションの要求あったら、コネクションを張り、
# 要求した計算機のIPアドレスを表示せよ。
# メッセージを受信するたびに、通信回数を[]で括って表示し、
# その後にメッセージを表示せよ。
# 空行が入力されたら、tcp_snd1もtcp_rec1の双方が終了するようにせよ。
# ポートとして、9000を利用せよ。

385 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 16:08:17 ]
>>384
% Prolog
nojiriko.asia/prolog/t384.html

386 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:29:44 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/732
# [1] 授業単元: プログラミングC
# [2] 問題文(含コード&リンク):
# キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字
を大文字にするプログラムを作成せよ。
#
# 実行例 文字列入力 :AbCdEfG123
#     変換文字列 :aBcDeFg123




387 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:49:22 ]
>>386
% Prolog

t386 :-
  get_line(Line),
  atom_chars(Line,Chars),
  大文字小文字変換(Chars,Chars2),
  atom_chars(Line2,Chars2),
  write_formatted('%t\n',[Line2]).

大文字小文字変換([],[]) :- !.
大文字小文字変換([A|R1],[B|R2]) :-
  A @>= 'A',
  A @=< 'Z',!,
  to_lower(A,B),
  大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[B|R2]) :-
  A @>= a,
  A @=< z,!,
  to_upper(A,B),
  大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[A|R2]) :-
  大文字小文字変換(R1,R2).



388 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:08:35 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/733
# [1] 授業単元: プログラミングC
# [2] 問題文(含コード&リンク):
# キーボードから半角英数で文字列を入力し、これを数字(0→9)、
# 大文字(A→Z)、
# 小文字(a→z)の順に並べ替えるプログラムを作成せよ。
# ヒント:並べ替えアルゴリズムは、バブルソート(隣接交換法)を
# 使うと簡単だろう。
# 文字列長はstrlen命令を使うとよい。みたいです。

389 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:11:42 ]
>>388
% Prolog

t388 :-
  get_line(Line),
  atom_chars(Line,Chars),
  バブルソート(Chars,_整列した文字ならび),
  atom_chars(Line2,_整列した文字ならび),
  write_formatted('%t\n',[Line2]).

バブルソート(L,X) :-
  整順が崩れるまで(L,L2),
  バブルソート(L2,X),!.
バブルソート(L,L).

整順が崩れるまで([A],[A]) :- !,fail.
整順が崩れるまで([A,B|R1],[A|R2]) :-
  A @=< B,
  整順が崩れるまで([B|R1],R2).
整順が崩れるまで([A,B|R1],[B,A|R1]) :-
  A @> B.

390 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:28:46 ]
>>377さん
誤植でした;;
無事出来ました
ちなみに述語がmemberだけで出来ると
聞いたのですが出来るのでしょうか?
出来るとしたらどんな感じに
なるのでしょうか?

391 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 20:35:12 ]
>>390
member/2だけではうまくいかなかった。

member(A,B,L,[A,B]) :- member((A,B),L).
member(A,B,L,[A|R1]) :- member((A,C),L),member(C,B,L,R1).

?- member(a,f,[(a,b),(b,c),(b,d),(c,e),(e,d),(d,f),(d,e)],S).

ならうまくいくかな。

392 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 23:30:00 ]
>>391さん
ヒントとしては
?- \+(member(a, [b,c])).
yes
となり
rev2(L, R) :-
rev2(L, [], R).
rev2([], R, R).
rev2([H|T], L, R) :-
rev2(T, [H|L], R).
みたいに
rev1([], []).
rev1([H|T], R) :-
rev1(T, R1),
append(R1, [H], R).
appendを使わないようにしようって事です
どうなんでしょうか?

393 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 04:01:54 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/762
# [1] 授業単元: 情報処理\u2160
# [2] 問題文: 乗算合同法で整数乱数を生成.。
# 区間(0.1)の一様にして、1以上、ある特定の整数の乱数を生成する。

394 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 04:06:06 ]
>>393
% Prolog

乗算合同法による乱数発生(_初期値,Y,X) :-
  乗算合同法(16087,_初期値,65535,Y,X).

乗算合同法(A,N,_法,N,X) :-
  X is N / _法.
乗算合同法(A,N,_法,Y,X) :-
  乗算合同法演算(A,N,_法,M),
  乗算合同法(A,M,_法,Y,X).

乗算合同法演算(A,N,_法,M) :-
  M is (A * N) mod _法.

395 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 04:11:39 ]
>>392
>>367 がそれに当たるつもりなのですが。
ただLogが逆順に生成されますね。

396 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 06:38:43 ]
>>395さん
成る程、丁寧にありがとうございました



397 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 07:57:55 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/764
# [1] 授業単元:プログラミング入門
# [2] 問題文(含コード&リンク):
# 問3:1週間の売り上げ一覧を表示するプログラムを作成せよ。
#    実行例  野菜の1週間の売り上げた合計数量と合計金額
#                             合計  合計
#         種類 単価 月 火 水 木 金 土 日 数量  金額
#         レタス 150 50 55 60 65 70 75 80 455  68250
#         トマト  50 20 25 30 35 40 45 50 245  12250
#         もやし  20 10 15 20 25 30 35 40 175  3500
#         ナスビ  40 5  10 15 20 25 30 35 140  5600

398 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 11:24:22 ]
>>397
% Prolog
nojiriko.asia/prolog/t397.html

399 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 12:51:07 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/757
# 【質問テンプレ】
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク): 二次元配列を使って以下のファイルを読み込み、
# 同じように表示しなさい。
#  【test.dat】
#   ** ** **
#   ** ** **
#   ** ** **

400 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 13:00:02 ]
>>399
% Prolog
t399 :-
  二次元構造の読み込み('test.dat',_二次元構造),
  member(A,_二次元構造),
  concat_atom(L,' ',S),
  write_formatted('%t\n',[S]),
  fail;
  true.

二次元構造の読み込み(File,_二次元構造) :-
  open(File,Input),
  findall(L,(repeat,get_line(Input,X),(X=end_of_file,!,fail;
                   split(X,[' '],L))),_二次元構造),
  close(Input),!.

401 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 13:04:19 ]
>>399 訂正。
% Prolog
t399 :-
  二次元構造の読み込み('test.dat',_二次元構造),
  member(L,_二次元構造),
  concat_atom(L,' ',S),
  write_formatted('%t\n',[S]),
  fail;
  true.

二次元構造の読み込み(File,_二次元構造) :-
  open(File,Input),
  findall(L,(repeat,get_line(Input,X),(X=end_of_file,!,fail;
                   split(X,[' '],L))),_二次元構造),
  close(Input),!.

402 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 13:46:35 ]
>>399 もうひとつ違っていた。
  open(File,read,Input), ですね。

403 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 19:00:09 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/786
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9706.txt
# [3] 環境
# 問題1
# テキストファイルからバイナリファイルの作成
# テキストファイルの内容は {14,17,18,21,23,25,31}と
# {10, 12, 15, 16, 19, 27, 28}の二つ。
# これが書かれているテキストファイルをバイナリファイルにする。
#
# 問題2
# 1で作ったバイナリファイルをあわせて
# {10, 12, 14, 15, 16 17, 18, 19 21, 23, 25 27, 28, 31} の
# バイナリファイルの作成

404 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 19:16:21 ]
>>403 問題1
% Prolog

t403_1(TextFile1,TextFile2,BinaryFile1,BinaryFile2) :-
t403_1_1(TextFile1,BinaryFile1),
t403_1_1(TextFile2,BinaryFile2).

t403_1_1(TextFile1,BinaryFile1) :-
open(TextFile1,read,Input),
open(BinaryFile1,write,Output,[type(binary)]),
get_line(Input,Line),
split(Line,['{',',','}'],L),
t403_1_2(Output,L),
close(Input),
close(Output).

t403_1_2(Output,L) :-
member(N,L),
put_byte(Output,N),
fail.
t403_1_2(_,_).


405 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 19:18:55 ]
>>403 問題1 書き直し
% Prolog

t403_1(TextFile1,TextFile2,BinaryFile1,BinaryFile2) :-
  t403_1_1(TextFile1,BinaryFile1),
  t403_1_1(TextFile2,BinaryFile2).

t403_1_1(TextFile1,BinaryFile1) :-
  open(TextFile1,read,Input),
  open(BinaryFile1,write,Output,[type(binary)]),
  get_line(Input,Line),
  split(Line,['{',',','}'],L),
  t403_1_2(Output,L),
  close(Input),
  close(Output).

t403_1_2(Output,L) :-
  member(N,L),
  put_byte(Output,N),
  fail.
t403_1_2(_,_).

406 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 20:42:25 ]
>>403
IO ばかりで正直あまり Haskell では書く気がしないな…

import System.IO
import Control.Exception (bracket)
import qualified Data.ByteString as B

t403_1 :: String -> IO ()
t403_1 fname = do
b <- bracket (openFile fname ReadMode) hClose parse
bracket (openFile fname WriteMode) hClose (flip B.hPut b)
where
parse :: Handle -> IO B.ByteString
parse h = hGetLine h >>= \s -> return $ B.pack $ read ("["++s++"]")

t403_2 :: String -> String -> String -> IO ()
t403_2 fname1 fname2 fname3 = do
b1 <- bracket (openFile fname1 ReadMode) hClose B.hGetContents
b2 <- bracket (openFile fname2 ReadMode) hClose B.hGetContents
bracket (openFile fname3 WriteMode) hClose (flip B.hPut (B.sort (B.concat [b1,b2])))

main = t403_1 "input1" >> t403_1 "input2" >> t403_2 "input1" "input2" "output"



407 名前:デフォルトの名無しさん [2009/07/09(木) 04:03:35 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/921
# 正の数を入力し、入力した整数の1と
# その数を除く約数の和を求めて表示するプログラムを作成しなさい。
# 15の約数は、1,3,5,15なので、1と15を除く約数の和は8となる。
#
# お願いします。

408 名前:デフォルトの名無しさん [2009/07/09(木) 04:07:49 ]
>>407
% Prolog

t407(N,X) :- N1 is N-1,t407(N1,N,X).

t407(1,_,0) :- !.
t407(N1,N,X) :- 0 is N mod N1,!,N2 is N1-1,t407(N2,N,Y),X is N+Y.
t407(N1,N,X) :- N2 is N1-1,t407(N2,N,X).

409 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 07:15:43 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/797
# [1] C言語を使って計算を簡略化する:
# [2] XY平面上の3点P1(x1,y1)P2(x2,y2)P3(x3,y3)の座標を順に入力した時、
# 3点が同一直線上にあるかどうかを調べて
#   結果を表示するプログラムを作成せよ。

410 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 07:28:11 ]
>>409
% Prolog

'3点が同一直線上にある'((X1,Y1),(X2,Y2),(X3,Y3)) :-
  U is (X3-X1) * (Y2-Y1),
  U is (X2-X1) * (Y3-Y1).

411 名前:デフォルトの名無しさん [2009/07/09(木) 09:11:18 ]
>>407
(defun s (n)
(do ((x 2 (1+ x)) (sum 0))
((>= x n) sum)
(if (= 0 (mod n x))
(setf sum (+ sum x)))))


412 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:52:46 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/822
# 何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて
# 処理するプログラムを作る。
#
# (1)科目別の最高点、最低点を表示する。
# (2)各学生の3教科の平均点を表示する。
# (3)各教科の平均点を表示する。
#
# ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。

413 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 19:32:25 ]
>>412
-- Haskell
import Data.List (transpose)

main = do
conn <- getContents
let grades = map (map read . words) $ lines conn :: [[Int]]
-- (1)
print $ map maximum $ transpose grades
print $ map minimum $ transpose grades
-- (2)
let sums = map sum $ grades
print sums
-- (3)
print $ map ((/ 3) . fromIntegral) sums

414 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 19:36:57 ]
>>412
% Prolog
% テーマ findallを使った集約処理

t412(_各科目の最高点,_各科目の最低点,_各学生の3教科の平均点,_各科目の平均点) :-
  findall([A,B,C],(repeat,read(A),(A=end_of_file,!,fail;read(B),read(C))),Y),
  findall(AVG,(member(L,Y),findavg(A,member(A,L),AVG)),_各学生の3教科の平均点),
  行列の転置(Y,Y2),
  findall((Max,Min),(member(L1,Y2),max(L1,Max),min(L1,Min)),_各科目の最高点と最低点),
  findall(AVG3,(member(L3,Y2),findavg(A,member(A,L3),AVG3)),_各科目の平均点).

415 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 19:42:53 ]
>>414 訂正
% Prolog
% テーマ findallを使った集約処理

t412(_各科目の最高点と最低点,_各学生の3教科の平均点,_各科目の平均点) :-
  findall([A,B,C],(repeat,read(A),(A=end_of_file,!,fail;read(B),read(C))),Y),
  findall(AVG,(member(L,Y),findavg(A,member(A,L),AVG)),_各学生の3教科の平均点),
  行列の転置(Y,Y2),
  findall((Max,Min),(member(L1,Y2),max(L1,Max),min(L1,Min)),_各科目の最高点と最低点),
  findall(AVG3,(member(L3,Y2),findavg(A,member(A,L3),AVG3)),_各科目の平均点).


416 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 21:48:12 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/826
# [1] 授業単元: 宿題
# [2] 問題文(含コード&リンク): 整数を入力し、奇数か偶数かを判断するプログラム



417 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 21:58:45 ]
>>416
% Prolog

t416 :-
  read(N),
  奇数・偶数判定(N,X),
  write_formatted('入力されたのは%tです\n',[X]).

奇数・偶数判定(N,奇数) :- 1 is N mod 2.
奇数・偶数判定(N,偶数) :- 0 is N mod 2.



418 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 22:03:10 ]
>>417
% 仕様の中に「整数」を入力し、とありますからinteger/1で検査する必要は
% ありそうですね。

t416 :-
  read(N),
  integer(N),
  奇数・偶数判定(N,X),
  write_formatted('入力されたのは%tです\n',[X]),!.
t416 :- write('正しい整数が得られませんでした\n').

奇数・偶数判定(N,奇数) :- 1 is N mod 2.
奇数・偶数判定(N,偶数) :- 0 is N mod 2.


419 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:09:03 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/825
# 〔1〕授業単元:C言語
# 〔2〕問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9718.txt
# 課題 I
# コマンド引数に自分の姓と名を与え,そのまま表示するプログラムを作成せよ.
# コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させること.
# 課題 II
# コマンド引数に任意の個数の整数を与え,その和を表示するプログラムを作成せよ.
# コマンド引数の数が少なかった場合は,標準エラー出力にエラー分を表示させること.

# また,コマンド引数に整数以外が与えられた場合にも,標準エラー出力にエラー分を表示させること.

420 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:33:50 ]
>>419
% Prolog

t419_1 :- user_parameters(L),split(L,[','],L1),length(L1,2),write_formatted('%t %t\n',L1),!.
t419_1 :- tell(user_error),write(引数エラー),told.
t419_2 :-
  user_parameters(L),
  split(L,[','],L1),
  length(L1,Len),
  引数長さ検査(Len),
  引数のすべてが整数(L1),
  sum(L1,Sum),
  write_formatted('引数に与えられた整数の合計は%tです\n',[Sum]).

引数の長さ検査(Len) :- Len > 0,!.
引数の長さ検査(Len) :- Len < 1,tell(user_error),write('引数がありません\n'),told,!,fail.

引数のすべてが整数([]) :- !.
引数のすべてが整数([N|R]) :- integer(N),引数のすべてが整数(R).
引数のすべてが整数([A|R]) :- tell(user_error),write('引数に整数でない%tがあります\n',[A]),told,!,fail.

sum([],0).
sum([N|R],X) :- sum(R,Y),X is N + Y.

421 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:42:18 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/878
# [1] 授業単元:プログラミング言語
# [2] 問題文(含コード&リンク):
# char型配列xに格納された文字列を一文字ごとに空白を開けて逆順に出力する関数
# reverse_array(char[])を以下のように出力されるよう作成せよ。
#
# 処理前:Tokyo
# 関数reverse_array()を呼び出しました
# 処理後:"o y k o T"

422 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:49:35 ]
>>421
% Prolog

t421(_文字ならび,_一文字ごとに空白を開けた逆順ならび) :-
  t421(_文字ならび,[],_一文字ごとに空白を開けた逆順ならび).

t421([A],X,[A|X]) :- !.
t421([A|R1],L,X) :- t421(R1,[A,' '|R1],X).

423 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 07:47:05 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/932
# 【 課題 】ボウリングのスコアを付けるプログラムを作成せよ。
# 各投球ごとの倒れたピン数を入力し、スコア一覧を出力。
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI  】4. 制限なし
# 【 期限 】本日、7/10 15:00
# 【 Ver  】Eclipse Version: 3.4.2
# 【 補足 】1つのメソッド10行以内、引数・戻り値を持つメソッド最低3つ作成のこと。

424 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 07:51:05 ]
>>423 (バッチ処理版)
% Prolog
nojiriko.asia/prolog/t423.html

425 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:40:09 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/825
# 〔1〕授業単元:C言語
# 〔2〕問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9718.txt
# 課題V
# n から m までの整数の和を求めるプログラムを作成せよ.(n ≦ m)
# 再帰呼び出しを行う関数 sum を作成して問題を解くこと.
# 関数 sum は,引数を n, m とし,n から m までの和を返すもとのとする.


426 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:44:01 ]
>>425
% Prolog

'n から m までの整数の和を求める'(N,N,N) :- !.
'n から m までの整数の和を求める'(N,M,_和) :-
  N < M,
  N2 is N + 1,
  'n から m までの整数の和を求める'(N2,M,_和_2),
  _和 is N + _和_2.




427 名前:デフォルトの名無しさん [2009/07/10(金) 12:13:08 ]
(defun sum (n m) (if (= n m) n (+ n (sum (1+ n) m))))


428 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:36:25 ]
>>425

sum(N,M,Sum) :-
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3),
  sum_1(L1,L2,L3),
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3).

sum_l(L,L,L) :- not(var(L)).
sum_l(L1,L2,X) :- append(L1,Z,X),sum_l([_|L1],L2,Z).

integer_to_varlist(N,L) :- integer(N),list(L),length(L,N).
integer_to_varlist(N,L) :- integer(N),var(L),length(L,N).
integer_to_varlist(N,L) :- var(N),list(L),length(L,N).
integer_to_varlist(N,L) :- var(N),var(L).

429 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:43:22 ]
>>426 さすがに冗長かな。

sum(N,M,Sum) :-
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3),
  sum_1(L1,L2,L3),
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3).

sum_l(L,L,L) :- not(var(L)).
sum_l(L1,L2,X) :- append(L1,Z,X),sum_l([_|L1],L2,Z).

integer_to_varlist(N,L) :- var(N),var(L).
integer_to_varlist(N,L) :- not((var(N),var(L))),length(L,N).

430 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 13:00:37 ]
>>429

integer_to_varlist(N,L) :- var(N),var(L).
integer_to_varlist(A,A) :- not(var(A)),A=[].
integer_to_varlist(L1,L2) :-
  not(var(L1)),
  not(var(L2)),
  L1=[N|R1],
  L2=[L|R2],
  integer_to_varlist(N,L),
  integer_to_varlist(R1,R2).
integer_to_varlist(N,L) :- not((var(N),var(L))),length(L,N).

integer_to_varlist/2は複雑になったがこれはユーティリティだから
構わない。これで

sum(N,M,Sum) :-
  integer_to_varlist([N,M,Sum],[L1,L2,L3]),
  sum_l(L1,L2,L3),
  integer_to_varlist([N,M,Sum],[L1,L2,L3]).

とすっきりする。

431 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 15:45:54 ]
>>430
?- sum(N,M,55).
N = 55,
M = 55;
N = 1,
M = 10;
N = 9,
M = 13;
N = 27,
M = 28;
no.
?-

432 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 03:58:23 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/901
# [1] 授業単元: C言語プログラミング演習
# [2] 問題文(含コード&リンク): プログラムを実行すると
# 行列1:
# 1,2,3
# 4,5,6
# 7,8,9
# 行列2:
# 3,4,5
# 6,7,8
# 9,10,11
# と表示する。最後に行列1と行列2の積を計算し、以下のように表示
# するプログラム。
# [行列1と行列2の積は
# ?,?,?
# ?,?,?
# ?,?,?]


433 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 04:24:30 ]
>>432
% Prolog
t432 :-
  _行列1 = [[1,2,3],[4,5,6],[7,8,9]],
  _行列2 = [[3,4,5],[6,7,8],[9,10,11]],
  write('行列1:\n'),行列表示(_行列1),
  write('行列2:\n'),行列表示(_行列2),
  行列の積(_行列1,_行列2,_行列3),
  write('行列1と行列2の積は\n'),行列表示(_行列3).

行列表示([]).
行列表示([_行|R]) :- concat_atom(_行,',',[_表示文字列]),write_formatted('%t\n',[_表示文字列]),行列表示(R).

行列の積(L1,L2,X) :- 行列の転置(L2,L3),行列の積の一(L1,L3,X).

行列の積の一([],_,[]) :- !.
行列の積の一([A|R1],L,[S1|R3]) :- 行列の積の二(A,L,S1),行列の積の一(R1,L,R3).

行列の積の二(_,[],[]) :- !.
行列の積の二(A,[B|R2],[C|R3]) :- 行列の積の三(A,B,C),行列の積の二(A,R2,R3).

行列の積の三([],[],0) :- !.
行列の積の三([A|R1],[B|R2],S) :- S1 is A * B,行列の積の三(R1,R2,S2),S is S1 + S2 .

行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3) .

行列の転置([[]|_],[]) :- !.
行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2),行列の転置(R2,R1),!.


434 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 17:14:27 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/916
# 【質問テンプレ】
# [1] 授業単元:情報基礎B
# [2] 問題文(含コード&リンク):(1) 平均、標準偏差
# (2) 得点の高い順の点数のリスト

435 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 17:19:44 ]
>>434
% Prolog

t434 :-
  '10人分の試験の点数を読み取る'(L),
  平均(L,_平均),標準偏差(L,_標準偏差),
  write_formatted('平均 : %t\n標準偏差 : %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 sqrt(S / (N - 1)),!.
標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2,S2 is S + S1,標準偏差(R,N,M,S2,V).

'10人分の試験の点数を読み取る'(L) :- '10人分の試験の点数を読み取る'(1,L). !.

'10人分の試験の点数を読み取る'(11,[]) :- !.
'10人分の試験の点数を読み取る'(M,[I|R]) :-
  write_formatted(' %t: ',[M]),
  get_line(Atom),
  atom_to_term(Atom,I,_),
  M2 is M + 1,
  '10人分の試験の点数を読み取る'(M2,R).

436 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 19:20:14 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/922
# [1] 授業単元:プログラミング入門
# [2] 問題文(含コード&リンク):
# if文を使って、月数に応じてコメントを表示するプログラム(1月ならばwinter、
# 3月ならspringといった具合に)を作る。
# 月は1月\uff5e12月までなので、13月以上の数値を打ち込んだ場合はerrorと表示させること。



437 名前:デフォルトの名無しさん [2009/07/11(土) 20:47:08 ]
# [1] 授業単元:プログラミング入門
# [2] 問題文(含コード&リンク):

たとえば
3481
という数字(4桁/0含む)が与えられたとき
0 = 3 + 4 - 8 + 1
1 = 3 + 4 - 8 * -1
2 = -(3 + 4 - 8 - 1)
3 = 3 * 4 - 8 - 1
4 = (3 / (4 + 8))^-1
...
のように加減乗除のみで整数を順に造っていってください

438 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 20:54:33 ]
x^y は加減乗算ではないよ。

439 名前:デフォルトの名無しさん [2009/07/11(土) 21:09:05 ]
4 = (4 + 8) / (3 * 1)

440 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 04:14:13 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/929
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 主語、目的語、述部が入ったデータファイルを読み込み、それらをランダムに
# 組み合わせて生成した短文を20個ファイルに出力するプログラムの作成。
# 短文の構文は必ず、「(主語)は、(目的語)(述部)。」となるようにする。
#
# 出力例:俺は、カレーが大好きだ。
#
# データファイルは以下を使用すること。
# 主語: 俺 私 あなた 彼 彼女 先生 犬のポチ 猫のタマ ライオン
# その人 政治家 ネズミ  の12個
# 目的語: カレー ご飯 肉 授業 男 女 すごいもの アレ アンパン
# お金  の10個
# 述部: が大好きだ が大嫌いだ を作った をなくした が欲しい
# に全力を尽くす を新しいものに交換した ?なにそれ美味いの?
# について深く考えた を捨てた に塩をふりかけた の11個

441 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 06:02:07 ]
>>440
% Prolog (1/2)
t440 :-
  get_lines('t440_1.txt',Lines),
  構造定義(Lines),
  findall(_文,文(_文,[]),_文集),
  '20文を選択して表示'(_文集).

'20文を選択して表示'(_文集) :-
  length(_文集,Len),
  Div is Len // 20,
  tell('t440_2.txt'),
  for(1,N,20),
  Nth is N * Div,
  list_nth(Nth,_文集,_選択文),
  write_formatted('%t%t%t%t%t\n',[_選択文]),
  N = 20,
  told.


442 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 06:03:56 ]
>>440
% Prolog (2/2)

文(_文,R) :- 主語(_文,R1),後置部(R2,R3),目的語(R2,R3),述部(R3,R4),句点(R4,R).

後置部(L,R) :- 後置詞(L,R1),読点(R1,R).
後置詞(['は'|R],R).
読点(['、'|R],R).
句点(['。'|R],R).

構造定義(Lines) :-
  member(_行,Lines),
  split(_行,[':',':',' ',' '],[F|L2]),
  append(L3,[_],L2),
  要素定義(F,L3),
  fail;
  true.

要素定義(F,L) :-
  member(A,L),
  P =.. [F,[A|R],R],
  assertz(P),
  fail;
  true.


443 名前:440 mailto:sage [2009/07/12(日) 06:11:44 ]
>>440 訂正 write_formattedの表現に誤りがありました。

'20文を選択して表示'(_文集) :-
  length(_文集,Len),
  Div is Len // 20,
  tell('t440_2.txt'),
  for(1,N,20),
  Nth is N * Div,
  list_nth(Nth,_文集,_選択文),
  concat_atom(_選択文,_選択文文字列),
  write_formatted('%t\n',[_選択文文字列]),
  N = 20,
  told.

444 名前:443 mailto:sage [2009/07/12(日) 06:12:58 ]
>>440 ではなくて >>442 の訂正でした。

445 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 06:20:53 ]
>>440
% Prolog ここに書き直しました。
nojiriko.asia/prolog/t440.html

446 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 10:36:30 ]
>>436
% Prolog
nojiriko.asia/prolog/t436.html



447 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 13:52:15 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/923
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):下に示すように,最初に整数を読み込み,
# その後,その個数だけ整数を読み込んでいき,そ
# の合計と平均を表示するプログラムを作成せよ。
# 整数は何個ですか: 6
# No.1 : 65
# No.2 : 23
# No.3 : 47
# No.4 : 9
# No.5 : 153
# No.6 : 777
# 合計値: 1074
# 平均値: 179.00

448 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 14:06:09 ]
>>447
% Prolog

t447 :-
  write('整数は何個ですか: '),
  get_line(Line),
  atom_to_term(Line,N,_),
  整数をn個読み込む(1,N,L),
  sum(L,Sum),
  avg(L,Avg),
  write('合計値: %t\n平均値: %t\n',[Sum,Avg]).

整数をn個読み込む(M,N,[]) :- M > N,!.
整数をn個読み込む(M,N,[_整数|R]) :-
  write_formatted('No.%t: ',[M]),
  get_line(Line),
  atom_to_term(Line,_整数,_),
  M2 is M + 1,
  整数をn個読み込む(M2,N,R).

sum([],0).
sum([A|R],X) :- sum(R,Y),X is A + Y.

avg(L,X) :- length(L,Len),Len > 0,sum(L,Sum),X is Sum / Len.






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<314KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef