blob: 04a7b84a0aba7ab395f458f906acfae4e099d128 [file] [log] [blame] [edit]
program grading (input, output);
const
namelength = 34;
idlength = 12;
commentlength = 6;
headlinelength = 40;
type
scores =
(
assign1, assign2, assign3, assign4,
assign5, assign6, assign7, assign8, assigns,
exam1, exam2, better, final, total
);
gradetype =
(
A, Aminus,
Bplus, B, Bminus,
Cplus, C, Cminus,
Dplus, D, Dminus,
F
);
grades =
(
absolu, curved, course
);
namestring = packed array [1.. namelength] of char;
idstring = packed array [1.. idlength] of char;
commentstring = packed array [1.. commentlength] of char;
headlinestring = packed array [1..headlinelength] of char;
studentpointer = ^ studentrecord;
studentrecord =
record
name : namestring;
id : idstring;
score : array [scores] of integer;
grade : array [grades] of gradetype;
rank : integer;
percentile : integer;
comment : commentstring;
next : studentpointer;
nextinrank : studentpointer
end;
var
studentlist : studentpointer;
nonames : boolean;
nstudents, noshows, nofinals : integer;
scoresfile : text;
histogram : array [0..100] of integer;
histogramlist : array [0..100] of studentpointer;
scoretorank : array [0..100] of integer; (* scoretorank [76] = rank of student(s)
with total score of 76 *)
percent : array [0..100] of integer; (* percent [76] = percentile of student(s)
with total score of 76 *)
function isnoshow (student : studentrecord) : boolean;
begin
isnoshow := (student.score [total] = 0)
end (* isnoshow *);
procedure computescoretorank;
var
score, nhigher : integer;
begin
nhigher := 0;
for score := 100 downto 0 do begin
scoretorank [score] := 1 + nhigher;
if
(nstudents - noshows - nofinals) > 0
then
percent [score] :=
((nstudents - noshows - nofinals - nhigher) * 100)
div
(nstudents - noshows - nofinals)
else
percent [score] := 0;
nhigher := nhigher + histogram [score];
end
end (* computescoretorank *);
procedure settitle (headline : headlinestring);
begin
writeln ('.bp');
writeln ('.ds Ti ', headline)
end (* settitle *);
procedure writetroffheader;
begin
writeln ('.po 1.2c');
writeln ('.m3 0');
writeln ('.m4 10');
writeln ('.ps 8');
writeln ('.vs 10');
writeln ('.pl 10.0i');
writeln ('.ll 7.3i');
writeln ('.lt 7.3i');
writeln ('\ ');
writeln ('.bp');
writeln ('.de $f');
writeln ('.ev 1');
writeln ('.nf');
writeln ('.ti 4.85c');
writeln ('\fC\ Gr\ \ \ \ \ Id\ \ \ \ \ \ \ \ A1\ A2\ A3\ A4\ A5\ A6\ A7\ A8\ A\ \ E1\ E2\ E\ \ Fi\ To\ Ab\ Cu\ Gr\ Rank\ Percentile\ Coll');
writeln ('.sp 2');
writeln ('.in 1.0i');
writeln ('\fC\s+2A = \fRsum of all assignments');
writeln ('\fCE1 = \fRfirst exam');
writeln ('\fCE2 = \fRsecond exam');
writeln ('\fCE = \fR better of first two exams');
writeln ('\fCFi = \fRfinal exam');
writeln ('.sp -5');
writeln ('.in +2.3i');
writeln ('\fCTo = \fRtotal score in course');
writeln ('\fCAb = \fRgrade according to first (absolute, i.e. not curved) policy');
writeln ('\fCCu = \fRgrade according to second (curved) policy');
writeln ('\fCGr = \fRcourse grade');
writeln ('Percentiles are computed ignoring ''No shows'' and ''No finals''.\s-2');
writeln ('.sp 2');
writeln ('.in 0');
writeln ('.tl ^\s+8\fB\\*(Ti^^\*(td\s-8\fP^^');
writeln ('.ev');
writeln ('..');
writeln ('.de $h');
writeln ('.ev 1');
writeln ('.ps 8');
writeln ('.vs 10');
writeln ('\ ');
writeln ('.sp |2.5c');
writeln ('.ti 4.85c');
writeln ('\fC\ Gr\ \ \ \ \ Id\ \ \ \ \ \ \ \ A1\ A2\ A3\ A4\ A5\ A6\ A7\ A8\ A\ \ E1\ E2\ E\ \ Fi\ To\ Ab\ Cu\ Gr\ Rank\ Percentile\ Coll');
writeln ('.sp 2');
writeln ('.ev');
writeln ('..');
writeln ('\ ');
writeln ('.bp');
writeln ('\fC');
writeln ('.nf');
writeln ('.ev 1');
writeln ('.ps 8');
writeln ('.vs 10');
writeln ('.ev');
end (* writetroffheader *);
procedure initialize;
var
score : integer;
begin
nstudents := 0;
noshows := 0;
nofinals := 0;
studentlist := nil;
for score := 0 to 100 do begin
histogram [score] := 0;
histogramlist [score] := nil
end;
writetroffheader
end (* initialize *);
procedure readscores;
var
newstudent : studentpointer;
s : scores;
c : integer;
begin
new (newstudent);
nstudents := nstudents + 1;
with newstudent^ do begin
next := studentlist;
for c := 1 to namelength do
read (input, name [c]);
for c := 1 to idlength do
read (input, id [c]);
for s := assign1 to assign8 do
read (input, score [s]);
read (input, score [exam1]);
read (input, score [exam2]);
read (input, score [final]);
for c := 1 to commentlength do
read (input, comment [c])
end;
readln (input);
studentlist := newstudent
end (* readscores *);
procedure computescores (student : studentpointer);
var
s : scores;
begin
with student^ do begin
score [assigns] := 0;
for s := assign1 to assign8 do
score [assigns] := score [assigns] + score [s];
if
score [exam1] > score [exam2]
then
score [better] := score [exam1]
else
score [better] := score [exam2];
score [total] := score [assigns]
+ score [better ]
+ score [final ];
if
isnoshow (student^)
then
noshows := noshows + 1
else if
score [final] = 0
then
nofinals := nofinals + 1
else
histogram [score [total]] := histogram [score [total]] + 1;
end
end (* computescores *);
procedure computeallscores (studentlist : studentpointer);
begin
if
studentlist <> nil
then begin
computescores (studentlist);
computeallscores (studentlist^.next)
end
end (* computeallscores *);
procedure computegrades (student : studentpointer);
begin
with student^ do begin
if score [total] >= 90 then grade [absolu] := A else
if score [total] >= 88 then grade [absolu] := Aminus else
if score [total] >= 86 then grade [absolu] := Bplus else
if score [total] >= 80 then grade [absolu] := B else
if score [total] >= 78 then grade [absolu] := Bminus else
if score [total] >= 76 then grade [absolu] := Cplus else
if score [total] >= 70 then grade [absolu] := C else
if score [total] >= 65 then grade [absolu] := Cminus else
if score [total] >= 60 then grade [absolu] := Dplus else
if score [total] >= 55 then grade [absolu] := D else
if score [total] >= 50 then grade [absolu] := Dminus else
grade [absolu] := F
;
rank := scoretorank [score [total]];
nextinrank := histogramlist [score [total]];
histogramlist [score [total]] := student;
percentile := percent [score [total]];
if percentile >= 80 then grade [curved] := A else
if percentile >= 78 then grade [curved] := Aminus else
if percentile >= 76 then grade [curved] := Bplus else
if percentile >= 50 then grade [curved] := B else
if percentile >= 48 then grade [curved] := Bminus else
if percentile >= 46 then grade [curved] := Cplus else
if percentile >= 25 then grade [curved] := C else
if percentile >= 23 then grade [curved] := Cminus else
if percentile >= 21 then grade [curved] := Dplus else
if percentile >= 10 then grade [curved] := D else
if percentile >= 8 then grade [curved] := Dminus else
grade [curved] := F
;
if
grade [absolu] < grade [curved]
then
grade [course] := grade [absolu]
else
grade [course] := grade [curved]
end
end (* computegrades *);
procedure computeallgrades (studentlist : studentpointer);
begin
if
studentlist <> nil
then begin
computegrades (studentlist);
computeallgrades (studentlist^.next)
end
end (* computeallgrades *);
function gradepoint (g : gradetype) : real;
begin
if g = A then gradepoint := 4.0 else
if g = Aminus then gradepoint := 3.7 else
if g = Bplus then gradepoint := 3.3 else
if g = B then gradepoint := 3.0 else
if g = Bminus then gradepoint := 2.7 else
if g = Cplus then gradepoint := 2.3 else
if g = C then gradepoint := 2.0 else
if g = Cminus then gradepoint := 1.7 else
if g = Dplus then gradepoint := 1.3 else
if g = D then gradepoint := 1.0 else
if g = Dminus then gradepoint := 0.7 else
if g = F then gradepoint := 0.0 else
gradepoint := 0.0
end (* gradepoint *);
procedure writegrade (g : gradetype);
begin
if g = A then write (' A ') else
if g = Aminus then write (' A-') else
if g = Bplus then write (' B+') else
if g = B then write (' B ') else
if g = Bminus then write (' B-') else
if g = Cplus then write (' C+') else
if g = C then write (' C ') else
if g = Cminus then write (' C-') else
if g = Dplus then write (' D+') else
if g = D then write (' D ') else
if g = Dminus then write (' D-') else
if g = F then write (' F ') else
write (' ??')
end (* writegrade *);
procedure readallscores;
begin
while
not eof (input)
do
readscores
end (* readallscores *);
procedure writestudent (student : studentpointer);
var
c : integer;
s : scores;
g : grades;
begin
end (* writestudent *);
procedure writestraight (studentlist : studentpointer);
begin
if
studentlist <> nil
then begin
writestraight (studentlist^.next);
writestudent (studentlist);
end
end (* writestraight *);
procedure gotoXY (x, y : integer);
begin
writeln ('\ ');
writeln ('.sp |', 1500 - 40 * y : 0, 'u');
writeln ('.ti ', 40 * x : 0, 'u');
end (* gotoXY *);
procedure writehistogram;
var
score, height : integer;
begin
for score := 0 to 100 do
for height := 1 to histogram [score] do begin
gotoXY (score, height);
writeln ('X')
end;
score := 0;
repeat
gotoXY (score, - 1);
writeln ('\v''0.5c''|');
gotoXY (score, - 3);
writeln (score : 0);
score := score + 5
until
score > 100;
gotoXY (0,- 10)
end (* writehistogram *);
procedure writerank (studentlist : studentpointer);
begin
if
studentlist <> nil
then begin
writerank (studentlist^.nextinrank);
writestudent (studentlist)
end
end (* writerank *);
procedure writebyrank;
var
score : integer;
begin
for score := 100 downto 0 do
writerank (histogramlist [score])
end (* writebyrank *);
procedure stats;
var
scoresum : array [scores] of real;
gradecount : array [grades, gradetype] of integer;
s : scores;
g : grades;
gt : gradetype;
currentstudent : studentpointer;
begin
writeln ('.in 0');
writeln ('.hl');
writeln ('\fC');
writeln ('.2c');
write ('Number of students: ');
writeln (nstudents : 5);
write (' No-shows: ');
writeln (noshows : 5);
write (' No finals: ');
writeln (nofinals : 5);
write (' Assignment 1: ');
writeln (scoresum [assign1] / (nstudents - noshows) : 5 : 1);
write (' Assignment 2: ');
writeln (scoresum [assign2] / (nstudents - noshows) : 5 : 1);
write (' Assignment 3: ');
writeln (scoresum [assign3] / (nstudents - noshows) : 5 : 1);
write (' Assignment 4: ');
writeln (scoresum [assign4] / (nstudents - noshows) : 5 : 1);
write (' Assignment 5: ');
writeln (scoresum [assign5] / (nstudents - noshows) : 5 : 1);
write (' Assignment 6: ');
writeln (scoresum [assign6] / (nstudents - noshows) : 5 : 1);
write (' Assignment 7: ');
writeln (scoresum [assign7] / (nstudents - noshows) : 5 : 1);
write (' Assignment 8: ');
writeln (scoresum [assign8] / (nstudents - noshows) : 5 : 1);
write (' All assignments: ');
writeln (scoresum [assigns] / (nstudents - noshows) : 5 : 1);
write (' Exam 1: ');
writeln (scoresum [exam1 ] / (nstudents - noshows) : 5 : 1);
write (' Exam 2: ');
writeln (scoresum [exam2 ] / (nstudents - noshows) : 5 : 1);
write (' Better of 1,2: ');
writeln (scoresum [better ] / (nstudents - noshows) : 5 : 1);
write (' Final exam: ');
writeln (scoresum [final ] / (nstudents - noshows) : 5 : 1);
write (' Total score: ');
writeln (scoresum [total ] / (nstudents - noshows) : 5 : 1);
writeln ('.sp 2');
writeln ('Absolute grade distribution: ');
for gt := A to F do begin
writegrade (gt);
writeln (gradecount [absolu, gt])
end;
writeln ('.bc');
writeln ('Curved grade distribution: ');
for gt := A to F do begin
writegrade (gt);
writeln (gradecount [curved, gt])
end;
writeln ('.sp 2');
writeln ('Course grade distribution: ');
for gt := A to F do begin
writegrade (gt);
writeln (gradecount [course, gt])
end;
end (* stats *);
begin
initialize;
readallscores;
computeallscores (studentlist);
computescoretorank;
computeallgrades (studentlist);
settitle ('CSCI 1200, Spring 1989');
nonames := false;
writestraight (studentlist);
settitle ('CSCI 1200, Spring 1989');
nonames := true;
writestraight (studentlist);
settitle ('CSCI 1200, Spring 1989, grades by rank');
nonames := false;
writebyrank;
settitle ('CSCI 1200, Spring 1989, grade statistics');
writeln ('.de $f');
writeln ('.tl ^\v''1.0i''\s+8\fB\\*(Ti^^\*(td\s-8\fP\v''-1.0i''^^');
writeln ('..');
writeln ('.de $h');
writeln ('..');
writeln ('\ ');
writeln ('.bp');
writeln ('Histogram, without ''No-shows'' and ''No finals''');
writehistogram;
stats;
end.