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


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

Pascalの宿題は俺にやらせろ!!Part2



1 名前:デフォルトの名無しさん mailto:sage [2006/01/12(木) 00:45:25 ]
教育用(?)プログラムPascalの宿題をやって頂くスレ

■丸投げOK
■全く分かってない阿呆も放置しないで優しく対応
■他言語はよそ逝け( ゚Д゚)ゴルァ
■DelphiもTurbo Pascalも完全対応

【本家】

www.borland.co.jp/delphi/

【前スレ】

pc8.2ch.net/test/read.cgi/tech/1089719714

【関連スレ】

くだすれDelphi(超初心者用)その15
pc5.2ch.net/test/read.cgi/tech/1087823906/l50

Pascal の初心者用の質問・相談所
pc5.2ch.net/test/read.cgi/tech/1009903617/l50

【Delphi初心者】今から始めるDelphi Part01
pc5.2ch.net/test/read.cgi/tech/1062422335/l50


458 名前:デフォルトの名無しさん mailto:sage [2006/12/19(火) 03:02:53 ]
ミリ秒に変換して計算すれば良いと思う。

459 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 02:21:31 ]
>>458
回答ありがとうございます。それでは、ミリ秒に変換するには如何すればよいのでしょうか。

460 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 02:41:03 ]
何がしたいのか具体的に書かないと誰も答えられないよ。

461 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 17:41:23 ]
1 sec = 1000msec
1 min = 60 sec
1 hour = 60 min

462 名前:光速エスパー世代774RR mailto:sage [2006/12/26(火) 17:59:23 ]
バッババババビューンと空を逝くw

463 名前: 【ぴょん吉】 【1736円】 mailto:sage [2007/01/01(月) 01:08:04 ]
さて、明けたことだし宿題やろ

464 名前:q [2007/01/21(日) 20:19:40 ]
[質問]
「上から○(円)が落ちてきて、
ウィンドウの1番下に達したら
その円は止まり、新しい円が
また落ちてくるプログラムを作れ
(ただしfor文を使うこと)。」
という宿題が出たのですが、
よく分かりません。

どなたか分かる方、教えて下さいm(__)m

465 名前:デフォルトの名無しさん mailto:sage [2007/01/21(日) 20:33:00 ]
やだ

466 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 00:04:54 ]
ヒント
Form1.Canvas, Ellipse, Timer, Form1.ClientHeight




467 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 00:20:44 ]
ここはいつからDelphiスレになったんだ?

468 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 00:21:29 ]
あぁ、Delphiも対応であったか。失礼。

469 名前:デフォルトの名無しさん [2007/01/25(木) 19:06:01 ]
パスカルの入門書でおすすめありませんか?
www.saiensu.co.jp/books-htm/ISBN4-7819-0757-1.htm
これを買おうかな、と今は思っているのですが。

470 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 03:47:12 ]
やめとけ

471 名前:光速エスパー世代774RR mailto:sage [2007/01/26(金) 12:38:49 ]
つーか、今からPascalを勉強しようというのが… 授業かなんかかい?

Pascalの教科書は何冊か使ったけれど、てもとにあるのは森口さん他の
「Pascalプログラミング講義」(共立出版)
だ。これ、ちょっと内容が薄いかな。

思い出してみればボーランドのTurbo Tutorが結構優れた教科書だった。
TP5.5はフリーになってるけど、Turbo Tutorってネットに流れてない?

定番アルゴリズムは奥村さんのアルゴリズム事典で勉強したね。
ttp://oku.edu.mie-u.ac.jp/~okumura/algo/algo_pas.html

あれだ、今日びは言語自体より、(一昔前なら)API、(出るちゃん以降は)
コンポーネントの使い方の方が大事だってゆー、つまらないといえばつまらない
世の中になったもんだよ。

472 名前:469 mailto:sage [2007/01/26(金) 15:20:07 ]
いえ、授業ではなくてただの興味です。
レスありがとうございますm(__)m

473 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 00:53:01 ]
授業でないなら、その手の教科書本は初心者にはしんどいと思うよ。
興味を持ち続けられないと思う。


474 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 00:56:26 ]
Delphi言語や、教育目的、古いプログラムの保守は別として、
Pascalもまだまだ現役で使われてるんですか?

475 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 01:01:17 ]
全く。

476 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 09:25:11 ]
DelphiってもしかしてObjectPASCALのことですか?



477 名前:光速エスパー世代774RR mailto:sage [2007/01/28(日) 15:15:58 ]
>476
その辺は複雑で、ボーランドはBorland Pascal がサポートする言語を
Object Pascal と呼んでいた。Borland Pascalは消滅して、ご存知Delphiが現行なんだが、
これが実装している言語は今では「Delphi言語」と呼ばれているはず。

