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/
809 名前:デフォルトの名無しさん mailto:sage [03/12/02 21:44] >>807 出来ないかも。 やり方は多分『(1)コードリソースを作って(2)それをメモリ上に読み込み、(3)それを呼び出す』 という手順でやっているのだと思う。(68Kの場合) で、3番目の“呼び出し”はC言語なら出来るんだけど THINK Pascalだとハンドルを関数/手続き扱いしなければならないのでかなり難しいと思う。 (コードリソースの作成はTHINK Pascalでも出来る。) 色々やってみた結果CodeWarrior Pascalで fPtr = function (a,b:integer):integer; こんな感じで関数を型定義してやったらできた。 しかし、これをTHINK Pascalに持ってくると文法違反でコンパイルが通らなかった。
810 名前:809 mailto:sage [03/12/02 21:45] CodeWarrior Pascalで実行できたソースコードの例 プラグイン側の関数は2数の和を返す関数。 type fPtr = function (a,b:integer):integer; {←ここがTHINKでNG。型は必要に応じて変える} fHdl = ^fPtr; var plugHdl: fHdl; plugin: fPtr; c: integer; procedure loadPlugin; {とりあえずファイル名、リソースタイプ、IDは決め打ち} var iFileRef, iErr: integer; begin iFileRef := OpenResFile('pl1'); {プラグインファイルを開く} plugHdl := fHdl(Get1Resource('MyPL', 128)); {メモリ上に読み込み} iErr := FSClose(iFileRef); end; begin loadPlugin; {プラグインをファイルから読み込む} hlock(handle(plugHdl)); {ハンドルロック} plugin := plugHdl^; {一旦ポインタに移し替えないとダメっぽい} c := plugin(3,6); {関数呼び出し。プラグインは2数の和を返す関数}
811 名前:デフォルトの名無しさん mailto:sage [03/12/02 23:03] >>808 どうしても分からん問題だけ聞くのは良いんだけど、こっちは どうしても分からなん問題かどうかなんて判断付かないし、問 題だけ書かれたら「ただ丸投げしている」と思われても仕方が ないだろう。 あと、「分かるところまで書き込む」んじゃなくて、「分からない ところだけ抜き出す」事をしてくれ。元の問題も分からず、ここ まで分かりましたと書かれても答えようがないし、問題と分かっ たところを書かれると「こっちが分からないところを探し出す作 業」をしなければならん。 分からないところを抜き出す作業が面倒と言うことはないと思 うが、「分からないところを抜き出す作業をミス」したり、間違っ て解釈したりするかもしれん。それでお互い時間と数レスを費 やすかもしれないと思うと面倒くさい。
812 名前:デフォルトの名無しさん [03/12/02 23:26] 10進法で表現された数を 2進法、8進法、16進法の表現に変換するプログラムを書いてください。 ただし、入力する10進法の数は(16^4)-1=65535までです。 また、実際の実行例もお願いします。
813 名前:デフォルトの名無しさん mailto:sage [03/12/03 00:15] IntToHex といって見るだけ
814 名前:デフォルトの名無しさん mailto:sage [03/12/03 01:06] >>812 **進法というのは分かっているのか? 分かっているとしたら どこが分からないんだ? 分からないところだけを聞き直して くれ。 あと、実行例くらい自分で実行して作ってもいいだろ。おん ぶにだっこじゃ身につかんぞ。
815 名前:807 mailto:sage [03/12/03 08:39] >>809 ,810 いろいろ試していただいたようで、ありがとうございます。 ハンドルを関数型で確保するのが無理、って事ですね。 仕方ないですね。型にうるさいのは仕様ですから。 型を指定しないで、普通のハンドルなりポインターで確保 して、いきなりそのアドレスをinlineでコールしたら・・・ って思ったけど、それだと変数の受け渡しが出来ませんね。
816 名前:デフォルトの名無しさん mailto:sage [03/12/03 08:41] >>812 今までの課題よりも簡単に思えるけど。
817 名前:デフォルトの名無しさん [03/12/03 12:11] function hoge(n, base: integer): string; var x: integer; s: string; begin if (base <> 2) and (base <> 8) and (base <> 16) then base := 16; s := ''; repeat x := n mod base; if x < 10 then s := chr(ord('0') + x) + s else s := chr(ord('A') + x - 10) + s; n := n div base; until n <= 0; hoge := s; end;
818 名前:デフォルトの名無しさん mailto:sage [03/12/03 15:25] >実際の実行例もお願いします。 萎え
819 名前:デフォルトの名無しさん mailto:sage [03/12/03 18:13] >>812 またおまえか
820 名前:809 mailto:sage [03/12/03 18:39] >>815 (807) できました! 最初、引数・返り値を同じにしたダミーの関数を作って その関数を実行時に機械語の絶対ジャンプで上書きするというのをやってみたんですが デバッガ(Lights Bug)で追うと、きちんと上書きされているにも関わらず 平然と元の関数を実行してるんですね。(失敗) で、動作をMacs Bugで追ってみたところ、 どうやら関数のアドレスを取得すると ジャンプテーブルのアドレスが帰ってくるみたいです。 で、普通に関数コールするとジャンプテーブルをショートカットして 元の関数がダイレクトに呼び出されているようです。 そこで関数を引数にした手続きを別に作成し、 そこから関数を呼び出してみたところ、 うまいこと、プラグインの関数が呼び出されました。 [通常の関数コール]→[目的の関数] [関数、手続きを引数とした関数コール]→[ジャンプテーブル]→[目的の関数] なお、inline関数の場合、関数のアドレス取得自体が出来ませんでした。(コンパイル時にエラー) どこかにひとつ、その関数が作られるわけではなく コードの随所にそのバイト列が単純に埋め込まれるようになっているからだろうと思います。
821 名前:809 mailto:sage [03/12/03 18:39] THINK Pascalで出来るコードリソース呼び出し type funcOverWriteT = record {関数書換用の型} opCode: integer; {JMP命令オペコード用領域} operand: longint; {JMP先絶対アドレス用領域} end; funcOWPtr = ^funcOverWriteT; var fp: funcOWPtr; {ダミー関数アドレス保持} h: handle; {プラグインアドレス保持} c: integer; function dummy_Func (a, b: integer): integer; {ダミー関数。形式はプラグインと合わせる} begin dummy_Func := 1 + a + b - 3 + 4; end; procedure Plugin_Caller (function f (a, b: integer): integer); {Plug-in呼び出し用手続き} begin c := f(3, 6); end; begin h := loadPluginManual; {プラグインアドレス取得。>>810 の手続きを関数にしたもの} hlock(handle(h)); {プラグインのハンドルロック} fp := funcOWPtr(@dummy_Func); {ダミー関数のアドレス取得} fp^.opCode := $4ef9; {68KのJMP命令を上書き} fp^.operand := ord4(h^); {プラグインの絶対アドレスを上書き。ハンドル→ポインタを忘れずに} c := dummy_Func(3, 6); writeln(c); {失敗。ジャンプテーブルを経由しないので元の関数が呼ばれる。} Plugin_Caller(dummy_Func); writeln(c); {プラグイン呼び出し成功!!}
822 名前:デフォルトの名無しさん mailto:sage [03/12/03 21:17] >>820 ,821 なんと!!できましたか!!すばらしい。小生の 知識不足からまだ理解も、再現も出来ていませんが、 希望が持てました。がんばってみます。
823 名前:812 [03/12/03 23:29] >>817 ありがとうございました。 実行例もお願いします。
824 名前:デフォルトの名無しさん mailto:sage [03/12/03 23:39] >>823 自分の所で実行してみなよ。 それが実行例。
825 名前:807,815,822 mailto:sage [03/12/04 13:10] >>809 ,810 >>820 ,821 動きました。 Plugin_Callerを書き換えて変数を渡せるように しても、ちゃんと動きました。 ありがとうございました。
826 名前:812 [03/12/04 18:26] >>817 のプログラムの意味解説をお願いします。
827 名前:デフォルトの名無しさん mailto:sage [03/12/04 18:39] >>826 お前やる気あんの? 全部分からない訳じゃないだろ? 分からないとこを聞けよ。 漠然とした要求をするな
828 名前:デフォルトの名無しさん mailto:sage [03/12/04 19:11] >>817 これでも良さそう const STR16='0123456789ABCDEF'; ・・・略 repeat x := n mod base; s := concat(STR16[x + 1], s); n := n div base; until n <= 0; ・・・略
829 名前:デフォルトの名無しさん mailto:sage [03/12/04 19:11] >>826 解説するまでもない明解なプログラムだぞ。>817は。
830 名前:デフォルトの名無しさん mailto:sage [03/12/04 19:12] >>826 意味って>>812 のことじゃないの?
831 名前:デフォルトの名無しさん mailto:sage [03/12/04 20:24] 10÷2=5...0 5÷2=2...1 2÷2=1...0 1÷2=0...1 10=1010 この意味が分からなければ、 調べ直した方がいい。
832 名前:812 [03/12/04 21:38] わからないのは以下の部分です。 >hoge(n, base: ): string; >s: string; hoge,n,base,string はどういう意味ですか?? >(base <> 2) and (base <> 8) and (base <> 16) これはどういう意味ですか。 >base := 16; >s := ''; >n mod base; n mod baseとはどういう意味ですか。 >s := chr(ord('0') + x) + s >s := chr(ord('A') + x - 10) + s; chr,ordはどういう意味ですか。 >n div base; これはどういう意味ですか。 >until n <= 0; >hoge ここもまるでわかりません お願いします
833 名前:デフォルトの名無しさん mailto:sage [03/12/04 21:50] >>832 ちっとは、Pascalの教科書を読んでおいでよ。 さすがにそれは、不勉強すぎです。
834 名前:デフォルトの名無しさん [03/12/04 21:51] >>832 ちょいと812さん、mod divが分からないなんて… ぶっちゃけpascalなんにも知らないと違います?(;´▽`A``
835 名前:812 [03/12/04 21:56] >>834 そうなんです。 私は数学科で、pascalは何も知らないんです。 コンピュータの教科書に詳細な説明はないんです。 わかるのは function,var,integer,if,then,elseといったものぐらいです。 そこであらためて 817の意味解説をお願いします。
836 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:08] >>835 Pascalの教科書を図書館で借りて読め。「分からないから 教えてくれ」というのは先生にしか言っちゃいけない言葉だぞ。
837 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:22] >>835 directory.google.com/Top/Computers/Programming/Languages/Pascal/Tutorials/
838 名前:817 mailto:sage [03/12/04 22:35] hogeは関数名、nは変換する数値、baseは変換の基底、stringは文字列 baseが2,8,16以外だったらbaseを16にしてる。 n mod baseで一の位が分かる。 数値から文字への変換。'0'の次が'1'、'A'の次が'B' n div baseは整数の割り算。base進数で一の位を削る 0になったら終了。関数の返り値をsにする。
839 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:44] >817さんが親切に>838のような解説を書いても、 >812にはさっぱり意味不明だろう。 pascalの教科書を探して読んで来ない限り、 どこまでいっても全く無駄。 教科書じゃなくても、pascalの初歩のページでも せめて探して読んできなよ。
840 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:49] たとえば ttp://grape.c.u-tokyo.ac.jp/~makino/kougi/jousho/pascal_memo.html
841 名前:805 mailto:sage [03/12/04 23:30] やっぱり「何も考えずに教えてください」って言っているのと 変わらんな。やっぱり無視した方が良いかも。>>801
842 名前:809 mailto:sage [03/12/05 01:03] >825 あ、できましたか。よかったですね。
843 名前:デフォルトの名無しさん [03/12/05 01:20] 6ケタの数を入力し、N個右にずらす(たとえばN=2だとすると123456を を561234)にするにはどのようなプログラムにすればいいですか?
844 名前:デフォルトの名無しさん mailto:sage [03/12/05 01:40] x := x div 10 + (x mod 10) * 100000 をN回繰り返せばいーんでないの
845 名前:デフォルトの名無しさん mailto:sage [03/12/05 04:00] こいつ、課題を全部ここで訊いて済まそうとしているのか? そんなやつに答える事はないと思うけど。>>ALL
846 名前:デフォルトの名無しさん mailto:sage [03/12/05 10:43] 10のN乗を使ってもいいね。
847 名前:デフォルトの名無しさん mailto:sage [03/12/05 10:56] 10のn乗だと、桁、大丈夫?
848 名前:デフォルトの名無しさん mailto:sage [03/12/05 12:59] 6乗までだから大丈夫でしょう。 function hoge(x, n: integer): integer; const k = 1000000; var i, j: integer; begin x := x mod k; j := 1; for i := 1 to n mod 6 do j := j * 10; hoge := (x mod j) * (k div j) + x div j end;
849 名前:デフォルトの名無しさん mailto:sage [03/12/05 19:50] >function,var,integer,if,then,elseといったものぐらいです。 えっ、? >>hoge(n, base: ): string; >>s: string; >hoge,n,base,string はどういう意味ですか?? function分かってるんじゃなかったの? しかも抜き出し方がおかしすぎだろう >function hoge(n, base: integer): string; これで何で分かる「単語」だけを消すかなぁ >hoge(n, base: ): string; ここでintegerを抜いて意味が分からないとは・・・レベル高杉(藁 ほんと基本から学んできてね? というより、分からない単語があったら まず せめて 最低限 ヘルプで調べてね? あかん、、突っ込みどころ大杉 根負けするわ
850 名前:デフォルトの名無しさん mailto:sage [03/12/05 20:03] ひょっとして、質問してる>812は 自分の実行環境を持ってないのか?
851 名前:デフォルトの名無しさん mailto:sage [03/12/05 20:40] winならDelphi DOSならturbo pascal macならTHINK Pascal debianならgpc linuxならKylix ぜ〜んぶ無料
852 名前:デフォルトの名無しさん mailto:sage [03/12/05 20:48] 空いてる時間は大学のコンピュータにかじりついてでも コードを書いてコンパイルしてとにかく試せ。 処理系が見つからなくてCへのコンバータ使ってたころもあったなあ。
853 名前:デフォルトの名無しさん mailto:sage [03/12/05 23:19] Pascal入門 ttp://www.ics.kagoshima-u.ac.jp/edu/proen1/index.html
854 名前:デフォルトの名無しさん [03/12/12 00:28] ほしゅすしゅしゅ(´・ω・`)ショボーン
855 名前:デフォルトの名無しさん mailto:sage [03/12/12 01:48] では、保守ついでに、またもTHINK Pascalの質問。 コードリソースからToolBoxのルーチンを使うには、 コードリソースのプロジェクトに何を入れれば良い?
856 名前:デフォルトの名無しさん mailto:sage [03/12/13 01:05] >>855 ・Runtime.libを外してかわりにRSRCRuntime.Libを入れる。 ・Interface.libはそのまま。
857 名前:856 mailto:sage [03/12/13 01:26] ↑はコードリソースを作る時の一般的な手順なんだけど これでダメって事?
858 名前:デフォルトの名無しさん mailto:sage [03/12/13 07:56] >>856 ,857 アプリしか作った事が無いので、 その一般的な手順を知らなかった・・・(^^; あとで試してみます。ありがとう。
859 名前:デフォルトの名無しさん mailto:sage [03/12/23 02:12] ある手続きで、newでメモリーを確保しながら不定の個数の データを生成するとする。 type myPtr = ^myList; myList = record next: myPtr; Word: string[255]; end; のようなリスト形式だから、順番にデータを読みだせる。 disposeも順番にできる。 この手続きをライブラリ化したとして、 disposeをライブラリ外のメインルーチン側に任せるのは お行儀としてはいかがでしょう? あぶない? ライブラリに、読み出しやdisposeのルーチンを含める べきでしょうか?
860 名前:デフォルトの名無しさん mailto:sage [03/12/23 22:31] >>859 使う使わないは別として、一揃いの機能はライブラリにもって いて欲しいというのが普通じゃないかな。ライブラリ側としては 堅牢に作っておけば、それで問題ないわけだし。あと、リスト追 加(メモリ確保も含む)、削除、ソート、検索なども入れておけば、 わざわざライブラリ外で操作しようと思わないだろうし。 もしリスト形式(というかデータ形式)を「ライブラリ外から隠す」 ようなコンパイラの場合は「ライブラリで処理すべき」だと思い ます。そうすれば「メモリ保護機能を付け加える」というような 場合でも、インターフェイスさえ変えなければ、同じ感覚で使う ことが出来ますから。
861 名前:デフォルトの名無しさん [04/01/08 20:49] 質問です A、B、Cに数値が移動していく問題なのですが A B C 100 0 0 という状態から A B C 70 30 0 A B C 49 48 3 上記のように AからBには30%、BからCには10%分ステップごとに移動していくようには どのようなプログラムを書けばよろしいのでしょうか? 御教授の程よろしくお願いします。
862 名前:デフォルトの名無しさん mailto:sage [04/01/08 20:55] var x, y: integer; begin repeat x = a * 30 div 100; y = b * 10 div 100; a = a - x; b = b + x - y; c = c + y; until loop_end;
863 名前:861 [04/01/08 21:37] 迅速な回答本当にありがとうございました。 重ね重ね失礼を承知の上で2,3お聞きしたいことがあるのですが 上のプログラムではABC3個の値の移動ですが 自分で移動する個数を指定したり(10と入力すればA〜Jまでの数値の移動) Aから右に数値が移動していくと同時に、Cからある割合で左に数値を返していく A B C 100 0 0 A B C 70 30 0 A B C 52 39 9 (右へは30%、左へは10%という感じです) というプログラムはどう書けばよろしいのでしょうか? よろしければ教えていただけると嬉しいです。
864 名前:デフォルトの名無しさん mailto:sage [04/01/08 22:27] 配列かな。 右へ移動する分を蓄えるのと左の分を蓄えるのと用意して計算する。 Pascalで動的確保はどうやるか知らない。
865 名前:デフォルトの名無しさん mailto:sage [04/01/09 02:14] 宿題は自分でやりましょう
866 名前:デフォルトの名無しさん mailto:sage [04/01/09 03:00] よくやるのが、値とポインタをセットにした構造体を定義して、 newでメモリーを確保しながら、つないで行く事かな。 これなら、メモリーの許す限り、いくつ増えても大丈夫。 あ、でも、標準のpascalだと、メモリー確保できたかどうかは 検出できないんだっけ。 ただ、最大何個か決まってるなら、配列でそれだけの数を 確保しちゃってある方が、プログラムは簡単だわな。
867 名前:863 mailto:sage [04/01/09 09:24] >>864 ,865,866 アドバイスをどうもありがとうございました。 配列を用いてといているのですが、 『右へ移動する分を蓄えるのと左の分を蓄えるのと用意して計算』 という部分がどう記述していいのかよくわからないのです。 右から戻ってくる値はdowntoを用いて計算すればいいのでしょうか? また、蓄えた値を足したり引いたりして解を求めるということは ABC…といった場所の値が常に変化してしまうので 変化した値を常に用いて左右に移動する値を求める という部分の記述がどうにもわかりません。 どうか御教授の程よろしくお願いします。
868 名前:デフォルトの名無しさん mailto:sage [04/01/09 09:49] 自分なりに、出来ているコードを提示してはどうですか? コードが出てくればどの程度の知識があるのかも予測できるし。
869 名前:デフォルトの名無しさん mailto:sage [04/01/09 11:26] hoge: array [0..1] of array [0..10] of integer; hoge[0]にa,b,c...が入り hoge[1]に右からと左からを入れる 最後にhoge[0]に足す。
870 名前:デフォルトの名無しさん mailto:sage [04/01/09 21:14] >>869 わざわざ二次元配列にするより、一次元配列を2つ作った方が 分かりやすいと思うんだけど。
871 名前:デフォルトの名無しさん mailto:sage [04/01/09 21:38] 配列を2つ作る必要ってあるのか?
872 名前:デフォルトの名無しさん mailto:sage [04/01/09 21:50] >>871 私に言わせると「わざわざ二次元配列にする必要ってあるのか」 になるんだけど。 値を保存する配列と計算用の配列は分けた方が分かりやすいと 思うんだけど。
873 名前:デフォルトの名無しさん mailto:sage [04/01/09 22:36] ああ。出題の意味を取り違えていた。 配列は2ついるね。失礼。 2次元配列は意味ないね。確かに。
874 名前:デフォルトの名無しさん mailto:sage [04/01/10 02:56] >>867 問題をもう少し整理してくれ。 1. 移動率は場所によって変わるのか? >>861 だとA->Bは30%、B->Cは10%になっている。 2. >>863 で左右に移動する場合、上記1と左右の移動率の関わりは? 3. 左右端の処理はどうするのか? あと、移動率は定数か変数のどちらかもはっきりしないし。 ここいらへんがちゃんと定義されていないと、プログラムを書こうにも書けないぞ。
875 名前:861,863,867 mailto:sage [04/01/10 09:41] 皆様色々とアドバイスをありがとうございます。 >>874 そうでしたすみませんでした。 1は 移動率は場所によって変動です。 2は 移動率なんですが右方向へは(n/50)、左方向へは(n/100)といったようにN番目の場所により移動率が変化。 3は 左端は右隣に移動と右隣からの移動、右端は左隣からの移動と左隣への移動です。 移動率は変数です。
876 名前:デフォルトの名無しさん mailto:sage [04/01/10 09:48] 宿題の設問、そのまま書いてくれたほうがわかりやすいんだけどなぁ
877 名前:875 mailto:sage [04/01/10 10:12] 下のような状態遷移図が書いてあって → → → → @ A B ・・・ I ← ← ← ← @に適当な値を与えると まず@からAに移動、次に@からAに、AからBに、Aから@に、その次は・・・ といった様に数値が移動していく。 また、移動率は右方向には(n/50)、左方向には(n/100)というように、位置Nの値を 用いて設定する。 これにより、各場所での定常値を求めるプログラムを作成しなさい。 というようなことが書いてあります。
878 名前:デフォルトの名無しさん mailto:sage [04/01/10 11:32] ほんとに宿題だったか.... 右が n/50, 左が n/100 だと足して1になりませんが、ここはホントはなんてかいてあった?
879 名前:デフォルトの名無しさん mailto:sage [04/01/10 11:53] 別に足して1にならなくてもいいんでしょ。 const N = 10; var foo: array [1..N] of integer; procedure move; var i, right, left, temp: integer; begin right := foo[1] div 50; for i := 2 to N do begin left := foo[i] * i div 100; foo[i-1] := foo[i-1] - right + left; temp := right; right := foo[i] * i div 50; foo[i] := foo[i] + temp - left; end; end;
880 名前:デフォルトの名無しさん mailto:sage [04/01/10 18:57] >>877 「移動率は位置Nの値を用いて設定する」ってのがよく分からない なぁ。Nは何を表していて、その場所との関係はどうなっているの かをはっきりさせないとプログラムは組めないと思うんだけど。あと 「右方向には(n/50)」のnって何を表しているの? あと、数値は実数にするのか? それとも整数で良いのか? もし整 数なら除算の余り部分の処理はどうするのかが問題ですね。
881 名前:877 mailto:sage [04/01/10 22:18] >>878 ,879,880 アドバイスをどうもありがとうございました >>880 説明が足らず申し訳ありませんでした。 NというのはN番目ということです。 図の@〜Iのことです。 「右方向には(n/50)」、「右方向には(n/100)」のnはNと同じです。 @からAに移動する時は(1/50)、AからBに移動する時は(2/50)、・・・ HからIに移動する時は(9/50)ということです。 数値は実数です。
882 名前:デフォルトの名無しさん mailto:sage [04/01/10 23:51] >>881 なんだ算出可能なら簡単じゃん。私は場所によって特定値 (左右別)になるのかと思って「場所別、左右別の配列」を 用意しなければならないかと思っていました。 で、ここまではっきりすれば簡単に組めるのでは。日本語ア ルゴリズムだとこんな感じ。 { 事前に元量配列に量をセットしておく} for 遷移回数ループ do begin 計算配列を0クリア for 最初の要素から最後の要素まで do begin 左右の漏れ率計算 左右の漏れ量、残り量計算 計算配列に漏れ量と残り量を加える end; 元量配列に計算配列を代入 {途中結果の出力(遷移回数,元量配列)} end; {最終結果出力(元量配列)} 移動する個数を可変にする場合は、配列宣言を大きくセット しておいてその一部だけを使うとか、動的配列を使う(処理 系が許せば)などの方法があります。 注意点は最初の要素と最後の要素は片方にしか漏れ出さ ないことです。あとは自分で組めるでしょ。
883 名前:881 mailto:sage [04/01/11 10:06] 皆様のアドバイスを単に組み合わせただけですが以下のように記述してみました。 type foo=array [1..100] of real; var data:foo; i,j,n:integer; right,left,temp:real; begin write('移動する個数は?'); readln(n); data[1]:=100; j:=0; repeat right:=data[1]/50; for i:=2 to n do begin left:=data[i]*i/100; data[i-1]:=data[i-1]-right+left; temp:=right; right:=data[i]*i/50; data[i]:=data[i]+temp-left end; j:=j+1 until j=100; for i:=1 to n do begin writeln(i,'番目の定常値は',data[i]:5:3,'です。') end.
884 名前:883 mailto:sage [04/01/12 09:18] 上のプログラムを1000回繰り返したときと2000回繰り返したときに 得られた値に変化が見られないのですがなぜなのでしょうか? また、左右に移動する確率をrandomを用いて得ようと思い 簡単なプログラムでどのような乱数が返ってくるのかを 試したところ毎回同じ値しか帰ってこないのはなぜなのでしょうか?
885 名前:デフォルトの名無しさん mailto:sage [04/01/12 09:52] それが定常値
886 名前:883 mailto:sage [04/01/12 10:17] やっぱり定常値なんですね。 もっと果てしない回数を繰り返して得られるものだと思っていたので… type x=array [1..5] of real; var data:x; a,n:integer; begin for n:=1 to 5 do data[n]:=random; for n:=1 to 5 do writeln(data[n]) end. こんなプログラムでいつも同じ乱数しか返ってこないのですが 違う乱数を得るにはどうしたらいいんでしょうか?
887 名前:デフォルトの名無しさん mailto:sage [04/01/12 10:30] Randomと一緒にRandomizeを説明してない教科書は窓からポイ
888 名前:883 mailto:sage [04/01/12 10:45] 窓から ・⌒ヾ(*´_`)ポイしてきました ありがとうございました
889 名前:883 mailto:sage [04/01/12 12:33] 883で書いたプログラムは 待ち行列と考えると 右に移動していく値は人の到着の確率 左に移動していく値はサービスをうけ列を離れていく確率 になるのではないかと思うのですがどうでしょうか?
890 名前:883 mailto:sage [04/01/12 15:47] type foo=array [1..100] of real; var data:foo; i,j,n,k,m:integer; right,left,temp:real; begin write('行列の全人数は?'); readln(n); write('何ステップ?'); readln(k); write('窓口の数は?'); readln(m); {初期値の設定} data[1]:=1; j:=0; repeat {最初に人がが到着する確率} right:=data[1]*・・・; {移動} for i:=2 to n do begin {窓口でのサービス提供} if i<=m then begin {サービス終了率} left:=data[i]*・・・; data[i-1]:=data[i-1]-right+left; temp:=right; right:=data[i]*・・・; data[i]:=data[i]+temp-left end
891 名前:883 mailto:sage [04/01/12 15:48] {待ち行列} else begin {途中放棄率?} left:=data[i]*・・・; data[i-1]:=data[i-1]-right+left; temp:=right; right:=data[i]*・・・; data[i]:=data[i]+temp-left end; end j:=j+1 {決められたステップ数まで} until j=k; for i:=1 to n do writeln(i,'番目の定常値は',data[i]:5:10,'です。') end. 待ち行列に用いて行列の定常値を求めるには こんな感じにすればいいんでしょうか?
892 名前:883 [04/01/12 22:41] 下の式を記述したいのですが (AのN乗÷N!)÷(Σ AのX乗/X!) X=0〜N この式の左側は記述できたのですが 右側はどうやって記述したらいいのでしょうか?
893 名前:デフォルトの名無しさん mailto:sage [04/01/12 22:48] まず数式読みづらい あと0からってのがおかしいと思うが 0の階乗なんてないし 0で割ったらダメでしょ 括弧の結びどころがみにくい Σ(A^X / X!) こう解釈していいか? Σの上下につく数字も明示してくれ 下手っぴでずれてもいいからさ X=1からNまでってところか?
894 名前:883 mailto:sage [04/01/12 22:55] >>893 その解釈で大丈夫です。 Xは1からNまででした。 見にくい上にわかりにくくてすみませんでした
895 名前:883 mailto:sage [04/01/13 09:50] (A^N/N!)/(Σ(A^X)/) Xは1からNまで type hako=array [1..100] of real; hako2=array [1..100] of real; hako3=array [1..100] of real; var box:hako; box2:hako2; box3:hako3; n,b,x,y,z,temp:integer; ue,a,seki,total,kotae,goukei:real; begin write('Nは?'); readln(n); write('Aは?'); readln(a); seki:=1; for b:=1 to n do begin seki:=seki*a; box[b]:=seki end; x:=0; y:=1; z:=0; repeat x:=x+1; y:=y*x; temp:=y; z:=z+1; box2[z]:=temp until z=n; ue:=seki/y;
896 名前:デフォルトの名無しさん mailto:sage [04/01/13 09:50] for b:=1 to n do box3[b]:=box[b]/box2[b]; total:=0; for b:=1 to n do total:=total+box3[b]; goukei:=total+1; kotae:=ue/goukei; writeln('求める値は',kotae:5:3,'です。') end. こんな感じであってますか?
897 名前:883 mailto:sage [04/01/13 09:54] 問題は (A^N/N!)/(Σ((A^X)/X!)) Xは1からNまでで やっぱりX=0の時も値を求める必要があるみたいなので 1を加えてみたのですが、どうでしょうか?
898 名前:デフォルトの名無しさん mailto:sage [04/01/13 18:17] X=0のときってのが意味わからん
899 名前:883 [04/01/15 10:56] Σ (nCm)*{a/(n-a)}^m m=1〜s-1まで Σ {a/(n-a)}^m/(n-m)!*s^(m-s) m=s〜nまで nCmはコンビネーションです。 a,n,sにはこちらから値を与えて解を求める問題なのですが どう記述したらよろしいでしょうか? お願いします
900 名前:デフォルトの名無しさん [04/01/15 13:25] 900
901 名前:デフォルトの名無しさん [04/01/18 11:34] 配列1に5個の数値が順番に1,2,3,4,5と入っているものを 配列2に5,4,3,2,1と入れ替えるにはどうしたらいいですか?
902 名前:デフォルトの名無しさん mailto:sage [04/01/18 11:40] for i:=Low(array1) to High(array1) do array2[i] := array1[High(array1) - i];
903 名前:デフォルトの名無しさん mailto:sage [04/01/18 11:47] >>902 ありがとうございました
904 名前:デフォルトの名無しさん mailto:sage [04/01/18 11:58] どういたまして
905 名前:デフォルトの名無しさん [04/01/18 13:03] type box1=array [1..100] of longint; box2=array [1..100] of longint; var hako:box1; hako2:box2; i,n:integer; p,q,r:real; begin p:=0; q:=1; r:=0; repeat p:=p+1; q:=q*p; r:=r+1; hako[r]:=q until r=10; for i:=Low(hako) to High(hako) do hako2[i]:=hako[High(hako)-i]; for n:=1 to 10 do writeln(hako2[n]) end. 上のプログラムのようにリピートを用いた記述で 配列の入れ替えを行うと0しか戻ってこない場合はどうしたらいいですか?
906 名前:レイホウ@6歳 mailto:sage [04/01/18 13:10] until r=10; これを until r=100; とやってみなさい
907 名前:デフォルトの名無しさん [04/01/18 13:14] >>906 ありがとうございました。
908 名前:レイホウ@6歳 mailto:sage [04/01/18 13:23] うそだった やってみたら for n:=90 to 100 do writeln(hako2[n]); こうだな それか box1=array [1..10] of longint; box2=array [1..10] of longint; ↑これ
909 名前:デフォルトの名無しさん [04/01/20 20:18] N!のような値の大きなものを求めるプログラムで realで宣言すると100!の階乗でも求められるのに 配列(realで宣言)に入れてしまうとエラーが出てしまうのはなぜですか?
910 名前:デフォルトの名無しさん mailto:sage [04/01/20 22:20] >>909 1) 配列は本当に実数型ですか? 2) 初期化していますか? 3) 小さな値(2!、3! など)でもそうなりますか?
911 名前:デフォルトの名無しさん mailto:sage [04/01/21 00:19] エラーの内容を書けょ コード書けょ 配列なのにhoge:=kaijou(100); みたいなことやってるんじゃないの? hoge[0]:=kaijou(100);
912 名前:909 [04/01/21 09:03] type box=array [1..100] of real; var hako:box; a,b,c,d:real; begin a:=0; b:=1; c:=0; write('数値入力'); readln(d); repeat a:=a+1; b:=b*a; c:=c+1; hako[c]:=b until c=d; writeln('答えは',hako[c],'です。') end. これで、 Error: Type mismatch Error: Incompatible types: got "S64REAL" expected "LONGINT"というのが hako[c]のところにでてしまいます
913 名前:デフォルトの名無しさん mailto:sage [04/01/21 09:14] Type がミスマッチしてるんねん。 LONGINT を期待してはるのに S64REAL 型の変数がやってきたんや。
914 名前:デフォルトの名無しさん mailto:sage [04/01/21 09:17] そんなときはキャスト、キャスト。 コンパイルエラーが出なくなるまでキャストし続ける。 何でもいいからよさそうな型でキャスト。 912 のコードなら hako[ byte(c) ]:=b; でどうだろう。
915 名前:デフォルトの名無しさん mailto:sage [04/01/21 16:57] Cはカウンタだから整数型でいいんじゃないの? var a, b: real; c, d: integer; で。
916 名前:デフォルトの名無しさん [04/01/25 11:59] 質問です。 指数分布に従う乱数を発生させるにはどうしたらいいですか?
917 名前:デフォルトの名無しさん mailto:sage [04/01/25 14:52] 2,4,8,16... ってことか? いや、分布だから大きい数がめっちゃ出やすいってことか?
918 名前:デフォルトの名無しさん mailto:sage [04/01/27 06:53] function Expondist : extended; begin Result := -Ln( Random ); end;
919 名前:デフォルトの名無しさん [04/02/05 11:40] 英単語をいくつか入力して、辞書みたいなアルファベット順に表示するにはどうすればいい? アルファベット順にするのはソート関数でいいとして、文字列の配列(?)っていうのが分からない。 たとえばA[i](char)って配列を用意したとして、英単語を my may と入力した場合は、 A[1]='m' A[2]='y' A[3]='m' A[4]='a' A[5]='y' となるような気がするんですが、これじゃあソート出来ないですよね? A[1]='my' A[2]='may' として、さらに一文字ずつ比較していくにはどうすればいいですか?(分かりづらいとは思いますが)
920 名前:デフォルトの名無しさん mailto:sage [04/02/05 11:42] 使っている処理系の名前は? array[1..100] of string; って定義は可能?
921 名前:デフォルトの名無しさん [04/02/05 11:54] SSH使って大学のにログインしてて、処理系は分かりません。 試しにやってみたら warning: missing string capacity - assuming 255 と出ましたが、これ出てきても出来ます?
922 名前:デフォルトの名無しさん mailto:sage [04/02/05 12:47] メモリーばか食いしてもいいのなら、 type Str255:string[255] とか定義して、 array[1..100] of Str255 しちゃえば良いのでは? (って、昔のマック風みたい)
923 名前:デフォルトの名無しさん [04/02/05 13:23] いざとなれば別のコンパイラを使うことにして、定義はこれでやってみます。 でも今度は、stringで定義した文字列で、アルファベット順に順序を比較していく方法が分かりません。
924 名前:デフォルトの名無しさん mailto:sage [04/02/05 14:00] 文字列ではない、たとえば整数の配列のソートは出来ますか? type TargetType = array[1..100] of integer; と定義しているとき、 procedure Sort( var TargetData : TargetType ); という関数を実装出来ますか? これが出来るなら、文字列ソートも容易でしょう。
925 名前:デフォルトの名無しさん mailto:sage [04/02/05 14:06] なんか文字と文字列がごちゃ混ぜになっているっぽいね。 「アルファベット順に順序を比較」ってことは、与えられた二つの文字列に順序をつける。 という操作と同義。 type CompareResult = (sGREATER, sEQUAL, sLESS); function CompareString( s1, s2 : string ) : CompareResult; という関数を作り、任意の文字列間に順序を定める。 もし使っている処理系が文字列間比較をサポートしているのなら、 if s1 > s2 みたいに書いてしまえばよい。大きいか小さいか、等しいかの3通りあるので間違えないように。 文字列間比較をサポートしていない処理系の場合は「アルファベット順」の定義に基づき 一文字ずつ比較。
926 名前:デフォルトの名無しさん [04/02/05 16:20] 整数でのソートは出来ます。それの配列の型をintegerからstringに変えるだけで、英単語も整数と同様に並び変わるってことですね。
927 名前:デフォルトの名無しさん [04/02/05 17:59] やってみたら出来ました。ありがとうございます。
928 名前:デフォルトの名無しさん mailto:sage [04/02/06 13:56] Ord
929 名前:げんげんげんげん [04/02/08 04:49] 分布関数 F(x)=x^n(0<x<1) をもつ乱数を発生させるプログラム誰か教えてください!! お願いいたします。
930 名前:デフォルトの名無しさん mailto:sage [04/02/08 13:46] nは定数? Exp(x * Ln(n)); //n>0のときのみ
931 名前:デフォルトの名無しさん mailto:sage [04/02/08 15:14] それじゃあx^nにならない?
932 名前:デフォルトの名無しさん mailto:sage [04/02/08 15:15] ↑は「それじゃあn^xにならない?」の間違い
933 名前:デフォルトの名無しさん mailto:sage [04/02/08 16:32] そうなると思うならxとnを逆にしたらいいんじゃないかとか考えないのか
934 名前:930.931 mailto:sage [04/02/08 17:59] >>933 いや、俺は>>929 じゃないから。 俺が>>933 のように考えたとしても、何の意味もないじゃんか。 名前からしても別人である可能性が高いのに。釣りか?
935 名前:デフォルトの名無しさん mailto:sage [04/02/08 23:29] >>934 なんか番号間違えまくってないか?
936 名前:デフォルトの名無しさん mailto:sage [04/02/09 17:27] >>935 1つも間違ってない
937 名前:930 mailto:sage [04/02/09 17:38] 930≠931ですが何か?
938 名前:デフォルトの名無しさん mailto:sage [04/02/10 04:25] >>918 の回答じゃだめなのかなぁ?
939 名前:デフォルトの名無しさん mailto:sage [04/03/10 14:34] pc2.2ch.net/test/read.cgi/tech/1078885169/ なんか、次スレたってるぞ
940 名前:デフォルトの名無しさん mailto:sage [04/04/27 21:24] Pascal の言語仕様書(のようなもの)はどこかのサイトで閲覧できますか? Pascal の言語が一通りわかれば良いのですが。
941 名前:デフォルトの名無しさん mailto:sage [04/04/28 00:04] >>940 Pascalって言っても方言から拡張まで何でもありだから、対象の開発環境によってまるっきり違いそうな気がする。 それに言語仕様といっても厳密に書き出すと膨大な量になるから、あまりやっているところはないんじゃないかな。 一通りということなら、入門サイトでも見たらどうかな? 私は本(WirthのPascal本)から入ったのでサイトを紹介することはできないけど。
942 名前:デフォルトの名無しさん mailto:sage [04/04/28 01:13] www.jisc.go.jp/app/pager ここで検索すればJIS標準Pascalの仕様書がPDFで閲覧できるはず。 適当に弄ればPDFのDLもできる。
943 名前:942 mailto:sage [04/04/28 01:30] 上のURLだと見れんみたい トップページから「JIS検索」たどってくれ
944 名前:デフォルトの名無しさん mailto:sage [04/04/28 13:51] とりあえずはANS/JISの標準化された古い仕様だけだよね。 その後のオブジェクト指向方面の拡張はAppleのとBorlandので違うもんねぇ。 gpcはBorlandに近いんだっけ?
945 名前:デフォルトの名無しさん mailto:sage [04/04/29 05:02] >>941-944 どうもです。 いま直接関係しているのが Pascal の方言なので、サイトとかを見て回ってみます。
946 名前:デフォルトの名無しさん [04/05/15 21:02] perlのハッシュのようにキーと要素を扱わせることは出来ないでしょうか? iniファイルのようにキーがたびたび変更される場合を扱いたいのです
947 名前:946 mailto:sage [04/05/15 21:07] すいません・・・思いっきり上の方で連想配列の話題がありましたね 忘れてください
948 名前:デフォルトの名無しさん mailto:sage [04/05/15 22:32] >>946 「キーがたびたび変更されるのでそれに対応する」んじゃなくて「キーがたびたび変更されないように(もしくは変更されても簡単に対応できるように)プログラミングする」のが良いと思う。 キーを作るプログラムが他のだと手の出しようもないけど、自分で作るのならデータ構成、プログラミングで対応できそうな気がする。
949 名前:デフォルトの名無しさん [04/06/25 01:20] レベルの低い質問で申し訳ないんですけど 大学の授業で先週からpascalやってるんですけどわけがわからなくなってるんで 家でpascalの勉強をしたいんですけどどうすれば自宅のパソコンで使えるようになるんですか? OSはウインドウズXPなんですけど。 CDとかで売ってたりするんですか? >>1 のサイトでダウンロードしてもインストールすることができないし 何をどうすれば自宅のパソコンでpascalが使えるようになるんですか?
950 名前:デフォルトの名無しさん mailto:sage [04/06/25 02:49] >>949 大学の授業ってんならgnu-pascal(gpc)当たりが正当かと思うが、 borlandのサイトからdelphiの無償版が落とせる。 またFreePascal(fpc)というのも割りとメジャーだ。 ttp://www.freepascal.org/ ttp://www.jp.freepascal.org/mirror/fpc/download.html
951 名前:デフォルトの名無しさん mailto:sage [04/06/25 04:59] >>949 >>950 が言う通りだと思うけど、その教授に自習したいから処理系教えれ!って聞くのがいいんじゃなかろうか? 学校のマシンが何かのUnix系の端末でgpcってオチが一番ありそうな気はするけども。 Cygwinあたりを突っ込んで(SFUとかU-WinとかMinGWとかでも構わんかもしれんけど)自力でgpcを入れるとかなのかな? 後、大学生なら ttp://www.pascal-central.com/ あたりとりあえず眺めてみるのもお勉強になるかもね。 って、情報系でもなんでもなくてマジわけわかんね〜〜〜〜〜!!!とかだとこういう情報過多なサイトは遠慮しとくベキ?
952 名前:デフォルトの名無しさん mailto:sage [04/06/25 08:03] >>949 Bloodshed Software - Dev-Pascal www.bloodshed.net/devpascal.html
953 名前:949 mailto:sage [04/06/27 00:50] >>950-952 レスありがとうございます。 とりあえずFreePascal(fpc)というのを試してみます。
954 名前:大学生 [04/07/20 22:04] √cの近似値をニュートン法で求めるプログラムと、 二分法でfor文を使って求めるプログラム、 さらに二分法で求めたものを再帰的手続きにより求めるプログラムを テストで出されるそうなのですが、まったくわかりません・・。 なんとか助けていただけないでしょうか?? よろしくお願いします!!!
955 名前:デフォルトの名無しさん mailto:sage [04/07/20 23:44] 車の運転ができない人に免許をとらせても世の中のためになりません。 以上
956 名前:デフォルトの名無しさん mailto:sage [04/07/21 02:16] 筆記試験か。すごいね。穴埋めになるのかな。
957 名前:デフォルトの名無しさん mailto:sage [04/07/21 06:06] 再帰的二分法。のアイデア。 function 再帰で開平を求める関数(c: real); function 実際の再帰で開平を求める関数(範囲の最低値, 範囲の最高値: real); var 二分点: real; begin 二分点 := (範囲の最低地 + 範囲の最高値)/2; if (二分点 * 二分点) < c then result := 実際の再帰で開平を求める関数(二分点, 範囲の最高値) else (二分点 * 二分点) > c result := 実際の再帰で開平を求める関数(範囲の最低値, 二分点) else result := 二分点; end; begin 実際の再帰開平を求める関数(0, c)// 初期値は 0 から c までとする。 end;
958 名前:デフォルトの名無しさん [04/07/26 01:12] レポートが出たのですが、全く分かりません↓ LD A−Aをレジスターに格納する ST A−レジスターの中身をAに格納 AD A−レジスターの中身とAを足して、レジスターに格納 SB A−レジスターの中身とAを足して、レジスターに格納 ML A−レジスターの中身とAを掛けて、レジスターに格納 DV A−レジスターの中身をAで割って、レジスターに格納 接尾辞表現で ABC*+DE-/(普通に書いたら(A+B*C)/(D-E))と入力して 上の指示表現を使って答えを解いていくための別のプログラムを書くとしたら LD B ML C ST TEMP1 LD A AD TEMP1 ST TEMP2 LD D SB E ST TEMP3 LD TEMP2 DV TEMP3 ST TEMP4 と表示できるようなプログラムをpascalで作りなさい。という内容です。 ヒント 式を順にスタックに入れていって、 最初のBC*はop2:=c;op1:=b;として、取り出していくそうです 人助けだと思ってお願いします(ToT)/~~~
959 名前:デフォルトの名無しさん mailto:sage [04/07/26 08:07] オレニマカセロ! とはいうものの、処理系手に入れるまで待ってね。
960 名前:デフォルトの名無しさん mailto:sage [04/07/26 18:51] ずれてたらごめん 1→2→3→4→5→6→7→8→9→α→β→γ→δ * + − / A B C C X X Y D E E Z Z W A B B A A Y D D Y Y A A Y Y 4: (B * C -> X) => (LD B / ML C / ST TEMP1) 6: (A + X -> Y) => (LD A / AD TEMP1 / ST TEMP2) α: (D - E -> Z) => (LD D / SB E / ST TEMP3) γ: (Y / Z -> W) => (LD TEMP2 / DV TEMP3 / ST TEMP4)
961 名前:デフォルトの名無しさん [04/07/27 14:16] どうもありがとうございました(*^_^*)頑張ってやってみます♪
962 名前:デフォルトの名無しさん [04/08/09 10:05] 現在、Pascalによるプログラムが実用されている所ってあるんですかね。 どっかの工場のPCで動いてるとか。
963 名前:デフォルトの名無しさん mailto:sage [04/08/09 10:08] >>962 君の知らない「あそこ」で動いている。 秘主義務があるので具体的な内容は話せない。
964 名前:デフォルトの名無しさん mailto:sage [04/08/09 19:37] matrixengine.jp/product/d_loca/dloca_html/dloca_taiken.html これもPascalみたい。 体験版あるみたいなのでPascal詳しい人試してみて意見聞かせてほしいです。
965 名前:デフォルトの名無しさん mailto:sage [04/08/09 23:36] > 当時は Borland(現 Inprise)の Turbo Pascal が人気のコンパイラでした。私も一時はそればかり使っていま > した。しかし,世の中は ANSI C に移ろうとしていた頃です。私はまむしさんより一歩先に Turbo Pascal を捨 > てて Turbo C に移行しました。 ttp://oku.edu.mie-u.ac.jp/~okumura/compression/1988.html
966 名前:デフォルトの名無しさん mailto:sage [04/08/19 22:39] >>962 私はngraphを現役で使っています。
967 名前:デフォルトの名無しさん mailto:sage [04/08/20 07:21] >>966 研究室のMS-DOS機ですか?
968 名前:966 mailto:sage [04/08/21 22:50] 一応Win95が動いているマシンです。 あとアドインプログラム書くのでコンパイラも時々動かしてます。
969 名前:デフォルトの名無しさん [04/08/22 03:48] 大学院入試のアルゴリズムとデータ構造でPascalで書かれた問題があるのですが、 Pascalは詳しくやってないのでよくわかりません。二分探索木の問題で type tree = @node; node = record; element:integer; left,right:tree; end; で2分木のデータ型treeを定義しているのですが、これはC言語で書くと struct node{ int element; struct node *right,*left; }; struct node *tree; といった感じのイメージでいいのでしょうか(Cの方の文法も間違ってるかも…)。
970 名前:デフォルトの名無しさん mailto:sage [04/08/22 03:50] >>969 あ、Pascalの方の2行目recordと4行目treeの後ろにセミコロン;はありませんでした。 すみません。
971 名前:デフォルトの名無しさん mailto:sage [04/08/22 03:51] あってるよ
972 名前:デフォルトの名無しさん mailto:sage [04/08/22 03:57] ありがとうございます。ここでtree型の変数pのelementの部分にアクセスするためには Pascalではどう書けばいいのでしょうか?
973 名前:デフォルトの名無しさん mailto:sage [04/08/22 04:09] あ、あと問題の一部に(pはtree、xはintegerです) if p=nil then begin new(p); with p do begin (穴埋問題) :=x; left :=nil;right :=nil; end end ってのがあったんですが、with p って何ですか?
974 名前:デフォルトの名無しさん mailto:sage [04/08/22 08:42] >>972-973 pがtree型ならそいつの指すnode型のブツをゲットする必要があるから例えば p^.element だな。Cの (*p).element に相当する書き方。 withの意味は自分で調べれよ。それで分からないところだけ質問しる。 ところで、そこの「with p」は「with p^」 が正しいと思うがどうか。
975 名前:969=970=972=973 [04/08/22 15:44] >>974 ありがとうございます。問題文を見直した所、with p と書かれています。問題の間違いですかね? with文についてググったのですが 「Pascalでレコードのメンバーを扱うには「レコード名.メンバー名」という書式を使うが、 レコード名をある程度省略する方法がある。それにwithを使う。 withの内部では「メンバー名」を書くだけで、そのレコードのメンバーが参照できる。」とありました。 例えば穴埋問題の部分には(p^)のelementメンバにxを代入したいわけですが、 ここは「(p^).」を付けずに element := x; と書ける、ということですか? 書けるとしたら、p^.elementと書くのは間違いとなるのでしょうか?
976 名前:上とは別人 mailto:sage [04/08/22 16:42] >>969 のtype tree = @node;は、type tree = ^node; じゃないのかなあ…まあ、Pascalも方言多いから何とも言えんけど with p or with p^も、Delphiなんかじゃrecordへのポインタに直接"."を続けられるから間違いとも言い切れ無さげ… あと、withは、名前を探す順番を変えるだけなので、p^.elementももちろん書ける…私の知ってるPascalであれば…
977 名前:デフォルトの名無しさん mailto:sage [04/08/22 17:08] >>976 ありがとうございました。 @については、ここ数年分見ましたが、同様の問題では全て@node;のような書き方をしていました。 別な方言なんでしょうね。
978 名前:デフォルトの名無しさん mailto:sage [04/08/25 10:56] >>976 PASCALのJIS規格では「@」は「^」の代替表現なので、とりあえず どっちで書いても同じです。Delphiでは意味が違いますが。 「with p」は規格としては「with p^」でないとまずいでしょう。 もちろん「with p」と書ける処理系は存在するかもしれませんが, すくなくとも GNU Pascal ではだめでした。
979 名前:デフォルトの名無しさん mailto:sage [04/08/31 03:47] スレさようなら
980 名前:デフォルトの名無しさん mailto:sage [04/08/31 03:51] 980!
981 名前:デフォルトの名無しさん mailto:sage [04/08/31 14:51] 落ち
982 名前:デフォルトの名無しさん [04/08/31 22:42] 夏とともに、さよなら・・・。