[表示 : 全て 最新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


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行目を換えればいいのかなと思ったのですがどうでしょうか?

559 名前:デフォルトの名無しさん [2007/08/23(木) 16:57:39 ]
約分をするプログラムの作り方を教えてください


560 名前:光速エスパー世代774RR mailto:sage [2007/08/24(金) 01:34:38 ]
最近はBASIC屋に化けてるww

約分ってのは分母子を最大公約数で割ればいいわけだから、
よーするに最大公約数を求める問題にいきつく。
これは二千年以上前から判っている方法で溶ける。FPCでテスト墨。

Program Euclid;

function GCD(m, n : integer) : integer;
begin
if n = 0 then GCD := m
else if m mod n = 0 then GCD := n
else GCD := GCD(n, m mod n)
end;

begin
writeln(GCD(123, 12))
end.

エウクレイデス先生はとても偉かったし、算法も高効率だが、
このコード自体の効率はわるいよ。


561 名前:デフォルトの名無しさん [2007/08/24(金) 16:43:39 ]
有賀と

562 名前:nao [2007/08/24(金) 17:03:06 ]
data.txt(100個の英単語がアルファベット順)というファイルに、
新しく単語を入力、またはそのファイルから単語を削除するプログラムを
どなたか作ってください。お願いします。




563 名前:デフォルトの名無しさん [2007/08/24(金) 17:24:41 ]
おい!誰ぞ!

パスカルの後継言語ヘクトパスカル作れよ!

564 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 17:59:51 ]
そこはあえてバールと言おうぜ。

565 名前:光速エスパー世代774RR mailto:sage [2007/08/24(金) 21:40:07 ]
どんなに気圧が低くても、愛の風は風力3w

566 名前:デフォルトの名無しさん [2007/09/20(木) 18:01:08 ]
program EX01(input,output);
var D1,D2,S,D,P,Q:integer;
begin
read(D1,D2);
S:=D1+D2;D:=D1-D2;P:=D1*D2;Q:=D1 dir D2;
writeln(D1,D2);
writeln(S,D,P,Q);
end.
整数の四則演算なのですが、Windowsで保存するときの拡張子を教えてください。

567 名前:566 [2007/09/20(木) 22:50:15 ]
急いでいたので、言葉が足りなかったかもしれません…。
今日から大学での講義がスタートして、教科書もなんにもなく、いきなり出された宿題なので、さっぱり分かんないのです。
C言語でやっていたように、Windowsのメモ帳でプログラムを作って、
【.cpp】ではない何かで保存→コマンドプロンプトで実行
というようにやりたいのですが、いろいろと教えていただきたいです。

568 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:51:10 ]
EX01.pasじゃだめなの?

569 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:06:12 ]
>>567
開発環境、つか、コンパイラは何を使っているんですか?

570 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:07:14 ]
コマンドプロンプトでは、
C:\Documents and Settings\user>cd My Documents
C:\Documents and Settings\user\My Documents>bcc32 EX01.pas
C:\Documents and Settings\user\My Documents>EX01.exe
って感じでおkですか?

571 名前:567 mailto:sage [2007/09/20(木) 23:10:24 ]
>>569
見てみたら、C++ Builderってやつでした。
これじゃPascalは無理か…

572 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:30:40 ]
>>566
そのソースプログラムをFree Pascal Compiler 2.0で
コンパイルしてみたらエラーが出たよ。dirはdivだね。

誤 Q:=D1 dir D2;
正 Q:=D1 div D2;



573 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:38:05 ]
>>571
ぼくはLinuxユーザーですが、
Free PascalにはWindows用のものもあるようですから
Free Pascalをインストールして試してみられてはいかがでしょう?

www.freepascal.org/
このサイトのDownloadというリンクをクリックしてみてください。
Win32, Win64 and WinCEというのがあるはずです。

574 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:42:41 ]
ちなみに、Free Pascalについてはこのページが参考になります。
ttp://www.ss.u-tokai.ac.jp/~onishi/lecture/freepascal.html

575 名前:567 mailto:sage [2007/09/21(金) 00:00:08 ]
>>572
板書の写し間違いですね。ありがとうございます。

>>573
dです!今すぐダウンロード&インストールします!

