いろんな言語で宿題スレat TECH
いろんな言語で宿題スレ - 暇つぶし2ch357:デフォルトの名無しさん
09/07/04 08:30:39
スレリンク(tech板:586番)
# [1] 授業単元:C+
# [2] 問題文(含コード&リンク):
# URLリンク(kansai2channeler.hp.infoseek.co.jp)

358:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/04 17:12:40
スレリンク(tech板:606番)
# [1] 授業単元:C
# [2] 問題文(含コード&リンク):
# URLリンク(kansai2channeler.hp.infoseek.co.jp)
# URLリンク(kansai2channeler.hp.infoseek.co.jp)

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

364:デフォルトの名無しさん
09/07/05 04:45:28
>>362
% Prolog
URLリンク(nojiriko.asia)

365:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/06 09:15:54
>>363
% Prolog
URLリンク(nojiriko.asia)

369:デフォルトの名無しさん
09/07/06 14:49:42
スレリンク(tech板:673番)
# [1] 授業単元: 構造体
# [2] 問題文(含コード&リンク): URLリンク(kansai2channeler.hp.infoseek.co.jp)
n/joyful/img/9688.txt

370:デフォルトの名無しさん
09/07/06 16:26:42
スレリンク(tech板:660番)
# [1] 授業単元:情報
# [2] 問題文(含コード&リンク):
# パソコン甲子園 2008 予選問題 問7 ふしぎな虫
# URLリンク(www.pref.fukushima.jp)

371:デフォルトの名無しさん
09/07/06 16:28:07
>>370
% Prolog
URLリンク(nojiriko.asia)

372:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/06 16:54:54
>>369 (1)
% Prolog
線分の長さ(X1,Y1,X2,Y2,_線分の長さ) :-
  _線分の長さ is sqrt((X2-X1)^2 + (Y2-Y1)^2).

374:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/07 14:08:47
スレリンク(tech板:725番)
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): 整数 nissu をキー入力して、
# 1 月1 日から数えて nissu 日目が何月何日かを表示
# したい。

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

385:デフォルトの名無しさん
09/07/07 16:08:17
>>384
% Prolog
URLリンク(nojiriko.asia)

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


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

389:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/07 18:28:46
>>377さん
誤植でした;;
無事出来ました
ちなみに述語がmemberだけで出来ると
聞いたのですが出来るのでしょうか?
出来るとしたらどんな感じに
なるのでしょうか?

391:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/08 04:01:54
スレリンク(tech板:762番)
# [1] 授業単元: 情報処理\u2160
# [2] 問題文: 乗算合同法で整数乱数を生成.。
# 区間(0.1)の一様にして、1以上、ある特定の整数の乱数を生成する。

394:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/08 04:11:39
>>392
>>367 がそれに当たるつもりなのですが。
ただLogが逆順に生成されますね。

396:デフォルトの名無しさん
09/07/08 06:38:43
>>395さん
成る程、丁寧にありがとうございました

