1 名前:デフォルトの名無しさん [02/01/02 01:46] Pascal の初心者用の質問・相談所 コンソールのみ。GUI は扱いません。 「Cをやったけど難しいので、やっぱりPascalからぼちぼちやるぅ」という人向け。 コンパイラダウンロード www.vector.co.jp/vpack/filearea/win95/prog/pascal/index.html ちなみにDelphiは 「モナーの *やさしい* Delphi質問スレ」 pc.2ch.net/test/read.cgi/tech/1003113413/
610 名前:デフォルトの名無しさん mailto:sage [03/08/23 05:32] 1行が255バイト以上の行を含むテキストファイルの読み込みは、 どうしたら良いのでしょう?
611 名前:デフォルトの名無しさん mailto:sage [03/08/23 05:53] DelphiでもFreePascalでも、大抵は長い文字列を持ってるんじゃないかな…。 無いならChar単位で読むとか。
612 名前:デフォルトの名無しさん mailto:sage [03/08/23 09:49] 初心者質問ですいません。 Dev-pascalはどうやってアンインストールするのでしょうか? リードミーに載ってないんですが・・・。
613 名前:デフォルトの名無しさん [03/08/23 10:28] >>610 var f: text; s: string[255]; begin while not eoln(f) do read(f, s); readln(f); end
614 名前:610 mailto:sage [03/08/23 22:26] >>611 Delphiの無限とも言える長さの文字列は、 便利で良いですねぇ。しかも、CommaTextで 自動的にCSVを切り分けてくれるし。(日本語対応で) でも、今はちょっと長い文字列は無理みたい。 というか、やりたいのはCSVの読み込みなんですけど、 ひょっとしたら1行を一度に読み込むんじゃなくて、 1文字ずつ分析して、項目を切り分けながら 読み込む方が良いのかな? ひょっとして、アルゴリズムって、公開されてる?
615 名前: ◆R/rLuLKeEI [03/08/27 02:02] >>614 >ひょっとして、アルゴリズムって、公開されてる? 理論的には有限オートマトン、正規表現、字句解析、構文解析などを検索すれば、いいんじゃないかな。 CSV形式をうまく構文(文法)に書き下す事が出来れば、ある程度形式的にプログラムに落す方法があるよ。
616 名前:デフォルトの名無しさん mailto:sage [03/08/27 02:10] >>614 C#のでよければ。なんとなくは分かると思うよ。 onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5BTips%2FCVS%A4%F2%CA%AC%B3%E4%A4%B9%A4%EB%5D%5D
617 名前: ◆R/rLuLKeEI mailto:sag [03/08/27 02:44] >>616 そだね、CSVごときに有限オートマトンとか大袈裟だったな。 で、これは日本語対応?
618 名前:デフォルトの名無しさん mailto:sage [03/08/27 03:15] C#に日本語非対応なコードなど無い。
619 名前:デフォルトの名無しさん mailto:sage [03/08/27 04:41] 無知の知ったか。
620 名前:デフォルトの名無しさん mailto:sage [03/08/27 09:04] >>602 ANSIエスケープシーケンスを使う
621 名前:610 mailto:sage [03/08/27 10:13] >>620 おおっ!忘れていたが、何か画期的なアイデアに思える。(w と、思ったが、調べてみたらこう書いてあった。 >どの文字列をエスケープシークエンスとして解釈するかは >ソフトウェアによって千差万別であり、統一された規格の >ようなものが存在するわけではない。 (T^T) >>615 ,616 ありがとうございます。それをきっかけに調べてみます。
622 名前: ◆R/rLuLKeEI [03/08/29 00:54] >どの文字列をエスケープシークエンスとして解釈するかは >ソフトウェアによって千差万別であり、統一された規格の >ようなものが存在するわけではない。 なのに、「ANSI【アメリカ規格協会】」を冠しているのが不思議。
623 名前:620 [03/08/29 07:37] 「ANSIエスケープシーケンス」は>>602 へのコメントだよ。 0x1b(ESC)で始まる文字列をコンソールに送ることで 画面、コンソールの位置、文字の色等を制御するもの。
624 名前:デフォルトの名無しさん [03/08/29 07:39] >>623 s/コンソールの位置/カーソルの位置/
625 名前:610 mailto:sage [03/08/29 10:52] 一応、CSVを切り分けられるコードは書けた。 C#の>616のコードは読めなかったので、 適当に考えてやってみた。だけど、""→"に するのとか、漢字コードのチェックとか やってないし、変なCSVを回避するのも できないし、拡張性が無いコードになって しまっている。
626 名前:デフォルトの名無しさん mailto:sage [03/08/29 12:26] Delphiのコンパイラ使おうぜ。
627 名前:デフォルトの名無しさん mailto:sage [03/08/29 19:24] >>622 ANSIエスケープシーケンスも知らないコテハンか。 時代だな。
628 名前: ◆R/rLuLKeEI mailto:sage [03/08/30 03:46] >>627 >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より)。 と、慌てて調べても後の祭。
629 名前:610 mailto:sage [03/08/30 07:35] Cのソースを見ながら、CSV切り分け書いてるんだけど。 Cだとbreak,continueとかで、loopを跳んだり、 文をキャンセルするので、全然参考にならん。
630 名前:デフォルトの名無しさん mailto:sage [03/08/30 14:09] 同じように書けば良いじゃん。
631 名前:610 mailto:sage [03/08/30 16:21] 無理じゃん。 break, continueが使えるか使えないかで、全然変わるよ。 とりあえず、フラグを追加して、似たような動作を確保。 ""→"にするのも出来たし、"なし文字列のスペースを 取り除くのも出来た。変なCSVでなければ、概ね基準通り 切り分けられるようになった。
632 名前:デフォルトの名無しさん mailto:sage [03/08/30 16:40] >>631 えっ… ひょっとして、DelphiやFreePascalにあるSystem.Breakは、独自拡張!?
633 名前:610 mailto:sage [03/08/30 17:13] >>632 知らなかったのか低能(ワラ
634 名前: ◆R/rLuLKeEI [03/08/30 18:31] >>631 >無理じゃん。 >break, continueが使えるか使えないかで、全然変わるよ。 break文、continue文はラベル無しgoto文といわれるように、これらは等価なラベル有りgoto文に変換可能です。 >>632 DelphiやFreePascalのBreak、Continueが手続きであることの方が吃驚! 知らなかった私も低脳かえ?
635 名前:610 mailto:sage [03/08/30 20:04] >633は別人だが。 >>634 もちろん、goto文を使うことも考えたけど、 なんか邪道っぽくない? ちなみに、うちのはTHINK Pascal。
636 名前: ◆R/rLuLKeEI mailto:sage [03/08/30 22:06] >>635 PASCALで大域ジャンプ以外にgotoを使うのは邪道っぽい。 ちなみに、うちのはGNU Pascal。 ただし、JIS-PASCAL(X3008-1990)の範囲内で考えている。
637 名前:610 mailto:sage [03/08/30 22:25] macの場合、NewHandleやNewPointerでメモリーを 確保した場合、メモリー確保に失敗したら OSErrで分かるんだけど。 標準pascalのnewでメモリー確保に失敗したら どうなるの?というか、その判別方法は?
638 名前: ◆R/rLuLKeEI mailto:sage [03/08/30 23:06] >>637 >標準pascalのnewでメモリー確保に失敗したら >どうなるの?というか、その判別方法は? JIS-PASCAL(X3008-1990)には何の記述もない。 必ず成功するかのようにも読める。 というわけで、その判別方法はない。 1.2 規定外事項 (1) 特定のデータ処理システム又は処理系が処理できるプログラム及び データの大きさ又は複雑さの限界並びにそれらの限界を超えた場合の措置。
639 名前:デフォルトの名無しさん mailto:sage [03/09/01 02:23] >635 ・continue はループの先頭に戻る ・breakはループを脱出 でいいの? だったらTHINK Pascalでは ・ループ(for,while,repeat)の先頭に戻る → cycle ・ループ脱出 → leave だけど。 他に関数・手続きからの脱出 → exit(関数/手続き名) というのもある。入れ子になった関数/手続きから一気に抜ける事も出来る。
640 名前: ◆R/rLuLKeEI [03/09/01 04:25] ・continue はループの最後に飛びます(C++第2版リファレンスマニュアルr.6.6.2)
641 名前:610 mailto:sage [03/09/01 13:34] >>639 ほんとだ・・・あった・・・。サンクス 標準Pascalの本を見ながらやってたので、気づかなかった。 THINK Pacal入門の後ろの方に、ちらっと載ってた。 あとこれでCとの違いといえば、case文の挙動が ちょっと違う事くらいか。
642 名前:デフォルトの名無しさん mailto:sage [03/09/12 12:33] 例えば、'tarou'と入力させて、 tarouという名前の変数か、 tarouという添え字の配列を作って、 tarou[rika]:=100; とか代入するには、どうすればいい?
643 名前:デフォルトの名無しさん mailto:sage [03/09/12 13:11] できません。
644 名前:デフォルトの名無しさん mailto:sage [03/09/12 16:25] じゃあ、tensuuは固定の名前で、 name:='tarou'; kamoku:='rika' tensuu[name,kamoku]:=100; kamoku:='eigo' tensuu[name,kamoku]:=90; とかは?
645 名前:デフォルトの名無しさん mailto:sage [03/09/12 16:47] 連想配列かあ。純粋なPascalじゃ無理かもね。 拡張構文使っていいならやりようはあるけど。
646 名前:デフォルトの名無しさん mailto:sage [03/09/12 19:06] そうそう。連想配列。無理か・・・。 似たようなことは出来ない? つまり、プログラム自体は一定で、 データの構造次第で変数を増やしたり 減らしたり、参照したり、したい。 いっそ、独自のスクリプト言語を Pascalで作る方法を考えた方がいいか・・・。
647 名前:デフォルトの名無しさん mailto:sage [03/09/12 21:07] 連想配列そのものじゃなくても type Tensuu = record Name, Kamoku: string; Tensuu: Integer end; の配列かリンクリストでいいのでは? SetTensuu(list, name, kamoku, 90); みたいに使えるアクセサ関数を用意しとけば不便ってこともないでしょ。 Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど
648 名前:デフォルトの名無しさん mailto:sage [03/09/13 01:42] ここは「Pascal の初心者」なので、Delphi 等の拡張 Pascal は外すべきでは? で、純正 PASCAL には「連想配列」はありません。 配列の引数として許されるのは列挙可能な型のみです。列挙不可能な数学的実数を表現している実数型も使用できません。 だいたい、純正 Pascal には文字列型すらないんだし.... 連想配列を実現するコードを自分で書くことになります。 それを使って 647 さんの >Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど ってことを実現することができるでしょう。
649 名前:デフォルトの名無しさん mailto:sage [03/09/13 08:59] Delphiで言うところの動的配列も、標準では無いですよね? var hairetu: array [0..maxNum] of integer; の maxNumが変数であるのは許されないもんね。 まあ、この程度ならリストで代用できるから良いけど。 BasicでいうDIM文が懐かしい・・・。 >>648 >連想配列を実現するコードを自分で書くことになります。 どこかに、転がってないでしょうか。 "pascal 連想配列"でググッても、rubyやPHPが出てくる。 それと、連想配列って英語ではなんて言うの?
650 名前:デフォルトの名無しさん mailto:sage [03/09/13 09:45] あそしえーしょんあれい。
651 名前:デフォルトの名無しさん mailto:sage [03/09/13 14:52] 久しぶりにTHINK Pascalのマニュアルを引っぱり出したが。 associtation arrayは載ってない。当然か・・・。 探していたら、こんなのを見つけた。 PASCAL ファンのための CGI プラットフォーム 「Reims」 ttp://member.nifty.ne.jp/ymagami/Reims.html こいつの言語仕様を参考に、associationやlongstringが 標準のPascalでも使えるようなルーチンを作るか。 ・・・って、自分にできるか?(^^; もっと偉い人が作った奴、どっかに落ちてないかなぁ。
652 名前:デフォルトの名無しさん mailto:sage [03/09/14 11:18] PNL Librariesに、連想配列のコードがあった。 だけど、これはMacの、しかもコードウォーリアー用みたい。 少し書き換えればTHINK Pascalでもいけるみたいだけど。 スレ違いになりそうです。失礼しました。
653 名前:デフォルトの名無しさん mailto:sage [03/09/16 03:26] THINK Pascal / Mac でやっているの? 連想配列って、やってることはデータベース検索なんだから、 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 のように一致したキーを探すことになる。 毎回、全数検査すると遅くなるからハッシュを使うとか、速度向上の手法はいくらでもあるけど、本質は検索だ
654 名前:652 mailto:sage [03/09/16 20:04] まだソースをざっと見ている段階ですけど、 結構高度なことをやっている様子。 追加、削除、検索など、一通りのルーチンは 揃っているみたい。使い方を解析せねば。
655 名前:レイホウ@6歳 mailto:sage [03/09/24 22:35] 処理速度を犠牲にしてもいいなら for($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としては↑間違ってる えいめ〜ん
656 名前:デフォルトの名無しさん mailto:sage [03/10/14 04:20] 3つの整数を読み込み、最小値と最大値を出力するプログラムを作りなさい。
657 名前:デフォルトの名無しさん mailto:sage [03/10/14 09:28] >656 宿題?
658 名前:デフォルトの名無しさん mailto:sage [03/10/14 09:32] 最初に 整数を三つ読み込む。 次に 最小値を見つける。そして出力。 最後に 最大値を見つけ、それを出力。 簡単でしょ
659 名前:デフォルトの名無しさん mailto:sage [03/10/14 12:29] こういうのをわざと、ObjectPascal使ってやったりしてな。
660 名前:デフォルトの名無しさん mailto:sage [03/10/14 17:02] あ、そろそろ後期の授業が始まったわけか。
661 名前:でたらめ mailto:sage [03/10/14 18:27] program test3; var 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.
662 名前:デフォルトの名無しさん mailto:sage [03/10/16 01:29] program maxandmin; (* IF無しバージョン *) var 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.
663 名前:662 mailto:sage [03/10/16 01:30] あ、sgn に if文を使っているんだっけ。
664 名前:でたらめ mailto:sage [03/10/16 21:41] function sgn (si: integer): integer; begin case si of 0: si := 0; otherwise begin sgn := si div abs(si); end; end; end;
665 名前:でたらめ mailto:sage [03/10/16 21:42] あ。begin, end 一個余分だ。 function sgn (si: integer): integer; begin case si of 0: si := 0; otherwise sgn := si div abs(si); end; end;
666 名前:でたらめ mailto:sage [03/10/17 10:56] program MaxMinX; (* ObjectPascal ver. *) type 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.
667 名前:662 mailto:sage [03/10/17 18:42] program test(input, output); (* 今度こそIF無しバージョン *) Type 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.
668 名前:でたらめ mailto:sage [03/10/17 19:08] >>667 発想がすごい! けど、うちの環境(THINK Pascal)だと、 2行目が通らないっす・・・
669 名前:622 mailto:sage [03/10/17 20:32] >>668 あ、関数型(手続き型の方が分かりが良いかな)って 標準Pascal仕様じゃなかったんですね。ちなみにDelphi では通りました。
670 名前:でたらめ mailto:sage [03/10/18 03:13] program MMX; var 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.
671 名前:デフォルトの名無しさん mailto:sage [03/10/18 17:14] >>656 読み込んでソートして一番上と一番下を見る
672 名前:662 mailto:sage [03/10/21 18:45] >>670 あ、なるほど。2変数のやつをもう一度繰り返せば3変数 に対応出来ますね。私は「一度に3変数に対応出来ない か」と考えていました。
673 名前:でたらめ mailto:sage [03/10/22 00:22] >>672 でもこれって、>667の >writeln('min=', fmin(fmin(a, b), c)); >writeln('max=', fmax(fmax(a, b), c)); の派生みたいな物ですよ。 ただ、公式にあてはめただけです。
674 名前:でたらめ mailto:sage [03/10/22 00:25] 他にも、 const maxint = 32767; minint = -32768; var index: array[minint..maxint] of boolean; を使う方法も考えたけど、 メモリーが足りない(?)とかで 配列が確保できずに断念したっス。
675 名前:662 mailto:sage [03/10/25 15:23] >>673 2変数での公式と>>667 のやつを組み合わせることを 思いつかなかったんです。思いついてさえいたら、先 に書いていたのに...
676 名前:デフォルトの名無しさん [03/10/31 01:49] 質問いいですか? 一クラス分の身長を実数型で入力し、最高と最低を求めるプログラムを作成せよ。 さらに示された入力データでトレース表を書きなさい。 (A)最初に人数を入力し、人数分の処理をする場合(for) (B)身長に0が入力されたら、終了する場合(while) 実行結果例 人数 制御変数 身長 最高 最低 6 1 178 2 165 165.0 3 197 197.0 4 168 5 175 6 183 こんな問題です。 特に、入力された人数分を変数に入れる方法と、トレース表に出力する方法が分かりません。
677 名前:デフォルトの名無しさん [03/10/31 03:33] >>676 小学校の宿題か?
678 名前:662 mailto:sage [03/10/31 05:22] >>676 配列とか知っているか? それとなんでその問題で「実数型」にする必要があるんだ? 実数型だと比較が難しいぞ。
679 名前:デフォルトの名無しさん [03/10/31 08:01] >>678 問題が実数型で入力せよとなっているので・・・。 配列はあやふやです・・・。
680 名前:でたらめ mailto:sage [03/10/31 08:40] 3つの最大・最小の次は、この課題ですか。ふふーん じゃあ、どうしよっかなー
681 名前:でたらめ mailto:sage [03/10/31 08:44] (A)みたいなのは、BasicだとDIM文とかで 配列を宣言すれば無駄がないけど、Pascal はできないもんね。 (B)も(A)もそうだけど、人数の最大が決まっ てるか決まってないかで、全然変わるけど。 その辺は、どうなんだろうね?
682 名前:デフォルトの名無しさん [03/10/31 11:46] がんばって考えてみたけどエラーが出ます。どこを改良すればいいですか? var 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.
683 名前:でたらめ mailto:sage [03/10/31 17:01] >>682 ほとんどできてるじゃん。 >IF sin[i]:=max then >write(' ',sin[i]); >IF sin[i]:=min then >write(' ',sin[i]); ここ、「:=」じゃなくて「=」だ。 それと、この次に、 writeln; の1行を入れる必要がある。
684 名前:662 mailto:sage [03/10/31 18:34] >>682 実数型を使っていないけど、いいのか? それとトレース表の人数のあとに改行が入っているけど それも問題無し?
685 名前:でたらめ mailto:sage [03/10/31 19:10] >>684 そやな、ごもっとも。(w でも、例とは違ってもええんちゃう? それ言い始めると、「最低」の数字の 表示位置がずれてる気がするけど。
686 名前:でたらめ mailto:sage [03/10/31 21:16] ところで。私も詳しく知らないんだが。 実数型って比較が難しいの?
687 名前:662 mailto:sage [03/11/01 09:12] >>685 おお、表示位置のずれは気づかなかった。という ことで、そこも直す必要があるぞ。>>682 >>686 10進と2進の変換誤差(浮動小数点の場合)と計 算誤差があるから、等号比較だと偽になる場合 が考えられる。あと、有効桁数の問題も気にとめ ておく必要が出る場合もあるし。 まあ、今回みたいに変数に入れた物を代入する 場合なんかは等号比較が出来る場合が多いけ ど、代入を計算と見なした場合は一度倍精度に してから単精度に戻すなどの処理が入って値が 変わる可能性があることを頭に入れておいた方 が破綻しづらくなります。 と言うことで私は整数型で実装出来るものは整数 型で実装するようにしています。
688 名前:でたらめ mailto:sage [03/11/01 10:59] >>687 そうか。誤差か。普段そこまでシビアな計算って したことないんで、気にしなかった。 うちも整数型がほとんどです。 今回の場合、まさか身長で小数点以下2桁以上が 必要になることはないので。入力した数値を ×10して整数型で保存・計算。表示の時に ÷10して実数型(例だと下一桁)っぽく 表示するのではあかんのやろか。 この処理、逆に面倒?誤差が大きくなる?
689 名前:662 mailto:sage [03/11/01 11:44] >>688 私もその方が良いと思ったので「実数型にする必要があ るんだ?」と聞いたんだけど... でも「問題が実数型で入力 せよ」という事らしいから、実数型にする必要があるみた いですね。 それとも「入力が実数型」を受け付けると言うことだけで 良いのなら内部は整数で扱う方がプログラム的には楽 ですね。 計算することを考えるのなら、小数点以下2桁くらい取っ ておいた方が安全かも。
690 名前:でたらめ mailto:sage [03/11/01 13:19] 実数型で入力し・・・そうか!!やっぱり 入力さえ実数型なら、ええんちゃう? 処理まで実数型とは書いてないもんな。 >>682 考えることは同じやね。うちも最初は小数点以下 2桁と思ったけど、例が下1桁だったので、表示 するときの手間を考えて下1桁って書いてた。 そんなわけで。>682は、課題完了だな。
691 名前:682 [03/11/01 23:35] レス有難うございます!! あとですね、>>676 のwhile文のほうがあって身長に0を入力した場合に入力が終わるプログラムなんだけど、 そうすると出力のときに身長に0が出てしまうんですよ。どうすればいいですか?
692 名前:でたらめ mailto:sage [03/11/02 00:30] >>691 forとwhileの基本的な違いではないか。 それを考えるのが課題のポイントじゃ。
693 名前:でたらめ mailto:sage [03/11/02 11:26] for 1〜2回 入力 1〜2回繰り返し 戻る repeat 入力 1〜2回繰り返し、3回目に0を入力 0以外は戻る 最後の入力は無効 で、ええんちゃうか。 そうすると問題は、のっけから0を入力された 場合のエラーセーフだけど。ま、やってみそ。
694 名前:デフォルトの名無しさん mailto:sage [03/11/02 23:35] if文は使ったらいけないのヵ begin 一つ目を入力; while i>0 do begin 出力; 入力; end; end. たぶん不合格。 ん?0を「入力した」場合に「入力が」終わる?
695 名前:でたらめ mailto:sage [03/11/03 00:44] あ。すまぬ。>693は何か勘違いして書いてるかもしれん。 そか。repeatはuntilで、whileは違うか。 ま、気にするな。(w
696 名前:でたらめ mailto:sage [03/11/03 00:51] 罪滅ぼしに、ちょっとヒントを。 var next:boolean; ... next:=true; while next do begin 入力 if a=0 then next:=false; その他のチェック end;
697 名前:デフォルトの名無しさん mailto:sage [03/11/03 01:44] なんだその変なコード。
698 名前:でたらめ mailto:sage [03/11/03 02:31] >>697 まあ、でたらめっちゅー事で。気にするな。 よかったら、すばらしいサンプルを提示して やってくだされ。
699 名前:デフォルトの名無しさん mailto:sage [03/11/03 17:26] >>696 while true do で if 〜then break すればいいんじゃ?
700 名前:でたらめ mailto:sage [03/11/03 18:13] >>699 前にも似たような話があったけど、 標準Pascalではbreakが使えないのよん。
701 名前:でたらめ mailto:sage [03/11/03 18:13] と、思って>700を書いたが。私の勘違い?
702 名前:デフォルトの名無しさん mailto:sage [03/11/03 19:01] 1周目を必ず通すならrepeat使いなよ。
703 名前:でたらめ mailto:sage [03/11/03 19:11] >>702 >676
704 名前:デフォルトの名無しさん mailto:sage [03/11/03 20:04] ちょっくら問題作った奴に山嵐決めてくる。
705 名前:662 mailto:sage [03/11/03 23:08] ほんとだ、これは問題を作ったやつがバカ。 repeat - until を使った方が素直に組めるのに。 どうしてもwhileでやらなきゃならないのなら、入力 関数でも作って以下のようにするか... function 身長入力関数(var 身長) : boolean; begin 入力処理 end; while 身長入力関数(身長) do 身長追加処理; >>701 その通り、breakは無いです。元が教育用言語 だから、抜け道は作らないような構文になって いるんですよね(caseのelse、otherwiseも無い)。
706 名前:でたらめ mailto:sage [03/11/03 23:15] >>705 「課題」なんだから仕方ないよ。 Cだと、入力しつつ比較が出来るから、 関数を作る必要はないんだよね?確か。 breakが無いのはまだいいけど、 caseのotherwiseも標準にはないの? これないと辛い。つーか、無理。 THINK Pascalはある。
707 名前:662 mailto:sage [03/11/04 00:21] >>706 いや、課題だからこそ変な制約を付けることなく作ら せるのがよい。まあ、一定の方向に仕向けるためだ ろうけど、それでプログラミング嫌いになったら教育 の価値無し。 otherwise(Delphiではelse)は無い。と言うかcase を使う時点で出てくる要素は判っているはずだから、 全て列挙しろと言うことでしょう。otherwiseに入れら れた処理を「あとで分類し直す」なんて事になったら 結構大変だというのは想像が付きそうだけど。
708 名前:676 [03/11/04 12:17] こんな強引な感じになりましたが一応例どおり動きました。 Program en9a(input,output); var i,n :integer; max,min :real; 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]; writeln('人数 制御変数 身長 最高 最低 '); writeln(n);
709 名前:676 [03/11/04 12:18] i:=1; repeat IF sin[i]>max then max:=sin[i]; IF sin[i]<min then min:=sin[i]; write(' ',i,' ', sin[i]); IF sin[i]=max then write(' ',max:3:1); IF sin[i]=min then write(' ',min:3:1); writeln; i:=i+1; until i<>1; for i:=2 to n do begin IF sin[i]>max then max:=sin[i]; IF sin[i]<min then min:=sin[i]; write(' ',i,' ', sin[i]); IF sin[i]=max then write(' ',max:3:1); IF sin[i]=min then write(' ',min:3:1); writeln; end; end.
710 名前:676 Bのほう [03/11/04 12:19] Program en9b(input,output); var i,n :integer; max,min :real; sin:array[1..100] of integer; begin n:=1; i:=1; writeln(i,'人目の身長を入力してください'); readln(sin[i]); while sin[i]<>0 do begin i:=i+1; writeln(i,'人目の身長を入力してください'); readln(sin[i]); n:=n+1; end; max:=sin[1]; min:=sin[1]; writeln('人数 制御変数 身長 最高 最低 '); writeln(n-1);