>>513 手元の Linux に入っていた GNU Pascal 2.95.4 でやってみましたらできるようです。 サンプル・ソース:
program iso(input, output);
var a : packed array[0..7] of boolean; b : set of 0..65535;
begin writeln('hello'); end.
gpc -o iso iso.p
とやったら、
iso.p:5: warning: integer set size limited to 65535 elements from low bound iso.p:5: warning: use `--setlimit=NUMBER' to change the limit at compile time
と出たので、
gpc --setlimit=65536 -o iso iso.p
としたら、エラーも警告もなくコンパイルできました。 動作は未確認ですが (^^ ちなみに、GNU Pascal は cygwin を使えば Windows でも動きます。
GNU Pascal で set -65535..65535 は gpc --standard-pascal --setlimit=131071 でとおりました。
536 名前:521 mailto:sage [03/04/25 08:28]
訂正;THINK Pascalでもpacked array[0..7] of booleanは1byteでした。
>>526 >packed set of -maxint..maxintはどうだろう。 >コンパイル出来ても実行は出来なくて当然だとは思うが… maxintが32767なのでTHINK Pascalでコンパイル&実行できます。 集合はもともと1bit扱いなのでpackedがついてもつかなくても 変数のサイズは同じです。
エラトステネスのふるいで素数を求めるプログラム、 set of 0..maxint (32767)でコンパイル&実行できました。 最後の3つの素数 = 32717 32719 32749
537 名前:デフォルトの名無しさん [03/04/25 08:52]
>>536 エラトステネスのふるいって、集合型でどうやるんですか? 0 から n までの配列を用意して、素数なら true、合成数なら false にしていく、 というものだと思うんですが。
538 名前:別人 mailto:sage [03/04/25 08:59]
set of Xもarray[X] of Booleanも、言語仕様上はともかく役割としては変わらないよ。 配列で A[i] → 集合で i in A A[i] := True → Include(A, i) A[i] := False → Exclude(A, i)
program primenumber(input, output); const n = 65535; var prime : set of 0..n; i : integer; j : integer; begin prime := [0..n]; for i := 2 to n do if prime >= [i] then begin j := i + i; while j <= n do begin prime := prime - [j]; j := j + i; end end; for i := 2 to n do begin if prime >= [i] then writeln(i); end end.
541 名前:デフォルトの名無しさん [03/04/25 11:16]
空白が崩れた。スマソ。 program primenumber(input, output); const n = 65535; var prime : set of 0..n; i : integer; j : integer; begin prime := [0..n]; for i := 2 to n do if prime >= [i] then begin j := i + i; while j <= n do begin prime := prime - [j]; j := j + i; end end; for i := 2 to n do begin if prime >= [i] then writeln(i); end end.
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.
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文忘れてしまったよ)