576 名前:567 mailto:sage [2007/09/21(金) 01:00:56 ]
うおおおおおおおおお!!!!!!!!
できました!!!!!!!!マジdクス!

来週からもよろしくお願いしますwww

577 名前:567 mailto:sage [2007/09/21(金) 01:14:12 ]
てへ、もういっちょ教えてくださいw
さっきのを、整数じゃなくて実数にするのですが、
program PR01(input,output);
real D1,D2,S,D,P,Q:integer;
begin
read(D1,D2);
S:=D1+D2;D:=D1-D2;P:=D1*D2;Q:=D1/D2;
writeln(D1,D2);
writeln(S,D,P,Q);
end.
だとエラーが出るんですけど、どこが違うのでしょう?

578 名前:567 mailto:sage [2007/09/21(金) 01:20:25 ]
2行目は
var D1,D2,S,D,P,Q:real;
ですね。でもまだ上手くいかない気が…。

579 名前:567 mailto:sage [2007/09/21(金) 02:11:32 ]
うお、S:6:2とかにしないと、桁数がおかしなことになるんですね。
解決しました!

580 名前:デフォルトの名無しさん [2007/09/30(日) 19:15:06 ]
 

581 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 00:21:35 ]
一番短いパスカルのプログラムってどんなのですか?
文字数が一番少ないものを作れという課題が出たのですが…


582 名前:デフォルトの名無しさん [2007/10/03(水) 00:22:35 ]
ageてしまえ



583 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 00:28:23 ]
program a;
begin
end.

584 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 13:45:25 ]
>>583
改行コードをスペースにすれば(環境によっては)1文字分減るかも。

585 名前:デフォルトの名無しさん [2007/10/03(水) 17:01:06 ]
短すぎてびっくりしましたw それでもいいんですね。ありがとうございます。
ついでにこれも…。
☆頭書きをBNF記法で表せ。
☆整数「43221」を読み込み、逆順にして、元のデータと共に出力せよ
☆次の余剰を調べよ
14 mod 4
-14 mod 4
14 mod -4
-14 mod -4

586 名前:光速エスパー世代774RR mailto:sage [2007/10/03(水) 18:35:48 ]
program a;begin end.

Pascalのセミコロンは区切り子なので、改行もスペースもいらない。

587 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 19:09:53 ]
>>585
>☆頭書きをBNF記法で表せ。
何の頭書き?

>☆整数「43221」を読み込み、逆順にして、元のデータと共に出力せよ
正数を文字列にしてひっくり返せばいいの?

>☆次の余剰を調べよ
何が分からないの?その式をそのまま実行して出力したんじゃダメなの?

588 名前:デフォルトの名無しさん [2007/10/04(木) 00:44:16 ]
program PR0203(input,output);
var W,L,H,V,S:integer;
begin
readln(W,L);raldln(H);writeln(W,L,H);
V:=W*L*H;S:=2*(W*(L+H)+L*H);
writeln(V,S);
end.

これでエラーが出るのは何故なんでしょう?

PR0203.pas(4,21) Error: Identifier not found "raldln"
PR0203.pas(4,24) Error: Illegal expression
PR0203.pas(4,25) Warning: Variable "H" does not seem to be initialized
PR0203.pas(8) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted
Error: C:\FPC\2.2.0\bin\i386-Win32\ppc386.exe returned an error exitcode (normal
if you did not specify a source file to be compiled)

と出たのですが、よくわかりません。

589 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:46:47 ]
コンパイラ「raldln なんて関数ねーよ」

590 名前:光速エスパー世代774RR mailto:sage [2007/10/04(木) 00:47:49 ]
>>588
>raldln(H)

そらー単純にミスタイプづら。
「raldlnなんつー識別子はないどごるぁ」ってコンパイラが逝ってるじゃん。

591 名前:光速エスパー世代774RR mailto:sage [2007/10/04(木) 00:51:47 ]
>>589
うふっ、けこーんね♥
こんど一緒にゐると先生の所にいきませんこと?
ねぇってば、ねぇ、ねぇ

それにしても、どう指を動かすとイク^H^Hこんなtypoするんだろうなw

592 名前:デフォルトの名無しさん [2007/10/04(木) 00:54:51 ]
ひゃー、タイプミスはずかし…。
>>585の頭書きなんですけど、

