[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 09:01 / Filesize : 272 KB / Number-of Response : 983
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Pascal の初心者用の質問・相談所



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/

554 名前:デフォルトの名無しさん [03/07/03 20:20]
初心者から質問です

10人分の学生の成績データを打ち込み、
次に10点区切りでヒストグラムを出力するプログラムを書こうとしています。
現在ヒストグラムの作り方がちとわかりません。どんな形のヒストグラムでもいいのでプログラムソースを教えてもらえないでしょうか?

555 名前:デフォルトの名無しさん mailto:sage [03/07/03 20:34]
if (点数 => 0) and (点数 < 10) then ヒストグラム[1] := ヒストグラム[1] + 1;
if (点数 => 10) and (点数 < 20) then ヒストグラム[2] := ヒストグラム[2] + 1;
...

と並べて書くとか。

556 名前:デフォルトの名無しさん [03/07/03 20:39]
>>554
学校の課題だろうと思うんで、ここでいきなり答えを書くのはちょっとね。
自分でどこまでやったん?

557 名前:デフォルトの名無しさん mailto:sage [03/07/03 20:43]
PROGRAM Histogram;
VAR
 data: ARRAY[1..5] OF INTEGER;
 i, j: INTEGER;
BEGIN
 data[1] := 0; data[2] := 1; data[3] := 4; data[4] := 2; data[5] := 1;
 FOR i := 1 TO 5 DO
  BEGIN
   Write('Fraction ' + IntToStr(i) + ':');
   FOR j := 1 TO data[i] DO
    Write('*');
   WriteLn;
  END;
END.

558 名前:デフォルトの名無しさん [03/07/03 20:43]
まず、「ヒストグラム」とは何か、わかっているか。
プログラムの流れとしては
(1)データの入力
(2)集計
(3)ヒストグラムの出力
に分かれるわけだが。

559 名前:デフォルトの名無しさん mailto:sage [03/07/03 20:48]
スマソ>556

560 名前:デフォルトの名無しさん mailto:sage [03/07/03 22:42]
集合型はフラグくらいにしか使ったことなかったけど
なかなかエレガントな使い方があるものだね
感心しますた

561 名前:デフォルトの名無しさん [03/07/11 15:43]
学校の課題で『ブラックジャック』作ることになったんですが
どなたか、教えていただけませんか。

562 名前:デフォルトの名無しさん mailto:sage [03/07/11 21:34]
>561
取り敢えず「手塚治虫」で検索しとけ。



563 名前:デフォルトの名無しさん [03/07/12 23:44]
>>561
カードゲームなら実際のカードを使って一人遊びすれば必要な構造が見えてくるぞ。

564 名前:デフォルトの名無しさん [03/07/13 00:06]
一人遊び? ハァハァ

565 名前:名無し@沢村 [03/07/13 00:08]
>>562

取りあえずじゃねーんだよ!!
おまいはタンスとかあってなっとらんぞ!!!

jbbs.shitaraba.com/computer/7294/

566 名前:デフォルトの名無しさん mailto:sage [03/07/13 00:11]
A  U  T  H  O  R   D  A  T  A

本田 守さん

--------------------------------------------------------------------------------

名前
本田 守/ほんだ まもる

ハンドル
Mr.あねさん

ホームページ
www2.neweb.ne.jp/wd/wonder/
hp.vector.co.jp/authors/VA015412/

MESSAGE
プログラムの勉強をはじめて1年とちょっとになります。まだまだ高度なものを作るには程遠いですが、先だっては某社のプログラミングコンテストに入賞させていただきました。

--------------------------------------------------------------------------------

S  O  F  T  W  A  R  E

--------------------------------------------------------------------------------

Windows95/98/Me/アミューズメント
●KIKU おど〜る
 音楽CDをかけるとキャラクターが踊ります

567 名前:デフォルトの名無しさん [03/07/13 03:20]
集合型にシフト演算子があったらなぁ

568 名前:デフォルトの名無しさん mailto:sage [03/07/13 05:41]
それは集合なのか?

569 名前:デフォルトの名無しさん [03/07/13 12:46]
ビットの集合です

570 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [03/07/13 14:37]
>>562
あの漫画の題名はトランプのそれとは無関係だそうです.

…じゃなくて,どうしてプログラミングを教えている学校の先生は
生徒の理解度を無視してこういう課題を出すのか理解に苦しみます.
とりあえず>561はじゃんけんゲームは作れますか?


571 名前:561 mailto:sage [03/07/14 00:38]
>570
もちろん作れません
何かヒントでもいいんでおねがいします。

572 名前:デフォルトの名無しさん [03/07/14 08:12]
>>571
ゲームのルールをよく吟味して場にある有形、無形のものを列挙してみんさい



573 名前:デフォルトの名無しさん mailto:sage [03/07/14 09:00]
カードをとってくる関数と
勝敗を判定する関数と
手に持ったカードを表示する関数と
入力を受け付けてカードをとるか終了するか決める関数を書けばいい。

574 名前:デフォルトの名無しさん [03/07/14 11:30]
データ構造決めなきゃ片手落ち

575 名前:デフォルトの名無しさん [03/07/14 13:50]
綺麗なお姉さんのパイパンおま○こ生写真を発見!
plaza16.mbn.or.jp/~satchel/omanko_marumie/

これはタマラン…(´Д`;)ハァハァ


576 名前:561 mailto:sage [03/07/14 14:05]
>>573
関数が使っている教科書にあまり載ってないんで
何かいいサイトあったら教えてください

577 名前:ななしへたぐらま ◆XcB18Bks.Y mailto:sage [03/07/14 14:46]
>>571
簡単なゲームプログラムを解説したサイトか入門書を見つけてみて.

やりたい処理をプログラムというカタチにするというのは一番基本的な能力であり,
一つや二つのヒントで解決する問題ではありません.
でもこれさえクリアすればプログラミングは半分マスターしたようなものです.


578 名前:デフォルトの名無しさん mailto:sage [03/07/14 16:06]
ルール見たけど結構複雑。ま、そこまで要求してないのかもしれんが。
「無限デック使ってます」って言えばカードの残り考えなくてもすむかも。
(ハートのAが10枚出てきても知らんふり。)

579 名前:山崎 渉 mailto:(^^) [03/07/15 09:45]

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

580 名前:デフォルトの名無しさん mailto:sage [03/07/23 20:52]
良スレ保守

581 名前:デフォルトの名無しさん mailto:age [03/07/24 18:19]
Pascalの集合型と混同してるのかな。このプログラムは集合型は関係ないよ。

582 名前:デフォルトの名無しさん mailto:sage [03/07/25 01:14]
どのプログラム?



583 名前:デフォルトの名無しさん [03/07/27 17:35]
grape.astron.s.u-tokyo.ac.jp/~makino/kougi/jousho/kougi-98Ww/note12.html
ここの練習1なんですが、どのように回答するのがスマートなんでしょうか。
学生番号用のソート手続きをもうひとつ加えて場合分けするのはあまりよくないような気がするんですが、
他に思い浮かばないんです。

584 名前:デフォルトの名無しさん mailto:sage [03/07/27 21:04]
比較用関数を複数作って関数ポインタで切り替えて使う。

585 名前:デフォルトの名無しさん mailto:sage [03/07/27 21:06]
ソート用の手続きをつくる。
引数は点数でソートするか学生番号でソートするかを示す。

「student_record」と「ソートの引数」を引数にとる関数をつくる。
返り値は点数か、学生番号。
この関数をつかってソートをつくる。

あんまり効率よくなさそうだけど。

586 名前:デフォルトの名無しさん mailto:sage [03/07/27 21:45]
function CompareTensu(var S1, S2: student_record): Boolean;
function CompareBango(var S1, S2: student_record): Boolean;
って比較する関数を適当に作って。
var
 Compare: function(var S1, S2: student_record): Boolean;
begin
 if 点数でやるなら then
  Compare:=CompareTensu
 else
  Compare:=CompareBango;
 あとはCompareで比較してソートで良いと思うよ。
end;

587 名前:デフォルトの名無しさん [03/07/27 22:45]
iアプリ作りたいんですけどどーしてよいか・・
作成講座ページ紹介してください。
あと質問なんですが、これだけでも作れますか?ブロック崩し(505対応版)
win98(HSPダウンロード済み)

588 名前:デフォルトの名無しさん mailto:sage [03/07/27 22:51]
iアプリはi-mode Javaでしょ。
HSPじゃ無理。

DoCoMo Net - 製品・サービス - i-mode - iアプリコンテンツの作成について
www.nttdocomo.co.jp/p_s/imode/java/index.html


589 名前:583 mailto:sage [03/07/27 23:14]
なるほど。ありがとうございます。
>>585>>586の手法は同じではないですよね。
かなり参考になりました。

ですが、585さんの
>ソート用の手続きをつくる。
>引数は点数でソートするか学生番号でソートするかを示す。
これを具体的にどうしたらよいのかぜんぜんわからないんです・・・
例題だと、
if student[i].score < student[j].score then begin
で点数で比較してますよね。
これを点数だけではなく番号でも比較できるにするためにはどうしたらいいのでしょうか。





590 名前:デフォルトの名無しさん mailto:sage [03/07/27 23:29]
procedure sort(x: ...);
...
if hoge(student[i], x) < hoge(student[j], x) then begin
って書いて、hogeも書く。

591 名前:デフォルトの名無しさん mailto:sage [03/07/27 23:40]
>>589
比較部分を関数にするだけだって
function CompareTensu(var S1, S2: student_record): Boolean;
begin
CompareTensu:=(S1.score < S2.score);
end;
function CompareBango(var S1, S2: student_record): Boolean;
begin
CompareBango:=(S1.id < S2.id);
end;

>>586のようにCompareTensuとCompareBangoのどっちか使いたい方をCompare変数に入れる。
どっちの比較方法を使うかはコマンドラインオプションで切り替えたりすると良い。
例えば
Compare:=CompareTensu;
for I:=1 to ParamCount do
begin
if ParamStr(I)='/b' then
begin
Compare:=CompareBango;
Break;
end;
end;
でコマンドラインに/bを付ければCompareが番号で比較、付けなければ点数で比較になる。
あとは
if Compare(student[i], student[j]) thenに変えて終わり。

Delphiで動作確認済み

592 名前:デフォルトの名無しさん mailto:sage [03/07/27 23:55]
if (x = Tensu and student[i].score < student[j].score) or
(x = Bango and student[i].id < student[j].id) then begin
ってベタに書いてもいいし。

条件式を関数にまとめて
if x = Tensu then Result := student[i].score < student[j].score
else if x = Bango then Result := student[i].id < student[j].id
else Result := false;
とか。(case文忘れてしまったよ)



593 名前:デフォルトの名無しさん mailto:sage [03/07/28 00:35]
なるほどなるほど。
かなりよくわかりました!

ここは本当にすごい人が来るんですね。
驚きました。

594 名前:デフォルトの名無しさん mailto:sage [03/07/28 00:47]
すごくはないよ。基本的なことだし。

動的な関数を作りたいなと思って
Pascalの上で実現してしまったとかならすごいと思うけど。

595 名前:デフォルトの名無しさん mailto:sage [03/07/30 12:17]
Lazarusの落とし方知ってるひといますか?

596 名前:デフォルトの名無しさん mailto:sage [03/07/30 14:39]
「ハノイの塔」とやらの問題解決プログラムを教えて下さい。
本気で何がなにやら・・・。

597 名前:デフォルトの名無しさん mailto:sage [03/07/31 10:50]
procedure Hanoi(n: interger; from, to, via: hoge);
begin
if n = 1 then
.... from から to へ一枚写す
else begin
hanoi(n-1, from, via, to);
hanoi(1, from, to, via);
hanoi(n-1, via, to, from);
end
end;

598 名前:596 mailto:sage [03/07/31 21:32]
どうもありがとうございます。
なんだかエラーが沢山出るんですけど、貼り付けるだけじゃ駄目なのでしょうか。。。
厨ですみません。

599 名前:デフォルトの名無しさん mailto:sage [03/07/31 22:51]
hogeと
.... from から to へ一枚写す
のところをきちんとかかないとダメ。

hogeを文字列にして
移動を表示するようにするとか。
writeln(from + 'から' + to + 'へ移動');

Pascalの細かいところ忘れたんで正しいかどうか解らないけど。
再帰するにはforwardとか要るような気もするな。

600 名前:山崎 渉 mailto:(^^)sage [03/08/02 02:15]
(^^)

601 名前:山崎 渉 mailto:(^^) [03/08/15 16:21]
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

602 名前:デフォルトの名無しさん [03/08/18 22:47]
たまにはageて質問を。

標準的なpascalで、basicでいう
cls;
locate(10,10);
print "OK?";
みたいなのは出来ますか?




603 名前:デフォルトの名無しさん [03/08/18 23:26]
 page(output);10個のwriteln(output);10個のwrite(output,' ');
っていうのは後戻りできない上に上書きしてしまうから無理だな。
cursesみたいに1画面分の2次元配列を取ろうかともおもたけど、画面の大きさを取る方法はJIS-PASCALにはない。
処理系依存の機能を仮定しないと無理っぽい。

604 名前:デフォルトの名無しさん mailto:sage [03/08/19 00:00]
無理ですか。
あ、そっか。画面の大きさが分からないから、
1ページ分書き直してスクロールアップ
するのも無理だ。うーむ。


605 名前:デフォルトの名無しさん mailto:sage [03/08/19 08:47]
プログラムパラメタに画面の大きさを渡してもらえばいいんだった。
program curses(input, output, ScreenWidth, ScreenHeight);
 var
  ScreenWidth: integer;
  ScreenHeight: integer;
  Screen: packed array[1..256, 1..256] of char; {こんだけあったら大抵間に合うでしょ}
 procedure cls;
 procedure locate(x: integer; y: integer);
 procedure print(packed array[u..v] of char);
 procedure reprint;
ってどう?

606 名前:デフォルトの名無しさん mailto:sage [03/08/19 12:55]
そういう手もあるか。
でも、画面の大きさを取得するのに、処理系毎の
工夫が必要。つーか、無理な場合もありそうな予感。

それよりも、独自に拡張して、cls, locateなどを
処理系毎に作るのが良いような気がしてきた。
・・・でも、それやってると、キリがないし、
実力の範囲を超えそうです。


607 名前:デフォルトの名無しさん mailto:sage [03/08/19 21:10]
画面制御ライブラリを1つだけ用意する。
実体は各処理系に移植されたC言語のcursesライブラリを呼び出すだけ。
外部ライブラリの実装方法に規格上、規定はないのでやりたい放題。
cursesが移植されていない処理系はライブラリの仕様を公開してユーザーに任す。
というのは駄目?


608 名前:デフォルトの名無しさん mailto:sage [03/08/22 00:10]
標準的なPascalの文字変数ってstring[255]ですよね?
で、var s:string[255]; という状態で、
1行ずつreadln(f,s); で読んでいくとして。
もしも1行の長さが255バイト以上だったら、
どうなるんでしょう。

アホな質問ですみません。


609 名前:デフォルトの名無しさん mailto:sage [03/08/23 00:26]
後ろの方がカットされます。

610 名前:デフォルトの名無しさん mailto:sage [03/08/23 05:32]
1行が255バイト以上の行を含むテキストファイルの読み込みは、
どうしたら良いのでしょう?


611 名前:デフォルトの名無しさん mailto:sage [03/08/23 05:53]
DelphiでもFreePascalでも、大抵は長い文字列を持ってるんじゃないかな…。
無いならChar単位で読むとか。

612 名前:デフォルトの名無しさん mailto:sage [03/08/23 09:49]
初心者質問ですいません。
Dev-pascalはどうやってアンインストールするのでしょうか?
リードミーに載ってないんですが・・・。



613 名前:デフォルトの名無しさん [03/08/23 10:28]
>>610

var
 f: text;
 s: string[255];
begin
 while not eoln(f) do
  read(f, s);
 readln(f);
end

614 名前:610 mailto:sage [03/08/23 22:26]
>>611
Delphiの無限とも言える長さの文字列は、
便利で良いですねぇ。しかも、CommaTextで
自動的にCSVを切り分けてくれるし。(日本語対応で)

でも、今はちょっと長い文字列は無理みたい。

というか、やりたいのはCSVの読み込みなんですけど、
ひょっとしたら1行を一度に読み込むんじゃなくて、
1文字ずつ分析して、項目を切り分けながら
読み込む方が良いのかな?

ひょっとして、アルゴリズムって、公開されてる?


615 名前: ◆R/rLuLKeEI [03/08/27 02:02]
>>614
>ひょっとして、アルゴリズムって、公開されてる?

理論的には有限オートマトン、正規表現、字句解析、構文解析などを検索すれば、いいんじゃないかな。
CSV形式をうまく構文(文法)に書き下す事が出来れば、ある程度形式的にプログラムに落す方法があるよ。

616 名前:デフォルトの名無しさん mailto:sage [03/08/27 02:10]
>>614
C#のでよければ。なんとなくは分かると思うよ。
onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5BTips%2FCVS%A4%F2%CA%AC%B3%E4%A4%B9%A4%EB%5D%5D

617 名前: ◆R/rLuLKeEI mailto:sag [03/08/27 02:44]
>>616
そだね、CSVごときに有限オートマトンとか大袈裟だったな。
で、これは日本語対応?

618 名前:デフォルトの名無しさん mailto:sage [03/08/27 03:15]
C#に日本語非対応なコードなど無い。

619 名前:デフォルトの名無しさん mailto:sage [03/08/27 04:41]
無知の知ったか。

620 名前:デフォルトの名無しさん mailto:sage [03/08/27 09:04]
>>602
ANSIエスケープシーケンスを使う

621 名前:610 mailto:sage [03/08/27 10:13]
>>620
おおっ!忘れていたが、何か画期的なアイデアに思える。(w

と、思ったが、調べてみたらこう書いてあった。
>どの文字列をエスケープシークエンスとして解釈するかは
>ソフトウェアによって千差万別であり、統一された規格の
>ようなものが存在するわけではない。
(T^T)

>>615,616
ありがとうございます。それをきっかけに調べてみます。


622 名前: ◆R/rLuLKeEI [03/08/29 00:54]
>どの文字列をエスケープシークエンスとして解釈するかは
>ソフトウェアによって千差万別であり、統一された規格の
>ようなものが存在するわけではない。
なのに、「ANSI【アメリカ規格協会】」を冠しているのが不思議。



623 名前:620 [03/08/29 07:37]
「ANSIエスケープシーケンス」は>>602へのコメントだよ。
0x1b(ESC)で始まる文字列をコンソールに送ることで
画面、コンソールの位置、文字の色等を制御するもの。


624 名前:デフォルトの名無しさん [03/08/29 07:39]
>>623
s/コンソールの位置/カーソルの位置/

625 名前:610 mailto:sage [03/08/29 10:52]
一応、CSVを切り分けられるコードは書けた。
C#の>616のコードは読めなかったので、
適当に考えてやってみた。だけど、""→"に
するのとか、漢字コードのチェックとか
やってないし、変なCSVを回避するのも
できないし、拡張性が無いコードになって
しまっている。


626 名前:デフォルトの名無しさん mailto:sage [03/08/29 12:26]
Delphiのコンパイラ使おうぜ。

627 名前:デフォルトの名無しさん mailto:sage [03/08/29 19:24]
>>622
ANSIエスケープシーケンスも知らないコテハンか。
時代だな。

628 名前: ◆R/rLuLKeEI mailto:sage [03/08/30 03:46]
>>627
>ANSIエスケープシーケンスも知らないコテハンか。
>時代だな。

時代ですね。
ANSIエスケープシーケンスは全く知らないわけでもない。
しかし、ここ何年も直接記述したことがないので、すっかり忘れてた。

>>602
Cマガジン1992/5, p.36, Table7(古っ!)によると、全画面消去のESC[2Jとカーソル位置指定のESC[m;nHは当時のどのPCでも共通のようだ。
MINIX本第2版図3-36やhtermでもこの二つは共通でした。
しかし、psterm-fast端末のカーソル位置指定は0x4m;n;などと全然違っていたりする(linuxのtermcapより)。

と、慌てて調べても後の祭。

629 名前:610 mailto:sage [03/08/30 07:35]
Cのソースを見ながら、CSV切り分け書いてるんだけど。
Cだとbreak,continueとかで、loopを跳んだり、
文をキャンセルするので、全然参考にならん。


630 名前:デフォルトの名無しさん mailto:sage [03/08/30 14:09]
同じように書けば良いじゃん。

631 名前:610 mailto:sage [03/08/30 16:21]
無理じゃん。
break, continueが使えるか使えないかで、全然変わるよ。

とりあえず、フラグを追加して、似たような動作を確保。
""→"にするのも出来たし、"なし文字列のスペースを
取り除くのも出来た。変なCSVでなければ、概ね基準通り
切り分けられるようになった。


632 名前:デフォルトの名無しさん mailto:sage [03/08/30 16:40]
>>631
えっ…

ひょっとして、DelphiやFreePascalにあるSystem.Breakは、独自拡張!?



633 名前:610 mailto:sage [03/08/30 17:13]
>>632
知らなかったのか低能(ワラ

634 名前: ◆R/rLuLKeEI [03/08/30 18:31]
>>631
>無理じゃん。
>break, continueが使えるか使えないかで、全然変わるよ。
break文、continue文はラベル無しgoto文といわれるように、これらは等価なラベル有りgoto文に変換可能です。


>>632
DelphiやFreePascalのBreak、Continueが手続きであることの方が吃驚!
知らなかった私も低脳かえ?

635 名前:610 mailto:sage [03/08/30 20:04]
>633は別人だが。

>>634
もちろん、goto文を使うことも考えたけど、
なんか邪道っぽくない?

ちなみに、うちのはTHINK Pascal。


636 名前: ◆R/rLuLKeEI mailto:sage [03/08/30 22:06]
>>635
PASCALで大域ジャンプ以外にgotoを使うのは邪道っぽい。

ちなみに、うちのはGNU Pascal。
ただし、JIS-PASCAL(X3008-1990)の範囲内で考えている。

637 名前:610 mailto:sage [03/08/30 22:25]
macの場合、NewHandleやNewPointerでメモリーを
確保した場合、メモリー確保に失敗したら
OSErrで分かるんだけど。
標準pascalのnewでメモリー確保に失敗したら
どうなるの?というか、その判別方法は?


638 名前: ◆R/rLuLKeEI mailto:sage [03/08/30 23:06]
>>637
>標準pascalのnewでメモリー確保に失敗したら
>どうなるの?というか、その判別方法は?

JIS-PASCAL(X3008-1990)には何の記述もない。
必ず成功するかのようにも読める。
というわけで、その判別方法はない。
1.2 規定外事項
 (1) 特定のデータ処理システム又は処理系が処理できるプログラム及び
   データの大きさ又は複雑さの限界並びにそれらの限界を超えた場合の措置。

639 名前:デフォルトの名無しさん mailto:sage [03/09/01 02:23]
>635
・continue はループの先頭に戻る
・breakはループを脱出
でいいの?
だったらTHINK Pascalでは
・ループ(for,while,repeat)の先頭に戻る → cycle
・ループ脱出 → leave
だけど。
他に関数・手続きからの脱出 → exit(関数/手続き名)
というのもある。入れ子になった関数/手続きから一気に抜ける事も出来る。

640 名前: ◆R/rLuLKeEI [03/09/01 04:25]
・continue はループの最後に飛びます(C++第2版リファレンスマニュアルr.6.6.2)

641 名前:610 mailto:sage [03/09/01 13:34]
>>639
ほんとだ・・・あった・・・。サンクス
標準Pascalの本を見ながらやってたので、気づかなかった。
THINK Pacal入門の後ろの方に、ちらっと載ってた。

あとこれでCとの違いといえば、case文の挙動が
ちょっと違う事くらいか。


642 名前:デフォルトの名無しさん mailto:sage [03/09/12 12:33]
例えば、'tarou'と入力させて、
tarouという名前の変数か、
tarouという添え字の配列を作って、
tarou[rika]:=100;
とか代入するには、どうすればいい?




643 名前:デフォルトの名無しさん mailto:sage [03/09/12 13:11]
できません。

644 名前:デフォルトの名無しさん mailto:sage [03/09/12 16:25]
じゃあ、tensuuは固定の名前で、
name:='tarou';
kamoku:='rika'
tensuu[name,kamoku]:=100;
kamoku:='eigo'
tensuu[name,kamoku]:=90;
とかは?


645 名前:デフォルトの名無しさん mailto:sage [03/09/12 16:47]
連想配列かあ。純粋なPascalじゃ無理かもね。
拡張構文使っていいならやりようはあるけど。

646 名前:デフォルトの名無しさん mailto:sage [03/09/12 19:06]
そうそう。連想配列。無理か・・・。
似たようなことは出来ない?

つまり、プログラム自体は一定で、
データの構造次第で変数を増やしたり
減らしたり、参照したり、したい。

いっそ、独自のスクリプト言語を
Pascalで作る方法を考えた方がいいか・・・。


647 名前:デフォルトの名無しさん mailto:sage [03/09/12 21:07]
連想配列そのものじゃなくても
type Tensuu = record Name, Kamoku: string; Tensuu: Integer end; の配列かリンクリストでいいのでは?
SetTensuu(list, name, kamoku, 90); みたいに使えるアクセサ関数を用意しとけば不便ってこともないでしょ。

Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど

648 名前:デフォルトの名無しさん mailto:sage [03/09/13 01:42]
ここは「Pascal の初心者」なので、Delphi 等の拡張 Pascal は外すべきでは?

で、純正 PASCAL には「連想配列」はありません。
配列の引数として許されるのは列挙可能な型のみです。列挙不可能な数学的実数を表現している実数型も使用できません。
だいたい、純正 Pascal には文字列型すらないんだし....

連想配列を実現するコードを自分で書くことになります。
それを使って
647 さんの
>Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど
ってことを実現することができるでしょう。

649 名前:デフォルトの名無しさん mailto:sage [03/09/13 08:59]
Delphiで言うところの動的配列も、標準では無いですよね?
var hairetu: array [0..maxNum] of integer;
の maxNumが変数であるのは許されないもんね。
まあ、この程度ならリストで代用できるから良いけど。

BasicでいうDIM文が懐かしい・・・。

>>648
>連想配列を実現するコードを自分で書くことになります。
どこかに、転がってないでしょうか。
"pascal 連想配列"でググッても、rubyやPHPが出てくる。

それと、連想配列って英語ではなんて言うの?


650 名前:デフォルトの名無しさん mailto:sage [03/09/13 09:45]
あそしえーしょんあれい。

651 名前:デフォルトの名無しさん mailto:sage [03/09/13 14:52]
久しぶりにTHINK Pascalのマニュアルを引っぱり出したが。
associtation arrayは載ってない。当然か・・・。

探していたら、こんなのを見つけた。
PASCAL ファンのための CGI プラットフォーム 「Reims」
ttp://member.nifty.ne.jp/ymagami/Reims.html
こいつの言語仕様を参考に、associationやlongstringが
標準のPascalでも使えるようなルーチンを作るか。

・・・って、自分にできるか?(^^;
もっと偉い人が作った奴、どっかに落ちてないかなぁ。


652 名前:デフォルトの名無しさん mailto:sage [03/09/14 11:18]
PNL Librariesに、連想配列のコードがあった。
だけど、これはMacの、しかもコードウォーリアー用みたい。
少し書き換えればTHINK Pascalでもいけるみたいだけど。
スレ違いになりそうです。失礼しました。



653 名前:デフォルトの名無しさん mailto:sage [03/09/16 03:26]
THINK Pascal / Mac でやっているの?

連想配列って、やってることはデータベース検索なんだから、

type
Item = record key : string; val : integer end;
Items = array[1.1000] of Item;

みたいにして

for Ind = 1 to 1000 do Items[Ind].Key = SearchKey then

のように一致したキーを探すことになる。
毎回、全数検査すると遅くなるからハッシュを使うとか、速度向上の手法はいくらでもあるけど、本質は検索だ

654 名前:652 mailto:sage [03/09/16 20:04]
まだソースをざっと見ている段階ですけど、
結構高度なことをやっている様子。
追加、削除、検索など、一通りのルーチンは
揃っているみたい。使い方を解析せねば。


655 名前:レイホウ@6歳 mailto:sage [03/09/24 22:35]
処理速度を犠牲にしてもいいなら
for($i = 0; $i < @mob; $i++){
 next if ($mob[$i] eq ""); ←何も無かったら次いく
 $mobname[$i] = $stuff[2] if ($stuff[1] eq $mob[$i]);
 last if ($stuff[1] eq $mob[$i]); ←見つかったら終了
}
これと同じ事をすればいい(↑はperlだけどな)

perlとしては↑間違ってる

えいめ〜ん


656 名前:デフォルトの名無しさん mailto:sage [03/10/14 04:20]
3つの整数を読み込み、最小値と最大値を出力するプログラムを作りなさい。

657 名前:デフォルトの名無しさん mailto:sage [03/10/14 09:28]
>656
宿題?

658 名前:デフォルトの名無しさん mailto:sage [03/10/14 09:32]
最初に
 整数を三つ読み込む。
次に
 最小値を見つける。そして出力。
最後に
 最大値を見つけ、それを出力。

簡単でしょ

659 名前:デフォルトの名無しさん mailto:sage [03/10/14 12:29]
こういうのをわざと、ObjectPascal使ってやったりしてな。

660 名前:デフォルトの名無しさん mailto:sage [03/10/14 17:02]
あ、そろそろ後期の授業が始まったわけか。

661 名前:でたらめ mailto:sage [03/10/14 18:27]
program test3;
var
a, b, c, max, min: integer;
begin
read(a);
max := a;
min := a;
read(b);
if b > max then
max := b;
if b < min then
min := b;
read(c);
if c > max then
max := c;
if c < min then
min := c;
writeln('max', max);
writeln('min', min);
end.

662 名前:デフォルトの名無しさん mailto:sage [03/10/16 01:29]
program maxandmin; (* IF無しバージョン *)

var
  a, b, c, max, min : integer;

function sgn(si : integer) : integer;
begin
  if si < 0 then sgn := -1 else if si = 0 then sgn := 0 else if si > 0 then sgn := 1;
end;

begin
  read(a); read(b); read(c);
  case sgn(a - b) of
    -1, 0 : case sgn(b - c) of
      -1, 0 : begin min := a; max := c; end;
      1 : case sgn(a - c) of
        - 1, 0 : begin min := a; max := b; end;
        1 : begin min := c; max := b; end;
      end;
    end;
    1 : case sgn(b - c) of
      -1, 0 : case sgn(a - c) of
        -1, 0 : begin min := b; max := c; end;
        1 : begin min := b; max := a; end;
      end;
      1 : begin min := c; max := a; end;
    end;
  end;
  writeln('max=', max);
  writeln('min=', min);
end.




663 名前:662 mailto:sage [03/10/16 01:30]
あ、sgn に if文を使っているんだっけ。

664 名前:でたらめ mailto:sage [03/10/16 21:41]
function sgn (si: integer): integer;
begin
case si of
0:
si := 0;
otherwise
begin
sgn := si div abs(si);
end;
end;
end;


665 名前:でたらめ mailto:sage [03/10/16 21:42]
あ。begin, end 一個余分だ。

function sgn (si: integer): integer;
begin
case si of
0:
si := 0;
otherwise
sgn := si div abs(si);
end;
end;


666 名前:でたらめ mailto:sage [03/10/17 10:56]
program MaxMinX; (* ObjectPascal ver. *)
type
MMXtype = object
vmax, vmin: integer;
procedure init;
procedure setValue (val: integer);
function max: integer;
function min: integer;
end;
procedure MMXtype.init;
begin
vmax := -32768;vmin := 32767;
end;
procedure MMXtype.setValue (val: integer);
begin
if val > vmax then vmax := val;
if val < vmin then vmin := val;
end;
function MMXtype.max: integer;
begin max := vmax; end;
function MMXtype.min: integer;
begin min := vmin; end;
var MMX: MMXtype;a, i: integer;
begin
new(MMX);
MMX.init;
for i := 1 to 3 do
begin read(a); MMX.setValue(a); end;
writeln('max=', MMX.max);
writeln('min=', MMX.min);
end.

667 名前:662 mailto:sage [03/10/17 18:42]
program test(input, output); (* 今度こそIF無しバージョン *)
Type TChoice = function(a, b : integer) : integer;
var
  Func : array[boolean] of TChoice;
  a, b, c : integer;

function First(a, b : integer) : integer;
begin First := a; end;

function Second(a, b : integer) : integer;
begin Second := b; end;

function fmax(a, b : integer) : integer;
begin fmax := Func[a >= b](a,b); end;

function fmin(a, b : integer) : integer;
begin fmin := Func[a <= b](a,b); end;

begin
  Func[false] := Second; Func[true] := First;

  read(a); read(b); read(c);
  writeln('min=', fmin(fmin(a, b), c));
  writeln('max=', fmax(fmax(a, b), c));
end.


668 名前:でたらめ mailto:sage [03/10/17 19:08]
>>667
発想がすごい!
けど、うちの環境(THINK Pascal)だと、
2行目が通らないっす・・・

669 名前:622 mailto:sage [03/10/17 20:32]
>>668
あ、関数型(手続き型の方が分かりが良いかな)って
標準Pascal仕様じゃなかったんですね。ちなみにDelphi
では通りました。

670 名前:でたらめ mailto:sage [03/10/18 03:13]
program MMX;
var
a, b, c: integer;
begin
read(a); read(b); read(c);
writeln('max=', ((((a + b) + abs(a - b)) div 2 + c) + abs(((a + b) + abs(a - b)) div 2 - c)) div 2);
writeln('min=', ((((a + b) - abs(a - b)) div 2 + c) - abs(((a + b) - abs(a - b)) div 2 - c)) div 2);
end.

671 名前:デフォルトの名無しさん mailto:sage [03/10/18 17:14]
>>656
読み込んでソートして一番上と一番下を見る

672 名前:662 mailto:sage [03/10/21 18:45]
>>670
あ、なるほど。2変数のやつをもう一度繰り返せば3変数
に対応出来ますね。私は「一度に3変数に対応出来ない
か」と考えていました。



673 名前:でたらめ mailto:sage [03/10/22 00:22]
>>672
でもこれって、>667の
>writeln('min=', fmin(fmin(a, b), c));
>writeln('max=', fmax(fmax(a, b), c));
の派生みたいな物ですよ。
ただ、公式にあてはめただけです。


674 名前:でたらめ mailto:sage [03/10/22 00:25]
他にも、
const
maxint = 32767;
minint = -32768;
var
index: array[minint..maxint] of boolean;
を使う方法も考えたけど、
メモリーが足りない(?)とかで
配列が確保できずに断念したっス。


675 名前:662 mailto:sage [03/10/25 15:23]
>>673
2変数での公式と>>667のやつを組み合わせることを
思いつかなかったんです。思いついてさえいたら、先
に書いていたのに...

676 名前:デフォルトの名無しさん [03/10/31 01:49]
質問いいですか?
一クラス分の身長を実数型で入力し、最高と最低を求めるプログラムを作成せよ。
さらに示された入力データでトレース表を書きなさい。
(A)最初に人数を入力し、人数分の処理をする場合(for)
(B)身長に0が入力されたら、終了する場合(while)

実行結果例
人数 制御変数 身長 最高 最低
6     1    178
    2    165       165.0
   3    197    197.0
   4    168
    5    175
   6    183

こんな問題です。
特に、入力された人数分を変数に入れる方法と、トレース表に出力する方法が分かりません。

677 名前:デフォルトの名無しさん [03/10/31 03:33]
>>676
小学校の宿題か?

678 名前:662 mailto:sage [03/10/31 05:22]
>>676
配列とか知っているか?

それとなんでその問題で「実数型」にする必要があるんだ?
実数型だと比較が難しいぞ。

679 名前:デフォルトの名無しさん [03/10/31 08:01]
>>678
問題が実数型で入力せよとなっているので・・・。
配列はあやふやです・・・。

680 名前:でたらめ mailto:sage [03/10/31 08:40]
3つの最大・最小の次は、この課題ですか。ふふーん
じゃあ、どうしよっかなー

681 名前:でたらめ mailto:sage [03/10/31 08:44]
(A)みたいなのは、BasicだとDIM文とかで
配列を宣言すれば無駄がないけど、Pascal
はできないもんね。
(B)も(A)もそうだけど、人数の最大が決まっ
てるか決まってないかで、全然変わるけど。
その辺は、どうなんだろうね?

682 名前:デフォルトの名無しさん [03/10/31 11:46]
がんばって考えてみたけどエラーが出ます。どこを改良すればいいですか?

var i,n,max,min :integer;
sin:array[1..100] of integer;
begin
write('人数は?');
readln(n);
for i:=1 to n do
begin
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
end;
max:=sin[1];
min:=sin[1];
for i:=2 to n do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
end;
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n);
for i:=1 to n do
begin
write(' ',i,' ', sin[i] );
IF sin[i]:=max then
write(' ',sin[i]);
IF sin[i]:=min then
write(' ',sin[i]);
end;
end.



683 名前:でたらめ mailto:sage [03/10/31 17:01]
>>682
ほとんどできてるじゃん。

>IF sin[i]:=max then
>write(' ',sin[i]);
>IF sin[i]:=min then
>write(' ',sin[i]);
ここ、「:=」じゃなくて「=」だ。
それと、この次に、
writeln;
の1行を入れる必要がある。


684 名前:662 mailto:sage [03/10/31 18:34]
>>682
実数型を使っていないけど、いいのか?

それとトレース表の人数のあとに改行が入っているけど
それも問題無し?

685 名前:でたらめ mailto:sage [03/10/31 19:10]
>>684
そやな、ごもっとも。(w
でも、例とは違ってもええんちゃう?
それ言い始めると、「最低」の数字の
表示位置がずれてる気がするけど。


686 名前:でたらめ mailto:sage [03/10/31 21:16]
ところで。私も詳しく知らないんだが。
実数型って比較が難しいの?


687 名前:662 mailto:sage [03/11/01 09:12]
>>685
おお、表示位置のずれは気づかなかった。という
ことで、そこも直す必要があるぞ。>>682

>>686
10進と2進の変換誤差(浮動小数点の場合)と計
算誤差があるから、等号比較だと偽になる場合
が考えられる。あと、有効桁数の問題も気にとめ
ておく必要が出る場合もあるし。

まあ、今回みたいに変数に入れた物を代入する
場合なんかは等号比較が出来る場合が多いけ
ど、代入を計算と見なした場合は一度倍精度に
してから単精度に戻すなどの処理が入って値が
変わる可能性があることを頭に入れておいた方
が破綻しづらくなります。

と言うことで私は整数型で実装出来るものは整数
型で実装するようにしています。

688 名前:でたらめ mailto:sage [03/11/01 10:59]
>>687
そうか。誤差か。普段そこまでシビアな計算って
したことないんで、気にしなかった。
うちも整数型がほとんどです。

今回の場合、まさか身長で小数点以下2桁以上が
必要になることはないので。入力した数値を
×10して整数型で保存・計算。表示の時に
÷10して実数型(例だと下一桁)っぽく
表示するのではあかんのやろか。
この処理、逆に面倒?誤差が大きくなる?


689 名前:662 mailto:sage [03/11/01 11:44]
>>688
私もその方が良いと思ったので「実数型にする必要があ
るんだ?」と聞いたんだけど... でも「問題が実数型で入力
せよ」という事らしいから、実数型にする必要があるみた
いですね。

それとも「入力が実数型」を受け付けると言うことだけで
良いのなら内部は整数で扱う方がプログラム的には楽
ですね。

計算することを考えるのなら、小数点以下2桁くらい取っ
ておいた方が安全かも。

690 名前:でたらめ mailto:sage [03/11/01 13:19]
実数型で入力し・・・そうか!!やっぱり
入力さえ実数型なら、ええんちゃう?
処理まで実数型とは書いてないもんな。

>>682
考えることは同じやね。うちも最初は小数点以下
2桁と思ったけど、例が下1桁だったので、表示
するときの手間を考えて下1桁って書いてた。

そんなわけで。>682は、課題完了だな。

691 名前:682 [03/11/01 23:35]
レス有難うございます!!
あとですね、>>676のwhile文のほうがあって身長に0を入力した場合に入力が終わるプログラムなんだけど、
そうすると出力のときに身長に0が出てしまうんですよ。どうすればいいですか?

692 名前:でたらめ mailto:sage [03/11/02 00:30]
>>691
forとwhileの基本的な違いではないか。
それを考えるのが課題のポイントじゃ。




693 名前:でたらめ mailto:sage [03/11/02 11:26]
for 1〜2回
 入力 1〜2回繰り返し
戻る

repeat
 入力 1〜2回繰り返し、3回目に0を入力
0以外は戻る
最後の入力は無効

で、ええんちゃうか。
そうすると問題は、のっけから0を入力された
場合のエラーセーフだけど。ま、やってみそ。


694 名前:デフォルトの名無しさん mailto:sage [03/11/02 23:35]
if文は使ったらいけないのヵ
begin
一つ目を入力;
while i>0 do begin
出力;
入力;
end;
end.
たぶん不合格。
ん?0を「入力した」場合に「入力が」終わる?

695 名前:でたらめ mailto:sage [03/11/03 00:44]
あ。すまぬ。>693は何か勘違いして書いてるかもしれん。
そか。repeatはuntilで、whileは違うか。
ま、気にするな。(w

696 名前:でたらめ mailto:sage [03/11/03 00:51]
罪滅ぼしに、ちょっとヒントを。
var next:boolean;
...
next:=true;
while next do
begin
入力
if a=0 then next:=false;
その他のチェック
end;


697 名前:デフォルトの名無しさん mailto:sage [03/11/03 01:44]
なんだその変なコード。

698 名前:でたらめ mailto:sage [03/11/03 02:31]
>>697
まあ、でたらめっちゅー事で。気にするな。
よかったら、すばらしいサンプルを提示して
やってくだされ。


699 名前:デフォルトの名無しさん mailto:sage [03/11/03 17:26]
>>696
while true do で if 〜then break すればいいんじゃ?

700 名前:でたらめ mailto:sage [03/11/03 18:13]
>>699
前にも似たような話があったけど、
標準Pascalではbreakが使えないのよん。

701 名前:でたらめ mailto:sage [03/11/03 18:13]
と、思って>700を書いたが。私の勘違い?

702 名前:デフォルトの名無しさん mailto:sage [03/11/03 19:01]
1周目を必ず通すならrepeat使いなよ。



703 名前:でたらめ mailto:sage [03/11/03 19:11]
>>702
>676

704 名前:デフォルトの名無しさん mailto:sage [03/11/03 20:04]
ちょっくら問題作った奴に山嵐決めてくる。

705 名前:662 mailto:sage [03/11/03 23:08]
ほんとだ、これは問題を作ったやつがバカ。
repeat - until を使った方が素直に組めるのに。
どうしてもwhileでやらなきゃならないのなら、入力
関数でも作って以下のようにするか...

function 身長入力関数(var 身長) : boolean;
begin 入力処理 end;

while 身長入力関数(身長) do
  身長追加処理;


>>701
その通り、breakは無いです。元が教育用言語
だから、抜け道は作らないような構文になって
いるんですよね(caseのelse、otherwiseも無い)。

706 名前:でたらめ mailto:sage [03/11/03 23:15]
>>705
「課題」なんだから仕方ないよ。

Cだと、入力しつつ比較が出来るから、
関数を作る必要はないんだよね?確か。

breakが無いのはまだいいけど、
caseのotherwiseも標準にはないの?
これないと辛い。つーか、無理。
THINK Pascalはある。


707 名前:662 mailto:sage [03/11/04 00:21]
>>706
いや、課題だからこそ変な制約を付けることなく作ら
せるのがよい。まあ、一定の方向に仕向けるためだ
ろうけど、それでプログラミング嫌いになったら教育
の価値無し。

otherwise(Delphiではelse)は無い。と言うかcase
を使う時点で出てくる要素は判っているはずだから、
全て列挙しろと言うことでしょう。otherwiseに入れら
れた処理を「あとで分類し直す」なんて事になったら
結構大変だというのは想像が付きそうだけど。

708 名前:676 [03/11/04 12:17]
こんな強引な感じになりましたが一応例どおり動きました。
Program en9a(input,output);
var i,n :integer;
max,min :real;
sin:array[1..100] of integer;
begin
write('人数は?');
readln(n);
for i:=1 to n do
begin
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
end;
max:=sin[1];
min:=sin[1];
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n);


709 名前:676 [03/11/04 12:18]
i:=1;
repeat
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
i:=i+1;
until i<>1;
for i:=2 to n do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
end;
end.


710 名前:676 Bのほう [03/11/04 12:19]
Program en9b(input,output);
var i,n :integer;
max,min :real;
sin:array[1..100] of integer;
begin
n:=1;
i:=1;
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
while sin[i]<>0 do
begin
i:=i+1;
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
n:=n+1;
end;
max:=sin[1];
min:=sin[1];
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n-1);

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 名前:でたらめ mailto:sage [03/11/04 13:11]
あのー、sinの宣言を見ていると、
整数型なんですけど・・・
小数入力しても、小数点以下が
切られてない?
(試してないので分からんけど)



713 名前:デフォルトの名無しさん mailto:sage [03/11/04 13:35]
sinってのは正弦みたいでやだな。

714 名前:デフォルトの名無しさん mailto:sage [03/11/04 17:40]
右シフトさせるプログラムがどーしても
出来ない・・・・

715 名前:デフォルトの名無しさん mailto:sage [03/11/04 18:13]
表示位置のずれはまだ直っていないようだが... あと
ちゃんとコンパイルして実行して動くかどうか確認し
て(もしくは不明点が見つかって)からアップしてくれ。

おまえのソースを全てチェックするほど暇じゃないん
だ。そっちのソースを直すより自分で全て書いた方
が早そうだし。


>>714
環境(対象コンパイラ、機種、OS等)の必要情報が
判らないとコメント付けようがないぞ。

716 名前:デフォルトの名無しさん mailto:sage [03/11/05 00:46]
>>715
例どうりに動いたと書いてあるよ。

717 名前:デフォルトの名無しさん mailto:sage [03/11/05 09:21]
>>715
フリーパスカル CPAD win2K

718 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/11/05 20:20]
>>720
0〜15の10進数しか変換できない。

722 名前:718 mailto:sage [03/11/05 22:26]
>>719
俺、配列使えなんて一言も言ってないんだけど。

何か良く分かんない(理解出来ないやり取りの)
所に来てしまったようなので、落ち着くまでしばら
く黙っていることにする。



723 名前:でたらめ mailto:sage [03/11/05 22:53]
学校の課題なんでないかい?
配列使え、っていう。

724 名前:718 mailto:sage [03/11/05 23:51]
>>723
課題は課題で良いんだけど、「他の人に分かって
もらう書き方」ってのがあると思うんだ。特にこうい
う場では。それと「自分で出来るだけ努力する」っ
てのも大事だし。

それをしないでソース垂れ流し(それもちょっと?の)
されるんで、もう私には理解不能。だからこの件
(と思われるもの)には黙ることにしました。

725 名前:でたらめ mailto:sage [03/11/06 01:21]
ところで。右シフトって何?
2で割ればいいんじゃないの?


726 名前:デフォルトの名無しさん mailto:sage [03/11/06 21:54]
>>725
マイナスの値を右シフトと2で割ることをしてみれば、
違いが分かると思う。それと、算術計算とビット操作
はやっぱり別の話だから。

727 名前:でたらめ mailto:sage [03/11/06 23:03]
マイナスか。それは考えなかった。
でも、ビット操作なんてアセンブラでも使わない
限り必要ないんじゃないかと思うけど。
Cならいざしらず、Pacalでは意味ないよねぇ。
課題じゃしょうがないけど。


728 名前:デフォルトの名無しさん mailto:sage [03/11/06 23:16]
>>727
だってグラフィックフォーマットとか通信プロトコルなんかで
「ビットで状態を表す」物って結構多いから、ビット操作がで
きないと辛い場合って結構あるよん。

そういう時までアセンブラを持ち出すのはちょっと大仰だと
思う。高級言語でサクサク組めた方が何倍もカンタン。

729 名前:でたらめ mailto:sage [03/11/07 00:00]
>>728
そうか。なるほど。

ビット操作はマックならtoolboxにあるので、
THINK Pascalでもコマンド一発。


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]
夏とともに、さよなら・・・。








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<272KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef