Files
lazarus-ccr/applications/lazstats/source/forms/analysis/measurement_programs/gradingunit.pas

428 lines
14 KiB
ObjectPascal
Raw Normal View History

unit GradingUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
ExtCtrls, StdCtrls, Grids,
OutputUnit;
type
{ TGradingFrm }
TGradingFrm = class(TForm)
Bevel1: TBevel;
ComputeBtn: TButton;
Label4: TLabel;
AssignedGrid: TStringGrid;
Label5: TLabel;
Grades: TStringGrid;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Panel5: TPanel;
Panel6: TPanel;
SaveBtn: TButton;
LoadBtn: TButton;
ResetBtn: TButton;
Cancelbtn: TButton;
ReturnBtn: TButton;
DistUseGroup: TRadioGroup;
CategoriesGroup: TRadioGroup;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
DownThroughLabel: TLabel;
SaveDialog1: TSaveDialog;
ScoresGrid: TStringGrid;
GradesGrid: TStringGrid;
TopScoreGrid: TStringGrid;
LowScoreGrid: TStringGrid;
TopScoreLabel: TLabel;
procedure CategoriesGroupClick(Sender: TObject);
procedure ComputeBtnClick(Sender: TObject);
procedure DistUseGroupClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure LoadBtnClick(Sender: TObject);
procedure LowScoreGridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ResetBtnClick(Sender: TObject);
procedure SaveBtnClick(Sender: TObject);
private
{ private declarations }
nints : integer;
ncases : integer;
col : integer;
ncats : integer;
sorted : array[0..50] of double;
public
{ public declarations }
end;
var
GradingFrm: TGradingFrm;
implementation
uses
Math,
gradebookunit;
{ TGradingFrm }
procedure TGradingFrm.DistUseGroupClick(Sender: TObject);
VAR
i, j, btn, nscores : integer;
RawScores : array[0..50] of double;
RawFreq : array[0..50] of double;
temp, X, Y : double;
begin
if DistUseGroup.ItemIndex < 0 then exit;
col := gradebookfrm.tno + 3; // column of raw scores for test number tno
btn := DistUseGroup.ItemIndex;
nscores := gradebookfrm.nints;
ScoresGrid.RowCount := nscores;
ncases := gradebookfrm.NoStudents;
case btn of
0 : TopScoreGrid.Cells[0,0] := IntToStr(gradebookfrm.nitems);
1 : TopScoreGrid.Cells[0,0] := FloatToStr(3.0);
2 : TopScoreGrid.Cells[0,0] := FloatToStr(90.0);
3 : TopScoreGrid.Cells[0,0] := FloatToStr(100.0);
end;
case btn of
0 : for i := 1 to ncases do RawScores[i-1] := StrToFloat(gradebookfrm.Grid.Cells[col,i]);
1 : for i := 1 to ncases do RawScores[i-1] := StrToFloat(gradebookfrm.Grid.Cells[col+1,i]);
2 : for i := 1 to ncases do RawScores[i-1] := StrToFloat(gradebookfrm.Grid.Cells[col+2,i]);
3 : for i := 1 to ncases do RawScores[i-1] := StrToFloat(gradebookfrm.Grid.Cells[col+3,i]);
end;
// sort RawScores into ascending order
for i := 1 to ncases - 1 do
begin
for j := i+1 to ncases do
begin
X := RawScores[i-1];
Y := RawScores[j-1];
if RawScores[i-1] < RawScores[j-1] then // switch
begin
temp := RawScores[i-1];
RawScores[i-1] := RawScores[j-1];
RawScores[j-1] := temp;
end;
end;
end;
// get frequency of each score
nints := 1;
for i := 1 to ncases do RawFreq[i-1] := 0;
X := RawScores[0];
Sorted[0] := X;
for i := 1 to ncases do
begin
if (X = RawScores[i-1])then RawFreq[nints-1] := RawFreq[nints-1] + 1
else // new value
begin
nints := nints + 1;
RawFreq[nints-1] := RawFreq[nints-1] + 1;
X := RawScores[i-1];
Sorted[nints-1] := X;
end;
end;
// put data in grid
// AssignedGrid.RowCount := nints + 1;
ScoresGrid.RowCount := nints+1;
GradesGrid.RowCount := nints + 1;
for i := 0 to nints-1 do
begin
ScoresGrid.Cells[0,i] := FloatToStr(Sorted[i]);
ScoresGrid.Cells[1,i] := FloatToStr(RawFreq[i]);
end;
end;
procedure TGradingFrm.FormActivate(Sender: TObject);
var
w: Integer;
begin
w := MaxValue([ResetBtn.Width, CancelBtn.Width, ComputeBtn.Width, ReturnBtn.Width]);
ResetBtn.Constraints.MinWidth := w;
CancelBtn.Constraints.MinWidth := w;
ComputeBtn.Constraints.MinWidth := w;
ReturnBtn.Constraints.MinWidth := w;
end;
procedure TGradingFrm.FormCreate(Sender: TObject);
begin
if OutputFrm = nil then
Application.CreateForm(TOutputFrm, OutputFrm);
end;
procedure TGradingFrm.FormShow(Sender: TObject);
VAR
i, j : integer;
begin
DistUseGroup.ItemIndex := -1;
CategoriesGroup.ItemIndex := -1;
for i := 0 to ScoresGrid.RowCount-1 do
for j := 0 to 1 do ScoresGrid.Cells[j,i] := '';
ScoresGrid.RowCount := 5;
for i := 0 to Grades.RowCount-1 do Grades.Cells[0,i] := '';
Grades.RowCount := 5;
for i := 0 to GradesGrid.RowCount-1 do GradesGrid.Cells[0,i] := '';
GradesGrid.RowCount := 5;
for i := 0 to TopScoreGrid.RowCount-1 do TopScoreGrid.Cells[0,i] := '';
TopScoreGrid.RowCount := 5;
for i := 0 to LowScoreGrid.RowCount-1 do LowScoreGrid.Cells[0,i] := '';
LowScoreGrid.RowCount := 5;
for i := 0 to AssignedGrid.RowCount-1 do AssignedGrid.Cells[0,i] := '';
AssignedGrid.RowCount := 5;
end;
procedure TGradingFrm.LoadBtnClick(Sender: TObject);
var
FName : string;
Grading : textfile;
i, j, choice : integer;
cellstring, outline, valstr : string;
begin
OutputFrm.RichEdit.Clear;
OpenDialog1.DefaultExt := '.GRD';
OpenDialog1.Filter := 'ALL (*.*)|*.*|Test Grading (*.GRD)|*.GRD';
OpenDialog1.FilterIndex := 2;
if OpenDialog1.Execute then
begin
// GetNoRecords;
FName := OpenDialog1.FileName;
AssignFile(Grading,FName);
Reset(Grading);
readln(Grading,ncases);
readln(Grading,nints);
readln(Grading,col);
readln(Grading,choice);
cellstring := format('Distribution used index = %2d',[choice]);
OutputFrm.RichEdit.Lines.Add(cellstring);
// DistUseGroup.ItemIndex := choice;
readln(Grading,choice);
cellstring := format('Category index = %2d',[choice]);
OutputFrm.RichEdit.Lines.Add(cellstring);
// CategoriesGroup.ItemIndex := choice;
readln(Grading,choice);
OutputFrm.RichEdit.Lines.Add('Top Score Low Score');
if choice = 0 then
begin
for i := 0 to 4 do
begin
readln(Grading,cellstring);
outline := format('%10s ',[cellstring]);
// TopScoreGrid.Cells[0,i] := cellstring;
readln(Grading,cellstring);
valstr := format('%10s',[cellstring]);
outline := outline + valstr;
// LowScoreGrid.Cells[0,i] := cellstring;
OutputFrm.RichEdit.Lines.Add(outline);
end;
end else
begin
for i := 0 to 11 do
begin
readln(Grading,cellstring);
outline := format('%10s',[cellstring]);
// TopScoreGrid.Cells[0,i] := cellstring;
readln(Grading,cellstring);
valstr := format('%10s',[cellstring]);
outline := outline + valstr;
// LowScoreGrid.Cells[0,i] := cellstring;
OutputFrm.RichEdit.Lines.Add(outline);
end;
end;
OutputFrm.RichEdit.Lines.Add('');
OutputFrm.RichEdit.Lines.Add('Assigned Grid');
for i := 0 to nints-1 do
begin
readln(Grading,cellstring);
outline := cellstring;
OutputFrm.RichEdit.Lines.Add(outline);
// AssignedGrid.Cells[0,i] := cellstring;
end;
// readln(Grading,cellstring);
OutputFrm.RichEdit.Lines.Add('Score Frequency');
for i := 0 to nints - 1 do
begin
outline := '';
for j := 0 to 1 do
begin
readln(Grading,cellstring);
valstr := format('%10s ',[cellstring]);
outline := outline + valstr;
// ScoresGrid.Cells[j,i] := cellstring;
end;
OutputFrm.RichEdit.Lines.Add(outline);
end;
end;
OutputFrm.ShowModal;
CloseFile(Grading);
end;
procedure TGradingFrm.LowScoreGridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
VAR
i, row, freq, intervals: integer;
lowval, hival, score1 : double;
begin
if Key = 13 then // enter key
begin
intervals := ScoresGrid.RowCount-1;
row := LowScoreGrid.Row;
freq := 0;
lowval := StrToFloat(LowScoreGrid.Cells[0,row]);
hival := StrToFloat(TopScoreGrid.Cells[0,row]);
for i := 0 to intervals-1 do
begin
score1 := StrToFloat(ScoresGrid.Cells[0,i]);
if (score1 >= lowval) and (score1 <= hival) then
freq := freq + StrToInt(ScoresGrid.Cells[1,i]);
end;
AssignedGrid.Cells[0,row] := IntToStr(freq);
if row < ncats-1 then
begin
if DistUseGroup.ItemIndex = 1 then // z score
TopScoreGrid.Cells[0,row+1] := FloatToStr(lowval-0.001);
if DistUseGroup.ItemIndex = 0 then // raw score
TopScoreGrid.Cells[0,row+1] := FloatToStr(lowval-1);
if DistUseGroup.ItemIndex = 2 then // T score
TopScoreGrid.Cells[0,row+1] := FloatToStr(lowval-0.1);
if DistUseGroup.ItemIndex = 3 then // Percentile rank
TopScoreGrid.Cells[0,row+1] := FloatToStr(lowval-0.01);
end;
end;
end;
procedure TGradingFrm.ResetBtnClick(Sender: TObject);
begin
FormShow(self);
end;
procedure TGradingFrm.SaveBtnClick(Sender: TObject);
var
FName : string;
Grading : textfile;
i, j : integer;
begin
SaveDialog1.DefaultExt := '.GRD';
SaveDialog1.Filter := 'ALL (*.*)|*.*|Test Grading (*.GRD)|*.GRD';
SaveDialog1.FilterIndex := 2;
if SaveDialog1.Execute then
begin
FName := SaveDialog1.FileName;
AssignFile(Grading,FName);
Rewrite(Grading);
writeln(Grading,ncases);
writeln(Grading,nints);
writeln(Grading,col);
writeln(Grading,DistUseGroup.ItemIndex);
writeln(Grading,CategoriesGroup.ItemIndex);
if CategoriesGroup.ItemIndex = 0 then
begin
for i := 0 to 4 do
begin
writeln(Grading,TopScoreGrid.Cells[0,i]);
writeln(Grading,LowScoreGrid.Cells[0,i]);
end;
end else
begin
for i := 0 to 11 do
begin
writeln(Grading,TopScoreGrid.Cells[0,i]);
writeln(Grading,LowScoreGrid.Cells[0,i]);
end;
end;
for i := 0 to AssignedGrid.RowCount-1 do
writeln(Grading,AssignedGrid.Cells[0,i]);
for i := 0 to ScoresGrid.RowCount - 1 do
begin
for j := 0 to 1 do writeln(Grading,ScoresGrid.Cells[j,i]);
end;
end;
CloseFile(Grading);
end;
procedure TGradingFrm.CategoriesGroupClick(Sender: TObject);
VAR
btn : integer;
begin
btn := CategoriesGroup.ItemIndex;
if btn = 0 then ncats := 5 else ncats := 12;
if btn = 0 then Grades.RowCount := 5 else Grades.RowCount := 12;
if btn = 0 then TopScoreGrid.RowCount := 5 else TopScoreGrid.RowCount := 12;
if btn = 0 then LowScoreGrid.RowCount := 5 else LowScoreGrid.RowCount := 12;
if btn = 0 then AssignedGrid.RowCount := 5 else AssignedGrid.RowCount := 12;
if btn = 0 then
begin
Grades.Cells[0,0] := 'A';
Grades.Cells[0,1] := 'B';
Grades.Cells[0,2] := 'C';
Grades.Cells[0,3] := 'D';
Grades.Cells[0,4] := 'F';
end;
if btn = 1 then
begin
Grades.Cells[0,0] := 'A';
Grades.Cells[0,1] := 'A-';
Grades.Cells[0,2] := 'B+';
Grades.Cells[0,3] := 'B';
Grades.Cells[0,4] := 'B-';
Grades.Cells[0,5] := 'C+';
Grades.Cells[0,6] := 'C';
Grades.Cells[0,7] := 'C-';
Grades.Cells[0,8] := 'D+';
Grades.Cells[0,9] := 'D';
Grades.Cells[0,10] := 'D-';
Grades.Cells[0,11] := 'F';
end;
end;
procedure TGradingFrm.ComputeBtnClick(Sender: TObject);
VAR
i, j: integer;
X, Y, low, hi : double;
begin
// build AssignedGrid of grades for each Score in the ScoresGrid
for i := 0 to ncats - 1 do
begin
hi := StrToFloat(TopScoreGrid.Cells[0,i]);
low := StrToFloat(LowScoreGrid.Cells[0,i]);
for j := 0 to nints-1 do
begin
X := StrToFloat(ScoresGrid.Cells[0,j]);
if (X >= low) and (X <= hi) then GradesGrid.cells[0,j] := Grades.cells[0,i];
end;
end;
// Now assign grades in the gradebook
for i := 1 to ncases do // gradebook grade cells
begin
Y := StrToFloat(gradebookfrm.grid.Cells[col,i]);
for j := 0 to nints - 1 do // Grade of values in the ScoreGrid
begin
X := StrToFloat(ScoresGrid.Cells[0,j]);
if X = Y then gradebookfrm.Grid.Cells[col+4,i] := gradesGrid.Cells[0,j];
end;
end;
end;
initialization
{$I gradingunit.lrs}
end.