397:デフォルトの名無しさん
09/07/08 07:57:55
スレリンク(tech板: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:デフォルトの名無しさん
09/07/08 11:24:22
>>397
% Prolog
URLリンク(nojiriko.asia)

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

400:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/08 13:46:35
>>399 もうひとつ違っていた。
  open(File,read,Input), ですね。

403:デフォルトの名無しさん
09/07/08 19:00:09
スレリンク(tech板:786番)
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# URLリンク(kansai2channeler.hp.infoseek.co.jp)
# [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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/09 04:03:35
スレリンク(tech板:921番)
# 正の数を入力し、入力した整数の1と
# その数を除く約数の和を求めて表示するプログラムを作成しなさい。
# 15の約数は、1,3,5,15なので、1と15を除く約数の和は8となる。
#
# お願いします。

408:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/09 07:15:43
スレリンク(tech板:797番)
# [1] C言語を使って計算を簡略化する:
# [2] XY平面上の3点P1(x1,y1)P2(x2,y2)P3(x3,y3)の座標を順に入力した時、
# 3点が同一直線上にあるかどうかを調べて
#   結果を表示するプログラムを作成せよ。

410:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/09 18:52:46
スレリンク(tech板:822番)
# 何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて
# 処理するプログラムを作る。
#
# (1)科目別の最高点、最低点を表示する。
# (2)各学生の3教科の平均点を表示する。
# (3)各教科の平均点を表示する。
#
# ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。

413:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/09 21:48:12
スレリンク(tech板:826番)
# [1] 授業単元: 宿題
# [2] 問題文(含コード&リンク): 整数を入力し、奇数か偶数かを判断するプログラム

417:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/10 03:09:03
スレリンク(tech板:825番)
# 〔1〕授業単元:C言語
# 〔2〕問題文:URLリンク(kansai2channeler.hp.infoseek.co.jp)
# 課題 I
# コマンド引数に自分の姓と名を与え,そのまま表示するプログラムを作成せよ.
# コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させること.
# 課題 II
# コマンド引数に任意の個数の整数を与え,その和を表示するプログラムを作成せよ.
# コマンド引数の数が少なかった場合は,標準エラー出力にエラー分を表示させること.

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

420:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/10 03:42:18
スレリンク(tech板:878番)
# [1] 授業単元:プログラミング言語
# [2] 問題文(含コード&リンク):
# char型配列xに格納された文字列を一文字ごとに空白を開けて逆順に出力する関数
# reverse_array(char[])を以下のように出力されるよう作成せよ。
#
# 処理前:Tokyo
# 関数reverse_array()を呼び出しました
# 処理後:"o y k o T"

422:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/10 07:47:05
スレリンク(tech板:932番)
# 【 課題 】ボウリングのスコアを付けるプログラムを作成せよ。
# 各投球ごとの倒れたピン数を入力し、スコア一覧を出力。
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI  】4. 制限なし
# 【 期限 】本日、7/10 15:00
# 【 Ver  】Eclipse Version: 3.4.2
# 【 補足 】1つのメソッド10行以内、引数・戻り値を持つメソッド最低3つ作成のこと。

424:デフォルトの名無しさん
09/07/10 07:51:05
>>423 (バッチ処理版)
% Prolog
URLリンク(nojiriko.asia)

425:デフォルトの名無しさん
09/07/10 11:40:09
スレリンク(tech板:825番)
# 〔1〕授業単元:C言語
# 〔2〕問題文:URLリンク(kansai2channeler.hp.infoseek.co.jp)
# 課題Ⅲ
# n から m までの整数の和を求めるプログラムを作成せよ.(n ≦ m)
# 再帰呼び出しを行う関数 sum を作成して問題を解くこと.
# 関数 sum は,引数を n, m とし,n から m までの和を返すもとのとする.


426:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/10 12:13:08
(defun sum (n m) (if (= n m) n (+ n (sum (1+ n) m))))


428:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/11 03:58:23
スレリンク(tech板: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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/11 17:14:27
スレリンク(tech板:916番)
# 【質問テンプレ】
# [1] 授業単元:情報基礎B
# [2] 問題文(含コード&リンク):(1) 平均、標準偏差
# (2) 得点の高い順の点数のリスト

435:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/11 19:20:14
スレリンク(tech板:922番)
# [1] 授業単元:プログラミング入門
# [2] 問題文(含コード&リンク):
# if文を使って、月数に応じてコメントを表示するプログラム(1月ならばwinter、
# 3月ならspringといった具合に)を作る。
# 月は1月\uff5e12月までなので、13月以上の数値を打ち込んだ場合はerrorと表示させること。

437:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/11 20:54:33
x^y は加減乗算ではないよ。

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

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

441:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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
09/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
09/07/12 06:12:58
>>440 ではなくて >>442 の訂正でした。

445:デフォルトの名無しさん
09/07/12 06:20:53
>>440
% Prolog ここに書き直しました。
URLリンク(nojiriko.asia)

446:デフォルトの名無しさん
09/07/12 10:36:30
>>436
% Prolog
URLリンク(nojiriko.asia)

447:デフォルトの名無しさん
09/07/12 13:52:15
スレリンク(tech板: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:デフォルトの名無しさん
09/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.

449:デフォルトの名無しさん
09/07/12 15:56:25
スレリンク(tech板:946番)
# 【質問テンプレ】
# [1] 授業単元 C言語
# [2] 問題文(含コード&リンク):
# 二つのバイナリファイルの中身を比較して等しいか、等しくないかを
# 比較して結果を返す関数を作る

450:デフォルトの名無しさん
09/07/12 15:58:28
>>449
% Prolog

二つのバイナリファイルの中身を比較(_ファイル1,_ファイル2,_診断) :-
open(ファイル1,read,_ストリーム1,[type(binary)]),
  open(ファイル2,read,_ストリーム2,[type(binary)]),
  get_byte(_ストリーム1,A),
  get_byte(_ストリーム2,B),
  二つのバイナリファイルの中身を比較(_ストリーム1,_ストリーム2,A,B,_診断),
  close(_ストリーム1),
  close(_ストリーム2).

二つのバイナリファイルの中身を比較(_,_,-1,-1,等しい) :- !.
二つのバイナリファイルの中身を比較(_,_,A,B,等しくない) :- not(A=B),!.
二つのバイナリファイルの中身を比較(_ストリーム1,_ストリーム2,A,A,_診断) :-
  get_byte(_ストリーム1,C),
  get_byte(_ストリーム2,D),
  二つのバイナリファイルの中身を比較(_ストリーム1,_ストリーム2,C,D,_診断).

451:デフォルトの名無しさん
09/07/12 18:03:48
スレリンク(tech板:424番)
# URLリンク(kansai2channeler.hp.infoseek.co.jp)にある
# 50コのデータを利用して
# 最大値と最小値を取り出すプログラムを以下の1,2の関数を用いて2つ作れ
# 1 return文を用いたケース
# 2 グローバル変数を用いたケース
# URLリンク(kansai2channeler.hp.infoseek.co.jp)
# ポインタは使用不可です
#ファイル名はseiseki.txtでお願いします
# 70 56 66 45 88
# 66 85 68 55 73
# 55 65 53 67 55
# 85 72 76 58 65
# 92 70 45 73 55
# 56 57 52 62 82
# 72 62 33 85 95
# 46 95 48 72 34
# 83 42 88 92 56
# 68 65 91 82 66

452:デフォルトの名無しさん
09/07/12 18:34:55
>>451
% Prolog

整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :-
  get_chars(_ファイル,Chars),
  concat_atom(Chars,Atom),
  split(Atom,['\n',' '],L),
  ならびの中の最小値・最大値(L,A,A,_最小値,_最大値).

ならびの中の最小値・最大値([],X,Y,X,Y) :- !.
ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :-
  A < Min,
  ならびの中の最小値・最大値(R,A,Max,_最小値,_最大値).
ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :-
  A > Max,
  ならびの中の最小値・最大値(R,Min,A,_最小値,_最大値).
ならびの中の最小値・最大値([_|R],Min,Max,_最小値,_最大値) :-
  ならびの中の最小値・最大値(R,Min,Max,_最小値,_最大値).


453:デフォルトの名無しさん
09/07/12 18:36:57
>>452 また間違い。
整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :-
  get_chars(_ファイル,Chars),
  concat_atom(Chars,Atom),
  split(Atom,['\n',' '],[A|L]),
  ならびの中の最小値・最大値(L,A,A,_最小値,_最大値).

454:デフォルトの名無しさん
09/07/12 18:48:58
>>447
StateT の練習

-- Haskell

import Control.Monad.State
import Data.Function (on)
import System.IO (hFlush, stdout)

t447 :: Int -> IO (Int,Double)
t447 m = evalStateT (t447' m 1) []
where
t447' :: Int -> Int -> StateT [Int] IO (Int,Double)
t447' m i = do
ls <- get
liftIO $ (putStr $ "No." ++ show i ++ ": ") >> hFlush stdout
s <- liftIO $ getLine
modify (++[read s])
if i == m then get >>= return . sumAndAverage else t447' m (i+1)

sumAndAverage :: [Int] -> (Int,Double)
sumAndAverage = f . foldl (\(s,l) x -> (s+x,l+1)) (0,0)
where
f :: (Int,Int) -> (Int,Double)
f (s,l) = (s, on (/) fromIntegral s l)

main = t447 6 >>= putStrLn . toString
where
toString :: (Int,Double) -> String
toString (s,a) = "sum: "++show s++"\naverage: "++show a

455:デフォルトの名無しさん
09/07/12 21:08:36
スレリンク(tech板:950番)
# 【質問テンプレ】
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 下に示すように,要素数が7 でint 型の配列に読み込んだ全要素を逆順に
# 並べ替えるプログラムを作成せよ.
#
# vx[ 0] : 58
# vx[ 1] : 32
# vx[ 2] : 17
# vx[ 3] : 46
# vx[ 4] : 22
# vx[ 5] : 73
# vx[ 6] : 69
# vx[ 0] = 69
# vx[ 1] = 73
# vx[ 2] = 22
# vx[ 3] = 46
# vx[ 4] = 17
# vx[ 5] = 32
# vx[ 6] = 58

456:デフォルトの名無しさん
09/07/12 21:14:39
>>455
% Prolog
% ここでは定義された単位節の一引数だけソートして差し替えると問題としてみよう。
URLリンク(nojiriko.asia)

457:デフォルトの名無しさん
09/07/12 23:05:14
スレリンク(tech板:957番)
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 100個の乱数を発生させ最大値、最小値、平均を求める
# また最大値、最小値それぞれ何番目にあるか答えよ

458:デフォルトの名無しさん
09/07/12 23:31:59
>>457
% Prolog
URLリンク(nojiriko.asia)


459:デフォルトの名無しさん
09/07/12 23:52:08
>>457
-- Haskell

import System.Random (getStdRandom, random)
import Control.Monad (replicateM)
import Data.List (maximumBy, minimumBy)
import Data.Function (on)

main = do
rands <- replicateM 100 (getStdRandom random :: IO Int)
let i = zip [1..] rands
putStrLn $ "(index, maximum) = " ++ show (maximumBy (compare `on` snd) i)
putStrLn $ "(index, minimum) = " ++ show (minimumBy (compare `on` snd) i)
putStrLn $ "average = " ++ show (on (/) fromIntegral (sum rands) 100)

460:デフォルトの名無しさん
09/07/13 05:00:41
スレリンク(tech板:960番)
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
# 下に示すように,要素数が5 でint 型の配列に、5 人の学生の身長を読み込んで、その
平均
# 身長を求めるプログラムを作成せよ。
# 身長を入力してください
# 1 番: 178
# 2 番: 175
# 3 番: 165
# 4 番: 179
# 5 番: 172
# 平均身長: 173.8


461:デフォルトの名無しさん
09/07/13 05:16:24
>>460
% Prolog
% URLリンク(nojiriko.asia)

'5 人の学生の身長を読み込んで、その平均身長を求める' :-
  '5 人の学生の身長を読み込んで、'(_身長ならび),
  sum(_身長ならび,_合計),
  _平均身長 is _合計 / 5,
  write_formatted('平均身長: %t\n',[_平均身長]),

'5 人の学生の身長を読み込んで、'(_身長ならび) :-
  findall(_身長,(for(1,N番目,5),身長を得る(N番目,_身長)),_身長ならび).

身長を得る(N番目,_身長) :-
  write_formatted('%t 番: ',[N番目]),
  数値を得る(_身長),
  _身長 > 0.0,
  _身長 < 220.0,!.
身長を得る(N番目,_身長) :-
  write('身長が適切な数値ではありませんでした。再入力が必要です\n'),
  身長を得る(N番目,_身長).

数値を得る(_数値) :-
  get_line(_改行までの文字列),
  atom_to_term(_改行までの文字列,_数値,_),
  number(_数値).

462:デフォルトの名無しさん
09/07/13 05:38:06
>>461 入力検査の部分を修正。
'5 人の学生の身長を読み込んで、その平均身長を求める' :-
'5 人の学生の身長を読み込んで、'(_身長ならび),
sum(_身長ならび,_合計),
_平均身長 is _合計 / 5,
write_formatted('平均身長: %t\n',[_平均身長]),

'5 人の学生の身長を読み込んで、'(_身長ならび) :-
findall(_身長,(for(1,N番目,5),身長を得る(N番目,_身長)),_身長ならび).

身長を得る(N番目,_身長) :-
write_formatted('%t 番: ',[N番目]),
数値を得る(_身長),
身長として適切な数値であるか検査する(_身長),!.
身長を得る(N番目,_身長) :-
身長を得る(N番目,_身長).

身長として適切な数値であるか検査する(_身長) :- _身長 > 0.0,_身長 < 230.0,!.
身長として適切な数値であるか検査する(_身長) :-
write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要
です\n',[_身長]),fail.

数値を得る(_数値) :-
get_line(_改行までの文字列),
atom_to_term(_改行までの文字列,_数値,_),
  number(_数値).

463:デフォルトの名無しさん
09/07/13 05:40:58
>>462 もう一度書き直し。すみません。
'5 人の学生の身長を読み込んで、その平均身長を求める' :-
  '5 人の学生の身長を読み込んで、'(_身長ならび),
  sum(_身長ならび,_合計),
  _平均身長 is _合計 / 5,
  write_formatted('平均身長: %t\n',[_平均身長]),

'5 人の学生の身長を読み込んで、'(_身長ならび) :-
  findall(_身長,(for(1,N番目,5),身長を得る(N番目,_身長)),_身長ならび).

身長を得る(N番目,_身長) :-
  write_formatted('%t 番: ',[N番目]),
  数値を得る(_身長),
  身長として適切な数値であるか検査する(_身長),!.
身長を得る(N番目,_身長) :-
  身長を得る(N番目,_身長).

身長として適切な数値であるか検査する(_身長) :- _身長 > 0.0,_身長 < 230.0,!.
身長として適切な数値であるか検査する(_身長) :-
  write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要
です\n',[_身長]),fail.

数値を得る(_数値) :-
  get_line(_改行までの文字列),
  atom_to_term(_改行までの文字列,_数値,_),
  number(_数値).

464:デフォルトの名無しさん
09/07/13 05:43:49
>>463
コピペの際に誤って改行してしまいましたが、Prologでは

  write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要
です\n',[_身長]),fail.

のように文字列のなかで改行すると構文エラーとなります。

465:デフォルトの名無しさん
09/07/13 09:32:01
スレリンク(tech板:949番)
# 【質問テンプレ】
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# URLリンク(kansai2channeler.hp.infoseek.co.jp)
# 課題:
# ・キーボードから正整数を入力し、その逆数を正確に計算し、ディスプレイに
# 表示させる。(循環小数である場合には、循環部分が分かるように表示を工夫する。)
# 内容:
# n(nは任意の正整数)の逆数を正確に計算し、計算過程で出た商、余りを逐次
# 配列に入れていく。計算途中で同じ商、余りが出たら循環小数と判定でき、
# 0が出たら割り切れると判定できる。

466:デフォルトの名無しさん
09/07/13 09:59:38
>>465
(do ((x (read) (read)) (a nil))
((or (not (integerp x)) (<= x 0)))
(setf a (cons x a))
(if (= x 1)
(format t "~A ~S~%" x a)
(format t "1/~A ~S~%" x a)))

どうぞ


467:デフォルトの名無しさん
09/07/13 13:25:57
>>465
% Prolog
URLリンク(nojiriko.asia)

468:デフォルトの名無しさん
09/07/13 13:42:10
>>465
% Prolog
逆数を正確に計算(_最大桁,_正整数,_逆数表示) :-
  逆数表示(_最大桁,_正整数,[[0,1]],_逆数表示),!.

逆数表示(N,_,Y,X) :- N < 0,逆数表示(Y,[],X),!.
逆数表示(N,_整数,[[D,0]|Y],X) :- 逆数表示([[D,0]|Y],[],X),!.
逆数表示(N,_整数,[[_商,_剰余]|Y],X) :-
  _商2 is _剰余 // _整数,
  _剰余2 is (_剰余 mod _整数) * 10,
  append(L1,[[_商2,_剰余2]|L2],[[_商,_剰余]|Y]),
  append([[']...',_]|L1],[[_商2,_剰余2],['[',_]|L2],Z),
  逆数表示(Z,[],X),!.
逆数表示(N,_整数,[[_商,_剰余]|Y],X) :-
  _整数 > _剰余,
  _剰余2 is _剰余 * 10,
  N2 is N - 1,
  逆数表示(N2,_整数,[[0,_剰余2],[_商,_剰余]|Y],X),!.
逆数表示(N,_整数,[[_商,_剰余]|Y],X) :-
  _整数 < _剰余,
  _商2 is _剰余 // _整数,
  _剰余2 is (_剰余 mod _整数) * 10,
  N2 is N - 1,
  逆数表示(N2,_整数,[[_商2,_剰余2],[_商,_剰余]|Y],X),!.

逆数表示([],[_|X],S) :- concat_atom(['0','.'|X],S),!.
逆数表示([[A|_]|R1],Y,S) :- 逆数表示(R1,[A|Y],S).

469:デフォルトの名無しさん
09/07/13 17:49:03
スレリンク(tech板:550番)
# [1] 授業単元: Ruby演習 [2] 問題文、URLリンク(kansai2channeler.hp.infoseek.co.jp)
c i-bin/joyful/img/9426.txt
# Rubyの問題がわかりません 助けてください
#
# (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい
#
# p wday["sunday"] #=> "日曜日"
# p wday["monday"] #=> "月曜日"
# p wday["saturday"] #=> "土曜日"
#
# (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい
#
# (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ
い。
# 「sunday」は日曜日のことです。
# 「monday」は月曜日のことです。
#
# (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正
規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ
ッドstr2hashを定義してください。
#
# p str2hash("bule 青 white 白\uff3cnred赤");
# #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"}

470:デフォルトの名無しさん
09/07/14 16:41:33
スレリンク(tech板:958番)
# 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】7/14 am6:00
# 【 Ver  】Eclipse Version: 3.4.2
# 【 補足 】
# あいう
# かきく
# さしす
# 上記のようなテキストファイルを読み込み、
# あかさ
# いきし
# うくす
# のように別のテキストファイルに書き出す感じです。

471:デフォルトの名無しさん
09/07/14 17:02:10
>>470
% Prolog
テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す(InFile,OutFile) :-
open(InFile,read,Input),
open(OutFile,write,Output),
findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
max(Chars,Max),
空白文字を付加して行の文字数一致させる(Max,LL,LL2),
行列の転置(LL2,LL3),
出力ファイルに書き出す(Output,LL3).

出力ファイルに書き出す(Output,[]) :- close(Output),!.
出力ファイルに書き出す(Output,[L|R]) :-
concat_atom(L,S),
write_formatted(Output,'%t\n',[S]),
出力ファイルに書き出す(Output,R).

空白文字を付加して行の文字数を一致させる(Max,LL1,LL2) :-
findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).

472:デフォルトの名無しさん
09/07/14 17:08:27
>>470 書き直し
% Prolog URLリンク(nojiriko.asia)

テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す(InFile,OutFile) :-
  open(InFile,read,Input),
  open(OutFile,write,Output),
  findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
  max(Chars,Max),
  空白文字を付加して行の文字数一致させる(Max,LL,LL2),
  行列の転置(LL2,LL3),
  出力ファイルに書き出す(Output,LL3).

出力ファイルに書き出す(Output,[]) :- close(Output),!.
出力ファイルに書き出す(Output,[L|R]) :-
  concat_atom(L,S),
  write_formatted(Output,'%t\n',[S]),
  出力ファイルに書き出す(Output,R).

空白文字を付加して行の文字数を一致させる(Max,LL1,LL2) :-
  findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).


473:デフォルトの名無しさん
09/07/14 17:31:04
スレリンク(tech板:954番)
# pascal pcpad
# 1個の自然数nを適当決めて、nチームが参加する
# リーグ戦の全試合を表示するプログラムを書きなさい。

474:デフォルトの名無しさん
09/07/14 17:33:35
>>473
% Prolog URLリンク(nojiriko.asia)

リーグ戦の全試合を表示するプログラム(N) :-
  findall(M,for(1,M,N),L),
  組合せ(L,2,[A,B]),
  write_formatted('%t-%t\n',[A,B]),
  fail;
  true.

組合せ(X,1,[A]) :-
  member(A,X).
組合せ([A|Y],N,[A|X]) :-
  N > 1,
  M is N - 1,
  組合せ(Y,M,X).
組合せ([_|Y],N,A) :-
  N > 1,
  組合せ(Y,N,A).

475:デフォルトの名無しさん
09/07/15 04:06:15
スレリンク(tech板:103番)
# 【質問テンプレ】
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): URLリンク(kansai2channeler.hp.infoseek.co.jp)
in/joyful/img/9753.txt
# 2.入力された年月の1日が何曜日かを調べる。
#   曜日のチェックはZellerの公式を使用する。Zellerの公式は、
#
#   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) +
8 ) / 5 ] + d ) % 7
#
#           ※ 上記の公式中の y は年、 m は月、 d は日を表し、
#             []はその数を越えない最大の整数を表す。(例: [13.6]は13
になる)
#
#   で、曜日を表す値は次のようになっている。
#
#     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3,
#
# 木曜日 = 4, 金曜日 = 5, 土曜日 = 6,
#
#   ※但し、1月と2月は前年の13月14月として計算するものとする。

