scorechk.pas v.6: read from file, write to file
October 1996
{ ============================================== }
{ Calc average of student scores, warn if < 60. }
{ v.6: Handle lines of ID + 3 scores from file }
{ - prompt for two file names to open }
{ - retry or exit on bad file names }
{ - loop until e-o-f, one student per line }
{ - write scores, av, warning to output file }
program avScores;
var
SID, err: integer;
Av, sc1, sc2, sc3: real;
warnString: string;
inFileID, outFileID: TEXT;
{ ----------------------------------------------- }
{ use prompt string to prompt user for file name }
{ - open file for mode r/w/a, return file ID }
{ - allow retry or exit on bad file name }
procedure PromptOpenFile(prompt: string;
mode: char;
var fID: TEXT;
var status: integer);
var fName: string;
begin
status := 1; { 1 while file not opened, 0 if success }
while (status <> 0) do
begin
write(prompt);
readln(fName);
if (fName = 'q') or (fName = 'Q') then
exit;
assign(fID, fName);
{$I-} { compiler flag: don't crash on bad name }
if mode = 'r' then
reset(fID)
else if mode = 'w' then
rewrite(fID)
else if mode = 'a' then
append(fID);
{$I+} { flag off }
status := ioResult; { DOS call: did file open work? }
if status <> 0 then
begin
writeln;
writeln('Could not open file: ',fName);
write('Enter q to quit, or ');
end;
end;
end; { proc promptOpenFile }
{ ------------------------------------------- }
{ open input and output files, return ID's }
{ - exit cleanly w/ err<>0 if file-open fails }
procedure openFiles(var inFileID, outFileID: TEXT;
var err: integer);
begin
promptOpenFile('Name of scores file: ','r',inFileID, err);
if err <> 0 then
exit;
promptOpenFile('Name of output file: ','w',outFileID,err);
if err <> 0 then
begin
close(inFileID);
exit;
end;
end; { proc openFiles }
{ ----------------------------------------------- }
{ return avg of 3 scores + warning if < warnLevel }
procedure calcAndCheck3(s1, s2, s3: real;
var avg: real;
var wstr: string);
const warnLevel = 60;
var Sum: real;
begin
Sum := s1 + s2 + s3;
avg := Sum/3;
if avg < warnLevel then
wstr := ' Warning!'
else
wstr := '';
end; { proc calcAndCheck3 }
{ ========================================================== }
begin
openFiles(inFileID,outFileID,err);
if err <> 0 then
exit;
while not eof(inFileID) do
begin
readln(inFileID, SID, sc1, sc2, sc3);
calcAndCheck3(sc1,sc2,sc3,av,warnString);
writeln(outFileID, SID, sc1:4:0, sc2:4:0, sc3:4:0,
' Average =', Av:6:1, warnString);
end;
close(inFileID);
close(outFileID);
writeln('Averages written to file.'); { announce completion }
end.