program ●●●(input,output)

の事らしいです。BNFをぐぐってもいまいち理解出来なくて。



593 名前:デフォルトの名無しさん [2007/10/04(木) 01:08:58 ]
<頭書き> ::= <名前> "(input,output)"

こんなんでいいのけ??

594 名前:デフォルトの名無しさん [2007/10/04(木) 02:03:34 ]
imepita.jp/20071004/062300

とっさに書きました。
これをBNFに書き換えるのを教えてください!!
お願いします!!!!!

595 名前:デフォルトの名無しさん mailto:age [2007/10/04(木) 02:14:44 ]
videointroplayer.web.fc2.com/?ii9YN1kO-TK36%+WhqyiIrhz0F110%+Kjtps4byn7a119%+esA5NHPWRF1115%+026mGIi9Z4824%+@1@_KeyboardCrusher

596 名前:デフォルトの名無しさん [2007/10/04(木) 02:44:32 ]
>>585の2個目

program PR0231(input,output);
var D,X,S:integer;
begin
read(D);
X:=D;S:=0;

S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;

writeln(D,S);
end.

これで出ないのはなぜ、、、。

597 名前:デフォルトの名無しさん [2007/10/04(木) 07:05:52 ]
できました!
ありがとうです!!

598 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 09:03:54 ]
いいよいいよ。どんどん宿題をオープンにしちゃって! 他の人も勉強になるから。

599 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 09:16:42 ]
バッカス・ナウア記法って、そういや昔『やさしいコンピュータ科学』を読んだときに
Turbo Pascalの概要が解説されているところで使われていたのを思い出した。
<> -> <> こんな感じの<>を使った記述。ちがったっけ?




600 名前:光速エスパー世代774RR mailto:sage [2007/10/04(木) 19:18:53 ]
>>596

>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;

次は、「自動化ちうのをしたくて電算機プログラムやってるのに、
なんでオラさはこんな5回も6回もコピペしなきゃなんねえだべ」と思ってみよう。

手抜きとぐうたら根性こそプログラミングの推薬ww

601 名前:デフォルトの名無しさん [2007/10/08(月) 02:02:31 ]
exp(x)とかodd(x)みたいな感じで、even(x)って存在するの?

602 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 07:27:53 ]
not odd(x) でいいーぶん



603 名前:デフォルトの名無しさん [2007/10/08(月) 10:02:52 ]
>>602
初めて知った!d!
ついでに。
なにが違うんじゃー
全部0って出てくるー

program PR0331(input,output);
var D1,D2:real;
var T1,T2,T3,T4,R1,R2,R3,R4:integer;
begin
read(D1,D2);
T1:=trunc(D1);T2:=trunc(D2);T3:=trunc(-D1);T4:=trunc(-D2);
R1:=round(D1);R2:=round(D2);R3:=round(-D1);R4:=round(-D2);
writeln('trunc(',D1:2:1,')=',T1:2,'trunc(',D2:2:1,')=',T2:2,'trunc(',-D1:2:1,')=',T3:2,'trunc(',-D2:2:1,')=',T4:2);
writeln('round(',D1:2:1,')=',R1:2,'round(',D2:2:1,')=',R2:2,'round(',-D1:2:1,')=',R3:2,'round(',-D2:2:1,')=',R4:2);
end.

あと、もうちょいシンプルにできないのかな、これw

604 名前:光速エスパー世代774RR mailto:sage [2007/10/09(火) 12:48:18 ]
>D1:2:1
少なくとも三桁は確保しないと表示できないと思われ。
負数だったら少なくとも四桁。

こういうのはシンプルにしようがないんだけど、元数値を別に表示すると少しは見やすいかな。

writeln('Data Entered : ', D1, D2);
writeln('Trunc''s of them are ', trunc(D1), ' and ', trunc(D2), ' respectivly.');
writeln('Trunc''s of negated them are ', trunc(-D1), ' and ', trunc(-D2), ' respectivly.');
writeln('Round''s of them are ', round(D1), ' and ', round(D2), ' respectivly.');
writeln('Round''s of negated them are ', round(-D1), ' and ', round(-D2), ' respectivly.');
writeln('Thus, both functions are (different from / same for) each other in case of (you must fill this parenthesis ).')






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

前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