476:デフォルトの名無しさん
09/07/15 04:18:51
>>475
% Prolog

'Zellerの公式'(_年,1,_日,_曜日) :-
  _前年 is _年 - 1,
  'Zellerの公式'(_前年,13,_日,_曜日),!.
'Zellerの公式'(_年,2,_日,_曜日) :-
  _前年 is _年 - 1,
  'Zellerの公式'(_前年,14,_日,_曜日),!.
'Zellerの公式'(_年,_月,_日,_曜日) :-
  _年=Y,_月=M,_日=D,
  _曜日を表す値 is (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7,
  曜日を表す値(_曜日を表す値,_曜日).

曜日を表す値(1,月曜).
曜日を表す値(2,火曜).
曜日を表す値(3,水曜).
曜日を表す値(4,木曜).
曜日を表す値(5,金曜).
曜日を表す値(6,土曜).
曜日を表す値(7,日曜).

477:デフォルトの名無しさん
09/07/15 07:09:47
>>476 まちがえた!
% Prolog URLリンク(nojiriko.asia)

曜日を表す値(0,日曜).
曜日を表す値(1,月曜).
曜日を表す値(2,火曜).
曜日を表す値(3,水曜).
曜日を表す値(4,木曜).
曜日を表す値(5,金曜).
曜日を表す値(6,土曜).

478:デフォルトの名無しさん
09/07/15 10:54:19
スレリンク(tech板:107番)
# [1] 授業単元: デジタル信号処理
# [2] 問題文(含コード&リンク): 2つのテキストファイル(double型)を読み込み、
# 畳み込み和を計算し、別のファイルに出力せよ。

479:デフォルトの名無しさん
09/07/15 11:02:01
>>478
% Prolog URLリンク(nojiriko.asia)

t478(N,Infile1,Infile2,Outfile) :-
  get_lines(Infile1,L1),
  get_lines(Infile2,L2),
  findall(F1,(member(A1,L1),atom_to_term(A2,F1,_)),_フィルタならび),
  findall(F2,(member(A2,L2),atom_to_term(A2,F2,_)),_サンプルならび),
  畳み込み和(N,_フィルタならび,_サンプルならび,_畳み込み和),
  畳み込み和出力(Outfile,_畳み込み和).

畳み込み和(N,_フィルタならび,_サンプルならび,_畳み込み和) :-
  length(L,N),
  append(L,_,_サンプルならび),
  reverse(_サンプルならび,_逆順サンプルならび),
  畳み込み和の二(_フィルタならび,_逆順サンプルならび,_畳み込み和).

畳み込み和の二([],_,0.0) :- !.
畳み込み和の二([A|R1],[B|R2],X) :-
  畳み込み和の二(R,R2,Y),
  X is A * B + Y.

畳み込み和出力(Outfile,_畳み込み和) :-
  open(Outfile,write,Output),
  write_formatted(Output,'%t\n',[_畳み込み和]),
  close(Output).

480:デフォルトの名無しさん
09/07/15 18:41:51
OSでSoundBlaster16のリセットをしたいのだが、どうもなかなかリセットが上手くいかない。
できればアセンブラのサンプルコード欲しいのだが誰か頼む

・SB16の詳細
URLリンク(faculty.petra.ac.id)

・ここにもサンプルコードがあるけど、どうも何をやっているのか良く分からない・・
URLリンク(www.nondot.org)

481:デフォルトの名無しさん
09/07/16 11:50:34
>>473

(defun comb (lim)
(do ((n1 1 (1+ n1)) (c 0))
((> n1 lim))
(do ((n2 (1+ n1) (1+ n2)))
((> n2 lim))
(setf c (1+ c))
(format t "no.~5A ~A - ~A~%" c n1 n2))))

;20チームだと↓

(comb 20)


482:デフォルトの名無しさん
09/07/16 17:02:20
>>473
-- Haskell

comb :: Int -> [(Int,Int)]
comb n = comb' [1..n]
where
comb' :: [Int] -> [(Int,Int)]
comb' [] = []
comb' (x:xs) = map ((,) x) xs ++ comb' xs

main = print $ comb 3

483:デフォルトの名無しさん
09/07/16 17:29:23
>>469
% Prolog これは遊びです。フラットな単位節でなくこのような形式で定義する積極的な理由は見つかりません。
URLリンク(prolog.asia)

484:483
09/07/16 17:31:06
>>483 間違えました。
URLリンク(nojiriko.asia)

でした。

485:デフォルトの名無しさん
09/07/16 17:39:20
>>475
% Prolog (1)-(4) まで全て定義おわりました。
URLリンク(nojiriko.asia)

486:デフォルトの名無しさん
09/07/17 00:10:16
| ?- search(hanoi,S,G,P,A).

:- [search].
/* 初期状態と目標状態 これは、2枚のハノイ */
initial_state(hanoi, [[1,2,3],[],[]]).
goal_state(hanoi, [[],[],[1,2,3]]).
%------------------ ハノイの塔
operator(hanoi, left_to_right(Disk), [[Disk|RestA], B, C], [RestA, B, [Disk|C]]) :-
con2(Disk, C).

operator(hanoi, left_to_center(Disk), [[Disk|RestA], B, C], [RestA, [Disk|B], C]) :-
con2(Disk, B). % 移動先で制約2を満たしていることをチェック

operator(hanoi,center_to_left(Disk), [A, [Disk|RestB], C], [[Disk|A], RestB, C]) :-
con2(Disk, A).

operator(hanoi, center_to_right(Disk), [A, [Disk|RestB], C], [A, RestB, [Disk|C]]) :-
con2(Disk, C).

%-- 制約2
% 一番上にあるディスクよりも、小さいことを検査
/* ?- con2(2, [1,3]).
?- con2(1, [2,3]). */

コレを完成させるにはどうすればいいのでしょうか?

487:デフォルトの名無しさん
09/07/17 02:52:13
スレリンク(tech板:157番)
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
# URLリンク(kansai2channeler.hp.infoseek.co.jp)
#
# 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、
# かつ2回以上使用される数字が存在しないものを魔方陣という。
# 下図に示すa,bに数値を設定したときに、1~9の整数によって構成される魔方陣を
# 出力するプログラムを作成せよ。
# 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」
# と出力するとする。
#
# la_lb_l__l
# l__l__l__l
# l__l__l__l
#


488:デフォルトの名無しさん
09/07/17 02:53:14
スレリンク(tech板:160番)
# [1]プログラミング
# [2] 課題
# 言語: C もしくは C++ 言語
#
# (1)以下のプログラムを作成しなさい(数当てゲーム)
#
# *画面上に「好きな数字を入力してください」と表示して、キーボードからの入力を
# 待つ。
# 変数aを定義して、10までの乱数を発生させて変数aに代入する。
# キーボードからの入力があれば、先に発生させた乱数と一致しているならば
# 「あたり!!」と表示する。
# 一致していなければ「残念乱数はxxです」と表示する(xxには変数aの中身を
# 表示する)

489:デフォルトの名無しさん
09/07/17 03:28:41
>>488
% Prolog

数当てゲーム :-
  repeat,
  _a is ramdom mod 10 + 1,
  write('好きな数字を入力してください '),
  get_line(Line),
  atom_to_term(Line,N,_),
  数当てゲーム診断(_a,N),
  Line = end_of_file.

数当てゲーム診断(A,A) :-
  write('あたり!!\n').
数当てゲーム診断(_,B) :-
  not(integer(B)),
  write('入力されたのは整数ではありません\n').
数当てゲーム診断(A,N) :-
  not(A == N),
  write_formatted('残念乱数は%tです\n',[A]).



490:デフォルトの名無しさん
09/07/17 07:27:53
>>487
% Prolog
URLリンク(nojiriko.asia)

491:デフォルトの名無しさん
09/07/17 10:30:13
>>486
ハノイの塔の課題をその仕様通り自然に定義していったらどうなるか?
興味がありますが、私が何か書き込めるまでにはもう少し時間が必要なので、
最小サンプルで確認することによって、ディスクの大小順序問題を
スキップしてしまっている最もよく知られたアルゴリズムによる
プログラム例を URLリンク(nojiriko.asia) に示します。

問題を直感的に理解するには
「Prologプログラミング入門」安部憲広著 共立出版刊 の29頁 図3.3
がよいと思います。

492:デフォルトの名無しさん
09/07/17 12:40:40
スレリンク(tech板:970番)
# 配列に関する基本問題
# フィールド int型の配列numberのみ
# コンストラクタ 引数で与えられたScannerから整数を順次読み取る、
# 最初に読み取った整数を配列サイズとみなし、int型の配列を生成し
# numberで参照する
# その後整数を読み取ってnumber[0],number[1]、・・・・と順に代入していき、
# 配列サイズ分だけ読み取る
# number中の全要素,最大値、最小値を表示

493:デフォルトの名無しさん
09/07/17 12:46:04
>>492
% Prolog こういう手続き的なのも可能。

t492 :-
  get_integer(N),
  length(L,N),
  for(1,M,N),
  get_integer(I),
  list_nth(M,L,I),
  M = N,
  max(L,Max),
  min(L,Min),
  write_formatted('全要素 = %t\n最大値 = %t\n最小値 = %t\n',[L,Max,Min]).

get_integer(N) :-
  repeat,
  get_line(Line),
  atom_to_term(Line,N,_),
  integer(N).


494:デフォルトの名無しさん
09/07/17 14:33:32
スレリンク(tech板:900番)
# 3つの自然数の合計が10になるような組み合わせを
# すべて列挙するプログラムを書け
# 1+1+8と1+8+1のように並び順が異なるだけのものは
# 同一と考え、重複して出力しないようにすることが望ましい

495:デフォルトの名無しさん
09/07/17 14:37:18
>>494
% Prolog

t494 :-
  重複組合せ([1,2,3,4,5,6,7,8,9],3,[A,B,C]),
  10 is A + B + C,
  write_formatted('%t + %t + %t\n',[A,B,C]),
  fail.
t494.

重複組合せ(X,1,[A]) :-
  member(A,X).
重複組合せ([A|Y],N,[A|X]) :-
  N > 1,
  M is N - 1,
  重複組合せ([A|Y],M,X).
重複組合せ([_|Y],N,A) :-
  N > 1,
  重複組合せ(Y,N,A).



496:デフォルトの名無しさん
09/07/17 14:59:38
スレリンク(tech板:902番)
# 個数Nが与えられたとき
# N個の自然数の合計が10になるような組み合わせをすべて列挙する
# プログラムを書け

497:デフォルトの名無しさん
09/07/17 15:05:56
>>496
% Prolog

t496(N) :-
  重複組合せ([1,2,3,4,5,6,7,8,9,10],N,L),
sum(L,10),
concat_atom(L,' + ',S),
write_formatted('%t\n',[S]),
fail.
t496(_).

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

498:デフォルトの名無しさん
09/07/17 15:07:10
>>496 書き直し。
% Prolog

t496(N) :-
  重複組合せ([1,2,3,4,5,6,7,8,9,10],N,L),
  sum(L,10),
  concat_atom(L,' + ',S),
  write_formatted('%t\n',[S]),
  fail.
t496(_).

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

499:デフォルトの名無しさん
09/07/17 21:28:54
>>488
import System.Random (getStdRandom, randomR)
import qualified System.IO.UTF8 as U

main = do
a <- getStdRandom $ randomR (0,10) :: IO Int
c <- getLine
U.putStrLn $ if (read c) == a then "あたり!!" else "残念乱数は" ++ show a ++ "です"

500:デフォルトの名無しさん
09/07/17 22:02:58
>>487
import Control.Monad (guard)
import Data.List (permutations)

t487 :: Int -> Int -> [[Int]]
t487 a b = do
xs@[c,d,e,f,g,h,i] <- permutations $ filter (\x -> and [x /= a, x /= b]) [1..9]
let n = a+b+c
guard $ and [d+e+f == n, g+h+i == n, a+d+g == n, b+e+h == n, c+f+i == n, a+e+i == n, c+e+g == n]
return (a:b:xs)

main = let a = t487 8 1 in if null a then putStrLn "Impossible" else mapM_ printer a
where
printer :: [Int] -> IO ()
printer [] = return ()
printer (a:b:c:xs) = print [a,b,c] >> printer xs

501:デフォルトの名無しさん
09/07/17 22:26:05
>>492
import Control.Monad (foldM)

t492 :: Int -> IO (Int,Int)
t492 n = foldM f (maxBound :: Int,minBound :: Int) [1..n]
where
f (a,b) _ = do
s <- getLine
let n = read s
return (min a n, max b n)

main = getLine >>= t492 . read >>= print

502:デフォルトの名無しさん
09/07/17 22:53:38
スレリンク(tech板:175番)
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
#
# 下に示すように,キーボードから二つの文字列を読み込み,どちらの文字列が
# 何文字長いか
# を表示するプログラムを作成せよ.なお,二つの文字列が同じ長さならば,
# 「二つの文字列は同じ長さです.」と表示させること.
#
# 文字列A : Good
# 文字列B : Morning
# 文字列B の方が3 文字長いです.

503:デフォルトの名無しさん
09/07/17 22:55:55
>>502
% Prolog URLリンク(nojiriko.asia)

入力文字列長の比較 :-
  write('文字列A ? '),
  get_line(A),
  write('文字列B ? '),
  get_line(B),
  名前付き文字列長さの診断(文字列A,A,文字列B,B,_診断),
  write_formatted('%t\n',[_診断).

名前付き文字列長の診断(_名前1,_文字列1,_名前2,_文字列2,_診断) :-
  atom_chars(_文字列1,L1),
  atom_chars(_文字列2,L2),
  length(L1,_長さ1),
  length(L2,_長さ2),
  _長さの差 is _長さ1 - _長さ2
  名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断),!.

名前付き文字列長の診断の二(_,_,0,'二つの文字列は同じです。') :- !.
名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断) :-
  _長さの差 > 0,
  concat_atom([_名前1,の方が,_長さの差,文字長いです。],_診断),!.
名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断) :-
  _長さの差 < 0,
  _長さの差1 is abs(_長さの差),
  concat_atom([_名前2,の方が,_長さの差1,文字長いです。],_診断).

504:503
09/07/17 23:01:55
>>503 訂正

  名前付き文字列長さの診断(文字列A,A,文字列B,B,_診断),
->
  名前付き文字列長の診断(文字列A,A,文字列B,B,_診断),

505:503
09/07/17 23:32:27
スレリンク(tech板:973番)
# 課題 URLリンク(uploaders.ddo.jp)
#
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI  】制限なし
# 【 期限 】7月21日
# 【 Ver  】1.6.0_11
#
# zipフォルダに詳細ファイルを入れました


506:デフォルトの名無しさん
09/07/17 23:35:14
>>505
% Prolog URLリンク(nojiriko.asia)

rev_str(X,Y) :- reverse_atom(X,Y).

reverse_atom(X,Y) :-
  atom_chars(X,L),
  reverse(L,L2),
  atom_chars(Y,L2).

507:デフォルトの名無しさん
09/07/17 23:49:23
>>494
>>496

import Data.List (sort)

h :: (Ord a) => Int -> [a] -> [[a]]
h 1 xs = map (\ls -> [ls]) xs
h n xs = concat $ map (\x -> map (\ys -> x:ys) (h (n-1) (filter (>= x) xs))) xs

