Pascal の初心者用の質問・相談所
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGコンソールのみ。GUI は扱いません。
「Cをやったけど難しいので、やっぱりPascalからぼちぼちやるぅ」という人向け。
コンパイラダウンロード
http://www.vector.co.jp/vpack/filearea/win95/prog/pascal/index.html
ちなみにDelphiは
「モナーの *やさしい* Delphi質問スレ」
http://pc.2ch.net/test/read.cgi/tech/1003113413/
0596デフォルトの名無しさん
NGNG本気で何がなにやら・・・。
0597デフォルトの名無しさん
NGNGbegin
if n = 1 then
.... from から to へ一枚写す
else begin
hanoi(n-1, from, via, to);
hanoi(1, from, to, via);
hanoi(n-1, via, to, from);
end
end;
0598596
NGNGなんだかエラーが沢山出るんですけど、貼り付けるだけじゃ駄目なのでしょうか。。。
厨ですみません。
0599デフォルトの名無しさん
NGNG.... from から to へ一枚写す
のところをきちんとかかないとダメ。
hogeを文字列にして
移動を表示するようにするとか。
writeln(from + 'から' + to + 'へ移動');
Pascalの細かいところ忘れたんで正しいかどうか解らないけど。
再帰するにはforwardとか要るような気もするな。
0600山崎 渉
NGNG0601山崎 渉
NGNG│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0602デフォルトの名無しさん
NGNG標準的なpascalで、basicでいう
cls;
locate(10,10);
print "OK?";
みたいなのは出来ますか?
0603デフォルトの名無しさん
NGNGっていうのは後戻りできない上に上書きしてしまうから無理だな。
cursesみたいに1画面分の2次元配列を取ろうかともおもたけど、画面の大きさを取る方法はJIS-PASCALにはない。
処理系依存の機能を仮定しないと無理っぽい。
0604デフォルトの名無しさん
NGNGあ、そっか。画面の大きさが分からないから、
1ページ分書き直してスクロールアップ
するのも無理だ。うーむ。
0605デフォルトの名無しさん
NGNGprogram curses(input, output, ScreenWidth, ScreenHeight);
var
ScreenWidth: integer;
ScreenHeight: integer;
Screen: packed array[1..256, 1..256] of char; {こんだけあったら大抵間に合うでしょ}
procedure cls;
procedure locate(x: integer; y: integer);
procedure print(packed array[u..v] of char);
procedure reprint;
ってどう?
0606デフォルトの名無しさん
NGNGでも、画面の大きさを取得するのに、処理系毎の
工夫が必要。つーか、無理な場合もありそうな予感。
それよりも、独自に拡張して、cls, locateなどを
処理系毎に作るのが良いような気がしてきた。
・・・でも、それやってると、キリがないし、
実力の範囲を超えそうです。
0607デフォルトの名無しさん
NGNG実体は各処理系に移植されたC言語のcursesライブラリを呼び出すだけ。
外部ライブラリの実装方法に規格上、規定はないのでやりたい放題。
cursesが移植されていない処理系はライブラリの仕様を公開してユーザーに任す。
というのは駄目?
0608デフォルトの名無しさん
NGNGで、var s:string[255]; という状態で、
1行ずつreadln(f,s); で読んでいくとして。
もしも1行の長さが255バイト以上だったら、
どうなるんでしょう。
アホな質問ですみません。
0609デフォルトの名無しさん
NGNG0610デフォルトの名無しさん
NGNGどうしたら良いのでしょう?
0611デフォルトの名無しさん
NGNG無いならChar単位で読むとか。
0612デフォルトの名無しさん
NGNGDev-pascalはどうやってアンインストールするのでしょうか?
リードミーに載ってないんですが・・・。
0613デフォルトの名無しさん
NGNGvar
f: text;
s: string[255];
begin
while not eoln(f) do
read(f, s);
readln(f);
end
0614610
NGNGDelphiの無限とも言える長さの文字列は、
便利で良いですねぇ。しかも、CommaTextで
自動的にCSVを切り分けてくれるし。(日本語対応で)
でも、今はちょっと長い文字列は無理みたい。
というか、やりたいのはCSVの読み込みなんですけど、
ひょっとしたら1行を一度に読み込むんじゃなくて、
1文字ずつ分析して、項目を切り分けながら
読み込む方が良いのかな?
ひょっとして、アルゴリズムって、公開されてる?
0615 ◆R/rLuLKeEI
NGNG>ひょっとして、アルゴリズムって、公開されてる?
理論的には有限オートマトン、正規表現、字句解析、構文解析などを検索すれば、いいんじゃないかな。
CSV形式をうまく構文(文法)に書き下す事が出来れば、ある程度形式的にプログラムに落す方法があるよ。
0616デフォルトの名無しさん
NGNGC#のでよければ。なんとなくは分かると思うよ。
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5BTips%2FCVS%A4%F2%CA%AC%B3%E4%A4%B9%A4%EB%5D%5D
そだね、CSVごときに有限オートマトンとか大袈裟だったな。
で、これは日本語対応?
0618デフォルトの名無しさん
NGNG0619デフォルトの名無しさん
NGNG0620デフォルトの名無しさん
NGNGANSIエスケープシーケンスを使う
0621610
NGNGおおっ!忘れていたが、何か画期的なアイデアに思える。(w
と、思ったが、調べてみたらこう書いてあった。
>どの文字列をエスケープシークエンスとして解釈するかは
>ソフトウェアによって千差万別であり、統一された規格の
>ようなものが存在するわけではない。
(T^T)
>>615,616
ありがとうございます。それをきっかけに調べてみます。
0622 ◆R/rLuLKeEI
NGNG>ソフトウェアによって千差万別であり、統一された規格の
>ようなものが存在するわけではない。
なのに、「ANSI【アメリカ規格協会】」を冠しているのが不思議。
0623620
NGNG0x1b(ESC)で始まる文字列をコンソールに送ることで
画面、コンソールの位置、文字の色等を制御するもの。
0624デフォルトの名無しさん
NGNGs/コンソールの位置/カーソルの位置/
0625610
NGNGC#の>616のコードは読めなかったので、
適当に考えてやってみた。だけど、""→"に
するのとか、漢字コードのチェックとか
やってないし、変なCSVを回避するのも
できないし、拡張性が無いコードになって
しまっている。
0626デフォルトの名無しさん
NGNG0627デフォルトの名無しさん
NGNGANSIエスケープシーケンスも知らないコテハンか。
時代だな。
>ANSIエスケープシーケンスも知らないコテハンか。
>時代だな。
時代ですね。
ANSIエスケープシーケンスは全く知らないわけでもない。
しかし、ここ何年も直接記述したことがないので、すっかり忘れてた。
>>602
Cマガジン1992/5, p.36, Table7(古っ!)によると、全画面消去のESC[2Jとカーソル位置指定のESC[m;nHは当時のどのPCでも共通のようだ。
MINIX本第2版図3-36やhtermでもこの二つは共通でした。
しかし、psterm-fast端末のカーソル位置指定は0x4m;n;などと全然違っていたりする(linuxのtermcapより)。
と、慌てて調べても後の祭。
0629610
NGNGCだとbreak,continueとかで、loopを跳んだり、
文をキャンセルするので、全然参考にならん。
0630デフォルトの名無しさん
NGNG0631610
NGNGbreak, continueが使えるか使えないかで、全然変わるよ。
とりあえず、フラグを追加して、似たような動作を確保。
""→"にするのも出来たし、"なし文字列のスペースを
取り除くのも出来た。変なCSVでなければ、概ね基準通り
切り分けられるようになった。
0632デフォルトの名無しさん
NGNGえっ…
ひょっとして、DelphiやFreePascalにあるSystem.Breakは、独自拡張!?
0634 ◆R/rLuLKeEI
NGNG>無理じゃん。
>break, continueが使えるか使えないかで、全然変わるよ。
break文、continue文はラベル無しgoto文といわれるように、これらは等価なラベル有りgoto文に変換可能です。
>>632
DelphiやFreePascalのBreak、Continueが手続きであることの方が吃驚!
知らなかった私も低脳かえ?
PASCALで大域ジャンプ以外にgotoを使うのは邪道っぽい。
ちなみに、うちのはGNU Pascal。
ただし、JIS-PASCAL(X3008-1990)の範囲内で考えている。
0637610
NGNG確保した場合、メモリー確保に失敗したら
OSErrで分かるんだけど。
標準pascalのnewでメモリー確保に失敗したら
どうなるの?というか、その判別方法は?
>標準pascalのnewでメモリー確保に失敗したら
>どうなるの?というか、その判別方法は?
JIS-PASCAL(X3008-1990)には何の記述もない。
必ず成功するかのようにも読める。
というわけで、その判別方法はない。
1.2 規定外事項
(1) 特定のデータ処理システム又は処理系が処理できるプログラム及び
データの大きさ又は複雑さの限界並びにそれらの限界を超えた場合の措置。
0639デフォルトの名無しさん
NGNG・continue はループの先頭に戻る
・breakはループを脱出
でいいの?
だったらTHINK Pascalでは
・ループ(for,while,repeat)の先頭に戻る → cycle
・ループ脱出 → leave
だけど。
他に関数・手続きからの脱出 → exit(関数/手続き名)
というのもある。入れ子になった関数/手続きから一気に抜ける事も出来る。
0640 ◆R/rLuLKeEI
NGNG0641610
NGNGほんとだ・・・あった・・・。サンクス
標準Pascalの本を見ながらやってたので、気づかなかった。
THINK Pacal入門の後ろの方に、ちらっと載ってた。
あとこれでCとの違いといえば、case文の挙動が
ちょっと違う事くらいか。
0642デフォルトの名無しさん
NGNGtarouという名前の変数か、
tarouという添え字の配列を作って、
tarou[rika]:=100;
とか代入するには、どうすればいい?
0643デフォルトの名無しさん
NGNG0644デフォルトの名無しさん
NGNGname:='tarou';
kamoku:='rika'
tensuu[name,kamoku]:=100;
kamoku:='eigo'
tensuu[name,kamoku]:=90;
とかは?
0645デフォルトの名無しさん
NGNG拡張構文使っていいならやりようはあるけど。
0646デフォルトの名無しさん
NGNG似たようなことは出来ない?
つまり、プログラム自体は一定で、
データの構造次第で変数を増やしたり
減らしたり、参照したり、したい。
いっそ、独自のスクリプト言語を
Pascalで作る方法を考えた方がいいか・・・。
0647デフォルトの名無しさん
NGNGtype Tensuu = record Name, Kamoku: string; Tensuu: Integer end; の配列かリンクリストでいいのでは?
SetTensuu(list, name, kamoku, 90); みたいに使えるアクセサ関数を用意しとけば不便ってこともないでしょ。
Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど
0648デフォルトの名無しさん
NGNGで、純正 PASCAL には「連想配列」はありません。
配列の引数として許されるのは列挙可能な型のみです。列挙不可能な数学的実数を表現している実数型も使用できません。
だいたい、純正 Pascal には文字列型すらないんだし....
連想配列を実現するコードを自分で書くことになります。
それを使って
647 さんの
>Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど
ってことを実現することができるでしょう。
0649デフォルトの名無しさん
NGNGvar hairetu: array [0..maxNum] of integer;
の maxNumが変数であるのは許されないもんね。
まあ、この程度ならリストで代用できるから良いけど。
BasicでいうDIM文が懐かしい・・・。
>>648
>連想配列を実現するコードを自分で書くことになります。
どこかに、転がってないでしょうか。
"pascal 連想配列"でググッても、rubyやPHPが出てくる。
それと、連想配列って英語ではなんて言うの?
0650デフォルトの名無しさん
NGNG0651デフォルトの名無しさん
NGNGassocitation arrayは載ってない。当然か・・・。
探していたら、こんなのを見つけた。
PASCAL ファンのための CGI プラットフォーム 「Reims」
ttp://member.nifty.ne.jp/ymagami/Reims.html
こいつの言語仕様を参考に、associationやlongstringが
標準のPascalでも使えるようなルーチンを作るか。
・・・って、自分にできるか?(^^;
もっと偉い人が作った奴、どっかに落ちてないかなぁ。
0652デフォルトの名無しさん
NGNGだけど、これはMacの、しかもコードウォーリアー用みたい。
少し書き換えればTHINK Pascalでもいけるみたいだけど。
スレ違いになりそうです。失礼しました。
0653デフォルトの名無しさん
NGNG連想配列って、やってることはデータベース検索なんだから、
type
Item = record key : string; val : integer end;
Items = array[1.1000] of Item;
みたいにして
for Ind = 1 to 1000 do Items[Ind].Key = SearchKey then
のように一致したキーを探すことになる。
毎回、全数検査すると遅くなるからハッシュを使うとか、速度向上の手法はいくらでもあるけど、本質は検索だ
0654652
NGNG結構高度なことをやっている様子。
追加、削除、検索など、一通りのルーチンは
揃っているみたい。使い方を解析せねば。
0655レイホウ@6歳
NGNGfor($i = 0; $i < @mob; $i++){
next if ($mob[$i] eq ""); ←何も無かったら次いく
$mobname[$i] = $stuff[2] if ($stuff[1] eq $mob[$i]);
last if ($stuff[1] eq $mob[$i]); ←見つかったら終了
}
これと同じ事をすればいい(↑はperlだけどな)
perlとしては↑間違ってる
えいめ〜ん
0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNG宿題?
0658デフォルトの名無しさん
NGNG整数を三つ読み込む。
次に
最小値を見つける。そして出力。
最後に
最大値を見つけ、それを出力。
簡単でしょ
0659デフォルトの名無しさん
NGNG0660デフォルトの名無しさん
NGNG0661でたらめ
NGNGvar
a, b, c, max, min: integer;
begin
read(a);
max := a;
min := a;
read(b);
if b > max then
max := b;
if b < min then
min := b;
read(c);
if c > max then
max := c;
if c < min then
min := c;
writeln('max', max);
writeln('min', min);
end.
0662デフォルトの名無しさん
NGNGvar
a, b, c, max, min : integer;
function sgn(si : integer) : integer;
begin
if si < 0 then sgn := -1 else if si = 0 then sgn := 0 else if si > 0 then sgn := 1;
end;
begin
read(a); read(b); read(c);
case sgn(a - b) of
-1, 0 : case sgn(b - c) of
-1, 0 : begin min := a; max := c; end;
1 : case sgn(a - c) of
- 1, 0 : begin min := a; max := b; end;
1 : begin min := c; max := b; end;
end;
end;
1 : case sgn(b - c) of
-1, 0 : case sgn(a - c) of
-1, 0 : begin min := b; max := c; end;
1 : begin min := b; max := a; end;
end;
1 : begin min := c; max := a; end;
end;
end;
writeln('max=', max);
writeln('min=', min);
end.
0663662
NGNG0664でたらめ
NGNGbegin
case si of
0:
si := 0;
otherwise
begin
sgn := si div abs(si);
end;
end;
end;
0665でたらめ
NGNGfunction sgn (si: integer): integer;
begin
case si of
0:
si := 0;
otherwise
sgn := si div abs(si);
end;
end;
0666でたらめ
NGNGtype
MMXtype = object
vmax, vmin: integer;
procedure init;
procedure setValue (val: integer);
function max: integer;
function min: integer;
end;
procedure MMXtype.init;
begin
vmax := -32768;vmin := 32767;
end;
procedure MMXtype.setValue (val: integer);
begin
if val > vmax then vmax := val;
if val < vmin then vmin := val;
end;
function MMXtype.max: integer;
begin max := vmax; end;
function MMXtype.min: integer;
begin min := vmin; end;
var MMX: MMXtype;a, i: integer;
begin
new(MMX);
MMX.init;
for i := 1 to 3 do
begin read(a); MMX.setValue(a); end;
writeln('max=', MMX.max);
writeln('min=', MMX.min);
end.
0667662
NGNGType TChoice = function(a, b : integer) : integer;
var
Func : array[boolean] of TChoice;
a, b, c : integer;
function First(a, b : integer) : integer;
begin First := a; end;
function Second(a, b : integer) : integer;
begin Second := b; end;
function fmax(a, b : integer) : integer;
begin fmax := Func[a >= b](a,b); end;
function fmin(a, b : integer) : integer;
begin fmin := Func[a <= b](a,b); end;
begin
Func[false] := Second; Func[true] := First;
read(a); read(b); read(c);
writeln('min=', fmin(fmin(a, b), c));
writeln('max=', fmax(fmax(a, b), c));
end.
0670でたらめ
NGNGvar
a, b, c: integer;
begin
read(a); read(b); read(c);
writeln('max=', ((((a + b) + abs(a - b)) div 2 + c) + abs(((a + b) + abs(a - b)) div 2 - c)) div 2);
writeln('min=', ((((a + b) - abs(a - b)) div 2 + c) - abs(((a + b) - abs(a - b)) div 2 - c)) div 2);
end.
0671デフォルトの名無しさん
NGNG読み込んでソートして一番上と一番下を見る
0673でたらめ
NGNGでもこれって、>667の
>writeln('min=', fmin(fmin(a, b), c));
>writeln('max=', fmax(fmax(a, b), c));
の派生みたいな物ですよ。
ただ、公式にあてはめただけです。
0674でたらめ
NGNGconst
maxint = 32767;
minint = -32768;
var
index: array[minint..maxint] of boolean;
を使う方法も考えたけど、
メモリーが足りない(?)とかで
配列が確保できずに断念したっス。
0676デフォルトの名無しさん
NGNG一クラス分の身長を実数型で入力し、最高と最低を求めるプログラムを作成せよ。
さらに示された入力データでトレース表を書きなさい。
(A)最初に人数を入力し、人数分の処理をする場合(for)
(B)身長に0が入力されたら、終了する場合(while)
実行結果例
人数 制御変数 身長 最高 最低
6 1 178
2 165 165.0
3 197 197.0
4 168
5 175
6 183
こんな問題です。
特に、入力された人数分を変数に入れる方法と、トレース表に出力する方法が分かりません。
0677デフォルトの名無しさん
NGNG小学校の宿題か?
0679デフォルトの名無しさん
NGNG問題が実数型で入力せよとなっているので・・・。
配列はあやふやです・・・。
0680でたらめ
NGNGじゃあ、どうしよっかなー
0681でたらめ
NGNG配列を宣言すれば無駄がないけど、Pascal
はできないもんね。
(B)も(A)もそうだけど、人数の最大が決まっ
てるか決まってないかで、全然変わるけど。
その辺は、どうなんだろうね?
0682デフォルトの名無しさん
NGNGvar i,n,max,min :integer;
sin:array[1..100] of integer;
begin
write('人数は?');
readln(n);
for i:=1 to n do
begin
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
end;
max:=sin[1];
min:=sin[1];
for i:=2 to n do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
end;
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n);
for i:=1 to n do
begin
write(' ',i,' ', sin[i] );
IF sin[i]:=max then
write(' ',sin[i]);
IF sin[i]:=min then
write(' ',sin[i]);
end;
end.
0683でたらめ
NGNGほとんどできてるじゃん。
>IF sin[i]:=max then
>write(' ',sin[i]);
>IF sin[i]:=min then
>write(' ',sin[i]);
ここ、「:=」じゃなくて「=」だ。
それと、この次に、
writeln;
の1行を入れる必要がある。
0686でたらめ
NGNG実数型って比較が難しいの?
0687662
NGNGおお、表示位置のずれは気づかなかった。という
ことで、そこも直す必要があるぞ。>>682
>>686
10進と2進の変換誤差(浮動小数点の場合)と計
算誤差があるから、等号比較だと偽になる場合
が考えられる。あと、有効桁数の問題も気にとめ
ておく必要が出る場合もあるし。
まあ、今回みたいに変数に入れた物を代入する
場合なんかは等号比較が出来る場合が多いけ
ど、代入を計算と見なした場合は一度倍精度に
してから単精度に戻すなどの処理が入って値が
変わる可能性があることを頭に入れておいた方
が破綻しづらくなります。
と言うことで私は整数型で実装出来るものは整数
型で実装するようにしています。
0688でたらめ
NGNGそうか。誤差か。普段そこまでシビアな計算って
したことないんで、気にしなかった。
うちも整数型がほとんどです。
今回の場合、まさか身長で小数点以下2桁以上が
必要になることはないので。入力した数値を
×10して整数型で保存・計算。表示の時に
÷10して実数型(例だと下一桁)っぽく
表示するのではあかんのやろか。
この処理、逆に面倒?誤差が大きくなる?
0689662
NGNG私もその方が良いと思ったので「実数型にする必要があ
るんだ?」と聞いたんだけど... でも「問題が実数型で入力
せよ」という事らしいから、実数型にする必要があるみた
いですね。
それとも「入力が実数型」を受け付けると言うことだけで
良いのなら内部は整数で扱う方がプログラム的には楽
ですね。
計算することを考えるのなら、小数点以下2桁くらい取っ
ておいた方が安全かも。
0690でたらめ
NGNG入力さえ実数型なら、ええんちゃう?
処理まで実数型とは書いてないもんな。
>>682
考えることは同じやね。うちも最初は小数点以下
2桁と思ったけど、例が下1桁だったので、表示
するときの手間を考えて下1桁って書いてた。
そんなわけで。>682は、課題完了だな。
0691682
NGNGあとですね、>>676のwhile文のほうがあって身長に0を入力した場合に入力が終わるプログラムなんだけど、
そうすると出力のときに身長に0が出てしまうんですよ。どうすればいいですか?
0693でたらめ
NGNG入力 1〜2回繰り返し
戻る
repeat
入力 1〜2回繰り返し、3回目に0を入力
0以外は戻る
最後の入力は無効
で、ええんちゃうか。
そうすると問題は、のっけから0を入力された
場合のエラーセーフだけど。ま、やってみそ。
0694デフォルトの名無しさん
NGNGbegin
一つ目を入力;
while i>0 do begin
出力;
入力;
end;
end.
たぶん不合格。
ん?0を「入力した」場合に「入力が」終わる?
0695でたらめ
NGNGそか。repeatはuntilで、whileは違うか。
ま、気にするな。(w
0696でたらめ
NGNGvar next:boolean;
...
next:=true;
while next do
begin
入力
if a=0 then next:=false;
その他のチェック
end;
■ このスレッドは過去ログ倉庫に格納されています