4.3BSD/usr/contrib/apl/lib/gradesys

n*.KB	Hnumbername	idn { id nam
nam { 8Ynam,'        '
n {(^/name= (Rname)Rnam)I1
}(n$1YRname)/ok
L{'name: ',nam,' not found'
} n { 0
ok: n { number[n]
score	dstatdstat x;r;max;min;mean;var;sd;md;med;mode;v;m;n
n{Rx
r{(max{x[n])-min{(x{x[|Hx])[1]
sd{(var{(+/(|x-nRmean{(+/x)%n)*2)%n-1)*0.5
md{(+/|x-nRmean)%n
med{0.5X+/x[(Sn%2),1+Dn%2]
'sample size		';n
'maximum		';max
'minimum		';min
'range			';r
'mean			';mean
'variance		';var
'standard deviation	';sd
'mean deviation         ';md
'median			';med

histr { n hist d;v;t
t { Dd%n
v { +/(I1+S/t)J.=t+I1
r { O- (IS/v)J.$v
numclist number  summarysummary; i
L{' '
L{'     score summary'
L{'  '
L{ head list
L { name,Bnumc,score
	lcrr { lcr fn ;t;n
t { Lcr fn
n { 1YRt
r { ((n,1)R'['),0 1U(B(n,1)R((In)-I1)),((n,3)R']  '),t
	headr { head list
r { (((1URlist), 8)R' '),((3X1YRlist)R 0 1 0)\O\  list
dropdrop ;idx;sid
ask: L{'student class id?'
 } (0=sid {L)/0
 idx { numberIsid
 head list
 name[idx;],B numc[idx;],score[idx;]
 L{'ok ?'
 }('y'#'L)/ask
 mask { (Rnumber)R1
 mask[idx]{0
 name {mask/[1]name
 numc {mask/[1]numc
 number{mask/number
 score { mask/[1]score
 L{'dropped'
 } ask
	statz{stat x;r;max;min;mean;var;sd;md;med;mode;v;m;n
n{Rx
r{(max{x[n])-min{(x{x[|Hx])[1]
sd{(var{(+/(|x-nRmean{(+/x)Pn)*2)Pn-1)*0.5
md{(+/|x-nRmean)Pn
med{0.5M+/x[(SnP2),1+DnP2]
z{n,r,max,min,mean,sd,med
	scoremax	statnameP8number  range   maximum minimum mean    std.dev.median  	newstatnewstat data ;i
 statscore { (7,1URdata)R0
 i {1
next: statscore[;i]{stat data[;i]
 } ((1URstatscore) & i{i+1)/next
 statscore[1;]{+/[1]0#data
statsummarystatsummary ;statscore
newstat score
L{' '
L{'      statistics summary'
L{' '
L{head list
L{ statname,(7 3R' '),B D statscore
type,ass  quiz test final
scoretype	newscorenewscore ;pos;i;mask;listn;p;it;tp
L{'current types are:'
L{ type
L'{'type ? '
p { type find it { L'
}(V/p)/oktype
L { 'type not found'
}0
oktype: tp { p/IRp
pos { (tp<scoretype)I1
mask {1,(Rscoretype)R1
mask[pos]{0
score { mask\score
scoremax { mask\scoremax
list { (1,mask)\[1]list
scoretype { mask\scoretype
scoretype [pos] { tp
L{'scoremax?'
scoremax[pos]{ L
listn { (B+/,scoretype=scoretype[pos]),'       '
list[pos+1;] { (1URlist)Rit,listn
CJ now input new scores
i{1
next: pos update number[i]
}((Rnumber)&i{i+1)/next
L{' new score complete'

updatecol update idn;idx;ip
 idx {numberIidn
 L{name[idx;],(Bidn),' : ',list[1+col;],'old score ',Bscore[idx;col]
 }(0> ip{L)/nc
 score[idx;col]{ip
 }0
nc: L{'no change'
newnamenewname ;nname
L{ 'names?'
next: } (0 = R nname{L')/done
name{ name,[1] 1 8 R nname,'        '
number{ number,1+ `1 Y number
}next
done: numc { ((Rnumber),1)Rnumber
score{ score,[1] (((Rnumber)-1YRscore),1URscore)R0
'exit'
alphaalpha 
name{ name[(H| 26 B O\ 0,name);]
	analysisanalysis; i; mk; av1; rank
tlist{ type,[1](1URtype)R'total   '
means{ ((Rnumber),1+1YRtype)R0
i{1
next1: mk{ scoretype=i
 }done XI 0=V/,mk
means[;i]{ 100X(+/mk/score) % +/mk/scoremax
done: }((1YRtype) >= i{ i+1 )/next1
means[;i]{ (+/(means[;Ii-1]X((Rnumber),Rweight)Rweight)) %+/weight
means{ (D 0.5+10Xmeans)%10
rank{ |V means[;i]
L{ 'ranking'
tlist{ ((1,1URtlist)R'rank    '),[1]tlist
head tlist
L{ name[rank;],B(IRrank),means[rank;]
''
''
''
av1{ |H [1]|V [1]means
tlist{ 1 0Utlist
head tlist
L{ name,Bav1
weight4B B CB
histgm title histgm data ; i;h;m50
m50 { 51 > S/data
data { S data%2-m50
h {51R0
i{0
loop: h[i+1] { +/data =i
}loop XI 50 & i {i+1
''
'              Histogram of ',title
''
i { S/h
loop2: ' *'[1+ h&i]
}loop2 XI 0< i{i-1
'|----|----|----|----|----|----|----|----|----|----|'
}m50/low
'0   10   20   30   40   50   60   70   80   90   100'
}0
low:'0    5   10   15   20   25   30   35   40   45   50'

findp { list find item
p { ^/list=(Rlist)R(1URlist)Y item,'        '
	
printstatprintstat colnam;data
}(0=Rdata{ getcol colnam)/0
dstat data
	printstat0printstat0 colnam;data
}(0=Rdata{ getcol colnam)/0
data { (0#data)/data
dstat data
	getcoldata { getcol colnam;p
p { 1U list find colnam
}(~V/p)/snf
data { ,p/score
}0
snf:p { tlist find colnam
}(~V/p)/nnf
data {,p/means
}0
nnf:'column name ',colnam,' not found'
data { 0R0
	
printhistprinthist colnam;data
}(0=Rdata{ getcol colnam)/0
colnam histgm data
	printhist0printhist0 colnam;data
}(0=Rdata{ getcol colnam)/0
data { (0#data)/data
colnam histgm data
	
readnamesreadnames file ;nn;fd
 fd { 260 Lopen file
 name { 0 8 R' '
next: nn { Lrd fd
 } exit XI0 = R nn
 name { name,[1]8Ynn,'        '
 } next
exit: fd {Lclose fd
name { name[(H| 26 B O\ 0,name);]
numc { ((1YRname),1)R number { I1YRname
score {((Rnumber),0)R0
scoretype { 0R0
scoremax { 0R0
list { 1 8R'number  '
setupsetup ;i
L{ 'enter the types one per line'
type { 0 8 R' '
gettype: }next XI 0=Rtt { 'L
type { type,[1]8Ytt,'        '
}gettype
next: L{ 'enter the weights for each type'
i { 1
weight { 0R0
nextweight: 'L { type[i;],' = '
weight { weight,L
}nextweight XI (1YRtype)&i { i+1

changenam change stype;idx;ip;idn;ic
idn { id nam
}(0=idn)/0
ic { list find stype
}(0#V/ic)/ok
L{'type not found'
}0
ok:col { `1 + ic I 1
 idx {numberIidn
 L{name[idx;],(Bidn),' : ',list[1+col;],'old score ',Bscore[idx;col]
 }(0> ip{L)/nc
 score[idx;col]{ip
 }0
nc: L{'no change'

analstatsanalstats ;statscore ;tlist
newstat means
L {''
L {'   analysis statistics'
L { ''
tlist { type,[1](1URtype)R'total       '
head tlist
statname,B D statscore