PROGRAM NAD; {$P} 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..10] 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; BLANKS: ARRAY[1..8] OF CHAR; END; 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; COUNTER,I,N:INTEGER; INFORMATION: MAILING; NUMBER_OF_RECORDS: INTEGER; NA,ST_NO,ST,CIT,STA,ZI,ATT: $STRING80; CONTINUE,NEWFILE: BOOLEAN; ANSWER:CHAR; FILENAM:$STRING14; 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:=1; T:=1; H:=1; TH:=1; 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 < 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 > 10) THEN BEGIN WHILE (CURRENT_NUMBER_OF_RECORDS < 10000) AND (CURRENT_NUMBER_OF_RECORDS > 10) DO {FOR VALUE 1 - 9999} 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; 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; 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 BEGIN TENS:=CHR(T+48); ONES:=CHR(CURRENT_NUMBER_OF_RECORDS+48); END; END; ACCT_NUMBER[1]:=THOUSANDS; ACCT_NUMBER[2]:=HUNDREDS; ACCT_NUMBER[3]:=TENS; ACCT_NUMBER[4]:=ONES; END; {OF WHILE} 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 ANSWER:CHAR; AC,HARDCOPY: BOOLEAN; FOUT: C; BEGIN CLEAR_SCREEN; 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); END; IF ANSWER = 'N' THEN HARDCOPY:= FALSE; 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; RESET(FILENAM,FIN); CLEAR_SCREEN; NUMBER_RECORDS(FILENAM); WITH INFORMATION DO BEGIN FOR I:= 2 TO NUMBER_OF_RECORDS DO BEGIN READ(FIN:I,INFORMATION); IF HARDCOPY = FALSE THEN BEGIN WRITELN; WRITELN (NAME); WRITELN(STREET_NUMBER,' ',STREET); WRITELN(CITY,' ',STATE,' ',ZIP); WRITELN; IF ATTENTION <> ' ' THEN WRITELN('ATT: ',ATTENTION); IF AC = TRUE THEN BEGIN WRITELN; WRITELN('ACCOUNT NUMBER: ',ACCT_NUMBER); END; END; {FOR HARDCOPY = FALSE} IF HARDCOPY = TRUE THEN BEGIN WRITELN(FOUT,' '); 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); END; END; {FOR HARDCOPY = TRUE} END; {FOR LOOP} END; {THIS IS FOR WITH STATEMENTS} 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:='FIRST RECORD OF FILE '; STREET_NUMBER:=' '; STREET:=' '; CITY:=' '; STATE:=' '; ZIP:=' '; ATTENTION:=' '; 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; BLANKS:=' '; WRITE(FIN:1,INFORMATION); END; {WITH LOOP} END; {OF PROCEDURE} {************** ENTER THE NAME OF THE FILE *****************} PROCEDURE ENTER_FILE_NAME; BEGIN 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); REPEAT MOVE_CURSOR(1,10); WRITE('IS THIS A NEW FILE? Y/N'); READ (ANSWER); UNTIL (ANSWER = 'Y') OR (ANSWER = 'N'); IF ANSWER = 'Y' THEN NEWFILE:=TRUE ELSE NEWFILE:=FALSE; IF NEWFILE = TRUE THEN CREATE_FIRST_RECORD('0001'); END; {OF PROCEDURE} {*********** PROCEDURE TO CORRECT INCORRECT ENTRY ************} PROCEDURE MISTAKE; VAR WRONG:CHAR; BEGIN WITH INFORMATION DO BEGIN ERASE_LINES(10,12); 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,2,30,'NAME',FALSE); NA:=INPUT_DATA(6,2,30,TRUE,0,0); FOR I:= 1 TO 30 DO NAME[I]:=NA[I]; END; '2': BEGIN PROMPT(1,4,6,'#: ',FALSE); ST_NO:=INPUT_DATA(4,4,6,TRUE,0,0); FOR I:= 1 TO 6 DO STREET_NUMBER[I]:=ST_NO[I]; END; '3': BEGIN PROMPT(10,4,20,'STREET:',FALSE); ST:=INPUT_DATA(19,4,20,TRUE,0,0); FOR I:= 1 TO 20 DO STREET[I]:=ST[I]; END; '4': BEGIN PROMPT(1,6,10,'CITY: ',FALSE); CIT:=INPUT_DATA(7,6,10,TRUE,0,0); FOR I:= 1 TO 10 DO CITY[I]:=CIT[I]; END; '5': BEGIN PROMPT(20,6,10,'STATE: ',FALSE); STA:=INPUT_DATA(27,6,10,TRUE,0,0); FOR I:= 1 TO 10 DO STATE[I]:=STA[I]; END; '6': BEGIN PROMPT(40,6,10,'ZIP: ',FALSE); ZI:= INPUT_DATA(46,6,10,TRUE,0,0); FOR I:= 1 TO 10 DO ZIP[I]:=ZI[I]; END; '7': BEGIN PROMPT(1,8,30,'ATTENTION: ',FALSE); ATT:=INPUT_DATA(12,8,29,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} {**************** MAIN PROGRAM BEGINS HERE ******************} BEGIN CONTINUE:=TRUE; ENTER_FILE_NAME; IF NEWFILE = TRUE THEN COUNTER:= 2; IF NEWFILE = FALSE THEN BEGIN NUMBER_RECORDS(FILENAM); COUNTER:=NUMBER_OF_RECORDS + 1; END; WITH INFORMATION DO BEGIN REPEAT CLEAR_SCREEN; PROMPT(1,2,30,'NAME',FALSE); PROMPT(1,4,6,'#: ',FALSE); PROMPT(10,4,20,'STREET: ',FALSE); PROMPT(1,6,10,'CITY: ',FALSE); PROMPT(20,6,10,'STATE: ',FALSE); PROMPT(40,6,10,'ZIP: ',FALSE); PROMPT(1,8,30,'ATTENTION: ',FALSE); NA:=INPUT_DATA(6,2,30,TRUE,0,0); ST_NO:=INPUT_DATA(4,4,6,TRUE,0,0); ST:=INPUT_DATA(19,4,20,TRUE,0,0); CIT:=INPUT_DATA(7,6,10,TRUE,0,0); STA:=INPUT_DATA(27,6,10,TRUE,0,0); ZI:=INPUT_DATA(46,6,10,TRUE,0,0); ATT:=INPUT_DATA(12,8,29,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]; FOR I:= 1 TO 10 DO CITY[I]:=CIT[I]; FOR I:= 1 TO 10 DO STATE[I]:=STA[I]; FOR I:= 1 TO 10 DO ZIP[I]:=ZI[I]; FOR I:= 1 TO 30 DO ATTENTION[I]:=ATT[I]; CALC_ACCT_NO(COUNTER); FOR I:= 1 TO 8 DO BLANKS[I]:=' '; IF NAME <> 'EXIT ' THEN 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; IF NAME <> 'EXIT ' THEN BEGIN WRITE(FIN:COUNTER,INFORMATION); COUNTER:=COUNTER+1; END; {OF IF} UNTIL NAME = 'EXIT '; CONTINUE:=FALSE; CALC_ACCT_NO(COUNTER - 1); CREATE_FIRST_RECORD(ACCT_NUMBER); END; 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. .