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;
ですが、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;
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;
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.