PROGRAM ex9 1 CONTEXT VOID USE standard BEGIN FILE f; IF open(f, "textbook", stand in channel)/=0 THEN print("Cannot open textbook"); exit(1) FI; STRING s; WHILE get(f,(s,newline)); UPB s /= 0 DO print((s,newline)) OD; close(f) END FINISH
PROGRAM ex9 2 CONTEXT VOID USE standard BEGIN FILE f; IF open(f, "textbook", stand in channel)/=0 THEN print("Cannot open textbook"); exit(1) FI; REAL r, sum:=0, INT n; get(f,n); TO n DO get(f,r); sum+:=r OD; print(sum); close(f) END FINISH
PROGRAM ex9 3 CONTEXT VOID USE standard BEGIN FILE inf,outf; IF open(inf, "textbook", stand in channel)/=0 THEN print("cannot open textbook"); exit(1) ELIF establish(outf, "result", stand out channel, 0,0,0)/=0 THEN print("Cannot create result"); exit(2) FI; REAL sum:=0, r, INT n; get(inf,n); TO n DO get(inf,r); sum+:=r OD; put(outf,sum); close(inf); close(outf) END FINISH
BY
construct.
PROGRAM ex9 4 CONTEXT VOID USE standard BEGIN INT size = 10 000; [2:size]BOOL flags; FOR i FROM LWB flags TO UPB flags DO flags[i]:=TRUE OD; FOR i FROM LWB flags TO UPB flags DO IF flags[i] THEN FOR k FROM i+i BY --i TO UPB flags DO flags[k]:=FALSE OD FI OD; #Now the file is needed# FILE f; IF establish(f, "primes", stand out channel, 0,0,0)/=0 THEN print("Cannot create primes"); exit(1) FI; FOR i FROM LWB flags TO UPB flags DO IF flags[i] THEN put(f,(i,newline)) FI OD; close(f) END FINISH
WHILE
clause.
PROGRAM ex9 5 CONTEXT VOID USE standard BEGIN FILE inf, outf; IF open(inf, "inbook", stand in channel)/=0 THEN print("Cannot open inbook"); exit(1) ELIF establish(outf, "outbook", stand out channel, 0,0,0)/=0 THEN print("Cannot create outbook"); exit(2) FI; STRING line; WHILE get(inf,(line,newline)); put(outf,(line,newline)); IF UPB line = 0 THEN FALSE ELSE line /= UPB line * blank FI DO SKIP OD; close(inf); close(outf) END FINISH
PROGRAM ex9 6 CONTEXT VOID USE transput BEGIN FILE inf, outf; IF open(inf, "lines", stand in channel)/=0 THEN print("Cannot open book lines"); exit(1) ELIF establish(outf, "words", stand out channel, 0,0,0)/=0 THEN print("Cannot create book words"); exit(2) FI; []CHAR terminators=" *"+cr+lf; make term(inf,terminators); STRING word, CHAR ch:=blank; WHILE get(inf,word); IF ch/=blank THEN ch PLUSTO word FI; WHILE get(inf,ch); CO String terminator, but cr/lf ignored CO ch = blank DO SKIP OD; #Skip spaces# put(outf,(word,newline)); ch /= "*" DO SKIP OD; close(inf); close(outf) END FINISH
on logical file end
procedure yields
FALSE
, the standard prelude causes an error message to be
displayed and the program itself exits with an equivalent error
number. Here is the code for the program:-
PROGRAM ex9 7 CONTEXT VOID USE standard IF FILE inf; STRING line; INT n,sum:=0; open(inf, "inbook", stand in channel)/=0 THEN print(("Cannot open inbook", newline)); exit(1) ELSE on logical file end(inf, (REF FILE f)BOOL: IF FILE ouf; establish(ouf, "outbook", stand out channel, 0,0,0)/=0 THEN print(("Cannot establish ", "outbook",newline)); exit(2); SKIP ELSE put(ouf,(sum/n,newline)); close(ouf); FALSE FI); FOR i DO get(inf,(line,newline)); n:=i; sum+:=UPB line OD FI FINISH
PROGRAM ex9 8 CONTEXT VOID USE standard IF FILE arg, inf, ouf; STRING line, infn, oufn; INT n,sum:=0; open(arg,"",arg channel)/=0 THEN put(stand error, ("Cannot access the ", "program arguments", newline)); exit(1) ELIF on logical file end(arg, (REF FILE f)BOOL: (put(stand error, ("Insufficient arguments", newline)); stop; SKIP)); get(arg,(LOC STRING,skip terminators, infn,skip terminators, oufn)); open(inf,infn,stand in channel)/=0 THEN print(("Cannot open ",infn,newline)); exit(2) ELSE on logical file end(inf, (REF FILE f)BOOL: IF establish(ouf, oufn, stand out channel, 0,0,0)/=0 THEN print(("Cannot establish ", oufn, newline)); exit(3); SKIP ELSE put(ouf,("Average=",sum/n, newline)); close(ouf); FALSE FI); FOR i DO get(inf,(line,newline)); n:=i; sum+:=UPB line OD FI FINISH
PROGRAM ex9 9 CONTEXT VOID USE standard IF FILE arg, inf, ouf; STRING line, infn, oufn; open(arg,"",arg channel)/=0 THEN put(stand error, ("Cannot access the arguments", newline)); exit(1) ELIF on logical file end(arg, (REF FILE f)BOOL: (put(stand error, ("Insufficient arguments", newline)); stop; SKIP)); get(arg,(LOC STRING, skip terminators, infn,skip terminators, oufn)); open(inf,infn,stand in channel)/=0 THEN print(("Cannot open ",infn,newline)); exit(2) ELIF establish(ouf, oufn, stand out channel, 0,0,0)/=0 THEN print(("Cannot establish ",oufn, newline)); exit(3) ELSE on logical file end(inf, (REF FILE f)BOOL: (close(ouf); close(inf); stop; SKIP)); on physical file end(ouf, (REF FILE f)BOOL: (put(stand error, ("Write error on ",idf(ouf), newline)); exit(4); SKIP)); DO get(inf,(line,newline)); FOR i FROM LWB line TO UPB line DO REF CHAR li=line[i]; IF li=blank THEN li:="*" FI OD; put(ouf,(line,newline)) OD FI FINISH
PROGRAM ex9 10 CONTEXT VOID USE standard IF FILE env; open(env,"PATH",env channel)=0 THEN on logical file end(env, (REF FILE e)BOOL: (stop; SKIP)); make term(env,":"+nul ch); STRING s; DO get(env,s); IF UPB s >= LWB s THEN print((s,newline)) FI; skip delimiters(env) OD; close(env) FI FINISH
PROGRAM ex9 11 CONTEXT VOID USE standard IF FILE arg; open(arg,"",arg channel)/=0 THEN put(stand error, ("Cannot access arguments", newline)); exit(1) ELSE on logical file end(arg, (REF FILE a)BOOL: (stop; SKIP)); get(arg,(LOC STRING, LOC CHAR, skip terminators)); DO make term(arg,"/"); STRING env name; CHAR terminator:=nul ch; get(arg, (env name, skip terminators, terminator)); IF FILE env; open(env, env name, env channel)/=0 THEN print((env name," undefined", newline)) ELSE make term(env, terminator+nul ch); STRING s; on logical file end( env, (REF FILE f)BOOL: (GOTO continue; SKIP)); DO get(env,s); IF UPB s >= LWB s THEN print((s,newline)) FI; skip terminators(env) OD; continue: close(env) FI; make term(arg,blank); skip terminators(arg) OD FI FINISHNotice the addition of
nul ch
to cater for the lack of a
specific terminator in the environment string.
PROGRAM ex9 12 CONTEXT VOID USE standard IF FILE abc; open(abc,"ABC",env channel)/=0 THEN print(("Environment string ABC", "is undefined",newline)); stop ELSE INT sum:=0, n; on logical file end( abc, (REF FILE f)BOOL: (close(f); print(("Total=",sum,newline)); stop; SKIP)); DO get(abc,n); sum+:=n OD FI FINISH
PROGRAM ex9 13 CONTEXT VOID USE standard BEGIN []STRING months= ("January","February","March", "April","May","June","July", "August","September", "October","November", "December"); []REAL rainfall= ( 6.54, 12.3, 10.1, 13.83, 5.04, 9.15, 14.34, 16.38, 13.84, 10.45, 8.49, 7.57); FOR m TO UPB months DO STRING mm=months[m]; print((mm,(12-UPB mm)*blank, fixed(rainfall[m],-5,2), newline)) OD END FINISH
PROGRAM ex9 14 CONTEXT VOID USE standard BEGIN print(("Table of square roots ", "1 to 100", newline,newline)); FOR i TO 25 DO FOR j TO 4 DO INT number = (j-1)*25+i; print((whole(number,-6), fixed(sqrt(number), -8,4))) OD; print(newline) OD END FINISH
PROGRAM ex9 15 CONTEXT VOID USE standard BEGIN REAL pi power:=1; print(("Table of powers of pi", " 1 to 10", newline,newline)); FOR i TO 10 DO pi power*:=pi; print((whole(i,-3)," ", float(pi power, 12,6,2), newline)) OD END FINISH
int bin bytes
. You will need to
write a short program to output a couple of integers to a binary book
and then see how long it is (and you might find its contents of
interest).
PROGRAM ex9 16 CONTEXT VOID USE standard BEGIN FILE work; IF establish(work, "ex9 9 1.tmp", stand back channel, 0,0,0)/=0 THEN print("Cannot create workbook"); exit(1) FI; FOR i TO 1000 DO put bin(work,i) OD; INT int bin bytes=?; CO Your value replaces ? CO FOR i FROM 17 BY --17 TO 1000 DO set(work,0,0,(i-1)*int bin bytes); INT n; get bin(work,n); print((n,newline)) OD; close(work) END FINISH
PROGRAM ex9 17 CONTEXT VOID USE standard BEGIN FILE inf, out1, out2; IF open(inf, "inbook", stand in channel)/=0 THEN print("Cannot open inbook"); exit(1) ELIF establish(out1, "outbook1", stand out channel, 0,0,0)/=0 THEN print("Cannot create outbook1"); exit(2) ELIF establish(out2, "outbook2", stand out channel, 0,0,0)/=0 THEN print("Cannot create outbook2"); exit(3) FI; make term(inf, blank+cr+lf); STRING word; CHAR ch:=blank; on logical file end(inf, (REF FILE f)BOOL: (close(out1); close(out2); close(f); stop; SKIP)); DO get(inf,(word, skip terminators)); IF UPB word > 0 THEN put bin(out2, (current pos(out1), UPB word)); put bin(out1,word) FI OD END FINISH
END OF REPORT
so that your reader knows that there are no
pages of the report which could have been lost. In a professionally
written program, you would put a page number and the date of the
report, but we have not yet covered how that can be done (see
chapter 12).
PROGRAM ex9 18 CONTEXT VOID USE standard IF []STRING months = ("January","February","March", "April","May","June", "July","August","September", "October","November","December"); []REAL rainfall = ( 6.54, 12.30, 10.10, 13,83, 5.04, 9.15, 14.34, 16.38, 13.84, 10.45, 8.49, 7.57); FILE prn; establish(prn, "rainfall.out", stand out channel, 0,0,0)/=0 THEN put(stand error, ("Cannot establish rainfall.out", newline)); stop ELSE put(prn, ("Rainfall figures in 1995", newline,newline, "Month",7*blank, "Rainfall in mm", newline)); FOR m TO UPB months DO STRING mm = months[m]; put(prn, (mm,(12-UPB mm)*blank, fixed(rainfall[m],-5,2), newline)) OD; put(prn, (newline, "END OF REPORT", newline)); close(prn) END FINISH
PROGRAM ex9 19 CONTEXT VOID USE standard IF STRING in idf; FILE arg, inf, prn; open(arg,"",arg channel)/=0 THEN put(stand error, ("Cannot access arguments", newline)); exit(1) ELIF on logical file end(arg, (REF FILE f)BOOL: (put(stand error, ("Usage: tt idf", newline)); stop; SKIP)); get(arg,(LOC STRING,skip terminators, in idf)); close(arg); open(inf,in idf,stand in channel)/=0 THEN put(stand error, ("Cannot open ",in idf, newline)); exit(2) ELIF establish(prn,"tt.out", stand out channel, 0,0,0)/=0 THEN put(stand error, ("Cannot establish tt.out", newline)); exit(3) ELSE STRING line; on logical file end(inf, (REF FILE f)BOOL: (close(f); close(prn); stop; SKIP)); FOR i DO get(inf,(line,newline)); put(prn,(whole(i,-6),": ")); IF UPB line > 0 THEN put(prn,line) FI; newline(prn) OD FI FINISH
PROGRAM ex9 20 CONTEXT VOID USE standard BEGIN REAL r; WHILE read(r); r/=0.0 DO print((float(r,-12,3,-2),newline)) OD END FINISH
PROGRAM ex9 21 CONTEXT VOID USE standard BEGIN FILE arg, emp, prn; STRING emp idf; INT week:=0; IF open(arg,"",arg channel)/=0 THEN put(stand error, ("Cannot access the arguments", newline)); exit(1) ELIF on logical file end(arg, (REF FILE f)BOOL: (put(stand error, ("Usage: tt emp-book week-no", newline)); exit(2); SKIP)); get(arg, (LOC STRING,LOC CHAR, emp idf,week)); week < 1 OR week > 53 THEN put(stand error, ("Invalid week number", newline)); exit(3) ELIF open(emp, emp idf, stand in channel)/=0 THEN put(stand error, ("Cannot open ",emp idf, newline)); exit(4) ELIF establish(prn, "report", stand out channel, 0,0,0)/=0 THEN put(stand error, ("Cannot establish report", newline)); exit(5) FI; MODE EMPLOYEE=STRUCT(STRING name, [2]STRING address, STRING dept, ni code, tax code, REAL basic, overtime, [52]REAL net pay,tax); PROC get emp=(REF FILE f, REF EMPLOYEE e)VOID: BEGIN [80]CHAR s; PROC get str=[]CHAR: ( INT len; get bin(f,len); [len]CHAR s; get bin(f,s); s ); \#get str\# IF (name OF e:=get str) /= "" THEN FOR i TO UPB address OF e DO (address OF e)[i]:=get str OD; dept OF e:=get str; ni code OF e:=get str; tax code OF e:=get str; get bin(f,(basic OF e, overtime OF e, net pay OF e, tax OF e)) FI END #get emp#; PROC put emp=(REF FILE f, REF EMPLOYEE e)VOID: put(f,(name OF e, (40-UPB name OF e)*blank, fixed((net pay OF e)[week], -8,2), newline)); INT line:=60, page:=0; PROC heading = (REF FILE f)VOID: IF line = 60 THEN line:=0; #reset the line count# put(f, (newpage, "Report of net pay for week ", whole(week,0), 40*blank,"Page ", whole(page+:=1,0), newline,newline, "Employee name", 28*blank,"Net pay", newline,newline)) FI #heading#; EMPLOYEE employee; REAL total pay:=0; INT n:=0; on logical file end(emp, (REF FILE f)BOOL: (put(prn, ("Total net pay for ", whole(n,0), " employees =", fixed(total pay,-11,2), newline, newline, "End of report",newline)); close(f); close(prn); stop; SKIP)); DO heading(prn); get emp(emp,employee); IF name OF employee /= "" THEN total pay+:= (net pay OF employee)[week]; n+:=1; #count of total employees# put emp(prn,employee); line+:=1 FI OD END FINISH
Sian Mountbatten 2012-01-19