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.



RETURN to CSCI 1200 Home Page

- John Rieman