[表示 : 全て 最新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/

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のことじゃないの?






[ 続きを読む ] / [ 携帯版 ]

前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