t496 :: Int -> [[Int]]
t496 n = filter ((==10) . sum) $ h n [1..9]

main = print $ t496 3

508:デフォルトの名無しさん
09/07/18 00:05:10
>>502
import System.IO (hFlush, stdout)
import qualified System.IO.UTF8 as U
main = do
U.putStr "文字列A: " >> hFlush stdout
a <- getLine
U.putStr "文字列B: " >> hFlush stdout
b <- getLine
let n = length a
let m = length b
U.putStrLn $ case compare n m of
GT -> "文字列Aの方が" ++ show (n-m) ++ "文字長いです"
LT -> "文字列Bの方が" ++ show (m-n) ++ "文字長いです"
EQ -> "二つの文字列は同じ長さです"

509:デフォルトの名無しさん
09/07/18 00:21:54
スレリンク(tech板:904番)
# [課題]
# ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を
# 取り除く
# ・一度に取ることのできるマッチ棒は1から3本
# ・山を空にしたプレーヤが勝ち
# 人間2人でこのゲームを行なうプログラムを作成せよ.
#
# プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと,
# 勝負がついたかどうかのチェックを行なうこと。
# また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの
# 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような
# プログラムにすること。

510:デフォルトの名無しさん
09/07/18 00:24:37
>>509
% Prolog
URLリンク(nojiriko.asia)

