Program Quiz_Array;
Const Low= 1; High= 50;
Type Index= Low..High;
     Tscores = array[Index] of real;
     Tgrade = array[Index] of char;
Var S : Tscores; G : Tgrade; Last:Index;
Procedure GetScores(Var Score : Tscores; num : index);
Var i:integer;
Begin  {read input and check data}
       For i:= 1 to num do
          Begin
          Write('No ',i,' : ');
          read(Score[i]);
          if (Score[i] >100) or (Score[i]<0) then
               Begin
               Write('No ',i,' : ');
               read(Score[i]);
               End;
          End;
End;

Procedure ShowScoresAndGrade(Score : TScores;Var Grade: Tgrade;num : Index);
Var i: integer;
Begin
      Writeln('------------Show Scores and grade--------------');
      {Compute Grade }
      For i:= 1 to num do
      Begin
      if Score[i] >= 80 then
         Grade[i] :='A'
      else if  Score[i] >= 70 then
         Grade[i] :='B'
      else if  Score[i] >= 60 then
         Grade[i] :='C'
      else if  Score[i] >= 50 then
         Grade[i] :='D'
      else  Grade[i] := 'F';
      {Show Score and Grade}
      Writeln('No ',i,' : ',Score[i]:6:2,'    Grade ',Grade[i]);
      End;
End;
Function CountGrade(Grade : TGrade;num : Index; GradeChr :Char):integer;
Var i,sum:integer;
Begin {Compute Each Grade}
      sum:=0;
      For i:= 1 to num do
       Begin
          if (Grade[i] = GradeChr) then
             sum:= sum+1;
       End;
      CountGrade := sum;
End;
Function FindMax(Score: Tscores;num:Index):real;
var i : integer;
    Max : real;
Begin
       Max:=Score[1];     {Initialize}
       For i:= 1 to num do
       Begin
          if (Score[i]>= Max) then
              Max:=Score[i] {Find Max}
       End;
       FindMax := Max;
End;

Function FindMin(Score : Tscores;num :Index):real;
var i : integer;
    Min : real;
Begin
       Min:=Score[1];  {Initialize}
       For i:= 1 to num do
       Begin
          if (Score[i]<= Min) then
              Min:=Score[i]  {find Min}
       End;
       FindMin := Min;
End;
Function ComputeAverage(Score :Tscores; num: Index):real;
var i : integer;
   Sum : real;
Begin
     sum:= 0;
     For i:= 1 to num do
     Begin
       sum:= sum+Score[i]
     End;
     ComputeAverage := sum/num;   {Compute Average}
End;
Begin {Main Program}
    Write('Enter Number of student(No more than 50): ');
    readln(last);
    GetScores(S,Last);       {Get Data}
    ShowScoresAndGrade(S,G,Last);      {Show Score and Grade}
    Write('Max = ',FindMax(S,Last):5:2,'  Min = ',FindMin(S,Last):5:2);
    Writeln('  Average = ',ComputeAverage(S,Last):5:2);    {Show Max Min and Average}
    Write('Grade A = ',CountGrade(G,Last,'A'));
    Write('  Grade B = ',CountGrade(G,Last,'B'));  {Count Each Grade}
    Write('  Grade C = ',CountGrade(G,Last,'C'));
    Write('  Grade D = ',CountGrade(G,Last,'D'));
    Writeln('  Grade F = ',CountGrade(G,Last,'F'));
End.

