|
|
DataMuseum.dkPresents historical artifacts from the history of: MIKADOS |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about MIKADOS Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 10208 (0x27e0)
Notes: Mikados TextFile, Mikados_K
Names: »FILETEST«
└─⟦89d8689a3⟧ Bits:30003591 MIKADOS Pascal compiler (01.02.1982 E)
└─⟦this⟧ »FILETEST«
PROGRAM FILETEST;
(***************************************************)
(* *)
(* CREATION AND UPDATING OF A PERSON FILE *)
(* *)
(* DEMONSTRATION OF DIRECT FILES AND THE USE OF *)
(* THE EDIT PROCEDURE IN MIKADOS PASCAL *)
(***************************************************)
TYPE STATUS = ( MARRIED, WIDOW, DIVORCED, BACHELOR );
ALFA = STRING(30);
TXT = STRING(18);
DATE = RECORD DAY: 1..31;
MONTH: 1..12;
YEAR: INTEGER
END;
PERSON = RECORD
NAME: RECORD
FIRSTNAME, LASTNAME: ALFA
END;
SEX: (MAN, WOMAN, UNKNOWN);
BIRTHDAY: DATE;
CASE MARRIEDSTATUS: STATUS OF
MARRIED,
WIDOW: (MARRIAGEDATE: DATE);
DIVORCED: (DIVDATE: DATE;
NUMBEROFDIVORCES: INTEGER);
BACHELOR: (INDEPENDENT: BOOLEAN)
END (*PERSON*);
VAR REGISTER: FILE OF PERSON;
MSTATUS, CODE: ALFA;
FINISHED, OK: BOOLEAN;
OPCODE, ANSWER : CHAR;
RECORDNUMBER: INTEGER;
IOVAL: INTEGER;
(***************************************************)
(* GENERALLY USEFUL PROCEDURE THAT ILLUSTRATES HOW *)
(* THE EDIT PROCEDURE MAY BE USED TO EDIT INTEGERS *)
(* IF OPCODE<>'A' A NEW INTEGER IS ENTERED *)
(* IF OPCODE ='A' THE PRESENT CONTENTS OF THE *)
(* INTEGER ARE PRESENTED ON THE TERMINAL AND *)
(* EDITED BY THE USER *)
(***************************************************)
PROCEDURE ENTERINTEGER( INVITATION: TXT;
VAR NUMBER: INTEGER );
VAR SIZE,INDEX: INTEGER;
INTSTRING: STRING(6);
SIGN, CH: CHAR;
DIGITS, FINISHED: BOOLEAN;
BEGIN
INDEX := 18;
WHILE INVITATION(INDEX)=' ' DO INDEX:=INDEX-1;
WRITE( INVITATION:INDEX, ' ' );
INTSTRING := ' ';
IF OPCODE='A' THEN
BEGIN
INDEX:=0;
IF NUMBER<0 THEN
BEGIN
NUMBER:=-NUMBER;
INDEX:=1;
INTSTRING(1):='-'
END;
SIZE:=10000;
WHILE NUMBER<SIZE DO
SIZE := SIZE DIV 10;
REPEAT
BEGIN
INDEX:=INDEX+1;
INTSTRING(INDEX):= CHR( NUMBER DIV SIZE + ORD('0'));
NUMBER := NUMBER MOD SIZE;
SIZE := SIZE DIV 10;
END;
UNTIL SIZE=0;
END;
EDIT( INTSTRING:6 );
INDEX := 1;
FINISHED := FALSE;
DIGITS := FALSE;
SIGN := ' ';
NUMBER := 0;
REPEAT
BEGIN
CH := INTSTRING(INDEX);
IF CH IN (.'+','-'.) THEN
IF DIGITS OR (SIGN<>' ') THEN FINISHED:=TRUE
ELSE SIGN:= CH
ELSE
IF CH IN (.'0'..'9'.) THEN
BEGIN
NUMBER := NUMBER*10 + ORD(CH) - ORD('0');
DIGITS := TRUE
END
ELSE FINISHED:=TRUE;
INDEX := INDEX + 1;
END;
UNTIL FINISHED OR (INDEX>6);
IF SIGN='-' THEN NUMBER:=-NUMBER;
END (*ENTERINTEGER*);
PROCEDURE ENTERSTRING( INVITATION: TXT;
VAR EDITSTRING: ALFA;
LENGTH: INTEGER );
VAR INDEX: INTEGER;
BEGIN
INDEX:=18;
WHILE INVITATION(INDEX)=' ' DO INDEX:=INDEX-1;
WRITE( INVITATION:INDEX, ' ' );
IF OPCODE='C' THEN
BEGIN
FILLCHAR( EDITSTRING(1), LENGTH, ' ' );
(*$R-*) EDITSTRING(0) := CHR(LENGTH); (*$R+*)
END;
EDIT( EDITSTRING:LENGTH )
END (*ENTERSTRING*);
PROCEDURE ENTERDATE( INVITATION: TXT;
VAR EDITDATE: DATE );
VAR INDEX: INTEGER;
BEGIN
INDEX:= 18;
WHILE INVITATION(INDEX)=' ' DO INDEX:=INDEX-1;
WRITELN( INVITATION:INDEX );
WITH EDITDATE DO
BEGIN
ENTERINTEGER( 'DAY ', DAY );
ENTERINTEGER( 'MONTH ', MONTH );
ENTERINTEGER( 'YEAR ', YEAR );
END;
END (*ENTERDATE*);
PROCEDURE ENTERCOMMAND;
BEGIN
REPEAT
BEGIN
WRITE( 'OPERATION (C-CREATE, A-ALTER, E-END) ' );
WHILE EOLN DO READLN;
READ( OPCODE );
END;
UNTIL OPCODE IN (.'C','A','E'.);
END;
PROCEDURE ENTERSTATUS;
BEGIN
IF OPCODE='A' THEN
CASE REGISTER^.MARRIEDSTATUS OF
MARRIED: MSTATUS := 'MARRIED ';
WIDOW: MSTATUS := 'WIDOW ';
DIVORCED: MSTATUS := 'DIVORCED';
BACHELOR: MSTATUS := 'BACHELOR';
END
ELSE MSTATUS := ' ';
REPEAT
BEGIN
WRITE( 'ENTER MARRIED STATUS (M/W/D/B) ' );
EDIT( MSTATUS );
END;
UNTIL MSTATUS(1) IN (.'M','W','D','B'.);
END;
BEGIN
REWRITE( REGISTER, 'PERSDATA:P2:10' );
FINISHED := FALSE;
REPEAT
BEGIN
CLEARSCREEN;
OK := TRUE;
ENTERCOMMAND;
IF OPCODE<>'E' THEN
BEGIN
WRITELN;
WRITE( 'ENTER RECORD NUMBER ' );
READ( RECORDNUMBER );
SEEK( REGISTER, RECORDNUMBER );
IF IORESULT<>0 THEN
BEGIN
IOVAL:=IORESULT;
WRITE( 'ERROR ', IOVAL, ' WHEN LOOKING IN FILE' );
WRITE(' - STRIKE RETURN:');
READLN;
OK := FALSE
END;
IF OK AND (OPCODE='A') THEN
BEGIN
GET( REGISTER );
IF IORESULT<>0 THEN
BEGIN
WRITELN( 'ERROR ', IORESULT, ' WHEN READING RECORD');
OK := FALSE
END
ELSE SEEK( REGISTER, RECORDNUMBER );
END;
IF OK THEN
BEGIN
WITH REGISTER^,NAME DO
BEGIN
ENTERSTRING('FIRST NAME ', FIRSTNAME, 30 );
ENTERSTRING('LAST NAME ', LASTNAME, 30 );
CODE := ' ';
REPEAT
BEGIN
IF OPCODE='A' THEN
CASE SEX OF
MAN: CODE := 'M';
WOMAN: CODE := 'W';
UNKNOWN: CODE := 'U';
END;
ENTERSTRING('SEX (M/W/U) ', CODE, 1 );
END;
UNTIL CODE(1) IN (.'M','W','U'.);
CASE CODE(1) OF
'M': SEX := MAN;
'W': SEX := WOMAN;
'U': SEX := UNKNOWN;
END;
ENTERDATE( 'BIRTHDAY: ', BIRTHDAY );
ENTERSTATUS;
CASE MSTATUS(1) OF
'M','W': BEGIN
IF MSTATUS(1)='M' THEN MARRIEDSTATUS:=MARRIED
ELSE MARRIEDSTATUS:=WIDOW;
WRITE( 'DATE OF ');
ENTERDATE('MARRIAGE: ',MARRIAGEDATE);
END;
'D': BEGIN
MARRIEDSTATUS:=DIVORCED;
ENTERDATE('DATE OF DIVORCE: ', DIVDATE );
ENTERINTEGER('# OF DIVORCES ',NUMBEROFDIVORCES);
END;
'B': BEGIN
MARRIEDSTATUS:=BACHELOR;
REPEAT
BEGIN
WRITE('INDEPENDET (Y/N) ');
WHILE EOLN DO READLN;
READ( ANSWER )
END;
UNTIL ANSWER IN (.'Y','N'.);
INDEPENDENT := ANSWER = 'Y';
END;
END (* CASE MSTATUS *)
END (*WITH REGISTER^*);
PUT( REGISTER );
END (*IF OK*);
END (*OPKODE<>'E'*);
END (*REPEAT*) ;
UNTIL OPCODE='E';
WRITELN('FILETEST TERMINATED');
END (*FILETEST*).