511:デフォルトの名無しさん
09/07/18 00:42:42
>>491さん
暇になったらお願いします


512:493
09/07/18 05:40:06
>>493 大間違い! これではリストに整数が貯まらない。再帰はしかたない。
t492 :-
  get_integer(N),
  length(L,N),
  t492(L),
  max(L,Max),
  min(L,Min),
  write_formatted('全要素 = %t\n最大値 = %t\n最小値 = %t\n',[L,Max,Min]).

t492([]) :- !.
t492([I|R]) :-
get_integer(I),
t492(R).

get_integer(N) :-
  repeat,
  get_line(Line),
  atom_to_term(Line,N,_),
  integer(N).

% バックトラックすると値の束縛は解かれてしまうから。

513:デフォルトの名無しさん
09/07/18 17:34:59
これまでの Prolog による回答の索引を作りました。

URLリンク(nojiriko.asia)

514:デフォルトの名無しさん
09/07/18 18:08:40
Prologで盛り上がっているのは、あんた一人だけだよ

515:デフォルトの名無しさん
09/07/18 18:11:20
prolog恐ろしす・・・

516:デフォルトの名無しさん
09/07/18 19:08:20
スレリンク(tech板:196番)
# [1] 授業単元:プログラミング論
# [2] 問題文:入力ストリームから読み込んだ文字列を、データベースに格納する前に
# スタックに一時的に格納するプログラムを作成する
# このときデータをまとめたデータ文字列を一つずつスタックへプッシュしたり
# ポップしたりする過程が分かるプログラムを作成する。
# なおスタックを実現するライブラリはスタックのための別のヘッダにまとめる
#
# [プログラムの例]
# 入力ストリームから読み込んだデータ文字列をスタックへプッシュしたり
# ポップしたりするたびにデータベースに格納された全データを表示する。

517:デフォルトの名無しさん
09/07/19 05:02:52
>>516
% Prolog URLリンク(nojiriko.asia)
t516(Instream,Stack1,Stack2) :-
  get_code(Instream,Code),
  t516(Instream,Code,Stack1,Stack2).

t516(Instream,-1,Stack1,Stack2) :-
  t516_popall(Stack1,Stack3,[],L),
  atom_codes(Atom,L),
  assertz(database(Atom)),!.
t516(Instream,10,Stack1,Stack2) :-
  t516_popall(Stack1,Stack3,[],Codes),
  atom_codes(Atom,Codes),
  assertz(database(Atom)),
  get_code(Instream,Code),
  t516(Instream,Code,Stack3),!.
t516(Insteam,A,Stack1,Stack2) :-
  push(A,stack1,Stack3),
  get_code(Instream,B),
  t516(Instream,B,Stack3,Stack2).

t516_popall(Stack,Stack,X,X) :- empty(Stack),!.
t516_popall(Stack1,Stack2,Y,X) :-
  pop(A,Stack1,Stack3),
  t516_popall(Stack3,Stack2,[A|Y],X).

empty([]) :- write('stack empty :: []\n\n').

push(A,Stack,[A|Stack]) :- write_formatted('push:%t :: %t --> %t\n',[A,Stack,[A|Stack]]).

pop(A,[A|Stack],Stack) :- write_formatted('pop:Pop :: %t --> %t Pop=%t\n',[[A|Stack],Stack,A]).

