03/10/17 19:08
>>667
発想がすごい!
けど、うちの環境(THINK Pascal)だと、
2行目が通らないっす・・・
669:622
03/10/17 20:32
>>668
あ、関数型(手続き型の方が分かりが良いかな)って
標準Pascal仕様じゃなかったんですね。ちなみにDelphi
では通りました。
670:でたらめ
03/10/18 03:13
program MMX;
var
a, b, c: integer;
begin
read(a); read(b); read(c);
writeln('max=', ((((a + b) + abs(a - b)) div 2 + c) + abs(((a + b) + abs(a - b)) div 2 - c)) div 2);
writeln('min=', ((((a + b) - abs(a - b)) div 2 + c) - abs(((a + b) - abs(a - b)) div 2 - c)) div 2);
end.
671:デフォルトの名無しさん
03/10/18 17:14
>>656
読み込んでソートして一番上と一番下を見る
672:662
03/10/21 18:45
>>670
あ、なるほど。2変数のやつをもう一度繰り返せば3変数
に対応出来ますね。私は「一度に3変数に対応出来ない
か」と考えていました。
673:でたらめ
03/10/22 00:22
>>672
でもこれって、>667の
>writeln('min=', fmin(fmin(a, b), c));
>writeln('max=', fmax(fmax(a, b), c));
の派生みたいな物ですよ。
ただ、公式にあてはめただけです。
674:でたらめ
03/10/22 00:25
他にも、
const
maxint = 32767;
minint = -32768;
var
index: array[minint..maxint] of boolean;
を使う方法も考えたけど、
メモリーが足りない(?)とかで
配列が確保できずに断念したっス。
675:662
03/10/25 15:23
>>673
2変数での公式と>>667のやつを組み合わせることを
思いつかなかったんです。思いついてさえいたら、先
に書いていたのに...
676:デフォルトの名無しさん
03/10/31 01:49
質問いいですか?
一クラス分の身長を実数型で入力し、最高と最低を求めるプログラムを作成せよ。
さらに示された入力データでトレース表を書きなさい。
(A)最初に人数を入力し、人数分の処理をする場合(for)
(B)身長に0が入力されたら、終了する場合(while)
実行結果例
人数 制御変数 身長 最高 最低
6 1 178
2 165 165.0
3 197 197.0
4 168
5 175
6 183
こんな問題です。
特に、入力された人数分を変数に入れる方法と、トレース表に出力する方法が分かりません。
677:デフォルトの名無しさん
03/10/31 03:33
>>676
小学校の宿題か?
678:662
03/10/31 05:22
>>676
配列とか知っているか?
それとなんでその問題で「実数型」にする必要があるんだ?
実数型だと比較が難しいぞ。
679:デフォルトの名無しさん
03/10/31 08:01
>>678
問題が実数型で入力せよとなっているので・・・。
配列はあやふやです・・・。
680:でたらめ
03/10/31 08:40
3つの最大・最小の次は、この課題ですか。ふふーん
じゃあ、どうしよっかなー
681:でたらめ
03/10/31 08:44
(A)みたいなのは、BasicだとDIM文とかで
配列を宣言すれば無駄がないけど、Pascal
はできないもんね。
(B)も(A)もそうだけど、人数の最大が決まっ
てるか決まってないかで、全然変わるけど。
その辺は、どうなんだろうね?
682:デフォルトの名無しさん
03/10/31 11:46
がんばって考えてみたけどエラーが出ます。どこを改良すればいいですか?
var i,n,max,min :integer;
sin:array[1..100] of integer;
begin
write('人数は?');
readln(n);
for i:=1 to n do
begin
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
end;
max:=sin[1];
min:=sin[1];
for i:=2 to n do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
end;
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n);
for i:=1 to n do
begin
write(' ',i,' ', sin[i] );
IF sin[i]:=max then
write(' ',sin[i]);
IF sin[i]:=min then
write(' ',sin[i]);
end;
end.
683:でたらめ
03/10/31 17:01
>>682
ほとんどできてるじゃん。
>IF sin[i]:=max then
>write(' ',sin[i]);
>IF sin[i]:=min then
>write(' ',sin[i]);
ここ、「:=」じゃなくて「=」だ。
それと、この次に、
writeln;
の1行を入れる必要がある。
684:662
03/10/31 18:34
>>682
実数型を使っていないけど、いいのか?
それとトレース表の人数のあとに改行が入っているけど
それも問題無し?
685:でたらめ
03/10/31 19:10
>>684
そやな、ごもっとも。(w
でも、例とは違ってもええんちゃう?
それ言い始めると、「最低」の数字の
表示位置がずれてる気がするけど。
686:でたらめ
03/10/31 21:16
ところで。私も詳しく知らないんだが。
実数型って比較が難しいの?
687:662
03/11/01 09:12
>>685
おお、表示位置のずれは気づかなかった。という
ことで、そこも直す必要があるぞ。>>682
>>686
10進と2進の変換誤差(浮動小数点の場合)と計
算誤差があるから、等号比較だと偽になる場合
が考えられる。あと、有効桁数の問題も気にとめ
ておく必要が出る場合もあるし。
まあ、今回みたいに変数に入れた物を代入する
場合なんかは等号比較が出来る場合が多いけ
ど、代入を計算と見なした場合は一度倍精度に
してから単精度に戻すなどの処理が入って値が
変わる可能性があることを頭に入れておいた方
が破綻しづらくなります。
と言うことで私は整数型で実装出来るものは整数
型で実装するようにしています。
688:でたらめ
03/11/01 10:59
>>687
そうか。誤差か。普段そこまでシビアな計算って
したことないんで、気にしなかった。
うちも整数型がほとんどです。
今回の場合、まさか身長で小数点以下2桁以上が
必要になることはないので。入力した数値を
×10して整数型で保存・計算。表示の時に
÷10して実数型(例だと下一桁)っぽく
表示するのではあかんのやろか。
この処理、逆に面倒?誤差が大きくなる?
689:662
03/11/01 11:44
>>688
私もその方が良いと思ったので「実数型にする必要があ
るんだ?」と聞いたんだけど... でも「問題が実数型で入力
せよ」という事らしいから、実数型にする必要があるみた
いですね。
それとも「入力が実数型」を受け付けると言うことだけで
良いのなら内部は整数で扱う方がプログラム的には楽
ですね。
計算することを考えるのなら、小数点以下2桁くらい取っ
ておいた方が安全かも。
690:でたらめ
03/11/01 13:19
実数型で入力し・・・そうか!!やっぱり
入力さえ実数型なら、ええんちゃう?
処理まで実数型とは書いてないもんな。
>>682
考えることは同じやね。うちも最初は小数点以下
2桁と思ったけど、例が下1桁だったので、表示
するときの手間を考えて下1桁って書いてた。
そんなわけで。>682は、課題完了だな。
691:682
03/11/01 23:35
レス有難うございます!!
あとですね、>>676のwhile文のほうがあって身長に0を入力した場合に入力が終わるプログラムなんだけど、
そうすると出力のときに身長に0が出てしまうんですよ。どうすればいいですか?
692:でたらめ
03/11/02 00:30
>>691
forとwhileの基本的な違いではないか。
それを考えるのが課題のポイントじゃ。
693:でたらめ
03/11/02 11:26
for 1~2回
入力 1~2回繰り返し
戻る
repeat
入力 1~2回繰り返し、3回目に0を入力
0以外は戻る
最後の入力は無効
で、ええんちゃうか。
そうすると問題は、のっけから0を入力された
場合のエラーセーフだけど。ま、やってみそ。
694:デフォルトの名無しさん
03/11/02 23:35
if文は使ったらいけないのヵ
begin
一つ目を入力;
while i>0 do begin
出力;
入力;
end;
end.
たぶん不合格。
ん?0を「入力した」場合に「入力が」終わる?
695:でたらめ
03/11/03 00:44
あ。すまぬ。>693は何か勘違いして書いてるかもしれん。
そか。repeatはuntilで、whileは違うか。
ま、気にするな。(w
696:でたらめ
03/11/03 00:51
罪滅ぼしに、ちょっとヒントを。
var next:boolean;
...
next:=true;
while next do
begin
入力
if a=0 then next:=false;
その他のチェック
end;
697:デフォルトの名無しさん
03/11/03 01:44
なんだその変なコード。
698:でたらめ
03/11/03 02:31
>>697
まあ、でたらめっちゅー事で。気にするな。
よかったら、すばらしいサンプルを提示して
やってくだされ。
699:デフォルトの名無しさん
03/11/03 17:26
>>696
while true do で if ~then break すればいいんじゃ?
700:でたらめ
03/11/03 18:13
>>699
前にも似たような話があったけど、
標準Pascalではbreakが使えないのよん。
701:でたらめ
03/11/03 18:13
と、思って>700を書いたが。私の勘違い?
702:デフォルトの名無しさん
03/11/03 19:01
1周目を必ず通すならrepeat使いなよ。
703:でたらめ
03/11/03 19:11
>>702
>676
704:デフォルトの名無しさん
03/11/03 20:04
ちょっくら問題作った奴に山嵐決めてくる。
705:662
03/11/03 23:08
ほんとだ、これは問題を作ったやつがバカ。
repeat - until を使った方が素直に組めるのに。
どうしてもwhileでやらなきゃならないのなら、入力
関数でも作って以下のようにするか...
function 身長入力関数(var 身長) : boolean;
begin 入力処理 end;
while 身長入力関数(身長) do
身長追加処理;
>>701
その通り、breakは無いです。元が教育用言語
だから、抜け道は作らないような構文になって
いるんですよね(caseのelse、otherwiseも無い)。
706:でたらめ
03/11/03 23:15
>>705
「課題」なんだから仕方ないよ。
Cだと、入力しつつ比較が出来るから、
関数を作る必要はないんだよね?確か。
breakが無いのはまだいいけど、
caseのotherwiseも標準にはないの?
これないと辛い。つーか、無理。
THINK Pascalはある。
707:662
03/11/04 00:21
>>706
いや、課題だからこそ変な制約を付けることなく作ら
せるのがよい。まあ、一定の方向に仕向けるためだ
ろうけど、それでプログラミング嫌いになったら教育
の価値無し。
otherwise(Delphiではelse)は無い。と言うかcase
を使う時点で出てくる要素は判っているはずだから、
全て列挙しろと言うことでしょう。otherwiseに入れら
れた処理を「あとで分類し直す」なんて事になったら
結構大変だというのは想像が付きそうだけど。
708:676
03/11/04 12:17
こんな強引な感じになりましたが一応例どおり動きました。
Program en9a(input,output);
var i,n :integer;
max,min :real;
sin:array[1..100] of integer;
begin
write('人数は?');
readln(n);
for i:=1 to n do
begin
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
end;
max:=sin[1];
min:=sin[1];
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n);
709:676
03/11/04 12:18
i:=1;
repeat
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
i:=i+1;
until i<>1;
for i:=2 to n do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
end;
end.
710:676 Bのほう
03/11/04 12:19
Program en9b(input,output);
var i,n :integer;
max,min :real;
sin:array[1..100] of integer;
begin
n:=1;
i:=1;
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
while sin[i]<>0 do
begin
i:=i+1;
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
n:=n+1;
end;
max:=sin[1];
min:=sin[1];
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n-1);
711:676 Bのほう2
03/11/04 12:20
i:=1;
repeat
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
i:=i+1;
until i<>1;
for i:=2 to n-1 do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
end;
end.
712:でたらめ
03/11/04 13:11
あのー、sinの宣言を見ていると、
整数型なんですけど・・・
小数入力しても、小数点以下が
切られてない?
(試してないので分からんけど)
713:デフォルトの名無しさん
03/11/04 13:35
sinってのは正弦みたいでやだな。
714:デフォルトの名無しさん
03/11/04 17:40
右シフトさせるプログラムがどーしても
出来ない・・・・
715:デフォルトの名無しさん
03/11/04 18:13
表示位置のずれはまだ直っていないようだが... あと
ちゃんとコンパイルして実行して動くかどうか確認し
て(もしくは不明点が見つかって)からアップしてくれ。
おまえのソースを全てチェックするほど暇じゃないん
だ。そっちのソースを直すより自分で全て書いた方
が早そうだし。
>>714
環境(対象コンパイラ、機種、OS等)の必要情報が
判らないとコメント付けようがないぞ。
716:デフォルトの名無しさん
03/11/05 00:46
>>715
例どうりに動いたと書いてあるよ。
717:デフォルトの名無しさん
03/11/05 09:21
>>715
フリーパスカル CPAD win2K
718:デフォルトの名無しさん
03/11/05 18:37
>>716
とても例どうりに動くとは思えんが、本人がそう言っている
のならそれでいいや。
>>717
確かFreePascalはTurboPascalの構文が使えるんじゃな
かったでしたっけ?それならshrで行けます。下記参考。ち
なみに左シフトはshl。
var
a, b : byte;
begin
a := 8;
b := a shr 1; (* シフトしたいビット数 *)
writeln(a, ' ', b);
end.
719:デフォルトの名無しさん
03/11/05 20:02
>>718
なんか配列使えって
言われちゃったので配列で無理やり作ってみた。
program sifuto(input,uotput);
type
suuji = array[1..10] of char;
var
a : suuji;
x,y,n : integer;
begin
begin
write('10文字入力');
readln(a);
end;
write('いくつずらす?');
readln(x);
for y:= 11-x to 10 do
write(a[y]);
for n:=1 to 10-x do
write(a[n]);
writeln()
end.
720:デフォルトの名無しさん
03/11/05 20:11
今日配列使って作ったもう一個のヤツ
program sinnsuu(input,output);
type
suuji = array[1..4] of integer;
var
a : suuji;
c, ans : integer;
d : integer;
begin
Write('Decimal : ');
Read(d);
c := 0;
while d <> 0 do
begin
c := c + 1;
ans := d mod 2;
d := d div 2;
a[c]:=ans
end;
for c:= 4 downto 1 do
write(a[c]);
writeln()
end.
配列メンドイ
なんか中途半端に理解した。
721:デフォルトの名無しさん
03/11/05 20:20
>>720
0~15の10進数しか変換できない。
722:718
03/11/05 22:26
>>719
俺、配列使えなんて一言も言ってないんだけど。
何か良く分かんない(理解出来ないやり取りの)
所に来てしまったようなので、落ち着くまでしばら
く黙っていることにする。
723:でたらめ
03/11/05 22:53
学校の課題なんでないかい?
配列使え、っていう。
724:718
03/11/05 23:51
>>723
課題は課題で良いんだけど、「他の人に分かって
もらう書き方」ってのがあると思うんだ。特にこうい
う場では。それと「自分で出来るだけ努力する」っ
てのも大事だし。
それをしないでソース垂れ流し(それもちょっと?の)
されるんで、もう私には理解不能。だからこの件
(と思われるもの)には黙ることにしました。
725:でたらめ
03/11/06 01:21
ところで。右シフトって何?
2で割ればいいんじゃないの?
726:デフォルトの名無しさん
03/11/06 21:54
>>725
マイナスの値を右シフトと2で割ることをしてみれば、
違いが分かると思う。それと、算術計算とビット操作
はやっぱり別の話だから。
727:でたらめ
03/11/06 23:03
マイナスか。それは考えなかった。
でも、ビット操作なんてアセンブラでも使わない
限り必要ないんじゃないかと思うけど。
Cならいざしらず、Pacalでは意味ないよねぇ。
課題じゃしょうがないけど。
728:デフォルトの名無しさん
03/11/06 23:16
>>727
だってグラフィックフォーマットとか通信プロトコルなんかで
「ビットで状態を表す」物って結構多いから、ビット操作がで
きないと辛い場合って結構あるよん。
そういう時までアセンブラを持ち出すのはちょっと大仰だと
思う。高級言語でサクサク組めた方が何倍もカンタン。
729:でたらめ
03/11/07 00:00
>>728
そうか。なるほど。
ビット操作はマックならtoolboxにあるので、
THINK Pascalでもコマンド一発。
730:デフォルトの名無しさん
03/11/11 16:54
a<>b<>c みたいなことをやらせるには どうしたらいいのでしょう… 配列を使った課題がT-T
731:デフォルトの名無しさん
03/11/11 19:50
a <> b and a <> c
732:デフォルトの名無しさん
03/11/11 19:59
>>730
a=cでもええのか?
>>731
b=cの可能性はあるな
そういう意味じゃない?
733:デフォルトの名無しさん
03/11/11 20:04
a <> b and a <> c and b <> c
等しくはならんが気休めにどうぞ。
734:デフォルトの名無しさん
03/11/11 22:03
andの方が優先度高い罠
735:デフォルトの名無しさん
03/11/12 02:04
そもそも、>730の課題は何がさせたいのだ?
aとbとcがいずれも異なる値であることを
確認すればいいの?
にしては、配列を使うって・・・意味不明。
736:デフォルトの名無しさん
03/11/12 23:39
>>735
意味を取ろうとするから意味不明。気にしなければOK。
課題を出している方はまともな課題を出していて、ここで
聞いているのの頭が「意味不明」なだけのような気がする
(もしくは本気で訊いていないのか)。今までの経緯から
すると。
意味が通る訊き方をすれば、それなりに答える気になる
のに。
737:デフォルトの名無しさん
03/11/14 16:34
配列を使ったプログラムの途中にa<>b<>cという判定が必要な部分があるとか
738:デフォルトの名無しさん
03/11/15 22:16
すいませんご教授おねがいします。
画面を再構成させる方法は存在するのでしょうか?
存在するのでしたら教えてください。
学校の宿題を作ってるとき、再構成しないと見栄えが悪いもので…
739:デフォルトの名無しさん
03/11/15 23:50
>>738
再構成ってどんなこと? 宿題と言われてもこっちは何も
分かっていないんだと言うことを理解して、詳しく説明し
てくれないと何の手助けも出来ないんだが。課題の内
容をこと細かく説明する必要は無いんだけど、「どんな
ことをやろうとして、どうなってしまったから、こうしたい」
くらいの説明がないと何とも。
あと、コンパイラ依存? それとも汎用? OSに関わりのあ
る(と思われる)場所は無いのかな?
見栄えを求めるとしたらどのレベル? 事によると宿題の
域を大幅に超えるかもしれないので、どれくらいの事を
したいのか分からないと答え辛いかも。
740:デフォルトの名無しさん
03/11/16 00:16
>>738
まるで
「僕のお小遣いで買いに行ける一番美味しいケーキはどれ?」
っていう質問に答えるようなものだな。
741:738
03/11/16 03:27
すいません、プログラミング初心者なので、
質問の仕方すらよくわかってません(/_<。)
delphi6のコンソールで、文字列がずらずらと繰り返えされ
見難くなるので、画面の文字をいったん全部消去する
方法を教えてもらいたいのですが…
正直どう説明すればいいのかすら分かりません(-_-;)
742:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/17 22:40
>>744
残念ながらBorlandのPascal言語系(Delphiだけで
なくTurboPascalから)はPageはサポートしていな
かったりする。
747:744
03/11/17 23:42
そうなんだ。
748:デフォルトの名無しさん
03/11/18 01:51
全く紛らわしいことしやがって。
749:デフォルトの名無しさん
03/11/18 03:17
TurboPascal風のコンソールユニット
URLリンク(www.slis.keio.ac.jp) から
Win32Crt.pas (w32crt03.lzh) を落として、解凍後、Win32Crt.pasを
Libフォルダにコピーする。
古いユニットなので、Delphi6では未定義の識別子 : 'KeyEvent' という
エラーが出るから、KeyEventという文字列を全てEvent.KeyEventに
置き換える。
これで、TurboPascalのCRTユニット風の関数が使えるようになる。
GotoXY, WhereX, WhereYがゼロオリジンなので、互換性を考えれば
ソースをいじったほうがいいかもしれない。
750:749
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:デフォルトの名無しさん
03/11/19 00:00
順番に調べればいいんじゃない。
x := 1;
for i := 0 to n-1 do
if a[i] > a[r] then x := x + 1;
753:デフォルトの名無しさん
03/11/19 00:39
>また、プログラム中に使用する名前の型、属性、意味内容を明示し、
>実際の実行例もお願いします。
それくらいは自分で考えた方が良いぞ。属性ってそもそも何?
754:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/19 11:37
>pascalでは配列を関数には渡せないよね?
いや…渡せるけど
procedure A(B: array[C..D] of Integer); みたいな。
Delphiならprocedure A(B: array of Integer); で範囲はLow/Highで取る。
757:デフォルトの名無しさん
03/11/19 12:46
いや、勘違いだったら失礼。
>>756
そのC..Dが変数でもできたっけ?
>>755
ポインタで渡すのが確実か。確かに。
758:デフォルトの名無しさん
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
03/11/20 07:38
>>758
いや、私が言いたかったのはオープン配列。
規格はよく知らないけど、ものの教科書では
procedure A(B: array[C..D] of Integer);
で、任意の長さの配列を渡せるらしい。C..Dには実引数の添え字範囲が入る、らしい。
(もっとも、対応しているコンパイラは知らないけどね)
追記しているようにTP系(FreePascal/Delphi)では同じ機能はあっても構文が違う。
760:デフォルトの名無しさん
03/11/20 08:44
たぶん、環境に依存しないやり方としては、>758が
正しいと思う。見て、おぼろに思い出した。
だけど、わざわざ型を指定するのって、面倒なんだよね。
761:デフォルトの名無しさん
03/11/20 18:20
>>759
あー、オープン配列は使ったことがなかったので、完全に
忘れていました。書かれて初めて「そういうのがあったっけ
なぁ」という感じ。
私はオープン配列を使うような場面ではTListを使うので使っ
たことがありません。オープン配列を使わなきゃならないよ
うな手続きなんかも書かないし。
762:デフォルトの名無しさん
03/11/20 22:44
Why Pascal is Not My Favorite Programming Language
URLリンク(www.lysator.liu.se)
誰か Why Pascal is My Favorite Programming Language を書いてください。
763:デフォルトの名無しさん
03/11/21 00:07
>>762
いいじゃん、放っておけば。大体用途の違う言語を
比較して「こっちが好きだ」って書いているような人
にろくなのはいないから。
分かっている人は「その言語はそういう用途には向
かない」とか「そういうことを目的として設計された言
語ではない」と書くと思う。
764:デフォルトの名無しさん
03/11/21 11:38
俺はタイプ量が多くなっても
if (hoge)と括弧を書くよりは
if hoge thenと書くほうが好きだ。
好きなところってそこしか思い浮かばなかった。
嫌いなところばっかり浮かんで来る・・・。
765:デフォルトの名無しさん
03/11/21 12:19
部分範囲型、集合型、配列の関係が好きだ…
C系の言語でこれらの概念を持ってるのがサッパリ無いのはどういうことか
766:デフォルトの名無しさん
03/11/21 14:40
ビットで済ましているんだろ。
767:デフォルトの名無しさん
03/11/22 11:26
お願いします
英単語を入力して、そのつづりを逆順にした文字列を作りなさい。
実行例
英単語は? beautiful
逆順にしたつづりは lufituaeb
できそうだと思ったんだけど挫折・・・
768:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/22 17:52
あっ、半分になってるよね。スレ汚しすまん。
772:デフォルトの名無しさん
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:デフォルトの名無しさん
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
03/11/23 23:25
ほぉ。concat関数ですか。知りませんでした。
でも
>function Concat(s1 [, s2,..., sn]: string): string;
>説明
>Concat 関数を使うと,任意の数の文字列を結合できます。各パラメータは文字列型の式です。結果はすべての文字列型パラメータ>の結合です。
>次に示すように,正符号演算子(+)を使っても Concat 関数と同じ結果が得られます。
>S := 'ABC' + 'DEF';
>参考正符号演算子の方が Concat よりも処理が速くなります。
正符号演算子では文字列の加算の「度に」文字列分のメモリの確保と開放が行われてる(と思う)ので
前もってメモリを確保してある>>768のほうが速いと思われます。
(文字列が長くなるに従って差は大きくなると思います。
つまり、
速度を求めるなら>>773氏の方法より>>768のほうがよろしいかと。
実際に試してないんで知らないけど。
添字の計算部分の差で負けたりして(w
775:デフォルトの名無しさん
03/11/24 00:19
>>774
うーん、確かに速度的には遅くなるかもしれないけど、
この関数をそんなに頻繁に使うとは思わないので、な
るべく単純な形の方が分かりやすいような気がする。
あと、以下の形にすると、日本語に対応するのも楽。
function ReverseString(S : string) : string;
var
776:775
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/24 18:09
>>775
単純さを求めるとなると手っ取り早い日本語対応は
function ReverseString(S : widestring) : widestring;
では?(w
>>776
>result := concat(S[i], result);
result := S[i] + result;
むしろこちらのほうが単純(直感的)かと。
ただconcat関数に慣れてないだけかも知れんが…
779:デフォルトの名無しさん
03/11/24 18:34
>ただconcat関数に慣れてないだけかも知れんが…
文字列連結に「+」が使える事にかえって驚く。
resultというのもDelphi独自の規格だよね。
780:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/25 14:16
procedure ketaketa(e : extended);
begin
while log10(e) < 30-1 do
e:=e*2;
ShowMessage(FloatToStr(e));
end;
789:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/25 14:52
procedure ketaketa(e : extended);
begin
ShowMessage(FloatToStr(e * power(2, Ceil((30 - 1 - log10(e)) / log10(2)))));
end;
791:デフォルトの名無しさん
03/11/25 15:14
procedure ketaketa(e : extended);
begin
ShowMessage(FloatToStr(e * power(2, Ceil((30-1)*log2(10) - log2(e)))));
end;
792:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/25 23:30
>>787-792
extendedって30桁まであるのか?
794:782
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
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:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/11/26 18:12
URLリンク(do.sakura.ne.jp)
前にあったブラックジャックを作ってみた。
つくりかけだけど。
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:デフォルトの名無しさん
03/11/27 20:25
あのー、少しは自分でやった方がいいと思うよ?
せめて、自分が考えたものを書くとかしたほうが。
802:デフォルトの名無しさん
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:デフォルトの名無しさん
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
03/11/28 11:52
>>796-797
ありがとうございます
805:デフォルトの名無しさん
03/11/28 19:49
>>801
うん、私もそう思う。課題をそのまま丸写ししたのは、無視するか
どこが分からないか聞き直すのが良いと思う。
806:801
03/11/28 23:22
>>805
無視は冷酷なんで。ヒントくらいかな、最初は。
807:デフォルトの名無しさん
03/11/29 09:35
THINK Pascalに詳しい方がおられるようなので、
ちょっとスレ違いだけど、質問。
THINK Pascalで、「アプリケーションはそのままで、
ライブラリで機能拡張するもの」は作れますか?
具体的には、「HyperCardとXCMD/XFCN」や
「フォトショップとプラグイン」
「MacOSと機能拡張やコントロールパネル」
みたいな関係のもの。
できるとしたら、大雑把に言って、どうやるんですか?
808:デフォルトの名無しさん
03/12/01 17:08
>>805
いや、別に何も考えずに教えてくださいといってるわけではないんですよ。
クラスみんなですごく悩みながらやってて、どうしても分からん問題だけ聞いてるんです。
ただ、これからは途中のわかるとこまで書き込むように心がけます。
これは言い訳なんですけど、授業では何もパスカルのこと教えないのにやたら難しい問題ばかり出す先生なので・・・
809:デフォルトの名無しさん
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
夏とともに、さよなら・・・。