Teacher Reporting: Difference between revisions

No edit summary
No edit summary
Line 37: Line 37:
** Attempt to create a simple Moodle module extension which can be further built off of to provide further functionality.
** Attempt to create a simple Moodle module extension which can be further built off of to provide further functionality.
* Provide a script to move StudentParser.awk's output to ClassParser.awk's input
* Provide a script to move StudentParser.awk's output to ClassParser.awk's input
=="Wishlist Accomplishments "==


==Documentation & Resources==
==Documentation & Resources==
'''''StudentParser.awk''''' Input file format:
<img>http://achumpatoxford.com/u/files/331/0e82d68cfd2c88d8b6dec8d93d1ffd61.png</img>
<pre>
Field Structure:
"Mathematical Operation" "Correct?"
 
example:
45/67 y
</pre>
 
'''''StudentParser.awk''''' Output file format *Incomplete*
<pre>
Field Structure:
line 1: "Student MAC-Address"
line 2+: "Operation type" "correct in decimal"
 
example:
0:1e:8c:25:a0:c1
+ .86
- .84
x .91
/ .86
</pre>
 
'''''Grader.awk:'''''
<pre>
#!/usr/bin/awk
 
# grades -- average student grades and determine
# letter grade as well as class averages
# at the command line run: awk -f grader.awk grades.dat
 
BEGIN { OFS = "\t";    "date +%H:%M:%S" | getline current_time
    close("date +%H:%M:%S")
    print "Report printed on " current_time
}
 
# action applied to all input lines
{
# add up the grades
total = 0
for (i = 3; i <= NF; ++i) # i=3 skips first 2 fields - last name, first name
total+=$i
# calculate average
avg = total / (NF - 2)
# assign student's average to element of array
class_avg[NR] = avg
# determine letter grade
if (avg >= 90) grade="A"
else if (avg >= 80) grade="B"
else if (avg >= 70) grade="C"
else if (avg >= 60) grade="D"
else grade="F"
# increment counter for letter grade array
++class_grade[grade]
# print student first name, last name, average interger value, and letter grade
print $2 " " $1, int(avg), grade#, NF, NF
}
 
# print out class statistics
END  {
# calculate class average
for (x = 1; x <= NR; x++)
class_avg_total += class_avg[x]
class_average = class_avg_total / NR
# determine how many above/below average
for (x = 1; x <= NR; x++)
if (class_avg[x] >= class_average)
++above_average
else
++below_average
# print results
print ""
print "Class Average: ", class_average
print "At or Above Average: ", above_average
print "Below Average: ", below_average
# print number of students per letter grade
for (letter_grade in class_grade)
print letter_grade ":", class_grade[letter_grade]
 
}
</pre>
 
==Helpful stuff==