RosettaCodeData/Task/Arrays/Simula/arrays-2.simula

146 lines
3.3 KiB
Plaintext

BEGIN
CLASS ITEM;;
CLASS ITEMARRAY(N); INTEGER N;
BEGIN
REF(ITEM) ARRAY DATA(1:N);
OUTTEXT("NEW ITEMARRAY WITH "); OUTINT(N, 0); OUTTEXT(" ELEMENTS");
OUTIMAGE;
END;
CLASS ARRAYLIST;
BEGIN
PROCEDURE EXPAND(N); INTEGER N;
BEGIN
INTEGER I;
REF(ITEMARRAY) TEMP;
OUTTEXT("EXPAND TO CAPACITY "); OUTINT(N, 0); OUTIMAGE;
TEMP :- NEW ITEMARRAY(N);
FOR I := 1 STEP 1 UNTIL SIZE DO
TEMP.DATA(I) :- ITEMS.DATA(I);
ITEMS :- TEMP;
END;
PROCEDURE ADD(T); REF(ITEM) T;
BEGIN
IF SIZE + 1 > CAPACITY THEN
BEGIN
CAPACITY := 2 * CAPACITY;
EXPAND(CAPACITY);
END;
SIZE := SIZE + 1;
ITEMS.DATA(SIZE) :- T;
OUTTEXT("SIZE IS "); OUTINT(SIZE, 0); OUTIMAGE;
END;
PROCEDURE REMOVE(I); INTEGER I;
BEGIN
INTEGER J;
IF I < 1 OR I > SIZE THEN ERROR("REMOVE: INDEX OUT OF BOUNDS");
FOR J := I STEP 1 UNTIL SIZE - 1 DO
ITEMS.DATA(J) :- ITEMS.DATA(J + 1);
ITEMS.DATA(SIZE) :- NONE;
SIZE := SIZE - 1;
END;
REF(ITEM) PROCEDURE GET(I); INTEGER I;
BEGIN
IF I < 1 OR I > SIZE THEN ERROR("GET: INDEX OUT OF BOUNDS");
GET :- ITEMS.DATA(I);
END;
INTEGER CAPACITY;
INTEGER SIZE;
REF(ITEMARRAY) ITEMS;
CAPACITY := 20;
SIZE := 0;
EXPAND(CAPACITY);
END;
ITEM CLASS TEXTITEM(TXT); TEXT TXT;;
ARRAYLIST CLASS TEXTARRAYLIST;
BEGIN
PROCEDURE ADD(T); TEXT T;
THIS TEXTARRAYLIST QUA ARRAYLIST.ADD(NEW TEXTITEM(T));
TEXT PROCEDURE GET(I); INTEGER I;
GET :- THIS TEXTARRAYLIST QUA ARRAYLIST.GET(I) QUA TEXTITEM.TXT;
END;
ITEM CLASS REALITEM(X); REAL X;;
ARRAYLIST CLASS REALARRAYLIST;
BEGIN
PROCEDURE ADD(X); REAL X;
THIS REALARRAYLIST QUA ARRAYLIST.ADD(NEW REALITEM(X));
REAL PROCEDURE GET(I); INTEGER I;
GET := THIS REALARRAYLIST QUA ARRAYLIST.GET(I) QUA REALITEM.X;
END;
REF(TEXTARRAYLIST) LINES;
REF(REALARRAYLIST) REALS;
INTEGER I;
LINES :- NEW TEXTARRAYLIST;
LINES.ADD("WE");
LINES.ADD("HAVE");
LINES.ADD("SEEN");
LINES.ADD("THAT");
LINES.ADD("ARRAYS");
LINES.ADD("ARE");
LINES.ADD("A");
LINES.ADD("VERY");
LINES.ADD("CONVENIENT");
LINES.ADD("WAY");
LINES.ADD("OF");
LINES.ADD("STORING");
LINES.ADD("SIMPLE");
LINES.ADD("VALUES");
LINES.ADD("AND");
LINES.ADD("REFERENCES");
LINES.ADD("TO");
LINES.ADD("MORE");
LINES.ADD("COMPLEX");
LINES.ADD("CLASS");
LINES.ADD("OBJECTS");
LINES.ADD("IN");
LINES.ADD("AN");
LINES.ADD("ORDERED");
LINES.ADD("LIST");
LINES.ADD(".");
FOR I := 1 STEP 1 UNTIL LINES.SIZE DO
BEGIN
OUTINT(I, 0); OUTTEXT(": ");
OUTTEXT(LINES.GET(I)); OUTIMAGE;
END;
REALS :- NEW REALARRAYLIST;
FOR I := 1 STEP 1 UNTIL 10 DO
REALS.ADD(I * I);
FOR I := 1 STEP 1 UNTIL REALS.SIZE DO
BEGIN
OUTINT(I, 4); OUTTEXT(": ");
OUTFIX(REALS.GET(I),2,10); OUTIMAGE;
END;
FOR I := REALS.SIZE STEP - 2 UNTIL 1 DO
REALS.REMOVE(I);
FOR I := 1 STEP 1 UNTIL REALS.SIZE DO
BEGIN
OUTINT(I, 4); OUTTEXT(": ");
OUTFIX(REALS.GET(I),2,10); OUTIMAGE;
END;
END;