用意したものは、Borland C++ 5.5のmakeと、PL/I-86です。
PL/I-86の実行ファイル一式はc:\pli86\binに入っています。
--- Makefile ---
PLIBINPATH=c:\pli86\bin
SYSFILE=pli0.ovr pli1.ovr pli2.ovr
LIBFILE=plilib.l86
PROG=tensort
${PROG}.exe: ${PROG}.obj ${LIBFILE}
link86 ${PROG},${LIBFILE}
${PROG}.obj: ${PROG}.pli ${SYSFILE}
pli ${PROG}
pli0.ovr:
copy ${PLIBINPATH}\$@ .
pli1.ovr:
copy ${PLIBINPATH}\$@ .
pli2.ovr:
copy ${PLIBINPATH}\$@ .
plilib.l86:
copy ${PLIBINPATH}\$@ .
clean:
-del ${PROG}.obj ${PROG}.sym ${SYSFILE} ${LIBFILE}
clobber:
-del ${PROG}.exe ${PROG}.obj ${PROG}.sym ${SYSFILE} ${LIBFILE}
--- tensort.pli ---
TENSORT: PROCEDURE OPTIONS(MAIN);
DECLARE 1 KYOKA(5),
2 NAME CHARACTER(6),
2 TEN FIXED(15);
DECLARE GOKEI FIXED(15);
DECLARE I FIXED(15);
DECLARE J FIXED(15);
NAME(1)='KOKUGO';
NAME(2)='SUGAKU';
NAME(3)='RIKA';
NAME(4)='SHAKAI';
NAME(5)='EIGO';
DO I=1 TO 5 BY 1;
PUT LIST (NAME(I),': TEN ? ');
GET LIST(TEN(I));
END;
DO I=1 TO 5-1 BY 1;
DO J=1+1 TO 5-I+1 BY 1;
IF TEN(J)>TEN(J-1) THEN
CALL SWAP(ADDR(KYOKA(J)),ADDR(KYOKA(J-1)));
END;
END;
GOKEI=0;
DO I=1 TO 5 BY 1;
PUT SKIP LIST(NAME(I),':',TEN(I));
GOKEI=GOKEI+TEN(I);
END;
PUT SKIP LIST('GOKEI ',':',GOKEI);
RETURN;
SWAP: PROCEDURE(K1,K2);
DECLARE K1 POINTER;
DECLARE K2 POINTER;
DECLARE 1 KYOKA1 BASED(K1),
2 K1NAME CHARACTER(6),
2 K1TEN FIXED(15);
DECLARE 1 KYOKA2 BASED(K2),
2 K2NAME CHARACTER(6),
2 K2TEN FIXED(15);
DECLARE TMPNAME CHARACTER(6);
DECLARE TMPTEN FIXED(15);
TMPNAME=K1NAME;
K1NAME=K2NAME;
K2NAME=TMPNAME;
TMPTEN=K1TEN;
K1TEN=K2TEN;
K2TEN=TMPTEN;
END SWAP;
END TENSORT;
実行すると、社会、数学、 国語、理科、英語の点数をきいてくるので、入力すると、得点が高い順に一覧を出して、最後に合計点を出します。
--- 実行例 ---
C:\home\neko\src\tensort>tensort
KOKUGO : TEN ? 90
SUGAKU : TEN ? 100
RIKA : TEN ? 98
SHAKAI : TEN ? 60
EIGO : TEN ? 85
SUGAKU : 100
RIKA : 98
KOKUGO : 90
EIGO : 85
SHAKAI : 60
GOKEI : 433
End of Execution
C:\home\neko\src\tensort>
SWAPプロシジャではポインタを使ってみました。
融通は利くけど、わかりにくくなりますね。