Delphi言語はプログラミング言語Pascalをオブジェクト指向を用いて
拡張したものだから、Object Pascalの一種であり、最も普及したものだね。
既にPascal言語の de facto standard といっていいと思う。

478 名前:デフォルトの名無しさん [2007/01/31(水) 11:03:06 ]
すいません、お初です。
学校課題でπの近似値を求めろ、言われました。マチンの公式使ってやってみようと思ったんですけど、数字を何乗かしたいとおもったっとき、使えるコマンドはあったでしょうか?
たとえば、2のN乗がしたいとき、read(n)で読み込んで、計算させたいということなんですけど。
教えてください。

479 名前:光速エスパー世代774RR mailto:sage [2007/01/31(水) 12:33:49 ]
標準的にはないけど、処理系のおまけでついている可能性がある。
なくても自分で書けばおっけー。

480 名前:デフォルトの名無しさん [2007/01/31(水) 12:54:08 ]
えーと、どうやれば書けますか?
ちょっと想像がつかないので教えてください。

481 名前:光速エスパー世代774RR mailto:sage [2007/01/31(水) 17:29:14 ]
再帰的な定義をそのまま実装(普通は末尾再帰→繰り返しにする)するか、
a ^ bのbが実数の場合は標準函数(だったよね)としてlnとexpがあることを利用すると、ln(a^b) = ln(a) * bだから a^b = exp(ln(a) * b)

冪乗の演算子/函数がないのに対数、指数関数があるというのがWirth先生。
以下FPCでテスト墨

Program PowerTest;
var a, b : real;

function power(a : real; b : integer) : real;
begin
if b > 0 then power := a * power(a, pred(b))
else if b = 0 then power := 1
else power := 1 / power(a, -b)
end;

function RealPower(a, b : real) : real;
begin
RealPower := exp(ln(a) * b)
end;

begin
write('a ^ b, a= , b= '); readln(a, b);
writeln(power(a, round(b)), ' ', RealPower(a, b))
end.


482 名前:デフォルトの名無しさん [2007/01/31(水) 18:38:46 ]
ありがとうございました。後はもう少し自分であがいて見ます。


483 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 09:10:23 ]
落ちてる?

484 名前:デフォルトの名無しさん [2007/04/14(土) 18:35:39 ]
GPCのバグを発見してしまったage

整数演算の結果がオペランドのビット巾で丸められちまう。

485 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 06:38:45 ]
丸められるって?

486 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:59:09 ]
質問です。
大学入ってPascalプログラミングやってるんですが、
『選択ソートのプログラムを作成せよ。
ただし、データ数を最初に入力するように変更すること。
また、データ数は1個から最大10000個まで対応できるようにすること』
とあるのですが、サッパリです。
かなり初心者な質問で申し訳ないのですが、どなたか教えてください



487 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 00:09:14 ]
>ただし、データ数を最初に入力するように変更すること。

元のソースが無いと変更しようが無い。

488 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 00:44:47 ]
すみません。元のソースは

program sort(input,putput);
const numofdata=893;
var d: array [1..numofdata] of integer;
i,j,k: integer;
tmp: integer;
begin
for i:=1 to numofdata do
begin
read(d[i]);
end;

for i:=1 to numofdata-1 do
begin
j:=i;
for k:=i+1 to numofdata do
begin
if d[j]>d[k] then j:=k;
end;
tmp:=d[j];
d[j]:=d[i];
d[i]:=tmp;
end;

for i:=1 to numofdata do
begin
writeln(d[i])
end
end.

です

489 名前:光速エスパー世代774RR mailto:sage [2007/06/19(火) 13:02:24 ]
ほれ。FreePascalでテスト済み。

Program sort(input, output); (* putputってぉぃw *)
const numofdata = 893; (* 嗤いどころかこれ。これを10000に汁 *)
type dataindex = 1..numofdata;
var d: array [dataindex] of integer;
datanum : dataindex; (* データ数を貯めとく変数を用意するのが肝な *)
i, j, k: integer;
tmp: integer;
begin
write('n (max ', numofdata, ')= '); readln(datanum);
for i := 1 to datanum do read(d[i]); (* begin endブロックいらね *)
for i := 1 to pred(datanum) do begin
j := i;
for k := succ(i) to datanum do
if d[j] > d[k] then j := k;
tmp := d[j]; d[j] := d[i]; d[i] := tmp (* セミコロンいらね *)
end;
for i := 1 to datanum do writeln(d[i]);
writeln('...so modified and tested by 2channelers ;-)')
(* このまま提出するなよ *)
end.

490 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 14:51:42 ]
ありがとうございます!

491 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 21:05:37 ]
ローカルのファイルにアクセスするにはどうすればいいですか?


492 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:06:37 ]
>>491
Pascalには標準的な方法がありません。処理系とファイルシステム依存です。

UCSD-Pascal, Pascal/MT, MT+, Turbo/Borland Pascal, FreePascal では
assign手続きを実行しといて、resetなりrewriteなりします。