518:デフォルトの名無しさん
09/07/19 06:25:56
>>514
チュートリアルの題材を求めるのが狙いなので、他の言語の人の
書き込みを待たずに進めてしまってちょっと申し訳けない。
Prologの場合は、低水準のコードにサイト上でなかなか出会えないと
いうことがあって、そこが初心者にとって辛いところです。
そこらあたりの欠落を些かでも埋められればと書き込んでいます。
繰り返し、いろんな表記法で、できれば螺旋状に発展していければ
おもしろいと思うのですが、間違いの訂正に数レスとられることが
多くて、1000スレまでの間では貧弱なものにしかなりそうもない。
それにしても、「C/C++の宿題片付けます 12*代目」の方々には感謝です。

519:デフォルトの名無しさん
09/07/19 13:34:31
スレリンク(tech板:213番)
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 下に示すように,キーボードから文字列を読み込み,その文字列が
# 回文(前から読んでも後ろから読んでも同じ)かどうかを判定するプログラムを
# 作成せよ.なお,入力する文字列は半角の英数字および記号のみと仮定してよい.
#
# 文字列を入力してください: abcba
# 回文です.

520:デフォルトの名無しさん
09/07/19 13:41:43
>>519
% Prolog

回文読み込み :-
  get_char(C),
  回文読み込み(C,[],X,X),
  write('回文です\n').

回文読み込み('\n',X,X,[]).
回文読み込み(C,Y,X,[C|R]) :-
  get_char(C2),
  回文読み込み(C2,[C|Y],X,R).

521:デフォルトの名無しさん
09/07/21 03:00:05
連休見なかったらC/C++の宿題片付けますスレが60も進んでしまった トホホ

522:デフォルトの名無しさん
09/07/21 09:30:44
(labels ((str-input nil
(format t "文字列を入力してください: ")
(read-line)))
(do ((l (str-input) (str-input)))
((= (length l) 0))
(if (equal l (reverse l))
(format t "回文です~%")
(format t "回文ではありません~%"))))

こんな感じです


523:デフォルトの名無しさん
09/07/21 12:23:09
スレリンク(tech板:292番)
# [1] 授業単元:プログラミングI
# [2] 問題文(含コード&リンク):
# typedef struct node *Tree;
# typedef struct node{
# int data;
# Tree left_subtree;
# Tree right_subtree;
# }Node;
#
# 2分木の大きさ(節点の個数)を調べて返す関数
# int size(Tree t)を定義せよ

524:デフォルトの名無しさん
09/07/21 12:26:07
スレリンク(tech板:291番)
# [1] 授業単元:コンピュータリテラシー
# [2] 問題文(含コード&リンク):問題文と参考は以下です
#   URLリンク(kansai2channeler.hp.infoseek.co.jp)
# ・試験の過程を記録
# 1,番号、得点を入力したあと平均点を計算
# 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする)
# 3,番号、得点、平均との差を出力
# 以上のプログラムを作成

