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
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:デフォルトの名無しさん
03/12/02 23:03
>>808
どうしても分からん問題だけ聞くのは良いんだけど、こっちは
どうしても分からなん問題かどうかなんて判断付かないし、問
題だけ書かれたら「ただ丸投げしている」と思われても仕方が
ないだろう。
あと、「分かるところまで書き込む」んじゃなくて、「分からない
ところだけ抜き出す」事をしてくれ。元の問題も分からず、ここ
まで分かりましたと書かれても答えようがないし、問題と分かっ
たところを書かれると「こっちが分からないところを探し出す作
業」をしなければならん。
分からないところを抜き出す作業が面倒と言うことはないと思
うが、「分からないところを抜き出す作業をミス」したり、間違っ
て解釈したりするかもしれん。それでお互い時間と数レスを費
やすかもしれないと思うと面倒くさい。
812:デフォルトの名無しさん
03/12/02 23:26
10進法で表現された数を
2進法、8進法、16進法の表現に変換するプログラムを書いてください。
ただし、入力する10進法の数は(16^4)-1=65535までです。
また、実際の実行例もお願いします。
813:デフォルトの名無しさん
03/12/03 00:15
IntToHex
といって見るだけ
814:デフォルトの名無しさん
03/12/03 01:06
>>812
**進法というのは分かっているのか? 分かっているとしたら
どこが分からないんだ? 分からないところだけを聞き直して
くれ。
あと、実行例くらい自分で実行して作ってもいいだろ。おん
ぶにだっこじゃ身につかんぞ。
815:807
03/12/03 08:39
>>809,810
いろいろ試していただいたようで、ありがとうございます。
ハンドルを関数型で確保するのが無理、って事ですね。
仕方ないですね。型にうるさいのは仕様ですから。
型を指定しないで、普通のハンドルなりポインターで確保
して、いきなりそのアドレスをinlineでコールしたら・・・
って思ったけど、それだと変数の受け渡しが出来ませんね。
816:デフォルトの名無しさん
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:デフォルトの名無しさん
03/12/03 15:25
>実際の実行例もお願いします。
萎え
819:デフォルトの名無しさん
03/12/03 18:13
>>812
またおまえか
820:809
03/12/03 18:39
>>815 (807)
できました!
最初、引数・返り値を同じにしたダミーの関数を作って
その関数を実行時に機械語の絶対ジャンプで上書きするというのをやってみたんですが
デバッガ(Lights Bug)で追うと、きちんと上書きされているにも関わらず
平然と元の関数を実行してるんですね。(失敗)
で、動作をMacs Bugで追ってみたところ、
どうやら関数のアドレスを取得すると
ジャンプテーブルのアドレスが帰ってくるみたいです。
で、普通に関数コールするとジャンプテーブルをショートカットして
元の関数がダイレクトに呼び出されているようです。
そこで関数を引数にした手続きを別に作成し、
そこから関数を呼び出してみたところ、
うまいこと、プラグインの関数が呼び出されました。
[通常の関数コール]→[目的の関数]
[関数、手続きを引数とした関数コール]→[ジャンプテーブル]→[目的の関数]
なお、inline関数の場合、関数のアドレス取得自体が出来ませんでした。(コンパイル時にエラー)
どこかにひとつ、その関数が作られるわけではなく
コードの随所にそのバイト列が単純に埋め込まれるようになっているからだろうと思います。
821:809
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:デフォルトの名無しさん
03/12/03 21:17
>>820,821
なんと!!できましたか!!すばらしい。小生の
知識不足からまだ理解も、再現も出来ていませんが、
希望が持てました。がんばってみます。
823:812
03/12/03 23:29
>>817
ありがとうございました。
実行例もお願いします。
824:デフォルトの名無しさん
03/12/03 23:39
>>823
自分の所で実行してみなよ。
それが実行例。
825:807,815,822
03/12/04 13:10
>>809,810
>>820,821
動きました。
Plugin_Callerを書き換えて変数を渡せるように
しても、ちゃんと動きました。
ありがとうございました。
826:812
03/12/04 18:26
>>817
のプログラムの意味解説をお願いします。
827:デフォルトの名無しさん
03/12/04 18:39
>>826
お前やる気あんの?
全部分からない訳じゃないだろ?
分からないとこを聞けよ。
漠然とした要求をするな
828:デフォルトの名無しさん
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:デフォルトの名無しさん
03/12/04 19:11
>>826
解説するまでもない明解なプログラムだぞ。>817は。
830:デフォルトの名無しさん
03/12/04 19:12
>>826
意味って>>812のことじゃないの?
831:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/12/04 22:08
>>835
Pascalの教科書を図書館で借りて読め。「分からないから
教えてくれ」というのは先生にしか言っちゃいけない言葉だぞ。
837:デフォルトの名無しさん
03/12/04 22:22
>>835
URLリンク(directory.google.com)
838:817
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:デフォルトの名無しさん
03/12/04 22:44
>817さんが親切に>838のような解説を書いても、
>812にはさっぱり意味不明だろう。
pascalの教科書を探して読んで来ない限り、
どこまでいっても全く無駄。
教科書じゃなくても、pascalの初歩のページでも
せめて探して読んできなよ。
840:デフォルトの名無しさん
03/12/04 22:49
たとえば
URLリンク(grape.c.u-tokyo.ac.jp)
841:805
03/12/04 23:30
やっぱり「何も考えずに教えてください」って言っているのと
変わらんな。やっぱり無視した方が良いかも。>>801
842:809
03/12/05 01:03
>825
あ、できましたか。よかったですね。
843:デフォルトの名無しさん
03/12/05 01:20
6ケタの数を入力し、N個右にずらす(たとえばN=2だとすると123456を
を561234)にするにはどのようなプログラムにすればいいですか?
844:デフォルトの名無しさん
03/12/05 01:40
x := x div 10 + (x mod 10) * 100000 をN回繰り返せばいーんでないの
845:デフォルトの名無しさん
03/12/05 04:00
こいつ、課題を全部ここで訊いて済まそうとしているのか?
そんなやつに答える事はないと思うけど。>>ALL
846:デフォルトの名無しさん
03/12/05 10:43
10のN乗を使ってもいいね。
847:デフォルトの名無しさん
03/12/05 10:56
10のn乗だと、桁、大丈夫?
848:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/12/05 20:03
ひょっとして、質問してる>812は
自分の実行環境を持ってないのか?
851:デフォルトの名無しさん
03/12/05 20:40
winならDelphi
DOSならturbo pascal
macならTHINK Pascal
debianならgpc
linuxならKylix
ぜ~んぶ無料
852:デフォルトの名無しさん
03/12/05 20:48
空いてる時間は大学のコンピュータにかじりついてでも
コードを書いてコンパイルしてとにかく試せ。
処理系が見つからなくてCへのコンバータ使ってたころもあったなあ。
853:デフォルトの名無しさん
03/12/05 23:19
Pascal入門
URLリンク(www.ics.kagoshima-u.ac.jp)
854:デフォルトの名無しさん
03/12/12 00:28
ほしゅすしゅしゅ(´・ω・`)ショボーン
855:デフォルトの名無しさん
03/12/12 01:48
では、保守ついでに、またもTHINK Pascalの質問。
コードリソースからToolBoxのルーチンを使うには、
コードリソースのプロジェクトに何を入れれば良い?
856:デフォルトの名無しさん
03/12/13 01:05
>>855
・Runtime.libを外してかわりにRSRCRuntime.Libを入れる。
・Interface.libはそのまま。
857:856
03/12/13 01:26
↑はコードリソースを作る時の一般的な手順なんだけど
これでダメって事?
858:デフォルトの名無しさん
03/12/13 07:56
>>856,857
アプリしか作った事が無いので、
その一般的な手順を知らなかった・・・(^^;
あとで試してみます。ありがとう。
859:デフォルトの名無しさん
03/12/23 02:12
ある手続きで、newでメモリーを確保しながら不定の個数の
データを生成するとする。
type
myPtr = ^myList;
myList = record
next: myPtr;
Word: string[255];
end;
のようなリスト形式だから、順番にデータを読みだせる。
disposeも順番にできる。
この手続きをライブラリ化したとして、
disposeをライブラリ外のメインルーチン側に任せるのは
お行儀としてはいかがでしょう? あぶない?
ライブラリに、読み出しやdisposeのルーチンを含める
べきでしょうか?
860:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
04/01/08 22:27
配列かな。
右へ移動する分を蓄えるのと左の分を蓄えるのと用意して計算する。
Pascalで動的確保はどうやるか知らない。
865:デフォルトの名無しさん
04/01/09 02:14
宿題は自分でやりましょう
866:デフォルトの名無しさん
04/01/09 03:00
よくやるのが、値とポインタをセットにした構造体を定義して、
newでメモリーを確保しながら、つないで行く事かな。
これなら、メモリーの許す限り、いくつ増えても大丈夫。
あ、でも、標準のpascalだと、メモリー確保できたかどうかは
検出できないんだっけ。
ただ、最大何個か決まってるなら、配列でそれだけの数を
確保しちゃってある方が、プログラムは簡単だわな。
867:863
04/01/09 09:24
>>864,865,866
アドバイスをどうもありがとうございました。
配列を用いてといているのですが、
『右へ移動する分を蓄えるのと左の分を蓄えるのと用意して計算』
という部分がどう記述していいのかよくわからないのです。
右から戻ってくる値はdowntoを用いて計算すればいいのでしょうか?
また、蓄えた値を足したり引いたりして解を求めるということは
ABC…といった場所の値が常に変化してしまうので
変化した値を常に用いて左右に移動する値を求める
という部分の記述がどうにもわかりません。
どうか御教授の程よろしくお願いします。
868:デフォルトの名無しさん
04/01/09 09:49
自分なりに、出来ているコードを提示してはどうですか?
コードが出てくればどの程度の知識があるのかも予測できるし。
869:デフォルトの名無しさん
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:デフォルトの名無しさん
04/01/09 21:14
>>869
わざわざ二次元配列にするより、一次元配列を2つ作った方が
分かりやすいと思うんだけど。
871:デフォルトの名無しさん
04/01/09 21:38
配列を2つ作る必要ってあるのか?
872:デフォルトの名無しさん
04/01/09 21:50
>>871
私に言わせると「わざわざ二次元配列にする必要ってあるのか」
になるんだけど。
値を保存する配列と計算用の配列は分けた方が分かりやすいと
思うんだけど。
873:デフォルトの名無しさん
04/01/09 22:36
ああ。出題の意味を取り違えていた。
配列は2ついるね。失礼。
2次元配列は意味ないね。確かに。
874:デフォルトの名無しさん
04/01/10 02:56
>>867
問題をもう少し整理してくれ。
1. 移動率は場所によって変わるのか? >>861だとA->Bは30%、B->Cは10%になっている。
2. >>863で左右に移動する場合、上記1と左右の移動率の関わりは?
3. 左右端の処理はどうするのか?
あと、移動率は定数か変数のどちらかもはっきりしないし。
ここいらへんがちゃんと定義されていないと、プログラムを書こうにも書けないぞ。
875:861,863,867
04/01/10 09:41
皆様色々とアドバイスをありがとうございます。
>>874
そうでしたすみませんでした。
1は
移動率は場所によって変動です。
2は
移動率なんですが右方向へは(n/50)、左方向へは(n/100)といったようにN番目の場所により移動率が変化。
3は
左端は右隣に移動と右隣からの移動、右端は左隣からの移動と左隣への移動です。
移動率は変数です。
876:デフォルトの名無しさん
04/01/10 09:48
宿題の設問、そのまま書いてくれたほうがわかりやすいんだけどなぁ
877:875
04/01/10 10:12
下のような状態遷移図が書いてあって
→ → → →
① ② ③ ・・・ ⑩
← ← ← ←
①に適当な値を与えると
まず①から②に移動、次に①から②に、②から③に、②から①に、その次は・・・
といった様に数値が移動していく。
また、移動率は右方向には(n/50)、左方向には(n/100)というように、位置Nの値を
用いて設定する。
これにより、各場所での定常値を求めるプログラムを作成しなさい。
というようなことが書いてあります。
878:デフォルトの名無しさん
04/01/10 11:32
ほんとに宿題だったか....
右が n/50, 左が n/100 だと足して1になりませんが、ここはホントはなんてかいてあった?
879:デフォルトの名無しさん
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:デフォルトの名無しさん
04/01/10 18:57
>>877
「移動率は位置Nの値を用いて設定する」ってのがよく分からない
なぁ。Nは何を表していて、その場所との関係はどうなっているの
かをはっきりさせないとプログラムは組めないと思うんだけど。あと
「右方向には(n/50)」のnって何を表しているの?
あと、数値は実数にするのか? それとも整数で良いのか? もし整
数なら除算の余り部分の処理はどうするのかが問題ですね。
881:877
04/01/10 22:18
>>878,879,880
アドバイスをどうもありがとうございました
>>880
説明が足らず申し訳ありませんでした。
NというのはN番目ということです。
図の①~⑩のことです。
「右方向には(n/50)」、「右方向には(n/100)」のnはNと同じです。
①から②に移動する時は(1/50)、②から③に移動する時は(2/50)、・・・
⑨から⑩に移動する時は(9/50)ということです。
数値は実数です。
882:デフォルトの名無しさん
04/01/10 23:51
>>881
なんだ算出可能なら簡単じゃん。私は場所によって特定値
(左右別)になるのかと思って「場所別、左右別の配列」を
用意しなければならないかと思っていました。
で、ここまではっきりすれば簡単に組めるのでは。日本語ア
ルゴリズムだとこんな感じ。
{ 事前に元量配列に量をセットしておく}
for 遷移回数ループ do begin
計算配列を0クリア
for 最初の要素から最後の要素まで do begin
左右の漏れ率計算
左右の漏れ量、残り量計算
計算配列に漏れ量と残り量を加える
end;
元量配列に計算配列を代入
{途中結果の出力(遷移回数,元量配列)}
end;
{最終結果出力(元量配列)}
移動する個数を可変にする場合は、配列宣言を大きくセット
しておいてその一部だけを使うとか、動的配列を使う(処理
系が許せば)などの方法があります。
注意点は最初の要素と最後の要素は片方にしか漏れ出さ
ないことです。あとは自分で組めるでしょ。
883:881
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
04/01/12 09:18
上のプログラムを1000回繰り返したときと2000回繰り返したときに
得られた値に変化が見られないのですがなぜなのでしょうか?
また、左右に移動する確率をrandomを用いて得ようと思い
簡単なプログラムでどのような乱数が返ってくるのかを
試したところ毎回同じ値しか帰ってこないのはなぜなのでしょうか?
885:デフォルトの名無しさん
04/01/12 09:52
それが定常値
886:883
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:デフォルトの名無しさん
04/01/12 10:30
Randomと一緒にRandomizeを説明してない教科書は窓からポイ
888:883
04/01/12 10:45
窓から ・⌒ヾ(*´_`)ポイしてきました
ありがとうございました
889:883
04/01/12 12:33
883で書いたプログラムは
待ち行列と考えると
右に移動していく値は人の到着の確率
左に移動していく値はサービスをうけ列を離れていく確率
になるのではないかと思うのですがどうでしょうか?
890:883
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
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:デフォルトの名無しさん
04/01/12 22:48
まず数式読みづらい
あと0からってのがおかしいと思うが
0の階乗なんてないし
0で割ったらダメでしょ
括弧の結びどころがみにくい
Σ(A^X / X!)
こう解釈していいか?
Σの上下につく数字も明示してくれ
下手っぴでずれてもいいからさ
X=1からNまでってところか?
894:883
04/01/12 22:55
>>893
その解釈で大丈夫です。
Xは1からNまででした。
見にくい上にわかりにくくてすみませんでした
895:883
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:デフォルトの名無しさん
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
04/01/13 09:54
問題は
(A^N/N!)/(Σ((A^X)/X!)) Xは1からNまでで
やっぱりX=0の時も値を求める必要があるみたいなので
1を加えてみたのですが、どうでしょうか?
898:デフォルトの名無しさん
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:デフォルトの名無しさん
04/01/18 11:40
for i:=Low(array1) to High(array1) do
array2[i] := array1[High(array1) - i];
903:デフォルトの名無しさん
04/01/18 11:47
>>902
ありがとうございました
904:デフォルトの名無しさん
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歳
04/01/18 13:10
until r=10;
これを
until r=100;
とやってみなさい
907:デフォルトの名無しさん
04/01/18 13:14
>>906
ありがとうございました。
908:レイホウ@6歳
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:デフォルトの名無しさん
04/01/20 22:20
>>909
1) 配列は本当に実数型ですか?
2) 初期化していますか?
3) 小さな値(2!、3! など)でもそうなりますか?
911:デフォルトの名無しさん
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:デフォルトの名無しさん
04/01/21 09:14
Type がミスマッチしてるんねん。
LONGINT を期待してはるのに S64REAL 型の変数がやってきたんや。
914:デフォルトの名無しさん
04/01/21 09:17
そんなときはキャスト、キャスト。
コンパイルエラーが出なくなるまでキャストし続ける。
何でもいいからよさそうな型でキャスト。
912 のコードなら
hako[ byte(c) ]:=b;
でどうだろう。
915:デフォルトの名無しさん
04/01/21 16:57
Cはカウンタだから整数型でいいんじゃないの?
var
a, b: real;
c, d: integer;
で。
916:デフォルトの名無しさん
04/01/25 11:59
質問です。
指数分布に従う乱数を発生させるにはどうしたらいいですか?
917:デフォルトの名無しさん
04/01/25 14:52
2,4,8,16...
ってことか?
いや、分布だから大きい数がめっちゃ出やすいってことか?
918:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/05 11:42
使っている処理系の名前は?
array[1..100] of string;
って定義は可能?
921:デフォルトの名無しさん
04/02/05 11:54
SSH使って大学のにログインしてて、処理系は分かりません。
試しにやってみたら
warning: missing string capacity - assuming 255
と出ましたが、これ出てきても出来ます?
922:デフォルトの名無しさん
04/02/05 12:47
メモリーばか食いしてもいいのなら、
type Str255:string[255]
とか定義して、
array[1..100] of Str255
しちゃえば良いのでは?
(って、昔のマック風みたい)
923:デフォルトの名無しさん
04/02/05 13:23
いざとなれば別のコンパイラを使うことにして、定義はこれでやってみます。
でも今度は、stringで定義した文字列で、アルファベット順に順序を比較していく方法が分かりません。
924:デフォルトの名無しさん
04/02/05 14:00
文字列ではない、たとえば整数の配列のソートは出来ますか?
type
TargetType = array[1..100] of integer;
と定義しているとき、
procedure Sort( var TargetData : TargetType );
という関数を実装出来ますか?
これが出来るなら、文字列ソートも容易でしょう。
925:デフォルトの名無しさん
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:デフォルトの名無しさん
04/02/06 13:56
Ord
929:げんげんげんげん
04/02/08 04:49
分布関数 F(x)=x^n(0<x<1)
をもつ乱数を発生させるプログラム誰か教えてください!!
お願いいたします。
930:デフォルトの名無しさん
04/02/08 13:46
nは定数?
Exp(x * Ln(n));
//n>0のときのみ
931:デフォルトの名無しさん
04/02/08 15:14
それじゃあx^nにならない?
932:デフォルトの名無しさん
04/02/08 15:15
↑は「それじゃあn^xにならない?」の間違い
933:デフォルトの名無しさん
04/02/08 16:32
そうなると思うならxとnを逆にしたらいいんじゃないかとか考えないのか
934:930.931
04/02/08 17:59
>>933
いや、俺は>>929じゃないから。
俺が>>933のように考えたとしても、何の意味もないじゃんか。
名前からしても別人である可能性が高いのに。釣りか?
935:デフォルトの名無しさん
04/02/08 23:29
>>934
なんか番号間違えまくってないか?
936:デフォルトの名無しさん
04/02/09 17:27
>>935
1つも間違ってない
937:930
04/02/09 17:38
930≠931ですが何か?
938:デフォルトの名無しさん
04/02/10 04:25
>>918 の回答じゃだめなのかなぁ?
939:デフォルトの名無しさん
04/03/10 14:34
スレリンク(tech板)
なんか、次スレたってるぞ
940:デフォルトの名無しさん
04/04/27 21:24
Pascal の言語仕様書(のようなもの)はどこかのサイトで閲覧できますか?
Pascal の言語が一通りわかれば良いのですが。
941:デフォルトの名無しさん
04/04/28 00:04
>>940
Pascalって言っても方言から拡張まで何でもありだから、対象の開発環境によってまるっきり違いそうな気がする。
それに言語仕様といっても厳密に書き出すと膨大な量になるから、あまりやっているところはないんじゃないかな。
一通りということなら、入門サイトでも見たらどうかな?
私は本(WirthのPascal本)から入ったのでサイトを紹介することはできないけど。
942:デフォルトの名無しさん
04/04/28 01:13
URLリンク(www.jisc.go.jp)
ここで検索すればJIS標準Pascalの仕様書がPDFで閲覧できるはず。
適当に弄ればPDFのDLもできる。
943:942
04/04/28 01:30
上のURLだと見れんみたい
トップページから「JIS検索」たどってくれ
944:デフォルトの名無しさん
04/04/28 13:51
とりあえずはANS/JISの標準化された古い仕様だけだよね。
その後のオブジェクト指向方面の拡張はAppleのとBorlandので違うもんねぇ。
gpcはBorlandに近いんだっけ?
945:デフォルトの名無しさん
04/04/29 05:02
>>941-944
どうもです。
いま直接関係しているのが Pascal の方言なので、サイトとかを見て回ってみます。
946:デフォルトの名無しさん
04/05/15 21:02
perlのハッシュのようにキーと要素を扱わせることは出来ないでしょうか?
iniファイルのようにキーがたびたび変更される場合を扱いたいのです
947:946
04/05/15 21:07
すいません・・・思いっきり上の方で連想配列の話題がありましたね
忘れてください
948:デフォルトの名無しさん
04/05/15 22:32
>>946
「キーがたびたび変更されるのでそれに対応する」んじゃなくて「キーがたびたび変更されないように(もしくは変更されても簡単に対応できるように)プログラミングする」のが良いと思う。
キーを作るプログラムが他のだと手の出しようもないけど、自分で作るのならデータ構成、プログラミングで対応できそうな気がする。
949:デフォルトの名無しさん
04/06/25 01:20
レベルの低い質問で申し訳ないんですけど
大学の授業で先週からpascalやってるんですけどわけがわからなくなってるんで
家でpascalの勉強をしたいんですけどどうすれば自宅のパソコンで使えるようになるんですか?
OSはウインドウズXPなんですけど。
CDとかで売ってたりするんですか?
>>1のサイトでダウンロードしてもインストールすることができないし
何をどうすれば自宅のパソコンでpascalが使えるようになるんですか?
950:デフォルトの名無しさん
04/06/25 02:49
>>949
大学の授業ってんならgnu-pascal(gpc)当たりが正当かと思うが、
borlandのサイトからdelphiの無償版が落とせる。
またFreePascal(fpc)というのも割りとメジャーだ。
URLリンク(www.freepascal.org)
URLリンク(www.jp.freepascal.org)
951:デフォルトの名無しさん
04/06/25 04:59
>>949
>>950が言う通りだと思うけど、その教授に自習したいから処理系教えれ!って聞くのがいいんじゃなかろうか?
学校のマシンが何かのUnix系の端末でgpcってオチが一番ありそうな気はするけども。
Cygwinあたりを突っ込んで(SFUとかU-WinとかMinGWとかでも構わんかもしれんけど)自力でgpcを入れるとかなのかな?
後、大学生なら
URLリンク(www.pascal-central.com)
あたりとりあえず眺めてみるのもお勉強になるかもね。
って、情報系でもなんでもなくてマジわけわかんね~~~~~!!!とかだとこういう情報過多なサイトは遠慮しとくベキ?
952:デフォルトの名無しさん
04/06/25 08:03
>>949
Bloodshed Software - Dev-Pascal
URLリンク(www.bloodshed.net)
953:949
04/06/27 00:50
>>950-952
レスありがとうございます。
とりあえずFreePascal(fpc)というのを試してみます。
954:大学生
04/07/20 22:04
√cの近似値をニュートン法で求めるプログラムと、
二分法でfor文を使って求めるプログラム、
さらに二分法で求めたものを再帰的手続きにより求めるプログラムを
テストで出されるそうなのですが、まったくわかりません・・。
なんとか助けていただけないでしょうか??
よろしくお願いします!!!
955:デフォルトの名無しさん
04/07/20 23:44
車の運転ができない人に免許をとらせても世の中のためになりません。
以上
956:デフォルトの名無しさん
04/07/21 02:16
筆記試験か。すごいね。穴埋めになるのかな。
957:デフォルトの名無しさん
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:デフォルトの名無しさん
04/07/26 08:07
オレニマカセロ!
とはいうものの、処理系手に入れるまで待ってね。
960:デフォルトの名無しさん
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:デフォルトの名無しさん
04/08/09 10:08
>>962
君の知らない「あそこ」で動いている。
秘主義務があるので具体的な内容は話せない。
964:デフォルトの名無しさん
04/08/09 19:37
URLリンク(matrixengine.jp)
これもPascalみたい。
体験版あるみたいなのでPascal詳しい人試してみて意見聞かせてほしいです。
965:デフォルトの名無しさん
04/08/09 23:36
> 当時は Borland(現 Inprise)の Turbo Pascal が人気のコンパイラでした。私も一時はそればかり使っていま
> した。しかし,世の中は ANSI C に移ろうとしていた頃です。私はまむしさんより一歩先に Turbo Pascal を捨
> てて Turbo C に移行しました。
URLリンク(oku.edu.mie-u.ac.jp)
966:デフォルトの名無しさん
04/08/19 22:39
>>962
私はngraphを現役で使っています。
967:デフォルトの名無しさん
04/08/20 07:21
>>966
研究室のMS-DOS機ですか?
968:966
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:デフォルトの名無しさん
04/08/22 03:50
>>969
あ、Pascalの方の2行目recordと4行目treeの後ろにセミコロン;はありませんでした。
すみません。
971:デフォルトの名無しさん
04/08/22 03:51
あってるよ
972:デフォルトの名無しさん
04/08/22 03:57
ありがとうございます。ここでtree型の変数pのelementの部分にアクセスするためには
Pascalではどう書けばいいのでしょうか?
973:デフォルトの名無しさん
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:デフォルトの名無しさん
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:上とは別人
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:デフォルトの名無しさん
04/08/22 17:08
>>976
ありがとうございました。
@については、ここ数年分見ましたが、同様の問題では全て@node;のような書き方をしていました。
別な方言なんでしょうね。
978:デフォルトの名無しさん
04/08/25 10:56
>>976
PASCALのJIS規格では「@」は「^」の代替表現なので、とりあえず
どっちで書いても同じです。Delphiでは意味が違いますが。
「with p」は規格としては「with p^」でないとまずいでしょう。
もちろん「with p」と書ける処理系は存在するかもしれませんが,
すくなくとも GNU Pascal ではだめでした。
979:デフォルトの名無しさん
04/08/31 03:47
スレさようなら
980:デフォルトの名無しさん
04/08/31 03:51
980!
981:デフォルトの名無しさん
04/08/31 14:51
落ち
982:デフォルトの名無しさん
04/08/31 22:42
夏とともに、さよなら・・・。