assign(ファイル変数, ファイル名);
reset(ファイル変数);
...
close(ファイル変数)

GPCだと上のBorland方言に加えて、ISO拡張Pascal標準のbind手続きが使えます。

493 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:26:50 ]
PASCALでCGIは作れますか?

494 名前:486&488 mailto:sage [2007/06/19(火) 23:34:10 ]
>>datanum : dataindex; (* データ数を貯めとく変数を用意するのが肝な *)
申し訳ないのですが、なぜデータ数を溜めておく変数が必要なのか教えていただけませんか

495 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 00:17:35 ]
変数に保存しとかなきゃ何回入力を受け入れるべきか解からなくなるじゃn

496 名前:光速エスパー世代774RR mailto:sage [2007/06/20(水) 12:43:41 ]
>>493
俺はCP/M世代の棺桶片足なおさんだから、そういう今様なものは
良く知らんのだが、perlやRubyの本をチラリズムしたカンジダと、
httpdとの間でデータをやり取りする規格さえ合ってれば、
文字列操作ができさえすれば良くて、
言語自体はLISPでもCOBOLでもALGOLでもPL/Iでもいいんじゃまいか。
実際、FreePascalでCGI作ってる例があったなあ。

ttp://courses.cs.vt.edu/~cs3304/FreePascal/doc/user/node12.html

ttp://www.erg.slf.th.schule.de/informatik/c/cgi-vortrag/index.html
に説明があるけど、uncgiユニットてのを使うと便利らしい。

ttp://www.is-hanko.co.jp/info/welcome.html
も面白い。茨の道へGO!



497 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:52:22 ]
PASCALの問題です

問題1

西暦を入力して、「1989年は平成2年です」というように年号や年を出力するプログラムを作りなさい。
ただし各年号の境目は両方の年号を出力するようにすること。(1988年は昭和64年でも、平成元年でもある)


問題2
下記を表示するプログラムを作れ

(1)
**********
*********
********
*******
******
*****
****
***
**
*

498 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:57:27 ]
(2)
*
**
***
****
*****
******
*******
********
*********

問題3
Nを入力して1からNまでの和を計算するプログラムを作れ。
また1からNまでの奇数の和を計算するプログラムも作れ。


問題1はif文,2・3はfor文を使用します。
一週間ほど足りない頭で粘ってみてもわかりません。
先生は非常勤だから質問する相手もいないので
皆さんの知恵をお貸ししていただけたら幸いですm(__)m

499 名前:デフォルトの名無しさん [2007/06/22(金) 20:21:54 ]
ふーん
こういう宿題出るもんなんだな(´・ω・`)

500 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 22:28:21 ]
Program LotsOfStars(output);
var i : integer;

procedure StarBar(n : integer);
var i : integer;
begin
for i := 1 to n do write('*');
writeln
end;

begin
for i := 10 downto 1 do StarBar(i);
for i := 1 to 10 do StarBar(i)
end.


おまけ
Program SingleStar(output);
var i : integer;
begin
for i := 10 downto 1 do writeln('*' : i);
for i := 1 to 10 do writeln('@' : i)
end.


501 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 14:01:19 ]
問題3の前半
Program NeverTested(input, output);
var n : integer;
begin
read(n); write((n * (n+1)) div 2)
{ don't trust me ;-p }
end.

502 名前:497,498 mailto:sage [2007/06/24(日) 16:49:06 ]
>>500-501
大きなヒントを下さってありがとうございます♪
教養科目で卒業が掛かっているのでとても嬉しいです

問1を自分なりにやってみたのですが、
program gengou(input,output);
var a:integer;
begin
readln(a);
writeln('西暦',a,'年の元号は?');
if a>1988
then writeln('平成',a-1988,'年です')
else if a>1926
then writeln('昭和',a-1926,'年です')
else if a>1910
then writeln('大正',a-1910,'年です')
else if a>1867
then writeln('明治',a-1867,'年です')
else writeln('江戸時代です')
end.

何がダメなのかすらわかりません><
助けてください・・・

503 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:28:48 ]
別に何もダメじゃなくね?

504 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:33:10 ]
強いて言えば問いかけの前にreadlnしてるとこ。

505 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:38:36 ]
あ、元号境界の処理と+1してない。

506 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:41:59 ]
>>505
INC(年号)は俺も気づかなかった



507 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:34:49 ]
>502
1989年は平成元年かつ昭和64年ってのを、最初のif文で判定する必要があると思う。

508 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:25:06 ]
なんとなく年号のテーブルがずれてる気がした。

program gengou;
{$APPTYPE CONSOLE}

var a, i: integer;
const
era: array[0..3] of Integer = (1989, 1926, 1912, 1868);
eraname: array[0..3] of array[0..10] of char = ('平成', '昭和', '明治', '大正');
begin
readln(a);
writeln('西暦', a, '年の元号は:');
for i := 0 to 3 do
if a >= era[i] then
begin
writeln(eraname[i], a - era[i] + 1, '年');
if a = era[i] then
writeln(eraname[i + 1], a - era[i + 1] + 1, '年');
break
end

end.


509 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:30:14 ]
一応コンパイラはdelphi使って確認したけどコンパイラ指示除いてBorland拡張は使っていない・・・と思う。


510 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:32:37 ]
例題から察するに、配列はまだ習ってないんじゃないか

511 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:34:46 ]
>>508
>const
>era: array[0..3] of Integer = (1989, 1926, 1912, 1868);
>eraname: array[0..3] of array[0..10] of char = ('平成', '昭和', '明治', '大正');

ここでもうBorland方言でつ。

512 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:37:46 ]
む、そうなるとかなり長いif文の羅列になるな・・・スマンそのコードは俺の性には合わない。

513 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:39:22 ]
な、な、定数配列はBorland方言とな!標準Pascalじゃやっぱり書けん!

514 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:41:54 ]
>>513
大域変数として名前を確保し、変数初期化手続きを書いて、
大域変数はそこでまとめて面倒を見ておく、てのが常道だった。
まーそこまでストリクトに標準Pascalの流儀を守る必要もないんだけどw

あと、文字列型を使っていいのかも不明なんだよな。

515 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:55:10 ]
久しぶりにヴィルトの原書開いてみたらやっぱり載ってなかった。
なるほどK&Rのどちらかだったか、「これじゃ書けねえ・・・」と思った気持ちもわかる。
いや、嫌いじゃないんだよPascal。むしろ好き。
ありがとう僕の友達Pascalに会わせてくれて。

516 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 00:03:33 ]
>>515
それはラスカルだ



517 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 00:03:38 ]
>>515
定数配列や変数宣言での初期化は便利だし、可読性も高くなるんだよね。

言語仕様を出来るだけ小さくしようと言うのがヴィルト先生の狙いだったのと、
原始Pascalでは宣言の順序が決まっているから、
定数宣言の中にユーザ定義型の識別子を書けないというのがあったのかな。



518 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 00:04:48 ]
>>516
歳がバレるぞww

519 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 00:10:27 ]
いや歌は違うだろうけど最近もやってるよ。
ttp://www.nippon-animation.co.jp/pocapoca/

520 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 04:24:17 ]
テラキモスw

521 名前:光速エスパー世代774RR mailto:sage [2007/06/26(火) 12:41:47 ]
break文もBorland方言だな。標準Pならgoto文で抜け出すことになるね(こういう時のためにgotoを残してあるんで)。
era回りだけど、record型を使う方が原則的で美しいよな。それと、効率は少し落ちるけど、
eraname = packed array [1..10] of char;
era = record
beginyear, endyear : integer;
name ; eraname
end;
eraarray = array[1..4] of era;

とやってあげて、eをeraarray型の変数として、
for i := 1 to 4 do with e[i] do begin
if (a >= beginyear) and (a <= endyear) then begin
j := a - beginyear;
if j = 0 then write(name, '元年 ') else write(name, succ(j), '年 ')
end
end;
writeln

も手だな。eがソートされていなくても動くし、元年の処理の特殊性が減る。課題とは動作が違うけどね。

522 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 08:58:27 ]
ファイル型の要素にtreeは使えないの?

program test (input,output,IntFile);
type tree=^node; node=record name:char; tel:integer; left,right:tree; end;
var IntFile:file of tree; r:tree;
begin
reset(IntFile,'tel-data');
read(IntFile,r);

rewrite(IntFile,'tel-data');
write(IntFile,r);
end.

こんな感じで

523 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:14:24 ]
使えるけど無意味だよ。

524 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:48:58 ]
大学ではpascalの講義の後lisp, prologと続くのか?最近はjavaとかもやるのか?

525 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:50:44 ]
っていうかpascal教えてる大学ってどういうところ?
情報系だとJavaを最初に教えると思うし。

526 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:46:13 ]
最終的にpascal処理系を作成させる為に最初にpascalやるんじゃなかろうか?



527 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 21:03:36 ]
↓の問題なのですが、どなたか教えていただけないでしょうか?

『下記のプログラムを参考にして、ファイルからデータを読み、それを整列し、その後、
”入力された値をデータの中から二分探索によって探索する”ことを繰り返すプログラムを作成せよ』


↓↓↓↓↓下記のプログラム↓↓↓↓↓

program sort(input,output);
var d:array [1..10000] of integer;
numofdata:integer;
i,j,k:integer;
tmp:integer;
begin
read(numofdata)
for i:=1 to numofdata do
begin
read(d[i]);
end;     ↓続きます

528 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 21:05:07 ]
for i:=1 to numofdata-1 do
begin
j:=i;
for k:=i+1 to numodata do
begin
if d[j]>d[k] then j:=k;
end;
tmp:=d[j];
d[j]:=d[i];
d[i]:=tmp;
end;

for i:=1 to numofdata do
begin
writeln(d[i])
end
end.

どなたかお願いしますm(_ _)m

529 名前:光速エスパー世代774RR mailto:sage [2007/07/11(水) 00:09:35 ]
ちょいと書き直すと、
Program sort(input,output);
var d:array [1..10000] of integer;
numofdata:integer;
i,j,k:integer;
tmp:integer;
begin
read(numofdata);
for i:=1 to numofdata do read(d[i]); (* begin end いらね *)
for i:=1 to numofdata-1 do begin
j:=i;
for k:=i+1 to numofdata do if d[j]>d[k] then j:=k; (* begin end いらね *)
tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp
end;

for i:=1 to numofdata do writeln(d[i]) (* begin end いらね *)
end.

ここで
tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp
が肝な。その上のfor文で、i<=jで最も小さいd[j]になるようなjを探し出している。
d[i]をそのd[j]と入れ替えれば、d[i]はi以降の最小値になるわけだ。
これをバブルソートって呼ぶことは知っているよな。

530 名前:光速エスパー世代774RR mailto:sage [2007/07/11(水) 00:11:20 ]
ついでだからばぶるな挿入な。さて、新しい値を p とする

d[numofdata + 1] := p;
i := 1;
while p < d[i] do i := i + 1;

これで i は p>=d[i]を満たす最小の値になった(もうソートしてあるから)
p がたまたま d の最大値だったら、これ以上処理は必要ない。そうでなければ、
d の i 番目に p をそうぬうする。

for j := numofdata downto succ(i) do d[succ(j)] := d[j];
d[i] := p;

でそうぬう官僚。実は、p がたまたま d の最大値だった場合もこれを走らせていい。
しかし、課題は二分探索であった。あんま奇麗じゃないがfpcで試してはある。

531 名前:光速エスパー世代774RR mailto:sage [2007/07/11(水) 00:13:50 ]
procedure binarysearch(p : データの型; mini, maxi : integer);
begin
i := (mini + maxi) div 2; (* mini と maxi の間の数ならなんでも *)
if p = d[i] then writeln('Found at ', i)
else
if maxi = mini then begin
write('Not found. Must be inserted ');
if p > d[i] then write('after ')
else write('before ');
writeln(i, ' th number.')
end else
if p > d[i] then binarysearch(p, succ(i), maxi)
else binarysearch(p, mini, pred(i))
end;

これをメインプログラムから binarysearch(調べたい数, 1, numofdata)

と呼ぶ。文字列型が使えると、少し奇麗になる。d[i]を何度も評価しているから、
d[i]の評価にコストがかかる場合はローカルにコピーしとく。

532 名前:光速エスパー世代774RR mailto:sage [2007/07/11(水) 12:44:57 ]
>>531は局所変数 i を宣言する行を落としていたな。

でだ、>>530と一緒に考えると、次のような改造をすぐ思いつく。

procedure insert(p ; データの型; i : integer);
var j : integer;
begin
numofdata ;= succ(numofdata);
for j := numofdata downto succ(i) do d[j] := d[pred(j)]; (* >>530は間違いだ orz *)
d[i] := p
end;

これは p を d の i 番目にそうぬうする手続な。>>531の真ん中へんでこれを呼ぶ。
if maxi = mini then begin
i := i + ord(p > d[i]);
writeln('Not found, then instert it as ', i, ' th number.');
insert(p, i)
end

新しい数が現れたらずんずん配列に追加していく改造な。

533 名前:デフォルトの名無しさん [2007/07/11(水) 22:10:21 ]
>>527
二分探索って何か分かってる?

534 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:46:19 ]
どんな巨大なデータも2分で探索できる高速アルゴリズムのことです

535 名前:光速エスパー世代774RR mailto:sage [2007/07/11(水) 22:56:04 ]
データ数が1でも2分かかったりしてw

536 名前:光速エスパー世代774RR mailto:sage [2007/07/12(木) 03:35:40 ]
それはないq



537 名前:光速エスパー世代774RR mailto:sage [2007/07/12(木) 22:43:26 ]
俺の偽者がずいぶんいるな。おまいらちゃんと名前修飾しろw

538 名前:デフォルトの名無しさん [2007/08/03(金) 15:50:40 ]
初めまして、いきなりで申し訳ないんですが教えてください(_ _)

入力された論理式の充足可能性を判定するプログラムを作成せよ。
論理式は, 充足可能性判定の計算量を考慮し, 最大10変数までにする。
という問題です。
以下は注釈です。
「論理式」とは論理変数 x0,x1,x2,・・・に, 論理演算「¬(否定)」,「∧(論理積)」,「∨(論理和)」を有限回適用したものである。
論理式 F(x1,...,xn) が「充足可能である」とは, F(a1,...,an) = true となる変数割当て (a1,...,an)∈{true, false}n が存在することをいいます。
作成するプログラムには, 以下の機能を付加すること。

1:入力された論理式を,通常の式のように表示する機能
「x1∨x2」, 「¬x0」, 「(x2∨¬x3)∧x1」など

2:論理式が true となる(すべての)変数値割当てを表示する機能

「F = x1∨x2 が true になるのは
x1=true, x2=true のとき
x1=true, x2=false のとき
x1=false, x2=true のとき
よって F は充足可能である」

ちなみに入力方法はキーボードで直接入力です。
例として、
例えば, (x1∧x2)∨x3, x1∧¬x1 などはいずれも論理式です。
例えば, F1 = (x1∧x2)∨x3 とすると, x1 = true, x2 = false, x3 = true のとき F1 = true となるので, 論理式 F1 は充足可能です。 一方, F2 = x1∧¬x1 とすると, どのような x1 に対しても F2 = false となるので, F2 は充足可能ではありません。

お願いします(_ _)

539 名前:光速エスパー世代774RR mailto:sage [2007/08/03(金) 21:05:34 ]
めんどいから逆ポで式を書くことにする。
例えば a b & c ¥ | ならば (a and b) or (not c) な。変数の個数は maxvar で与える。
Program Viva2chan;
const maxvar = 'c';
type
pnode= ^node;
node = record value : boolean; next : pnode end;
var
stack : pnode;
variables : array ['a'..maxvar] of boolean;
i : integer; s : string; c : char;

procedure push(v : boolean);
var nd : pnode;
begin
new(nd);
nd^.value := v; nd^.next := stack; stack := nd
end;

function pop : boolean;
var v : boolean; nd : pnode;
begin
nd := stack; v := nd^.value; stack := nd^.next; pop := v;
dispose(nd)
end;


540 名前:光速エスパー世代774RR mailto:sage [2007/08/03(金) 21:07:01 ]
procedure ope(operation : char);
var operand : boolean;
begin
if operation in ['&', '|', '#'] then operand := pop;
with stack^ do
case operation of
'&' : value := value and operand;
'|' : value := value or operand;
'#' : value := value xor operand;
'¥' : value := not value
end
end;

function calc(source : string) : boolean;
var i : integer; c : char;
begin
for i := 1 to length(source) do begin
c := source[i];
if c in ['a'..maxvar] then push(variables[c])
else if c in ['&', '|', '#', '¥'] then ope(c)
end;
calc := pop
end;



541 名前:光速エスパー世代774RR mailto:sage [2007/08/03(金) 21:08:28 ]
procedure SetVarSet(n : integer);
var c : char;
begin
for c := 'a' to maxvar do begin
variables[c] := odd(n);
n := n div 2
end
end;

function powerof(n : integer) : integer;
begin
if n > 0 then powerof := powerof(pred(n)) * 2
else powerof := 1
end;

begin
stack := nil;
write('Enter term :'); readln(s);
for i := 1 to powerof(ord(maxvar) - ord('a') + 1) do begin
SetVarSet(i);
for c := 'a' to maxvar do write(variables[c], ' ');
writeln(calc(s))
end
end.


542 名前:光速エスパー世代774RR mailto:sage [2007/08/03(金) 21:13:10 ]
つうわけで、n個の論理型変数が張る空間を全部舐めて、結果を表示する。
ここでは手抜きでやってるけど、空間なめにはハフマン距離を使うとかっこいい。

実際には全部舐める必要はなくて、最初にtrueが帰った時に終了すればいい。
中置気泡対応は任せた。

543 名前:デフォルトの名無しさん [2007/08/04(土) 14:14:45 ]
学校の宿題が

電車をA駅からB駅で乗り換えて、C駅に行きたい。
C駅での到着希望時刻を入力したらA駅での時刻が出力されるプログラムを作れ。

なのですが、行数300越え+時刻表からデータ取り込みなんで質問しようにもどこがおかしいのかいまいち分かりません。
怪しいところを抜粋して書き込むのでアドバイスよろしくお願いします。

544 名前:543 [2007/08/04(土) 14:28:19 ]

procedure Minteger( var int: integer);
begin
repeat read(f, c) until c in['1','2','3','4','5','6','7','8','9','0'];
if c in['1','2','3','4','5','6','7','8','9','0'] then
int := ord(c) - ord('0');
end

procedure Extfile(var a:data; i :count);
var
x,y,z: integer;
begin
i := 0;
while not eof(f) do begin { ファイル末尾でない限り }
Minteger(int);
x := int;
Minteger(int);
y := int;
x := (10*x)+y;
while not eoln(f) do begin
i := i + 1;
Minteger(int); y := int;
Minteger(int); z := int;
a[i] := (x*60) + (y*10) + z + 6;
end;
readln(f); { 改行文字を読み飛ばす }
end;
n := i;
writeln(output);
end;


545 名前:543 [2007/08/04(土) 14:36:38 ]
時刻表の数字の部分をinteger型に直す手続き(procedure Minteger)と、それぞれの時間を
分の単位に直してa[i]の配列に放り込む手続き(procedure Extfile)のつもりです。

時刻表のファイル自体はちゃんと開けています。
時刻表は
08 09 19 29 39 51
09 01 11 21 31 41 51
10 01 11 21 31 41 51
のようにすべて二桁になるようにつくっています。

546 名前:543(2) [2007/08/04(土) 14:43:37 ]
procedure ArriveSin(var Ax:integer);
var
x,y,z,mi: integer;
k: count;
begin
if (d = 1) then begin
reset(f, 'HolyUmeda'); writeln('Holyを読み込み増した。')
end
else begin
reset(f, 'WeekUmeda'); { ファイルを開く }
writeln('Weekを読み込み増した。')
end;

Extfile(a, i);

if (h < 14) then begin
k := 1;
while a[k] <= mi do
k := k+1;
Ax := a[k-1];
end
else begin
k := n;
while a[k] > mi do
k := k-1;
writeln('a[',k,'] = ',a[k]);
Ax := a[k];
end;
close(f)
end;



547 名前:543(2) [2007/08/04(土) 14:59:52 ]
さっきのa[i]の配列の中でmi(到着希望時刻を分単位になおしたもの)より小さいものの中で、一番大きなものを探してAxに代入しています。

hは時刻(時)で14時より早いなら前から、遅いなら後ろから調べるようにしているつもりです。

548 名前:538 [2007/08/04(土) 15:54:03 ]
>>538です。
答えありがとうございます!
実際の入力は例えば「ab&cdl&」と入力すればいいってことですね(゚∀゚)
出力が(a∧b)∧(c∨d) となる感じですね。

あと、プログラムの解説も書いて提出しなければならないのですが・・・
もしよろしければ、解説をしていただけるとありがたいです。



549 名前:光速エスパー世代774RR mailto:sage [2007/08/04(土) 17:24:23 ]
node = record
value : boolean; term : string; next : pnode
end;

てなかんじに項を文字列としてスタックに積めるようにする。
逆ポはそれ自体構文解析してるようなもんだから、次のようにすれば中置紀宝に
できるよ。

procedure term(operation : char);
var operand, tempterm : string;
begin
if operation in ['&', '|', '#'] then operand := popt;
with stack^ do begin
case operation of
'&' : tempterm := term + ' and ' + operand;
'|' : tempterm := term + ' or ' + operand;
'#' : tempterm := term + ' xor ' + operand;
'¥' : tempterm := 'not ' + term
end;
term := '(' + tempterm +')'
end
end;


550 名前:光速エスパー世代774RR mailto:sage [2007/08/04(土) 17:37:26 ]
function disp(source : string) : string;
var i : integer; c : char;
begin
for i := 1 to length(source) do begin
c := source[i];
if c in ['a'..maxvar] then pusht(c)
else if c in ['&', '|', '#', '¥'] then term(c)
end;
disp := popt
end;

push, pop類はスタックを実装している。RPNだから単純なスタックマシンで
好きなだけ複雑な式を計算させられる。calcが手抜きパーザで、変数名を見ると
スタックに値を積み、演算子を見ると、opeで演算を行いスタックトップに値を残す。
最後にpopすれば式全体の値になる。
変数空間を舐めるのはSetVarSetで、0から始まる2^変数個の整数を生成して、
得られた整数の各ビットを変数の値に代入している。


551 名前:光速エスパー世代774RR mailto:sage [2007/08/04(土) 17:54:07 ]
for i := 1 to powerof(ord(maxvar) - ord('a') + 1) do
はこれでもいいけど、
for i := 0 to pred(powerof(ord(maxvar) - ord('a') + 1)) do
の方が見栄えがいいな。

「変数空間を舐めるのはSetVarSetで、0から始まる2^変数個の整数を生成して、
得られた整数の各ビットを変数の値に代入している。」は
「変数空間を舐めるために、0から始まる2^変数個の整数を生成して、得られた
整数の各ビットをSetVarSetで各変数の値に代入している。」

552 名前:光速エスパー世代774RR mailto:sage [2007/08/04(土) 18:15:10 ]
>>543
時刻表ってのは基本的に列車の配列なのな。
列車をどうデータ化するかが問題じゃな。
別線を通ったり、優等列車だったりして特定の駅に停まらないことを表現するのも
忘れてはいけないのな。

駅乙にある時刻までに到着する、
駅乙に到着する前に駅甲に停車する列車のうちで、
駅甲の発車時刻が一番遅いものを見つける。この操作を二回繰り返せばいい。

553 名前:デフォルトの名無しさん [2007/08/06(月) 17:29:56 ]
>>548です。ありがとうございます。
実際に実行してみました。
Enter term: の後に a b & c \ | と入力すると
TRUE FALSE FALSE TRUE
FALSE TRUE FALSE TRUE
TRUE TRUE FALSE TRUE
FALSE FALSE TRUE FALSE
TRUE FALSE TRUE FALSE
FALSE TRUE TRUE FALSE
TRUE TRUE TRUE TRUE
FALSE FALSE FALSE TRUE
と表示されました。これは左から a, b, c, [(a and b) or (not c)]
となっているとわかりました。
実はプログラムへの要求事項があって
入力された論理式を,通常の式のように表示する機能
(例えば 入力が「a b |」 ならば 出力で「(a∨b」と表示される)
論理式が true となる(すべての)変数値割当てを表示する機能
の二つの機能、まとめると
「F = a∨b が true になるのは
a=true, b=true のとき
a=true, b=false のとき
a=false, b=true のとき
よって F は充足可能である」
こういうような形で表示しなければならないらしいんです。
こうするにはどうしたらいいのでしょうか?
何度もすみません^^;





554 名前:光速エスパー世代774RR mailto:sage [2007/08/07(火) 00:35:55 ]
「普通の式」で書くのは549-550のを久美こんでくれたまへ
もひとつのは、式の評価がtrueな時だけ出力すればいいから簡単。

ただねえ、10変数まで許すんでしょ、変数の値の集合には1024個の
元があって、式(変数1)を真にするのは500個、変数1-10の論理和をとれば
1023個で真になる。そんなのを表示しろというのも、若干野蛮な問題だと
思うなww


555 名前:デフォルトの名無しさん [2007/08/07(火) 15:51:13 ]
>>553です。ありがとうございます。
教えていただいたプログラムに549ー550を加えてみました。
Program Viva2chan;
const maxvar = 'c';
type
pnode= ^node;
node = record
value : boolean; term : string; next : pnode
end;
var
stack : pnode;
variables : array ['a'..maxvar] of boolean;
i : integer; s : string; c : char;

procedure push(v : boolean);
var nd : pnode;
begin
new(nd);
nd^.value := v; nd^.next := stack; stack := nd
end;

function pop : boolean;
var v : boolean; nd : pnode;
begin
nd := stack; v := nd^.value; stack := nd^.next; pop := v;
dispose(nd)
end;



556 名前:デフォルトの名無しさん [2007/08/07(火) 15:52:20 ]
procedure ope(operation : char);
var operand : boolean;
begin
if operation in ['&', '|'] then operand := pop;
with stack^ do
case operation of
'&' : value := value and operand;
'|' : value := value or operand;
'\' : value := not value
end
end;










557 名前:デフォルトの名無しさん [2007/08/07(火) 15:53:13 ]
function disp(source : string) : string;
var i : integer; c : char;
begin
for i := 1 to length(source) do begin
c := source[i];
if c in ['a'..maxvar] then pusht(c)
else if c in ['&', '|', '#', '\'] then term(c)
end;
disp := popt
end;

function powerof(n : integer) : integer;
begin
if n > 0 then powerof := powerof(pred(n)) * 2
else powerof := 1
end;

begin
stack := nil;
write('Enter term :'); readln(s);
for i := 1 to powerof(ord(maxvar) - ord('a') + 1) do begin
SetVarSet(i);
for c := 'a' to maxvar do write(variables[c], ' ');
writeln(calc(s))
end
end.

558 名前:デフォルトの名無しさん [2007/08/07(火) 15:54:01 ]
5ー7行目を549のように書き換えました。
60ー83行目に549ー550を追加しました。
コンパイルすると
push, pop, ope, calc, SetVarSet, term
"datakozo.p", line 62: Warning: Symbol 'POPT' is not defined [221]
"datakozo.p", line 62: Warning: Mixing non-strings with strings [170]
, disp
"datakozo.p", line 80: Warning: Symbol 'PUSHT' is not defined [221]
"datakozo.p", line 83: Warning: Symbol 'POPT' is not defined [221]
"datakozo.p", line 83: Warning: Mixing non-strings with strings [170]
, powerof, Viva2chan

Translation completed.
datakozo.c: 関数 `term' 内:
datakozo.c:116: `popt' が宣言されていません (この関数内で最初に利用)
datakozo.c:116: (未宣言の各変数については、それが最初に現われたそれぞれの関数
datakozo.c:116: に対して一度だけ報告されます。)
datakozo.c: 関数 `disp' 内:
datakozo.c:162: `popt' が宣言されていません (この関数内で最初に利用)

となりました。この場合はどうなのでしょうか?
あと、trueのときだけを表示するには下から4行目を換えればいいのかなと思ったのですがどうでしょうか?






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

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

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