525:デフォルトの名無しさん
09/07/21 12:32:04
>>523
(define (nodenum t)
(cond ((not (pair? t)) 0)
((or (not (pair? (cdr t))) (not (pair? (cddr t)))) "error:not a binary tree")
(else (+ 1 (nodenum (cadr t)) (nodenum (caddr t))))))
(nodenum '(1 leaf leaf)) ;1
(nodenum '(1 'leaf)) ;error
(nodenum '(1 (2 leaf leaf) (3 leaf (4 leaf leaf)))) ;4

526:デフォルトの名無しさん
09/07/21 12:44:29
>>524
(define bt '((1 60) (3 75) (4 100) (2 80)))
(define (average bt) (exact->inexact (/ (fold + 0 (map cadr bt)) (length bt))))
(define (sorter kind bt)
(cond ((eq? kind 'bangou) (sort bt (lambda (x y) (< (car x) (car y)))))
((eq? kind 'tokuten) (sort bt (lambda (x y) (> (cadr x) (cadr y)))))
(else "designate sort kind")))
(define (output bt)
((lambda (ave)
(map (lambda (x)
(print "bangou:" (car x))
(print "tokuten:" (cadr x))
(print "heikin_diff:" (- (cadr x) ave))
(newline)) bt))
(average bt)))
(average bt)
(sorter 'bangou bt)
(sorter 'tokuten bt)
(output bt)

527:デフォルトの名無しさん
09/07/21 12:57:44
スレリンク(tech板:256番)
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され,
# 2行目以降はその数の不定長文字列が空白で区切られているような入力
# ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに
# 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ
# を保持する.
# struct t_list {
# char **attributes;
# struct t_list *next;
# };
# またにはソースファイルには,生成した単方向連結リストの内容を
# 標準出力に出力する関数 print_tlist を含むものとしprint_tlist により各行
# に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ.
# なお,入力ファイル名はコマンドライン
# 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も
# 含めること.また,プログラム自身を除く引数の数が0個,
# もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする
# 入力ファイル:URLリンク(www.uploda.tv)

528:デフォルトの名無しさん
09/07/21 14:47:09
>>523
% Prolog

二分木の総節数([],0).
二分木の総節数(_節,_節の大きさ) :-
  節(_節,_左枝,_右枝),
  二分木の総節数(_左枝,_左枝の大きさ),
  二分木の総節数(_右枝,_右枝の大きさ),
  _節の大きさ is _左枝の大きさ + _右枝の大きさ + 1.

529:デフォルトの名無しさん
09/07/21 15:36:10
>>524
% Prolog
URLリンク(nojiriko.asia)

530:デフォルトの名無しさん
09/07/21 16:53:46
>>527
% Prolog
URLリンク(nojiriko.asia)

531:デフォルトの名無しさん
09/07/21 16:58:18
>>523
-- Haskell

data BTree a = Node (BTree a) a (BTree a) | Nil

size :: BTree a -> Int
size Nil = 0
size (Node tl _ tr) = 1 + (size tl) + (size tr)

main = print $ size node
where
node = Node (Node (Node Nil 2 Nil) 4 Nil) 0 (Node Nil 2 Nil)

532:デフォルトの名無しさん
09/07/21 17:35:39
>>524
import System.IO (hFlush, stdout)
import qualified System.IO.UTF8 as U
import Control.Monad.Writer
import Data.Function (on)
import Data.List (sortBy)

main = do
U.putStrLn "終了の際は0を二回押す"
grades <- execWriterT t524
U.putStr "(1)学籍番号順 (2)成績順: " >> hFlush stdout
s <- getLine
let cmp = case (read s) of
1 -> compare `on` fst
2 -> compare `on` snd
let av = average $ map snd grades
mapM_ (printer av) $ sortBy cmp grades
where
printer av (g,s) = U.putStrLn $ "学籍番号" ++ (show g) ++ " 成績" ++ (show s) ++ " 平均との差" ++ (show ((fromIntegral s) - av))

t524 :: WriterT [(Int,Int)] IO ()
t524 = do
liftIO $ U.putStr "学籍番号: " >> hFlush stdout
gakuseki <- liftIO getLine
liftIO $ U.putStr "成績: " >> hFlush stdout
seiseki <- liftIO getLine
let g = read gakuseki
let s = read seiseki
unless (g == 0 && s == 0) $ tell [(g,s)] >> t524

average :: [Int] -> Double
average = uncurry ((/) `on` fromIntegral) . foldl (\(s,l) x -> (s+x, l+1)) (0,0)

533:デフォルトの名無しさん
09/07/21 17:57:16
>>527
main = do
_ <- getLine -- just ignore
conn <- getContents
print $ map words $ lines conn

534:デフォルトの名無しさん
09/07/21 19:25:20
全くの初心者で、全然わからないんですがよろしくお願いします。アセンブラらしいです。


[課題] キーボードから10進数表示で2桁以下の正の整数を二つ受け取り,これらの積を求めGR1に保存するプログラムを作成しなさい。
ただし,以下の仕様を満たすこと。

掛け算は(上の例の方法ではなく)以下の(参考)の方法で行い,さらに副プログラム内で行うこと
キーボードから受け取った文字列を数値に変換する部分も副プログラムを用いて作成すること
キーボードからは10進数表示で2桁以下の正の整数が必ず入力されると仮定してよい(それ以外の文字列が入力された場合の対応を考えなくてよい)。

(参考) 二つの数の掛け算は,それぞれの2進数表現を考え,加算とシフトを用いることによって実現できる。たとえば,13x3 を計算するとき,13,3の2進数表現 1101,11 に対して通常の掛け算を筆算で行うように



と計算できる。すなわち,この例では

掛ける数の最下位(一番右)のビットが1なので,1101 を(0 ビットシフトして)(0に)加える。
掛ける数の右から2番目のビットが1なので,1101 を 1 ビットシフトして 11010 として1の結果に加える。
という手順により,二つの数の積を計算することができる。

掛ける数を1ビットずつ右にシフトしたとき,最下位ビットが1であればオーバーフローが発生する。
オーバーフローの発生はJOV命令でチェックできる(7/7の演習内容参照)ので,掛ける数の2進数表現においてどのビットが1であるかは直ちにわかる。
また右シフトを繰り返して0になるとZFフラグが1になるので,右シフトを停止するためにはJZE命令を使用すれば良い。

535:デフォルトの名無しさん
09/07/22 07:32:01
スレリンク(tech板:303番)
# [1] 授業単元:
# インタラクティブッコミュニケーション
# [2] 問題文(含コード&リンク):
# 外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、
# main()内のprintf()で結果を出力するプログラムを作成せよ。
# 但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは
# 負の値が入力されるまで繰り返されるものとする。
#
# URLリンク(www.ncc-1701.jp)
# の一番下の演習。
# 最終的にはこの形に
# URLリンク(www.ncc-1701.jp)

536:デフォルトの名無しさん
09/07/22 07:59:46
>>535
% Prolog 題意とは違いますが為替レートはリアルタイムに取得しています。
URLリンク(nojiriko.asia)

537:デフォルトの名無しさん
09/07/22 11:29:25
スレリンク(tech板:300番)
# [1] 授業単元:プログラミング基礎
# [2] 繰り返しをwhileもしくはdo\uff5ewhile文を使って作成しなさい。
#
# 任意の数字を入力し、その数字分まで1つずつ加算して表示する。
# 入力した数字までいったら逆に1になるまで表示する。
#
# 例
# 8
#
# *
# **
# ***
# ****
# *****
# ******
# *******
# ********
# *******
# ******
# *****
# ****
# ***
# **
# *

538:デフォルトの名無しさん
09/07/22 11:50:49
>>537
% Prolog ちょっと捻ってみた(コウイウコトヲシテハイケナイ)。

t537(N) :- M is N - 1,length(Z,M),t537([*],Z).

t537(L,Z) :- append(L,_,Z),t537_w(L),t537([*|L],Z).
t537(L,Z) :- t537_w(L),fail.
t537([*],_) :- !.

t537_w(L) :- concat_atom(L,S),write_formatted('%t\n',[S]).

539:デフォルトの名無しさん
09/07/22 11:57:44
>>537 一部変更。
% Prolog

t537(N) :- length(L,N),L=[_|Z],t537([*],Z).

t537(L,Z) :- append(L,_,Z),t537_w(L),t537([*|L],Z).
t537(L,Z) :- t537_w(L),fail.
t537([*],_) :- !.

t537_w(L) :- concat_atom(L,S),write_formatted('%t\n',[S]).


540:デフォルトの名無しさん
09/07/22 12:41:10
スレリンク(tech板:297番)
# [1] 授業単元: 数値解析プログラミング
# [2] 問題文(含コード&リンク): ∫\u20801/1+xx の積分を
# 方形公式、台形公式、シンプソン公式を用いて数値計算するプログラムを作成せよ

541:デフォルトの名無しさん
09/07/22 14:30:31
>>540 (1)
% Prolog

f(X,Y) :- Y is 1 / (1 + x ^ 2).

シンプソンの公式(A,B,M,X) :-
  D is (B - A) / (2 * M),
  f(A,S),
  N is 2 * M - 1,
  シンプソン公式の二(1,N,A,D,S,S2),
  f(B,Z),
  X is (S2 + Z) * D / 3.

シンプソンの公式の二(M,N,_,_,X,X) :- M > N,!.
シンプソンの公式の二(M,N,A,D,Y,X) :-
  U is A + M * D,
  Mod is M mod 2,
  シンプソンの公式の三(Mod,U,Y,Z),
  M2 is M + 1,
  シンプソンの公式の二(M2,N,A,D,Z,X).

シンプソンの公式の三(0,X,S,S2) :- f(X,Y),S2 is S + 2 * Y.
シンプソンの公式の三(1,X,S,S2) :- f(X,Y),S2 is S + 4 * Y.

542:541
09/07/22 14:42:49
>>541 訂正 X が x になっていた。
f(X,Y) :- Y is 1 / (1 + X ^ 2).

543:デフォルトの名無しさん
09/07/23 07:01:58
スレリンク(tech板:431番)
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):下記
# [3] 環境
#  [3.1] OS:WindowsVista SP1
#  [3.2] Visual stdio2008
#  [3.3] 言語:C
# [4] 期限:2009年7月23日午前7時まで
# [5] その他の制限:できるだけ簡単に
#
# 倍精度浮動小数点型変数で数値を入力し,
# 小数点以下を切り捨て・切り上げ・四捨五入するプログラムを作成せよ.
# ただし, 条件式は使用せず, 型変換を必ず使用すること.

544:デフォルトの名無しさん
09/07/23 08:23:13
>>537
(define (f x)
(dotimes (i x) (dotimes (j (+ i 1)) (display "*"))(newline))
(dotimes (i x) (dotimes (j (- x i 1)) (display "*"))(newline)))
(port-for-each f read)

545:デフォルトの名無しさん
09/07/23 09:08:46
スレリンク(tech板:448番)
# [1] 授業単元:数値情報解析
# [2] 問題文:ニュートン法により代数方程式を解くプログラムを作りなさい。
#       適当な初期値を自分で設定し、3つの真解すべてを求めなさい。
#       ただし、結果画面には(1)収束解(2)初期値(3)反復回数が表示されている
こと。
#       このとき、1回の実行で3つの真解すべてを求める必要はない。
#       初期値を与え直しながら実行した結果画面が3枚示されていれば
#       よいものとする。
# ・ 解くべき代数方程式 : x^3 - 6x^2 + 7x +2 = 0
# ・収束条件 : ε < 10^-10
#       ・微分は自分で計算した結果(3x^2 - 12x + 7 = 0)をソースファイルに
#        直接入力してよいものとする。

546:デフォルトの名無しさん
09/07/23 12:39:50
>>545

(defun f (x)
(let* ((xx (* x x)) (xxx (* xx x)))
(+ xxx (* -6l0 xx) (* 7l0 x) 2l0)))

(defun d (x)
(let ((xx (* x x)))
(+ (* 3l0 xx) (* -12l0 x) 7l0)))

(defconstant err 1.0l-10)

(defun solv (x0)
(do ((n 0) (x x0) xtmp (endf nil))
(endf (format t "x = ~A x0=~A n=~A ~%" x x0 n))
(setf xtmp (- x (/ (f x) (d x))))
(if (< (abs (- x xtmp)) err)
(setf endf t))
(setf x xtmp
n (1+ n))))

(defun input (s)
(format t s)
(read))

(do ((x (input "初期値 x0? ") (input "初期値 x0? ")))
((not (numberp x)))
(solv x))

こんな感じ?



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch