Pascal の初心者用の質問・相談所at TECH
Pascal の初心者用の質問・相談所 - 暇つぶし2ch543:デフォルトの名無しさん
03/04/25 12:02
>>542
あれ、そうですか。私 Opera なんですけど、大丈夫です。
ブラウザ依存なんでしょうか。すみません。


544:デフォルトの名無しさん
03/04/25 12:03
>>543
IE 6 では大丈夫です。


545:デフォルトの名無しさん
03/04/25 12:44
そうそう、>>541 の結果ですけれど、最後の 3 つは、65497、65519、65521 でした。


546:513
03/04/26 02:07
型T=set of 0..maxintの各元表記全体からmaxint+1ビットの符号無し整数への1対1写像は定義できるよな?
もし定義できるのならinteger型の範囲は遙かに越えてしまうな
で、更に(有限)整数上の加法と一致するように型T上の加法をうまく定義して…(略)
普通はintegerの配列で実現する多倍長整数とは一風変わった整数(環)が出来そう
これをリストに持たせてもっと大きな数に対する~のふるいが…
工夫しないとメモリ不足になりそうだな
或いはset of -maxint..maxintを基数2の固定小数点表現とみなすのも面白そうだ
体調が回復したらやってみよう

547:デフォルトの名無しさん
03/04/29 18:56
We Love Pascal.

548:山崎渉
03/05/22 05:01
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―

549:山崎渉
03/05/28 12:52
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎―◎                      山崎渉

550:デフォルトの名無しさん
03/05/28 21:24
URLリンク(community.borland.com) のTP5.5のとこからTurboPascalのOOP入門が落とせる。
AppleのObject Pascalレポートの名前が書いてあるので、
やっぱObjectPascal="object"型のあるPascal、でいいらしい。

だからどうした、と言われると困るが

551:デフォルトの名無しさん
03/06/13 17:06
良スレの予感

552:デフォルトの名無しさん
03/06/26 22:36
その教科書のどこかにある list 型構造体の定義を見直してみてくれ。

553:デフォルトの名無しさん
03/07/03 18:50
Lazarusの落とし方がわからん...

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

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

555:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/07/03 20:48
スマソ>556

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

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

562:デフォルトの名無しさん
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

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

URLリンク(jbbs.shitaraba.com)

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

本田 守さん

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

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

ハンドル
Mr.あねさん

ホームページ
URLリンク(www2.neweb.ne.jp)
URLリンク(hp.vector.co.jp)

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

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

S  O  F  T  W  A  R  E

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

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

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

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

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

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

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


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

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

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

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

575:デフォルトの名無しさん
03/07/14 13:50
綺麗なお姉さんのパイパンおま○こ生写真を発見!
URLリンク(plaza16.mbn.or.jp)

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


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

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

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


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

579:山崎 渉
03/07/15 09:45

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

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

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

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

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

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

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

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

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

586:デフォルトの名無しさん
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:デフォルトの名無しさん
03/07/27 22:51
iアプリはi-mode Javaでしょ。
HSPじゃ無理。

DoCoMo Net - 製品・サービス - i-mode - iアプリコンテンツの作成について
URLリンク(www.nttdocomo.co.jp)


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

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





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

591:デフォルトの名無しさん
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:デフォルトの名無しさん
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:デフォルトの名無しさん
03/07/28 00:35
なるほどなるほど。
かなりよくわかりました!

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

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

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

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

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

597:デフォルトの名無しさん
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
03/07/31 21:32
どうもありがとうございます。
なんだかエラーが沢山出るんですけど、貼り付けるだけじゃ駄目なのでしょうか。。。
厨ですみません。

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

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

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

600:山崎 渉
03/08/02 02:15
(^^)

601:山崎 渉
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:デフォルトの名無しさん
03/08/19 00:00
無理ですか。
あ、そっか。画面の大きさが分からないから、
1ページ分書き直してスクロールアップ
するのも無理だ。うーむ。


605:デフォルトの名無しさん
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:デフォルトの名無しさん
03/08/19 12:55
そういう手もあるか。
でも、画面の大きさを取得するのに、処理系毎の
工夫が必要。つーか、無理な場合もありそうな予感。

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


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


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

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


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

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


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

612:デフォルトの名無しさん
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
03/08/23 22:26
>>611
Delphiの無限とも言える長さの文字列は、
便利で良いですねぇ。しかも、CommaTextで
自動的にCSVを切り分けてくれるし。(日本語対応で)

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

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

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


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

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

616:デフォルトの名無しさん
03/08/27 02:10
>>614
C#のでよければ。なんとなくは分かると思うよ。
URLリンク(onigiri.s3.xrea.com:8080)

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

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

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

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

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


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

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

628: ◆R/rLuLKeEI
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
03/08/30 07:35
Cのソースを見ながら、CSV切り分け書いてるんだけど。
Cだとbreak,continueとかで、loopを跳んだり、
文をキャンセルするので、全然参考にならん。


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

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

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


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

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

633:610
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
03/08/30 20:04
>633は別人だが。

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

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


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

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

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


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

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

639:デフォルトの名無しさん
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
03/09/01 13:34
>>639
ほんとだ・・・あった・・・。サンクス
標準Pascalの本を見ながらやってたので、気づかなかった。
THINK Pacal入門の後ろの方に、ちらっと載ってた。

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


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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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


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

653:デフォルトの名無しさん
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
03/09/16 20:04
まだソースをざっと見ている段階ですけど、
結構高度なことをやっている様子。
追加、削除、検索など、一通りのルーチンは
揃っているみたい。使い方を解析せねば。


655:レイホウ@6歳
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:デフォルトの名無しさん
03/10/14 04:20
3つの整数を読み込み、最小値と最大値を出力するプログラムを作りなさい。

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

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

簡単でしょ

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

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

661:でたらめ
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:デフォルトの名無しさん
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
03/10/16 01:30
あ、sgn に if文を使っているんだっけ。

664:でたらめ
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:でたらめ
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:でたらめ
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
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:でたらめ
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
私に言わせると「わざわざ二次元配列にする必要ってあるのか」
になるんだけど。

値を保存する配列と計算用の配列は分けた方が分かりやすいと
思うんだけど。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch