program testsum2(input,output); (* restructured 11/13/91 PLJ *) const maxquest = 30; maxhead = 80; maxstr = 25; maxpoints=500; type typepoints=array[0..maxquest] of integer; typeheading=array[1..maxhead] of char; typename =array[1..maxstr] of char; typetblcount=array[1..maxpoints] of integer; typetenpercent = array[0..9] of integer; typeperquest=array[0..maxquest] of typetenpercent; var questions,total,average,maxscore,minscore,count:integer; header:typeheading; q:typepoints; name :typename; maxq:typepoints; counts:typetblcount; perquest:typeperquest; i,j,k:integer; function min(a,b:integer):integer; begin if a < b then min := a else min := b; end;(*min*) function max(a,b:integer):integer; begin if a > b then max := a else max := b; end;(*max*) procedure readline(var name:typename; numquestion:integer; var q:typepoints); var i:integer; begin if not eof then begin for i:= 1 to maxstr do read(name[i]); for i:= 0 to numquestion do if not eoln then read(q[i]) else q[i] := 0; readln; end; end;(*readline*) procedure errorvalue(numquestion:integer; var maxq,q:typepoints); var i:integer; sum:integer; begin sum := 0; for i:= 1 to numquestion do sum := sum + q[i]; for i:= 1 to numquestion do if q[i] > maxq[i] then writeln('value for question ',i,'>',maxq[i]); sum := (maxq[0] - sum); if sum <> q[0] then begin writeln;writeln('err sum does not match should be ',sum);end; end;(*errorvalue*) procedure writeline(name:typename; numquest:integer; q:typepoints); var i:integer; begin for i:=1 to maxstr do write(name[i]); for i:=0 to numquest do write(q[i]:3); end;(*writeline*) procedure readheader; var i:integer; begin for i:= 1 to maxhead do if not eoln then read(header[i]) else header[i]:=' '; readln; end;(*readheader*) procedure writeheader; var i:integer; begin for i:=1 to maxhead do write(header[i]); writeln; end;(*writeheader*) procedure process_line; var i,j:integer; procedure addto_perquestion(val,limit:integer;var vec:typetenpercent); var temp:integer; begin temp := val * 10 div limit; if temp > 9 then temp := 9; if temp < 0 then temp := 0; vec[temp] := vec[temp] + 1; end; begin readline(name,questions,q); writeline(name,questions,q); errorvalue(questions,maxq,q); writeln; minscore := min(minscore,q[0]); maxscore := max(maxscore,q[0]); total := total + q[0]; count := count + 1; if q[0] > maxpoints then counts[maxpoints]:=counts[maxpoints]+1 else counts[q[0]]:=counts[q[0]]+1; addto_perquestion(q[0],maxq[0],perquest[0]); for i:= 1 to questions do addto_perquestion(maxq[i]-q[i],maxq[i],perquest[i]); end;(*process_line*) procedure report; var i,j:integer; procedure show_perquestion(vec:typetenpercent; col:integer); var i:integer; begin for i:= 0 to 9 do if vec[i] > 0 then write(vec[i]:col) else write(' ':col) ; end;(*show_perquestion*) begin writeln; writeheader; writeln(count:5,' students read'); writeln(minscore:5,' min score'); writeln(maxscore:5,' max score'); writeln( total div count:5,' average score'); writeln; writeln('points count'); for i:=maxq[0] downto 0 do if counts[i]>0 then writeln(i:5,counts[i]:5); writeln; write(' ':4); for j:= 0 to 9 do write(j:3); writeln; for i:= (maxq[0] + 9) div 10 downto 0 do begin write(i:2,'0 '); for j:= 0 to 9 do begin k := i * 10 + j; if counts[k] > 0 then write(counts[k]:3) else write(' ':3) ; end; writeln; end; writeln; writeln; write(' '); for i:=0 to 9 do write(i*10:3);writeln; begin write('test '); show_perquestion(perquest[0],3);writeln; end; for i:=1 to questions do begin write('prob', i:2); show_perquestion(perquest[i],3);writeln; end; end;(*report*) begin writeln('test summary program'); for i:= 1 to maxpoints do counts[i]:=0; readheader; writeheader; readline(name,0,maxq); questions := maxq[0]; writeln(questions,' questions'); for i:= 0 to maxq[0] do counts[i]:=0; for i:= 0 to questions do for j:= 0 to 9 do perquest[i,j] := 0; readline(name,questions,maxq); writeline(name,questions,maxq); writeln; minscore := maxq[0]; maxscore := 0; total := 0; count := 0; while not eof do begin process_line; end; report; end.