scorechk.pas v.5: file proc catches bad file names, reprompts
October 1996
{ ============================================== }
{ Calc average of student scores, warn if < 60. }
{ v.5: Handle lines of ID + 3 scores from file }
{ - prompt for file name to open }
{ - retry or exit on bad file name }
{ - loop until e-o-f, one student per line }
program avScores;
var
SID, err: integer;
Av, sc1, sc2, sc3: real;
warnString: string;
inFileID: 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 rfID: 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(rfID, fName);
{$I-} { compiler flag: don't crash on bad names }
if mode = 'r' then
reset(rfID)
else if mode = 'w' then
rewrite(rfID)
else if mode = 'a' then
append(rfID);
{$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 reenter ');
end;
end;
end;
{ ----------------------------------------------- }
{ 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;
{ =============================================================== }
begin
promptOpenFile('Name of scores file: ','r',inFileID, 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(SID, sc1:4:0, sc2:4:0, sc3:4:0,
' Average =', Av:6:1, warnString);
end;
close(inFileID);
end.
- John Rieman