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/
730 名前:デフォルトの名無しさん [03/11/11 16:54] a<>b<>c みたいなことをやらせるには どうしたらいいのでしょう… 配列を使った課題がT-T
731 名前:デフォルトの名無しさん mailto:sage [03/11/11 19:50] a <> b and a <> c
732 名前:デフォルトの名無しさん mailto:sage [03/11/11 19:59] >>730 a=cでもええのか? >>731 b=cの可能性はあるな そういう意味じゃない?
733 名前:デフォルトの名無しさん mailto:sage [03/11/11 20:04] a <> b and a <> c and b <> c 等しくはならんが気休めにどうぞ。
734 名前:デフォルトの名無しさん mailto:sage [03/11/11 22:03] andの方が優先度高い罠
735 名前:デフォルトの名無しさん mailto:sage [03/11/12 02:04] そもそも、>730の課題は何がさせたいのだ? aとbとcがいずれも異なる値であることを 確認すればいいの? にしては、配列を使うって・・・意味不明。
736 名前:デフォルトの名無しさん mailto:sage [03/11/12 23:39] >>735 意味を取ろうとするから意味不明。気にしなければOK。 課題を出している方はまともな課題を出していて、ここで 聞いているのの頭が「意味不明」なだけのような気がする (もしくは本気で訊いていないのか)。今までの経緯から すると。 意味が通る訊き方をすれば、それなりに答える気になる のに。
737 名前:デフォルトの名無しさん mailto:sage [03/11/14 16:34] 配列を使ったプログラムの途中にa<>b<>cという判定が必要な部分があるとか
738 名前:デフォルトの名無しさん [03/11/15 22:16] すいませんご教授おねがいします。 画面を再構成させる方法は存在するのでしょうか? 存在するのでしたら教えてください。 学校の宿題を作ってるとき、再構成しないと見栄えが悪いもので…
739 名前:デフォルトの名無しさん mailto:sage [03/11/15 23:50] >>738 再構成ってどんなこと? 宿題と言われてもこっちは何も 分かっていないんだと言うことを理解して、詳しく説明し てくれないと何の手助けも出来ないんだが。課題の内 容をこと細かく説明する必要は無いんだけど、「どんな ことをやろうとして、どうなってしまったから、こうしたい」 くらいの説明がないと何とも。 あと、コンパイラ依存? それとも汎用? OSに関わりのあ る(と思われる)場所は無いのかな? 見栄えを求めるとしたらどのレベル? 事によると宿題の 域を大幅に超えるかもしれないので、どれくらいの事を したいのか分からないと答え辛いかも。
740 名前:デフォルトの名無しさん mailto:sage [03/11/16 00:16] >>738 まるで 「僕のお小遣いで買いに行ける一番美味しいケーキはどれ?」 っていう質問に答えるようなものだな。
741 名前:738 [03/11/16 03:27] すいません、プログラミング初心者なので、 質問の仕方すらよくわかってません(/_<。) delphi6のコンソールで、文字列がずらずらと繰り返えされ 見難くなるので、画面の文字をいったん全部消去する 方法を教えてもらいたいのですが… 正直どう説明すればいいのかすら分かりません(-_-;)
742 名前:デフォルトの名無しさん mailto:sage [03/11/16 13:22] >>741 Delphi6と言うことはWin32コンソールもしくはDOS窓に なるのか。OSによって対応は違いますね。 16ビット系(Win95からMEまで)なら「ANSIエスケープ シーケンス」が使えると思うのですが、32ビット系(NT から2000,XPまで)はこれが使えないので「いちいちコ ンソールと文字モードのサポートにあるAPIで制御」す るか、改行で区切って綺麗に見せて出力するかしか 無いですね。
743 名前:738 [03/11/16 15:35] >>742 そうですか…きっぱりあきらめることにします。 初心者の馬鹿な質問に答えて下さいまして本当にありがとうございました
744 名前:デフォルトの名無しさん mailto:sage [03/11/17 19:13] >>738-743 pageコマンドは? (A)コンソールに対して writeln('abc'); page; writeln('xyz'); こうすると(THINK Pascalの場合) (abcが表示された後、画面消去するので) コンソールにxyzだけが表示される。 (B)ファイルに対して var f:text; .. writeln(f, 'abc'); page(f); writeln(f, 'xyz'); こうするとabcとxyzの間に(改ページ)が挿入される。 一般的なPascalの教科書に出ているコマンドだよ。
745 名前:デフォルトの名無しさん [03/11/17 22:23] >>744 delphiのコンソールじゃ出来ないんじゃない?
746 名前:デフォルトの名無しさん mailto:sage [03/11/17 22:40] >>744 残念ながらBorlandのPascal言語系(Delphiだけで なくTurboPascalから)はPageはサポートしていな かったりする。
747 名前:744 mailto:sage [03/11/17 23:42] そうなんだ。
748 名前:デフォルトの名無しさん mailto:sage [03/11/18 01:51] 全く紛らわしいことしやがって。
749 名前:デフォルトの名無しさん mailto:sage [03/11/18 03:17] TurboPascal風のコンソールユニット www.slis.keio.ac.jp/~anakata/filearea/filearea.html から Win32Crt.pas (w32crt03.lzh) を落として、解凍後、Win32Crt.pasを Libフォルダにコピーする。 古いユニットなので、Delphi6では未定義の識別子 : 'KeyEvent' という エラーが出るから、KeyEventという文字列を全てEvent.KeyEventに 置き換える。 これで、TurboPascalのCRTユニット風の関数が使えるようになる。 GotoXY, WhereX, WhereYがゼロオリジンなので、互換性を考えれば ソースをいじったほうがいいかもしれない。
750 名前:749 mailto:sage [03/11/18 03:18] とりあえず、簡単なサンプル(Delphi6で確認)。 何かキーを押すと終了する。 program Project2; {$APPTYPE CONSOLE} uses Windows, SysUtils, Win32Crt; var f, b: Integer; begin for b := 0 to 15 do begin ClrScr; for f := 0 to 15 do begin TextColor(f); TextBackground(b); gotoXY(f * 2, f); Writeln('Test String [', WhereX, ',', WhereY, ']'); Sleep(1000); if KeyPressed then Exit end end end.
751 名前:デフォルトの名無しさん [03/11/18 23:36] n個の値 a[0] , a[1] , ・・・ , a[n-1] が与えられているとき、 a[i]の順位 r を求めるプログラムを書いてください。 ただし、順位=(自分より大きいものの個数+1)です。 また、プログラム中に使用する名前の型、属性、意味内容を明示し、 実際の実行例もお願いします。
752 名前:デフォルトの名無しさん mailto:sage [03/11/19 00:00] 順番に調べればいいんじゃない。 x := 1; for i := 0 to n-1 do if a[i] > a[r] then x := x + 1;
753 名前:デフォルトの名無しさん mailto:sage [03/11/19 00:39] >また、プログラム中に使用する名前の型、属性、意味内容を明示し、 >実際の実行例もお願いします。 それくらいは自分で考えた方が良いぞ。属性ってそもそも何?
754 名前:デフォルトの名無しさん mailto:sage [03/11/19 10:04] とても素朴な疑問なんだが。 >n個の値 a[0] , a[1] , ・・・ , a[n-1] が与えられているとき この「与えられているとき」ってのを見る度に悩むんだな。 サンプルをどうしよう?って。 programなら、入力ルーチンを作るか、ファイルから読み込むか、 constで適当な値を作るか。 procedureやfunctionだけ作るとしても、pascalでは配列を 関数には渡せないよね? それとも、a[0]...っていうグローバル変数があるものと してもいいけど、それも美しくないし。
755 名前:デフォルトの名無しさん [03/11/19 11:17] >>754 ポインタで渡せば?
756 名前:デフォルトの名無しさん mailto:sage [03/11/19 11:37] >pascalでは配列を関数には渡せないよね? いや…渡せるけど procedure A(B: array[C..D] of Integer); みたいな。 Delphiならprocedure A(B: array of Integer); で範囲はLow/Highで取る。
757 名前:デフォルトの名無しさん mailto:sage [03/11/19 12:46] いや、勘違いだったら失礼。 >>756 そのC..Dが変数でもできたっけ? >>755 ポインタで渡すのが確実か。確かに。
758 名前:デフォルトの名無しさん mailto:sage [03/11/19 18:31] >>754 渡せるぞ。ちゃんと宣言すれば。以下参照。 Type TIntArray = array[LO..HI] of integer; var A : TSomeArray; procedure DoSomething(B : TIntArray); として(LOとHIは定数で適当に宣言されているとする)、 DoSomething(A); とすればちゃんと呼び出せるぞ。 >>756 手続き宣言の場所で直接配列を宣言すると、処理系に よっては「違う型と見なされて配列を渡せない」事態にな る可能性があるぞ。これは実装依存らしいから、絶対大 丈夫だとか絶対ダメだとか言えないのが面倒。 >>757 変数はダメです(処理系によっては大丈夫かも)。標準で は定数しか受け付けません(というか実行時に大きさが 決まる配列自体が使えないはず)。
759 名前:756 mailto:sage [03/11/20 07:38] >>758 いや、私が言いたかったのはオープン配列。 規格はよく知らないけど、ものの教科書では procedure A(B: array[C..D] of Integer); で、任意の長さの配列を渡せるらしい。C..Dには実引数の添え字範囲が入る、らしい。 (もっとも、対応しているコンパイラは知らないけどね) 追記しているようにTP系(FreePascal/Delphi)では同じ機能はあっても構文が違う。
760 名前:デフォルトの名無しさん mailto:sage [03/11/20 08:44] たぶん、環境に依存しないやり方としては、>758が 正しいと思う。見て、おぼろに思い出した。 だけど、わざわざ型を指定するのって、面倒なんだよね。
761 名前:デフォルトの名無しさん mailto:sage [03/11/20 18:20] >>759 あー、オープン配列は使ったことがなかったので、完全に 忘れていました。書かれて初めて「そういうのがあったっけ なぁ」という感じ。 私はオープン配列を使うような場面ではTListを使うので使っ たことがありません。オープン配列を使わなきゃならないよ うな手続きなんかも書かないし。
762 名前:デフォルトの名無しさん [03/11/20 22:44] Why Pascal is Not My Favorite Programming Language www.lysator.liu.se/c/bwk-on-pascal.html 誰か Why Pascal is My Favorite Programming Language を書いてください。
763 名前:デフォルトの名無しさん mailto:sage [03/11/21 00:07] >>762 いいじゃん、放っておけば。大体用途の違う言語を 比較して「こっちが好きだ」って書いているような人 にろくなのはいないから。 分かっている人は「その言語はそういう用途には向 かない」とか「そういうことを目的として設計された言 語ではない」と書くと思う。
764 名前:デフォルトの名無しさん mailto:sage [03/11/21 11:38] 俺はタイプ量が多くなっても if (hoge)と括弧を書くよりは if hoge thenと書くほうが好きだ。 好きなところってそこしか思い浮かばなかった。 嫌いなところばっかり浮かんで来る・・・。
765 名前:デフォルトの名無しさん mailto:sage [03/11/21 12:19] 部分範囲型、集合型、配列の関係が好きだ… C系の言語でこれらの概念を持ってるのがサッパリ無いのはどういうことか
766 名前:デフォルトの名無しさん mailto:sage [03/11/21 14:40] ビットで済ましているんだろ。
767 名前:デフォルトの名無しさん [03/11/22 11:26] お願いします 英単語を入力して、そのつづりを逆順にした文字列を作りなさい。 実行例 英単語は? beautiful 逆順にしたつづりは lufituaeb できそうだと思ったんだけど挫折・・・
768 名前:デフォルトの名無しさん mailto:sage [03/11/22 13:48] function ReverseString( S : String ) : string; var I, J : Integer; begin J:=Length(S); SetLength( Result, J); for I:=1 to J do Result[i]:=S[J+1-I]; end; 実行してないんで動くかどうかはシラネ
769 名前:デフォルトの名無しさん mailto:sage [03/11/22 15:47] program rev; var st : string; i : integer; procedure swap(var a, b : char); var t : char; begin t := a; a := b; b := t; end; begin readln(st); for i := 1 to length(st) div 2 do swap(st[i], st[length(st) - i + 1]); writeln(st); end. こんな感じ?
770 名前:デフォルトの名無しさん [03/11/22 17:51] 回すのは、半分くらいでいいのでは?
771 名前:デフォルトの名無しさん mailto:sage [03/11/22 17:52] あっ、半分になってるよね。スレ汚しすまん。
772 名前:デフォルトの名無しさん mailto:sage [03/11/22 18:20] ■フォーマット xx xx xx xx -- -- ----- A B C A... アイテムコード B... 強化パラメータ ( 9C < 0 < 64 ) C... 使用回数 ( 00 01 < E8 03 < 00 00 ) ※00 00 : 無制限 これどういういみでつか??
773 名前:デフォルトの名無しさん mailto:sage [03/11/22 19:12] >>768 funciton ReverseString(S : String) : string; var i : integer; begin for i := length(S) downto 1 do result := concat(result, S[i]); end; これで良い気がする。
774 名前:768 mailto:sage [03/11/23 23:25] ほぉ。concat関数ですか。知りませんでした。 でも >function Concat(s1 [, s2,..., sn]: string): string; >説明 >Concat 関数を使うと,任意の数の文字列を結合できます。各パラメータは文字列型の式です。結果はすべての文字列型パラメータ>の結合です。 >次に示すように,正符号演算子(+)を使っても Concat 関数と同じ結果が得られます。 >S := 'ABC' + 'DEF'; >参考正符号演算子の方が Concat よりも処理が速くなります。 正符号演算子では文字列の加算の「度に」文字列分のメモリの確保と開放が行われてる(と思う)ので 前もってメモリを確保してある>>768 のほうが速いと思われます。 (文字列が長くなるに従って差は大きくなると思います。 つまり、 速度を求めるなら>>773 氏の方法より>>768 のほうがよろしいかと。 実際に試してないんで知らないけど。 添字の計算部分の差で負けたりして(w
775 名前:デフォルトの名無しさん mailto:sage [03/11/24 00:19] >>774 うーん、確かに速度的には遅くなるかもしれないけど、 この関数をそんなに頻繁に使うとは思わないので、な るべく単純な形の方が分かりやすいような気がする。 あと、以下の形にすると、日本語に対応するのも楽。 function ReverseString(S : string) : string; var
776 名前:775 mailto:sage [03/11/24 00:23] 途中で書き込んでしまった。 function ReverseString(S : string) : string; var i : integer; begin for i := 1 to length(S) do result := concat(S[i], result); end;
777 名前:デフォルトの名無しさん mailto:sage [03/11/24 17:04] 再帰バージョン function reverseString (a: string): string; begin if length(a) <= 1 then reverseString := a else reverseString := concat(reverseString(omit(a, 1, 1)), a[1]); end; omitは omit(文字列,位置,文字数) で指定した部分を削除した文字列を返す, THINK Pascal の組み込み関数。
778 名前:デフォルトの名無しさん mailto:sage [03/11/24 18:09] >>775 単純さを求めるとなると手っ取り早い日本語対応は function ReverseString(S : widestring) : widestring; では?(w >>776 >result := concat(S[i], result); result := S[i] + result; むしろこちらのほうが単純(直感的)かと。 ただconcat関数に慣れてないだけかも知れんが…
779 名前:デフォルトの名無しさん mailto:sage [03/11/24 18:34] >ただconcat関数に慣れてないだけかも知れんが… 文字列連結に「+」が使える事にかえって驚く。 resultというのもDelphi独自の規格だよね。
780 名前:デフォルトの名無しさん mailto:sage [03/11/24 23:12] >>778 widestringを使うのは環境にだいぶ依存しそう ですけど(確かに単純と言えば単純だけど)。 concatを使うのはあくまで私のやり方ですので、 +の方が分かりやすければそちらで問題ありま せん。
781 名前:デフォルトの名無しさん [03/11/25 00:22] >>779 Turbo Pascalからの仕様ですね。
782 名前:デフォルトの名無しさん [03/11/25 08:07] おながいします 問 正の整数を読み込み、30桁の数になるまでそれを2倍、2倍にしていき、 30桁の数になったら出力する。 桁数ってどうだっけ・・・
783 名前:デフォルトの名無しさん mailto:sage [03/11/25 09:34] program Hoge; {$APPTYPE CONSOLE} var bignum : array [1..30] of Integer; function keta: Integer; var i : Integer; begin i := 30; while (bignum[i] = 0) and (i > 1) do i := i - 1; keta := i; end; { keta } procedure nibai; var i : Integer; begin for i := 1 to 30 do bignum[i] := bignum[i] * 2; for i := 1 to 29 do begin bignum[i+1] := bignum[i+1] + bignum[i] div 10; bignum[i] := bignum[i] mod 10; end;end; { nibai } procedure print; var i : Integer; begin for i := 30 downto 1 do Write(bignum[i]);end; { print } procedure init; var i : Integer; begin for i := 2 to 30 do bignum[i] := 0; bignum[1] := 1;end; { init } begin init; while keta < 30 do nibai; print; end.
784 名前:デフォルトの名無しさん mailto:sage [03/11/25 09:49] procedure init; var i : Integer; begin Read(i); bignum[1] := i; for i := 1 to 29 do begin bignum[i+1] := bignum[i] div 10; bignum[i] := bignum[i] mod 10; end; end; { init }
785 名前:デフォルトの名無しさん [03/11/25 11:46] >>767 program ensyu(input,output); const msg ='英単語の綴りを逆順にします。'; var engword,downword:string[30]; Len,i :integer; begin writeln(msg); write('英単語は?'); readln(engword); Len:=length(engword); for i:=Len downto 1 do begin downword:=downword+engword[i]; end; writeln('逆順にした綴りは',downword,'です。'); readln; end.
786 名前:デフォルトの名無しさん mailto:sage [03/11/25 12:41] function ReverseString(S: String): String; var i, j : integer; c : char; begin i := 1; j := Length(S); while i < j do begin c := S[i]; S[i] := S[j]; S[j] := c; i := i + 1; j := j - 1; end; ReverseString := S; end; { ReverseString }
787 名前:デフォルトの名無しさん mailto:sage [03/11/25 13:54] 激遅 function ketaketa(e : extended):integer; begin while true do begin e:=e*2; if log10(e)>=30 then break; end; ShowMessage(FloatToStr(e)); end;
788 名前:デフォルトの名無しさん mailto:sage [03/11/25 14:16] procedure ketaketa(e : extended); begin while log10(e) < 30-1 do e:=e*2; ShowMessage(FloatToStr(e)); end;
789 名前:デフォルトの名無しさん mailto:sage [03/11/25 14:39] procedure ketaketa(e : extended); var i : Integer; begin for i := 1 to Ceil((30-1 - log10(e)) / log10(2)) do e := e * 2; ShowMessage(FloatToStr(e)); end;
790 名前:デフォルトの名無しさん mailto:sage [03/11/25 14:52] procedure ketaketa(e : extended); begin ShowMessage(FloatToStr(e * power(2, Ceil((30 - 1 - log10(e)) / log10(2))))); end;
791 名前:デフォルトの名無しさん mailto:sage [03/11/25 15:14] procedure ketaketa(e : extended); begin ShowMessage(FloatToStr(e * power(2, Ceil((30-1)*log2(10) - log2(e))))); end;
792 名前:デフォルトの名無しさん mailto:sage [03/11/25 16:28] function keta(e : Extended): Integer; var n : Integer; begin n := 1; while e >= 10 do begin n := n + 1; e := e / 10; end; keta := n; end; procedure ketaketa(e : extended); begin while keta(e) < 30 do e := e * 2; ShowMessage(FloatToStr(e)); end;
793 名前:デフォルトの名無しさん mailto:sage [03/11/25 23:30] >>787-792 extendedって30桁まであるのか?
794 名前:782 mailto:sage [03/11/26 03:27] いろいろカキコ有難うございます。今日の授業で>>782 を以下の.........の部分を埋めて作れと言われました。 program enshu(input,output); const K=30; var i,j,m,v, :integer n :array[1..K]of integer; begin write('出発の値は?'); readln(m); if m >0 then begin ............. while m<>0 do begin ............. end; J:=J+1; ・・。
795 名前:782 mailto:age [03/11/26 03:28] while j > 1 do begin for i:=K downto J do n[i]:= 2*n[i]; for i:=K downto J do begin ............... end; if n[i-1]<>0 then j:=j-1 end; for i:=1 1 to K do write(chr(n[i]+Ord('0'))); writeln end; readln end. スマソ全然わかんないです・
796 名前:デフォルトの名無しさん mailto:sage [03/11/26 09:14] program enshu(input,output); const K= 30; var i,j,m : integer; {var i,j,m,v, : integer} n : array[1..K]of integer; begin write('出発の値は?'); readln(m); if m >0 then begin j := K; while m<>0 do begin n[j] := m mod 10; m := m div 10; j := j - 1; end; J:=J+1;
797 名前:デフォルトの名無しさん mailto:sage [03/11/26 09:15] while j > 1 do begin for i:=K downto J do n[i]:= 2*n[i]; for i:=K downto J do begin n[i-1] := n[i-1] + n[i] div 10; n[i] := n[i] mod 10; end; if n[j-1]<>0 then j:=j-1 { if n[i-1]<>0 then j:=j-1 } end; for i:= 1 to K do { for i:=1 1 to K do } write(chr(n[i]+Ord('0'))); writeln end; readln end.
798 名前:デフォルトの名無しさん mailto:sage [03/11/26 18:12] do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=8 前にあったブラックジャックを作ってみた。 つくりかけだけど。
799 名前:デフォルトの名無しさん [03/11/27 20:00] お願いします。 「・・・」の部分を埋めて作るように言われましたが、全然・・・。 氏名(全角7文字)、数学、英語の得点(100点満点)からなる個人データが保存されているファイルからデータを入力してそれぞれの合計点を計算し、合計点の大きい順に整列して表示するプログラムを作りなさい。 実行例 得点データを合計点順に整列します データファイル名は? SEISEKI.DAT 氏 名 数学 英語 合計 あああああああ 100 59 159 いいいいいいい 80 80 160 ・・・ program seiretu(input,output); const nmax=100; type index=1..nmax; Person=record name:string[14] math,eng:0..100; total:0..200; end;
800 名前:799 [03/11/27 20:01] 続きです Personarray=array[index] of person; procedure sort(n:index;var x:personarray); procedure exchangeperson(var A,B:person); var temp:person; begin ・・・ end; var i,j:index; begin for i:=1 to N-1 do for j:=N-1 downto 1 do ・・・ end; var num:o..nmax; i:index; Student:personarray; Infile:text; Filename:string[80]; begin ・・・ end.
801 名前:デフォルトの名無しさん mailto:sage [03/11/27 20:25] あのー、少しは自分でやった方がいいと思うよ? せめて、自分が考えたものを書くとかしたほうが。
802 名前:デフォルトの名無しさん mailto:sage [03/11/27 22:18] コンパイル通しただけだから、バグ取りは自分で program seiretu(input,output); const nmax = 100; type index = 1..nmax; Person = record name : string[14]; math,eng : 0..100; total : 0..200; end; Personarray = array[index] of person; procedure sort(n : index; var x:personarray); procedure exchangeperson(var A,B : person); var temp : person; begin temp := A; A := B; B := temp; end; var i,j: index; begin for i:=1 to N-1 do for j:=N-1 downto i do if x[j+1].total < x[j].total then exchangeperson(x[j+1], x[j]); end;
803 名前:デフォルトの名無しさん mailto:sage [03/11/27 22:19] var num : 0..nmax; i : index; Student : personarray; Infile : text; Filename : string[80]; begin Write('データファイル名は?'); Readln(Filename); i := 1; Assign(Infile, Filename); while not eof(Infile) do begin Readln(Infile, Student[i].name, Student[i].math, Student[i].eng); i := i + 1; end; num := i - 1; sort(num, Student); for i := 1 to num do Writeln(Student[i].name, Student[i].math, Student[i].eng, Student[i].total); end.
804 名前:782 mailto:sage [03/11/28 11:52] >>796-797 ありがとうございます
805 名前:デフォルトの名無しさん mailto:sage [03/11/28 19:49] >>801 うん、私もそう思う。課題をそのまま丸写ししたのは、無視するか どこが分からないか聞き直すのが良いと思う。
806 名前:801 mailto:sage [03/11/28 23:22] >>805 無視は冷酷なんで。ヒントくらいかな、最初は。
807 名前:デフォルトの名無しさん mailto:sage [03/11/29 09:35] THINK Pascalに詳しい方がおられるようなので、 ちょっとスレ違いだけど、質問。 THINK Pascalで、「アプリケーションはそのままで、 ライブラリで機能拡張するもの」は作れますか? 具体的には、「HyperCardとXCMD/XFCN」や 「フォトショップとプラグイン」 「MacOSと機能拡張やコントロールパネル」 みたいな関係のもの。 できるとしたら、大雑把に言って、どうやるんですか?
808 名前:デフォルトの名無しさん mailto:sage [03/12/01 17:08] >>805 いや、別に何も考えずに教えてくださいといってるわけではないんですよ。 クラスみんなですごく悩みながらやってて、どうしても分からん問題だけ聞いてるんです。 ただ、これからは途中のわかるとこまで書き込むように心がけます。 これは言い訳なんですけど、授業では何もパスカルのこと教えないのにやたら難しい問題ばかり出す先生なので・・・
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] 夏とともに、さよなら・・・。