{A NAME AND ADDRESS PROGRAM BY: CRAIG RUDLIN, M.D. 202 OVERLOOK ROAD RICHMOND, VIRGINIA 23229 VERSION 3.0} PROGRAM NAD; {$P} CONST CITY_ONE = 'RICHMOND '; STATE_ONE = 'VIRGINIA '; CITY_TWO = 'BOSTON '; STATE_TWO = 'MASS '; TYPE MAILING = RECORD NAME:ARRAY[1..30] OF CHAR; STREET_NUMBER:ARRAY[1..6] OF CHAR; STREET: ARRAY[1..20] OF CHAR; CITY: ARRAY[1..18] OF CHAR; STATE:ARRAY[1..10] OF CHAR; ZIP:ARRAY[1..10] OF CHAR; ATTENTION:ARRAY[1..30] OF CHAR; ACCT_NUMBER:ARRAY[1..4] OF CHAR; END; ALPHABET = RECORD START:INTEGER; FINISH:INTEGER; END; FA=FILE OF ALPHABET; F = FILE OF MAILING; $STRING80 = STRING 80; $STRING0 = STRING 0; $STRING255 = STRING 255; $STRING14 = STRING 14; TR = ARRAY [1..4] OF CHAR; VAR FIN: F; FALP:FA; COUNTER,I,N:INTEGER; INFORMATION: MAILING; NUMBER_OF_RECORDS: INTEGER; NA,ST_NO,ST,CIT,STA,ZI,ATT: $STRING80; COR_FLAG,FINISH,CONTINUE,NEWFILE,LISTING: BOOLEAN; ANSWER:CHAR; ALPFILE,SORTFILE,FILENAM:$STRING14; REC_NUMBER,END_OF_FILE:INTEGER; DESIRED_NAME:ARRAY[1..30] OF CHAR; DES_NAM:$STRING80; FOUND:BOOLEAN; CHANGE_RECORD,DELETE_RECORD,FIND_RECORD,ADD_TO_FILE:BOOLEAN; PROCEDURE SETLENGTH(VAR X: $STRING0; Y:INTEGER);EXTERNAL; FUNCTION LENGTH(X:$STRING255):INTEGER;EXTERNAL; PROCEDURE CLEAR_SCREEN; BEGIN WRITE (CHR(27),'*',CHR(0),CHR(0),CHR(0),CHR(0)); END; PROCEDURE ERASE_LINES(STARTING_LINE,NUMBER_OF_LINES:INTEGER); VAR I:INTEGER; BLANKS:STRING 80; BEGIN BLANKS:=' ';{40SPACES} FOR I:= 1 TO NUMBER_OF_LINES DO BEGIN WRITE(CHR(27),'=',CHR(STARTING_LINE+31),CHR(32),BLANKS,BLANKS); STARTING_LINE:=STARTING_LINE + 1; END END; PROCEDURE MOVE_CURSOR (X,Y:INTEGER); BEGIN WRITE(CHR(27),'=',CHR(Y+31),CHR(X+31)); END; PROCEDURE PROMPT (X,Y,LENGTH:INTEGER; P:$STRING80; PROTECTED_FIELD_DESIRED:BOOLEAN); VAR UNDERLINE:STRING 80; I:INTEGER; BEGIN UNDERLINE:='_'; FOR I:= 1 TO LENGTH DO APPEND(UNDERLINE,'_'); IF PROTECTED_FIELD_DESIRED = FALSE THEN WRITE(CHR(27),'=',CHR(Y+31),CHR(X+31),P,UNDERLINE) ELSE WRITE(CHR(27),'=',CHR(Y+31),CHR(X+31),')',P, UNDERLINE,CHR(27),'('); END; FUNCTION INPUT_DATA (X,Y,LEN:INTEGER; ALPHANUMERIC:BOOLEAN; MAXIMUM_VALUE,MINIMUM_VALUE:REAL):$STRING80; VAR DATA,BLANKS:$STRING80; I:INTEGER; PROCEDURE CORRECT(X,Y:INTEGER); VAR I,A,B:INTEGER; BEGIN ERASE_LINES(20,2); WRITE (CHR(7)); MOVE_CURSOR (1,20); IF (ALPHANUMERIC = TRUE) AND (LENGTH(DATA)>LEN) THEN WRITE('TERM TOO LONG'); MOVE_CURSOR(X,Y); WRITE(' '); A:=X; B:=Y; FOR I:= 1 TO LENGTH(DATA) DO BEGIN MOVE_CURSOR(A,B); WRITE(' '); A:=A+1; END; MOVE_CURSOR(X,Y); WRITE('_'); A:=X; B:=Y; FOR I:= 1 TO (LEN-1) DO BEGIN MOVE_CURSOR(A,B); WRITE('_'); A:=A+1; END; MOVE_CURSOR(X,Y); READ(DATA); ERASE_LINES(20,1); END; BEGIN BLANKS:=' ';{40SPACES} MOVE_CURSOR(X,Y); READ(DATA); WHILE(ALPHANUMERIC = TRUE) AND (LENGTH(DATA) > LEN) DO CORRECT(X,Y); IF LENGTH(DATA) = 0 THEN BEGIN DATA:=' '; FOR I:=1 TO (LEN-1) DO APPEND(DATA,' '); END; IF LENGTH(DATA) < LEN THEN FOR I:= LENGTH(DATA) TO LEN DO APPEND(DATA,' '); INPUT_DATA:=DATA; END; {************ PROCEDURE TO DETERMINE NUMBER RECORDS IN FILE ******} PROCEDURE NUMBER_RECORDS(FILENAM:$STRING14); BEGIN RESET(FILENAM,FIN); WITH INFORMATION DO BEGIN READ(FIN:1,INFORMATION); NUMBER_OF_RECORDS:=(((ORD(ACCT_NUMBER[1])-48)*1000)+ ((ORD(ACCT_NUMBER[2])-48)*100)+ ((ORD(ACCT_NUMBER[3])-48)*10)+ ((ORD(ACCT_NUMBER[4])-48)*1)); END; {OF WITH} END; {OF PROCEDURE} {********** DETERMINE THE CURRENT NUMBER OF RECORDS *******} PROCEDURE CALC_ACCT_NO(CURRENT_NUMBER_OF_RECORDS:INTEGER); VAR ONES,TENS,HUNDREDS,THOUSANDS:CHAR; O,T,H,TH:INTEGER; BEGIN O:=0; T:=0; H:=0; TH:=0; WITH INFORMATION DO BEGIN IF CURRENT_NUMBER_OF_RECORDS < 10 THEN BEGIN ONES:=CHR(CURRENT_NUMBER_OF_RECORDS + 48); ACCT_NUMBER[1]:='0'; ACCT_NUMBER[2]:='0'; ACCT_NUMBER[3]:='0'; ACCT_NUMBER[4]:=ONES; END; {IF} IF CURRENT_NUMBER_OF_RECORDS = 10 THEN ACCT_NUMBER:='0010'; IF CURRENT_NUMBER_OF_RECORDS = 100 THEN ACCT_NUMBER:='0100'; IF CURRENT_NUMBER_OF_RECORDS = 1000 THEN ACCT_NUMBER:='1000'; IF (CURRENT_NUMBER_OF_RECORDS < 100) AND (CURRENT_NUMBER_OF_RECORDS > 10) THEN BEGIN WHILE (CURRENT_NUMBER_OF_RECORDS < 100) AND (CURRENT_NUMBER_OF_RECORDS > 10) DO {FOR VALUE 1-99} BEGIN CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS-10; T:=T+1; IF CURRENT_NUMBER_OF_RECORDS < 10 THEN BEGIN ONES:= CHR(CURRENT_NUMBER_OF_RECORDS + 48); TENS:=CHR(T+48); ACCT_NUMBER[1]:='0'; ACCT_NUMBER[2]:='0'; ACCT_NUMBER[3]:=TENS; ACCT_NUMBER[4]:=ONES; END; {IF} END; {WHILE} END; {OF IF} IF (CURRENT_NUMBER_OF_RECORDS < 10000) AND (CURRENT_NUMBER_OF_RECORDS > 100) THEN BEGIN IF CURRENT_NUMBER_OF_RECORDS < 1000 THEN THOUSANDS:='0'; BEGIN WHILE (CURRENT_NUMBER_OF_RECORDS < 10000) AND (CURRENT_NUMBER_OF_RECORDS >= 1000) DO BEGIN CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS - 1000; TH:=TH+1; IF CURRENT_NUMBER_OF_RECORDS < 1000 THEN THOUSANDS:=CHR(TH+48); END; IF CURRENT_NUMBER_OF_RECORDS < 100 THEN HUNDREDS:='0'; WHILE (CURRENT_NUMBER_OF_RECORDS < 1000) AND (CURRENT_NUMBER_OF_RECORDS >= 100) DO BEGIN CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS-100; H:=H+1; IF CURRENT_NUMBER_OF_RECORDS < 100 THEN HUNDREDS:=CHR(H+48); END; IF CURRENT_NUMBER_OF_RECORDS < 10 THEN TENS:='0'; WHILE (CURRENT_NUMBER_OF_RECORDS < 100) AND (CURRENT_NUMBER_OF_RECORDS >= 10) DO BEGIN CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS-10; T:=T+1; IF CURRENT_NUMBER_OF_RECORDS < 10 THEN TENS:=CHR(T+48); END; ONES:=CHR(CURRENT_NUMBER_OF_RECORDS+48); END; ACCT_NUMBER[1]:=THOUSANDS; ACCT_NUMBER[2]:=HUNDREDS; ACCT_NUMBER[3]:=TENS; ACCT_NUMBER[4]:=ONES; IF CURRENT_NUMBER_OF_RECORDS = 10 THEN ACCT_NUMBER:='0010'; IF CURRENT_NUMBER_OF_RECORDS = 100 THEN ACCT_NUMBER:='0100'; IF CURRENT_NUMBER_OF_RECORDS = 1000 THEN ACCT_NUMBER:='1000'; END; {OF IF} END; {OF WITH INFORMATION DO} END; {OF PROCEDURE} {******************** PRINT THE FILE ********************} PROCEDURE PRINT_FILE(FILENAM:$STRING14); TYPE C = FILE OF CHAR; VAR CONTINUE,ANSWER:CHAR; AC,HARDCOPY: BOOLEAN; FOUT: C; COUNTER:INTEGER; BEGIN CLEAR_SCREEN; REPEAT WRITELN; WRITE ('DO YOU WANT THE ACCOUNT NUMBER INCLUDED IN THE PRINT OUT? Y/N '); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN AC:=TRUE ELSE AC:=FALSE; REPEAT WRITELN; WRITE ('DO YOU WANT A HARDCOPY OF THE FILE? Y/N '); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN BEGIN HARDCOPY:=TRUE; REWRITE('LST:',FOUT); WRITELN('PREPARE PRINTER TO RECEIVE LISTING.'); WRITELN('WHEN READY, TYPE A CARRIAGE RETURN.'); READ(ANSWER); CLEAR_SCREEN; WRITELN('FILE IS NOW BEING PRINTED.'); END; IF ANSWER = 'N' THEN HARDCOPY:= FALSE; RESET(FILENAM,FIN); CLEAR_SCREEN; NUMBER_RECORDS(FILENAM); WITH INFORMATION DO BEGIN COUNTER:=0; FOR I:= 2 TO NUMBER_OF_RECORDS DO BEGIN READ(FIN:I,INFORMATION); IF NAME <> 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' THEN {DO'NT PRINT DELETED RECORDS} BEGIN IF HARDCOPY = FALSE THEN BEGIN WRITELN; WRITELN (NAME); WRITELN(STREET_NUMBER,' ',STREET); WRITELN(CITY,' ',STATE,' ',ZIP); WRITELN; COUNTER:=COUNTER+5; IF ATTENTION <> ' ' THEN BEGIN WRITELN('ATT: ',ATTENTION); COUNTER:=COUNTER+1; END; {OF THIS IF} IF AC = TRUE THEN BEGIN WRITELN; WRITELN('ACCOUNT NUMBER: ',ACCT_NUMBER); COUNTER:=COUNTER+1; END; IF COUNTER >= 21 THEN BEGIN PROMPT(1,23,0,'ENTER ANY CHARACTER TO CONTINUE',FALSE); READ(CONTINUE); ERASE_LINES(23,1); COUNTER:=0; END; END; {FOR HARDCOPY = FALSE} IF HARDCOPY = TRUE THEN BEGIN WRITELN(FOUT,NAME); WRITELN(FOUT,STREET_NUMBER,' ',STREET); WRITELN(FOUT,CITY,' ',STATE,' ',ZIP); WRITELN(FOUT,' '); IF ATTENTION <> ' ' THEN WRITELN(FOUT,'ATT: ',ATTENTION); IF AC = TRUE THEN BEGIN WRITELN(FOUT,' '); WRITELN(FOUT,'ACCOUNT NUMBER: ',ACCT_NUMBER); WRITELN(FOUT,' '); END; IF AC = FALSE THEN WRITELN(FOUT,' '); WRITELN(FOUT,' '); END; {FOR HARDCOPY = TRUE} END; {OF NAME <> ZZZZZZ..} END; {FOR LOOP} END; {THIS IS FOR WITH STATEMENTS} IF HARDCOPY = FALSE THEN BEGIN ERASE_LINES(22,2); MOVE_CURSOR(1,22); WRITE('ENTER A CARRIAGE RETURN TO CONTINUE PROGRAM'); READ(ANSWER); END; END; {OF PROCEDURE} {***************** CREATING THE FIRST RECORD OF FILE *******} PROCEDURE CREATE_FIRST_RECORD (ACTNO: TR); BEGIN IF (NEWFILE = TRUE) AND (CONTINUE = TRUE) THEN REWRITE(FILENAM,FIN); WITH INFORMATION DO BEGIN NAME:=' '; STREET_NUMBER:=' '; STREET:=' '; CITY:=' '; STATE:=' '; ZIP:=' '; ATTENTION:='FIRST RECORD OF FILE '; IF (NEWFILE = TRUE) AND (CONTINUE = TRUE) THEN ACCT_NUMBER:='0001'; IF (NEWFILE = TRUE) AND (CONTINUE = FALSE) THEN ACCT_NUMBER:=ACTNO; IF NEWFILE = FALSE THEN ACCT_NUMBER:= ACTNO; WRITE(FIN:1,INFORMATION); END; {WITH LOOP} END; {OF PROCEDURE} {************** ENTER THE NAME OF THE FILE *****************} PROCEDURE ENTER_FILE_NAME; VAR ERROR:BOOLEAN; BEGIN REPEAT NEWFILE:=FALSE; ERROR:=FALSE; CLEAR_SCREEN; WRITELN(' ENTER THE FILE NAME AS: DRIVE: NAME. EXTENSION'); WRITELN; WRITELN(' WHERE DRIVE IS A SINGLE LETTER--EITHER A OR B'); WRITELN(' NAME IS UP TO 8 LETTERS OR SPACES'); WRITELN(' EXTENSION MUST HAVE 3 LETTERS OR SPACES'); WRITELN; READLN(FILENAM); RESET(FILENAM,FIN); IF EOF(FIN) THEN BEGIN REPEAT MOVE_CURSOR(1,10); WRITE('FILE NOT FOUND. IS THIS A NEW FILE? Y/N'); READ (ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'N' THEN ERROR:=TRUE; IF ANSWER = 'Y' THEN NEWFILE:=TRUE ELSE NEWFILE:=FALSE; IF NEWFILE = TRUE THEN CREATE_FIRST_RECORD('0001'); END; {OF IF EOF} UNTIL ERROR = FALSE; IF NEWFILE = TRUE THEN COUNTER:= 2; IF NEWFILE = FALSE THEN BEGIN NUMBER_RECORDS(FILENAM); COUNTER:=NUMBER_OF_RECORDS + 1; END; END; {OF PROCEDURE} {*********** PROCEDURE TO CORRECT INCORRECT ENTRY ************} PROCEDURE MISTAKE; VAR WRONG:CHAR; BEGIN WITH INFORMATION DO BEGIN ERASE_LINES(12,9); PROMPT(1,12,0,'ENTER NUMBER OF INCORRECT INFORMATION',FALSE); PROMPT(1,14,0,'1-NAME ',FALSE); PROMPT(1,15,0,'2-# ',FALSE); PROMPT(1,16,0,'3-STREET ',FALSE); PROMPT(1,17,0,'4-CITY ',FALSE); PROMPT(1,18,0,'5-STATE ',FALSE); PROMPT(1,19,0,'6-ZIP ',FALSE); PROMPT(1,20,0,'7-ATTENTION ',FALSE); PROMPT(1,21,0,'8-ALL INFORMATION IS CORRECT AS DISPLAYED ',FALSE); REPEAT MOVE_CURSOR(50,16); READ(WRONG); CASE WRONG OF '1':BEGIN PROMPT(1,3,30,'NAME',FALSE); NA:=INPUT_DATA(6,3,30,TRUE,0,0); FOR I:= 1 TO 30 DO NAME[I]:=NA[I]; END; '2': BEGIN PROMPT(1,5,6,'#: ',FALSE); ST_NO:=INPUT_DATA(4,5,6,TRUE,0,0); FOR I:= 1 TO 6 DO STREET_NUMBER[I]:=ST_NO[I]; END; '3': BEGIN PROMPT(10,5,20,'STREET:',FALSE); ST:=INPUT_DATA(19,5,20,TRUE,0,0); FOR I:= 1 TO 20 DO STREET[I]:=ST[I]; END; '4': BEGIN PROMPT(1,7,10,'CITY: ',FALSE); CIT:=INPUT_DATA(7,7,18,TRUE,0,0); IF (CIT[1] <> '7') AND (CIT[1] <> '8') THEN FOR I:= 1 TO 18 DO CITY[I]:=CIT[I]; IF CIT[1] = '7' THEN {DEFAULT TO FIRST VALUE, E.G. RICHMOND,VA.} BEGIN CITY:=CITY_ONE; STATE:=STATE_ONE; PROMPT(7,7,0,CITY_ONE,FALSE); PROMPT(35,7,0,STATE_ONE,FALSE); END; IF CIT[1] = '8' THEN {DEFAULT TO SECOND VALUE} BEGIN CITY:=CITY_TWO; STATE:=STATE_TWO; PROMPT(7,7,0,CITY_TWO,FALSE); PROMPT(35,7,0,STATE_TWO,FALSE); END; END; '5': BEGIN PROMPT(28,7,10,'STATE: ',FALSE); STA:=INPUT_DATA(35,7,10,TRUE,0,0); FOR I:= 1 TO 10 DO STATE[I]:=STA[I]; END; '6': BEGIN PROMPT(48,7,10,'ZIP: ',FALSE); ZI:= INPUT_DATA(54,7,10,TRUE,0,0); FOR I:= 1 TO 10 DO ZIP[I]:=ZI[I]; END; '7': BEGIN PROMPT(1,9,30,'ATTENTION: ',FALSE); ATT:=INPUT_DATA(12,9,30,TRUE,0,0); FOR I:= 1 TO 30 DO ATTENTION[I]:=ATT[I]; END; END; {OF CASE} UNTIL WRONG = '8'; END; {OF WITH INFORMATION} ERASE_LINES(10,12); END; {OF PROCEDURE} {***************** OFFER A LISTING OF THE FILE **************} PROCEDURE OFFER_LISTING(FILENAM:$STRING14); BEGIN REPEAT ERASE_LINES(20,1); PROMPT(1,20,1,'DO YOU WANT A LISTING OF THE FILE? Y/N ',FALSE); MOVE_CURSOR(50,20); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN PRINT_FILE(FILENAM); END; {OF PROCEDURE} {******* PROC TO GET INFORMATION & PUT INFORMATION INTO FILE ******} PROCEDURE ENTER_INFORMATION; BEGIN WITH INFORMATION DO BEGIN CLEAR_SCREEN; PROMPT(1,3,30,'NAME',FALSE); PROMPT(1,5,6,'#: ',FALSE); PROMPT(10,5,20,'STREET: ',FALSE); PROMPT(1,7,18,'CITY: ',FALSE); PROMPT(28,7,10,'STATE: ',FALSE); PROMPT(48,7,10,'ZIP: ',FALSE); PROMPT(1,9,30,'ATTENTION: ',FALSE); MOVE_CURSOR(1,22); WRITE('ENTERING EXIT FOR THE NAME TERMINATES THIS PROCEDURE'); MOVE_CURSOR(1,23); WRITE('DEFAULT VALUES FOR CITY AND STATE ARE:'); MOVE_CURSOR(40,23); WRITE('7 = RICHMOND,VA. 8 = BOSTON,MASS.'); NA:=INPUT_DATA(6,3,30,TRUE,0,0); FOR I:= 1 TO 30 DO NAME[I]:=NA[I]; IF NAME <> 'EXIT ' THEN BEGIN ST_NO:=INPUT_DATA(4,5,6,TRUE,0,0); ST:=INPUT_DATA(19,5,20,TRUE,0,0); CIT:=INPUT_DATA(7,7,18,TRUE,0,0); IF (CIT[1] <> '7') AND (CIT[1] <> '8') THEN STA:=INPUT_DATA(35,7,10,TRUE,0,0); IF CIT[1] = '7' THEN {DEFAULT TO VALUE ONE, E.G. RICHMOND,VA.} BEGIN CITY:=CITY_ONE; STATE:=STATE_ONE; PROMPT(7,7,0,CITY_ONE,FALSE); PROMPT(35,7,0,STATE_ONE,FALSE); END; IF CIT[1] = '8' THEN {DEFAULT TO VALUE TWO} BEGIN CITY:=CITY_TWO; STATE:=STATE_TWO; PROMPT(7,7,0,CITY_TWO,FALSE); PROMPT(35,7,0,STATE_TWO,FALSE); END; ZI:=INPUT_DATA(54,7,10,TRUE,0,0); ATT:=INPUT_DATA(12,9,30,TRUE,0,0); FOR I:= 1 TO 30 DO NAME[I]:=NA[I]; FOR I:= 1 TO 6 DO STREET_NUMBER[I]:=ST_NO[I]; FOR I:= 1 TO 20 DO STREET[I]:=ST[I]; IF (CIT[1] <> '7') AND (CIT[1] <> '8') THEN BEGIN FOR I:= 1 TO 18 DO CITY[I]:=CIT[I]; FOR I:= 1 TO 10 DO STATE[I]:=STA[I]; END; FOR I:= 1 TO 10 DO ZIP[I]:=ZI[I]; FOR I:= 1 TO 30 DO ATTENTION[I]:=ATT[I]; CALC_ACCT_NO(COUNTER); REPEAT PROMPT(1,20,1,'IS INFORMATION CORRECT AS ENTERED? Y/N',FALSE); MOVE_CURSOR(50,20); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'N' THEN MISTAKE; END;{OF IF NOT EQUAL TO 'EXIT'} IF NAME <> 'EXIT ' THEN BEGIN WRITE(FIN:COUNTER,INFORMATION); COUNTER:=COUNTER+1; END; {OF IF NAME NOT EQUAL TO 'EXIT'} END; {OF WITH} END; {OF PROCEDURE} {************************* MENU ******************************} PROCEDURE MENU; VAR ANSWER:INTEGER; BEGIN CLEAR_SCREEN; CHANGE_RECORD:=FALSE; DELETE_RECORD:=FALSE; FIND_RECORD:=FALSE; ADD_TO_FILE:=FALSE; LISTING:=FALSE; MOVE_CURSOR(12,2); WRITELN(' SELECT ONE PROCEDURE, AND ENTER CORRESPONDING NUMBER'); WRITELN; WRITELN('1- CREATE A NEW, OR ADD TO AN EXISTING, NAME & ADDRESS FILE'); WRITELN('2- CHANGE OR CORRECT A RECORD IN AN EXISTING NAME & ADDRESS FILE'); WRITELN('3- DELETE A RECORD FROM AN EXISTING NAME & ADDRESS FILE'); WRITELN('4- DETERMINE IF A PARTICULAR NAME ALREADY EXISTS IN THE FILE'); WRITELN('5- LIST THE NAME & ADDRESS FILE ON EITHER THE CRT OR PRINTER'); WRITELN; WRITELN; REPEAT WRITE('YOUR SELECTION, PLEASE: '); READ(ANSWER); UNTIL (ANSWER < 6) AND (ANSWER > 0); CASE ANSWER OF 1: ADD_TO_FILE:= TRUE; 2: CHANGE_RECORD:=TRUE; 3: DELETE_RECORD:=TRUE; 4: FIND_RECORD:=TRUE; 5: LISTING:=TRUE; END; {OF CASE} CLEAR_SCREEN; END; {OF PROCEDURE MENU} {******************* ADD TO A NEW OR EXISTING FILE **************} PROCEDURE ADD(FILENAM:$STRING14); BEGIN WITH INFORMATION DO BEGIN REPEAT ENTER_INFORMATION; UNTIL NAME = 'EXIT '; CONTINUE:=FALSE; CALC_ACCT_NO(COUNTER - 1); CREATE_FIRST_RECORD(ACCT_NUMBER); END; {OF WITH INFORMATION} END; {OF PROCEDURE} {******************** FIND A NAME IN THE FILE *******************} PROCEDURE FIND(FILENAM:$STRING14; FLAG:INTEGER); VAR FINISHED:BOOLEAN; I,LINE_COUNTER:INTEGER; LOCALIZERS:ALPHABET; LINE_FLAG:BOOLEAN; FIRST_LETTER:INTEGER; BEGIN REPEAT FINISHED:=TRUE; REC_NUMBER:=1; FOUND:=FALSE; END_OF_FILE:=COUNTER -1; {COUNTER WAS SET = NUMBER_OF_RECORDS + 1 IN THE ENTER_FILE_NAME PROCEDURE} CLEAR_SCREEN; MOVE_CURSOR(2,2); IF FLAG = 1 THEN WRITELN(' PROCEDURE TO DETERMINE IF A NAME IS PRESENT IN FILE ', FILENAM) ELSE IF FLAG = 2 THEN WRITELN(' PROCEDURE TO FIND AND CHANGE A RECORD') ELSE IF FLAG = 3 THEN WRITELN(' PROCEDURE TO FIND AND DELETE A RECORD'); PROMPT(1,4,30,'ENTER THE NAME YOU WISH TO LOCATE',FALSE); DES_NAM:=INPUT_DATA(35,4,30,TRUE,0,0); FOR I:= 1 TO 30 DO DESIRED_NAME[I]:=DES_NAM[I]; CLEAR_SCREEN; PROMPT(2,12,0,'PROGRAM NOW SEARCHING FILE. ONE MOMENT PLEASE.',FALSE); RESET(FILENAM,FIN); I:=1; WHILE FILENAM[I] <> '.' DO BEGIN ALPFILE[I]:=FILENAM[I]; I:=I+1; END; ALPFILE[I]:='.'; ALPFILE[I+1]:='A'; ALPFILE[I+2]:='L'; ALPFILE[I+3]:='P'; IF (I+4) < 14 THEN BEGIN I:=I+4; FOR N:= I TO 14 DO ALPFILE[N]:=' '; END; RESET(ALPFILE,FALP); WITH LOCALIZERS DO BEGIN FIRST_LETTER:=ORD(DESIRED_NAME[1]) - 64; READ(FALP:FIRST_LETTER,LOCALIZERS); WITH INFORMATION DO BEGIN I:=START; REPEAT READ(FIN:I,INFORMATION); IF DESIRED_NAME = NAME THEN BEGIN FOUND:=TRUE; REC_NUMBER:=I; ERASE_LINES(12,1); PROMPT(1,1,0,'INFORMATION AS FOUND IN FILE: ',FALSE); PROMPT(1,3,0,'NAME: ',FALSE); PROMPT(1,5,0,'#: ',FALSE); PROMPT(10,5,0,'STREET: ',FALSE); PROMPT(1,7,0,'CITY: ',FALSE); PROMPT(28,7,0,'STATE: ',FALSE); PROMPT(48,7,0,'ZIP: ',FALSE); PROMPT(1,9,0,'ATTENTION: ',FALSE); MOVE_CURSOR(6,3); WRITE(NAME); MOVE_CURSOR(4,5); WRITE(STREET_NUMBER); MOVE_CURSOR(19,5); WRITE(STREET); MOVE_CURSOR(7,7); WRITE(CITY); MOVE_CURSOR(35,7); WRITE(STATE); MOVE_CURSOR(54,7); WRITE(ZIP); MOVE_CURSOR(12,9); WRITE(ATTENTION); END; I:=I+1; UNTIL (I > FINISH) OR (FOUND = TRUE); IF FOUND = FALSE THEN BEGIN ERASE_LINES(12,1); PROMPT(2,12,0,'NAME AS ENTERED NOT FOUND IN FILE.',FALSE); REPEAT MOVE_CURSOR(2,14); WRITE('WOULD YOU LIKE A LIST OF NAMES BEGINNING WITH ', DESIRED_NAME[1],' ? Y/N'); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN BEGIN CLEAR_SCREEN; LINE_COUNTER:=1; FOR I:=START TO FINISH DO BEGIN READ(FIN:I,INFORMATION); IF LINE_COUNTER < 15 THEN BEGIN MOVE_CURSOR(2,LINE_COUNTER); WRITE(NAME); END; IF (LINE_COUNTER >=15) AND (LINE_COUNTER < 30) THEN BEGIN MOVE_CURSOR(45,LINE_COUNTER-14); WRITE(NAME); END; IF LINE_COUNTER >= 30 THEN BEGIN PROMPT(2,23,0,'ENTER A CARRIAGE RETURN TO CONTINUE ',FALSE); READ(ANSWER); CLEAR_SCREEN; LINE_COUNTER:=0; END; LINE_COUNTER:=LINE_COUNTER + 1; END; {FOR I = START TO FINISH OF LISTING} END; {OF IF ANSWER = Y} ERASE_LINES(22,2); PROMPT(2,23,0,'ENTER A CARRIAGE RETURN TO CONTINUE',FALSE); READ(ANSWER); CLEAR_SCREEN; END; {OF FOUND = FALSE} END; {OF WITH INFORMATION} END; {OF LOCALIZERS} IF FLAG = 1 THEN BEGIN ERASE_LINES(22,1); REPEAT MOVE_CURSOR(1,22); WRITE('DO YOU WISH TO FIND ANOTHER RECORD IN FILE ',FILENAM,' Y/N?'); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN FINISHED:=FALSE ELSE FINISHED:=TRUE; END; {OF IF FLAG = 1} UNTIL FINISHED = TRUE; END; {OF PROCEDURE} {******************** DELETE A RECORD **************************} PROCEDURE DELETE(FILENAM:$STRING14); VAR FINISH:BOOLEAN; BEGIN REPEAT WITH INFORMATION DO BEGIN FIND(FILENAM,3); IF FOUND = TRUE THEN BEGIN RESET(FILENAM,FIN); REPEAT MOVE_CURSOR(1,22); WRITE('IS IT OK TO DELETE THIS RECORD? Y/N'); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN BEGIN ERASE_LINES(22,1); MOVE_CURSOR(1,22); WRITE('RECORD HAS BEEN DELETED.'); NAME:='ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'; STREET_NUMBER:=' '; STREET:=' '; CITY:=' '; STATE:=' '; ZIP:=' '; ATTENTION:=' '; ACCT_NUMBER:=' '; WRITE(FIN:REC_NUMBER,INFORMATION); END; {OF ANSWER = Y} END; {OF FOUND = TRUE} IF FOUND = FALSE THEN WRITELN('NO DELETION OCCURRED.'); END; {OF WITH INFORMATION} ERASE_LINES(22,1); REPEAT MOVE_CURSOR(1,22); WRITE('DO YOU WISH TO DELETE ANOTHER RECORD FROM FILE ',FILENAM,' Y/N'); READ(ANSWER) UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN FINISH:= FALSE ELSE FINISH:=TRUE; UNTIL FINISH = TRUE; END; {OF PROCEDURE} {****************** PROCEDURE TO CHANGE A RECORD IN FILE ***********} PROCEDURE CHANGE(FILENAM:$STRING14); VAR FINISH:BOOLEAN; BEGIN REPEAT WITH INFORMATION DO BEGIN FIND(FILENAM,2); IF FOUND = TRUE THEN BEGIN RESET(FILENAM,FIN); MISTAKE; WRITE(FIN:REC_NUMBER,INFORMATION); MOVE_CURSOR(1,23); WRITELN('RECORD HAS BEEN MODIFIED AS DESIRED'); END; {OF WITH INFORMATION} END; {OF IF FOUND = TRUE} REPEAT ERASE_LINES(22,1); MOVE_CURSOR(1,22); WRITE('DO YOU WISH TO CHANGE ANOTHER RECORD IN FILE ',FILENAM,' Y/N?'); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN FINISH:=FALSE ELSE FINISH:=TRUE; UNTIL FINISH = TRUE; END; {OF PROCEDURE} {*************** OFFER A CHANCE TO GO BACK TO MENU *************} PROCEDURE AGAIN; BEGIN CLEAR_SCREEN; REPEAT PROMPT(2,10,0,'WOULD YOU LIKE TO CHOOSE FROM THE MENU, AGAIN? Y/N ',FALSE); PROMPT(2,12,0,'ENTERING AN N WILL TERMINATE THE PROGRAM.',FALSE); MOVE_CURSOR(54,10); READ(ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN FINISH:= FALSE ELSE FINISH:=TRUE; END; {OF PROCEDURE} {**************** MAIN PROGRAM BEGINS HERE ******************} BEGIN FINISH:=FALSE; REPEAT MENU; CONTINUE:=TRUE; ENTER_FILE_NAME; IF CHANGE_RECORD = TRUE THEN CHANGE(FILENAM); IF DELETE_RECORD = TRUE THEN DELETE(FILENAM); IF FIND_RECORD = TRUE THEN FIND(FILENAM,1); IF ADD_TO_FILE = TRUE THEN ADD(FILENAM); IF LISTING = TRUE THEN OFFER_LISTING(FILENAM); IF (ADD_TO_FILE = TRUE) OR (DELETE_RECORD = TRUE) THEN BEGIN CLEAR_SCREEN; PROMPT(2,10,0,'WHEN THE CP/M PROMPT A> APPEARS, TYPE:',FALSE); PROMPT(16,12,0,'ALPHABET',FALSE); PROMPT(2,14,0,'THIS WILL RUN THE PROGRAM TO ALPHABETIZE THE FILE',FALSE); PROMPT(2,15,0,'AND ESTABLISH THE FILE OF POINTERS. THANK YOU.',FALSE); FINISH:= TRUE; END; IF (ADD_TO_FILE = FALSE) AND (DELETE_RECORD = FALSE) THEN AGAIN; UNTIL FINISH = TRUE; END. .