version 1.2, 2002/07/25 19:29:23
|
version 1.4, 2002/07/27 20:48:36
|
Line 43 use Apache::lonhtmlcommon;
|
Line 43 use Apache::lonhtmlcommon;
|
use Apache::loncoursedata; |
use Apache::loncoursedata; |
use GDBM_File; |
use GDBM_File; |
|
|
my %mapsort; |
|
|
|
sub BuildProblemStatisticsPage { |
sub BuildProblemStatisticsPage { |
my ($cacheDB, $students, $courseID, $c, $r,%color)=@_; |
my ($cacheDB, $students, $courseID, $c, $r,%color)=@_; |
Line 86 sub BuildProblemStatisticsPage {
|
Line 85 sub BuildProblemStatisticsPage {
|
my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID); |
my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID); |
my $index=0; |
my $index=0; |
foreach (@$students) { |
foreach (@$students) { |
|
$index++; |
#&Apache::lonstatistics::Update_PrgWin(++$index,$r); |
#&Apache::lonstatistics::Update_PrgWin(++$index,$r); |
$discriminantFactor = &ExtractStudentData(\%cache, $_, \@list,\%Discuss); |
$discriminantFactor = &ExtractStudentData(\%cache, $_, \@list, |
|
\%Discuss, $r); |
} |
} |
#&Apache::lonstatistics::Close_PrgWin($r); |
#&Apache::lonstatistics::Close_PrgWin($r); |
|
|
return $Ptr; |
|
my ($upper, $lower) = &Discriminant($discriminantFactor); |
my ($upper, $lower) = &Discriminant($discriminantFactor); |
my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod", |
my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod", |
4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff", |
4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff", |
Line 105 sub BuildProblemStatisticsPage {
|
Line 105 sub BuildProblemStatisticsPage {
|
return $Ptr; |
return $Ptr; |
} |
} |
|
|
sub BuildDiffGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('DiffGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
sub BuildWrongGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('WrongGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
#---- Activity log ------------------------------------------------------- |
|
|
|
sub LoadDoDiffFile { |
|
my $file="/home/minaeibi/183d.txt"; |
|
open(FILEID, "<$file"); |
|
my $line=<FILEID>; |
|
my %DoDiff=(); |
|
my @Act=split('&',$line); |
|
|
|
# $r->print('<br>'.$#Act); |
|
for(my $n=0;$n<=$#Act;$n++){ |
|
my ($res,$Degree)=split('@',$Act[$n]); |
|
$DoDiff{$res}=$Degree; |
|
} |
|
|
|
return \%DoDiff; |
|
} |
|
|
|
sub LoadClassFile { |
|
my $file="/home/minaeibi/class.txt"; |
|
open(FILEID, "<$file"); |
|
my $line; |
|
my %Grade=(); |
|
while ($line=<FILEID>) { |
|
my ($id,$ex1,$ex2,$ex3,$ex4,$hw,$final,$grade)=split(' ',$line); |
|
$Grade{$id}=$grade; |
|
} |
|
return \%Grade; |
|
} |
|
|
|
#------- Classification |
|
sub Classify { |
|
my ($DiscFac, $students)=@_; |
|
my ($fileGrade) = &LoadClassFile(); |
|
my $Count=0; |
|
my @List=(); |
|
my @LS=(); |
|
my @LF=(); |
|
my @LM=(); |
|
my $cf=0; |
|
my $cs=0; |
|
my $cm=0; |
|
foreach (keys(%$DiscFac)){ |
|
my @l=split(/\:/,$_); |
|
if (!($students->{$l[1]})) {next;} |
|
my $Grade=$fileGrade->{$students->{$l[1]}}; |
|
if( $Grade > 3 ) { |
|
$cs++; |
|
push(@LS,("$l[6],$l[5],$l[4],$l[7],$l[8],$l[9],Successful")); |
|
} elsif ( $Grade > 2 ) { |
|
$cm++; |
|
push(@LM,("$l[6],$l[5],$l[4],$l[7],$l[8],$l[9],Average")); |
|
} else { |
|
$cf++; |
|
push(@LF,("$l[6],$l[5],$l[4],$l[7],$l[8],$l[9],Failed")); |
|
} |
|
} |
|
my $Str = ''; |
|
for(my $n=0;$n<$cs;$n++){$Str .= '<br>'.$LS[$n];} |
|
for(my $n=0;$n<$cm;$n++){$Str .= '<br>'.$LM[$n];} |
|
for(my $n=0;$n<$cf;$n++){$Str .= '<br>'.$LF[$n];} |
|
|
|
return $Str; |
|
} |
|
|
|
sub ProcAct { |
|
# return; |
|
my ($Act,$Submit)=@_; |
|
my @Act=split(/\@/,$Act); |
|
@Act = sort(@Act); |
|
|
|
##$r->print('<br>'.$#Act); |
|
##for(my $n=0;$n<=$#Act;$n++){ |
|
## $r->print('<br>n='.$n.')'.$Act[$n]); |
|
## } |
|
|
|
# my $Beg=$Act[0]; |
|
my $Dif=$Submit-$Act[0]; |
|
$Dif = ($Dif>0) ? ($Dif/3600) : 0; |
|
|
|
# $r->print('<br>Access Number = '.$#Act.'<br>Submit Time='.$Submit.'<br>First Access='.$Act[0].'<br>Last Access='.$Act[$#Act].'<br> Submit - First = <b>'.$Dif.'</b>'); |
|
|
|
|
|
#time spent for solving the problem |
|
# $r->print('<br>Def'.($Act[$#Act-1]-$Act[0])); |
|
|
|
return $Dif; |
|
} |
|
|
|
sub LoadActivityLog { |
|
# my $CacheDB = "/home/minaeibi/act183.log.cache"; |
|
my $CacheDB = "/home/httpd/perl/tmp/act183.log.cache"; |
|
|
|
my %Activity; |
|
if (-e "$CacheDB") { |
|
if (tie(%Activity,'GDBM_File',"$CacheDB",&GDBM_READER,0640)) { |
|
return; |
|
} |
|
else { |
|
# $r->print("Unable to tie log Cache hash to db file"); |
|
} |
|
} |
|
else { |
|
if (tie(%Activity,'GDBM_File',$CacheDB,&GDBM_WRCREAT,0640)) { |
|
foreach (keys %Activity) {delete $Activity{$_};} |
|
&Build_log(\%Activity); |
|
} |
|
else { |
|
# $r->print("Unable to tie log Build hash to db file"); |
|
} |
|
} |
|
return \%Activity; |
|
} |
|
|
|
sub Build_log { |
|
my ($Activity)=@_; |
|
my $file="/home/minaeibi/act183.log"; |
|
open(FILEID, "<$file"); |
|
my $line; |
|
my $count=0; |
|
while ($line=<FILEID>) { |
|
my ($time,$machine,$what)=split(':',$line); |
|
$what=&Apache::lonnet::unescape($what); |
|
my @accesses=split('&',$what); |
|
|
|
foreach my $access (@accesses) { |
|
|
|
$count++; |
|
|
|
my ($date,$resource,$who,$domain,$post,@posts)=split(':',$access); |
|
if (!$resource) { next; } |
|
my $res=&Apache::lonnet::unescape($resource); |
|
if (($res =~ /\.problem/)) { |
|
$Activity->{$who.':'.$res}.=$date.'@'; |
|
#$r->print('<br>'.$time.':'.$who.'---'.$res); |
|
&Update_PrgInit($count); |
|
|
|
} |
|
} |
|
} |
|
|
|
# my $c=1; |
|
# foreach (sort keys %Activity) { |
|
# $r->print('<br>'.$c.')'.$_.' ... '.$Activity{$_}); |
|
# $c++; |
|
# } |
|
|
|
} |
|
|
|
sub Activity { |
|
my $file="/home/minaeibi/activity.log"; |
|
my $userid='adamsde1'; |
|
# $r->print("<br>Using $file"); |
|
# $r->rflush(); |
|
open(FILEID, "<$file"); |
|
my $line; |
|
my @allaccess; |
|
my $Count=0; |
|
while ($line=<FILEID>) { |
|
my ($time,$machine,$what)=split(':',$line); |
|
$what=&Apache::lonnet::unescape($what); |
|
my @accesses=split('&',$what); |
|
foreach my $access (@accesses) { |
|
my ($date,$resource,$who,$domain,$post,@posts)=split(':',$access); |
|
#if ($who ne $userid) { next; } |
|
if (!$resource) { next; } |
|
my $res=&Apache::lonnet::unescape($resource); |
|
if (($res =~ /\.(sequence|problem|htm|html|page)/)) { |
|
$Count++; |
|
###888 $r->print("<br>$Count) ".localtime($date).": $who --> $res"); |
|
# if ($post) { |
|
# $Count++; |
|
# $r->print("<br><b>$Count) Sent data ".join(':', |
|
# &Apache::lonnet::unescape(@posts)).'</b>'); |
|
# } |
|
###888 $r->rflush(); |
|
} |
|
#push (@allaccess,unescape($access)); |
|
#print $machine; |
|
} |
|
} |
|
# @allaccess=sort(@allaccess); |
|
# $Count=0; |
|
# foreach my $access (@allaccess) { |
|
# my ($date,$resource,$who,$domain,$post,@posts)=split(':',$access); |
|
# $Count++; |
|
# $r->print("<br>$Count) $date: $who --> $resource"); |
|
# $r->rflush(); |
|
# if ($post) { |
|
# $r->print("<br><b>Sent data ".join(':',unescape(@posts)).'</b>'); |
|
# } |
|
# } |
|
} |
|
|
|
#---- END Activity log --------------------------------------------------- |
|
|
|
#---- Problem Statistics Web Page --------------------------------------- |
#---- Problem Statistics Web Page --------------------------------------- |
|
|
#------- Processing upperlist and lowerlist according to each problem |
|
sub ProcessDiscriminant { |
|
my ($List) = @_; |
|
my @sortedList = sort (@$List); |
|
my $Count = scalar @sortedList; |
|
my $Problem; |
|
my @Dis; |
|
my $Slvd=0; |
|
my $tmp; |
|
my $Sum1=0; |
|
my $Sum2=0; |
|
my $nIndex=0; |
|
my $nStudent=0; |
|
my %Proc=undef; |
|
while ($nIndex<$Count) { |
|
($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); |
|
@Dis=split(/\+/,$tmp); |
|
my $Temp = $Problem; |
|
do { |
|
$nIndex++; |
|
$nStudent++; |
|
$Sum1 += $Dis[0]; |
|
$Sum2 += $Dis[1]; |
|
($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); |
|
@Dis=split(/\+/,$tmp); |
|
} while ( $Problem eq $Temp && $nIndex < $Count ); |
|
# $Proc{$Temp}=($Sum1/$nStudent).':'.$nStudent; |
|
$Proc{$Temp}=($Sum1/$nStudent).':'.($Sum2/$nStudent); |
|
# $r->print("$nIndex) $Temp --> ($nStudent) $Proc{$Temp} <br>"); |
|
$Sum1=0; |
|
$Sum2=0; |
|
$nStudent=0; |
|
} |
|
|
|
return %Proc; |
|
} |
|
|
|
#------- Creating Discimination factor |
|
sub Discriminant { |
|
my ($discriminantFactor)=@_; |
|
my @discriminantKeys=keys(%$discriminantFactor); |
|
my $Count = scalar @discriminantKeys; |
|
|
|
my $UpCnt = int(0.27*$Count); |
|
my $low=0; |
|
my $up=$Count-$UpCnt; |
|
my @UpList=(); |
|
my @LowList=(); |
|
|
|
$Count=0; |
|
foreach my $key (sort(@discriminantKeys)) { |
|
$Count++; |
|
if($low < $UpCnt || $Count > $up) { |
|
$low++; |
|
my $str=$discriminantFactor->{$key}; |
|
foreach(split(/\:/,$str)){ |
|
if($_) { |
|
if($low<$UpCnt) { push(@LowList,$_); } |
|
else { push(@UpList,$_); } |
|
} |
|
} |
|
} |
|
} |
|
my %DisUp = &ProcessDiscriminant(\@UpList); |
|
my %DisLow = &ProcessDiscriminant(\@LowList); |
|
|
|
return (\%DisUp, \%DisLow); |
|
} |
|
|
|
|
|
sub NumericSort { |
sub NumericSort { |
$a <=> $b; |
$a <=> $b; |
} |
} |
Line 427 sub CloseTable {
|
Line 149 sub CloseTable {
|
|
|
# ------ Dump the Student's DB file and handling the data for statistics table |
# ------ Dump the Student's DB file and handling the data for statistics table |
sub ExtractStudentData { |
sub ExtractStudentData { |
my ($cache,$name,$list,%Discuss)=@_; |
my ($cache,$name,$list,$Discuss,$r)=@_; |
my %discriminantFactor; |
my %discriminantFactor; |
|
|
my $totalTries = 0; |
my $totalTries = 0; |
Line 443 sub ExtractStudentData {
|
Line 165 sub ExtractStudentData {
|
my $TimeTot = 0; |
my $TimeTot = 0; |
my $Discussed=0; |
my $Discussed=0; |
|
|
|
$Apache::lonxml::debug=1; |
|
#&Apache::lonhomework::showhash(%$cache); |
|
$Apache::lonxml::debug=0; |
|
|
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
if($cache->{'ProblemStatisticsMap'} ne 'All Maps' && |
# if($cache->{'ProblemStatisticsMap'} ne 'All Maps' && |
$cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) { |
# $cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) { |
next; |
# $r->print("<br>$name --- $sequence"); |
} |
# $r->print("<br>".$cache->{$sequence.':title'}); |
|
# next; |
|
# } |
|
|
my $Dis = ''; |
my $Dis = ''; |
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
my $problem = $cache->{$problemID.':problem'}; |
my $problem = $cache->{$problemID.':problem'}; |
|
$r->print("<br>$problemID === $problem"); |
my $LatestVersion = $cache->{$name.':version:'.$problem}; |
my $LatestVersion = $cache->{$name.':version:'.$problem}; |
|
# Output dashes for all the parts of this problem if there |
# Output dashes for all the parts of this problem if there |
|
# is no version information about the current problem. |
# is no version information about the current problem. |
#if(!$LatestVersion) { |
#if(!$LatestVersion) { |
# foreach my $part (split(/\:/,$cache->{$sequence.':'. |
# foreach my $part (split(/\:/,$cache->{$sequence.':'. |
Line 481 sub ExtractStudentData {
|
Line 209 sub ExtractStudentData {
|
# oldest version. Basically, it gets the most recent |
# oldest version. Basically, it gets the most recent |
# set of grade data for each part. |
# set of grade data for each part. |
for(my $Version=1; $Version<=$LatestVersion; $Version++) { |
for(my $Version=1; $Version<=$LatestVersion; $Version++) { |
foreach my $part (split(/\:/,$cache->{$sequence.':'. |
foreach my $part (split(/\:/,$cache->{$sequence.':'. |
$problemID. |
$problemID. |
':parts'})) { |
':parts'})) { |
|
|
Line 517 sub ExtractStudentData {
|
Line 245 sub ExtractStudentData {
|
elsif ($val eq 'incorrect_by_override'){$code = 'I';} |
elsif ($val eq 'incorrect_by_override'){$code = 'I';} |
elsif ($val eq 'excused') {$code = 'x';} |
elsif ($val eq 'excused') {$code = 'x';} |
$partData{$part.':code'}=$code; |
$partData{$part.':code'}=$code; |
|
|
if($partData{$part.':wrong'} ne 0 && |
if($partData{$part.':wrong'} ne 0 && |
($code eq 'C' || $code eq 'O')) { |
($code eq 'C' || $code eq 'O')) { |
$partData{$part.':wrong'}--; |
$partData{$part.':wrong'}--; |
Line 529 sub ExtractStudentData {
|
Line 256 sub ExtractStudentData {
|
# correct order and prepare the output |
# correct order and prepare the output |
foreach (split(/\:/,$cache->{$sequence.':'.$problemID. |
foreach (split(/\:/,$cache->{$sequence.':'.$problemID. |
':parts'})) { |
':parts'})) { |
|
#$r->print("<br>".$cache->{$sequence.':title'}); |
|
|
my $Yes = 0; |
my $Yes = 0; |
if($partData{$_.':code'} eq 'C' || |
if($partData{$_.':code'} eq 'C' || |
$partData{$_.':code'} eq 'O') { |
$partData{$_.':code'} eq 'O') { |
Line 554 sub ExtractStudentData {
|
Line 283 sub ExtractStudentData {
|
$DisF = $Fac; |
$DisF = $Fac; |
} |
} |
|
|
if ($Discuss{"$name:$problem"}) { |
if ($Discuss->{"$name:$problem"}) { |
$TotDiscuss++; |
$TotDiscuss++; |
$Discussed=1; |
$Discussed=1; |
} |
} |
my $time = $cache->{"$name:$LatestVersion:$problem:timestamp"}; |
my $time = $cache->{"$name:$LatestVersion:$problem:timestamp"}; |
$Dis .= $tempProblemOrder.'='.$DisF.'+'.$Yes; |
$Dis .= $tempProblemOrder.'='.$DisF.'+'.$Yes; |
$ptr .= '&'.$partData{$_.'.Tries'}. |
$ptr .= '&'.$partData{$_.'.tries'}. |
'&'.$partData{$_.'.Wrongs'}. |
'&'.$partData{$_.'.wrongs'}. |
'&'.$partData{$_.'.Code'}; |
'&'.$partData{$_.'.code'}; |
push (@$list, $ptr."&$Discussed"); |
push (@$list, $ptr."&$Discussed"); |
|
$r->print('<br>'.$name.'---'.$ptr); |
|
|
#### if ($DoDiff>0.85) { |
#### if ($DoDiff>0.85) { |
|
|
$TimeTot += $time; |
$TimeTot += $time; |
Line 619 sub MySort {
|
Line 349 sub MySort {
|
} |
} |
=cut |
=cut |
|
|
|
|
sub BuildStatisticsTable { |
sub BuildStatisticsTable { |
my ($cache,$discriminantFactor,$list,$headings,$students,$r,%color)=@_; |
my ($cache,$discriminantFactor,$list,$headings,$students,$r,%color)=@_; |
|
|
Line 641 sub BuildStatisticsTable {
|
Line 372 sub BuildStatisticsTable {
|
my %GraphDat; |
my %GraphDat; |
my $NoElements = scalar @$list; |
my $NoElements = scalar @$list; |
|
|
|
|
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
if($cache->{'ProblemStatisticsMap'} ne 'All Maps' && |
|
$cache->{'ProblemStatisticsMap'} ne $cache->{$sequence.':title'}) { |
|
next; |
|
} |
|
|
|
&CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, |
&CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, |
$cache->{$sequence.':source'}, |
$cache->{$sequence.':source'}, |
$cache->{$sequence.':title'}, |
$cache->{$sequence.':title'}, |
$headings,$r); |
$headings,$r); |
|
|
|
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
|
my $problem = $cache->{$problemID.':problem'}; |
|
$r->print("<br>$problem"); |
|
|
|
} |
|
} |
|
} |
|
=pod |
##777777 |
##777777 |
## $Str .= &Classify($discriminantFactor, $students); |
## $Str .= &Classify($discriminantFactor, $students); |
|
|
Line 783 sub BuildStatisticsTable {
|
Line 519 sub BuildStatisticsTable {
|
# close( OUT ); |
# close( OUT ); |
#666666 |
#666666 |
} |
} |
|
=cut |
|
|
=pod |
=pod |
sub Cache_Statistics { |
sub Cache_Statistics { |
Line 1010 sub ProblemStatisticsLegend {
|
Line 747 sub ProblemStatisticsLegend {
|
return $Ptr; |
return $Ptr; |
} |
} |
|
|
|
#------- Processing upperlist and lowerlist according to each problem |
|
sub ProcessDiscriminant { |
|
my ($List) = @_; |
|
my @sortedList = sort (@$List); |
|
my $Count = scalar @sortedList; |
|
my $Problem; |
|
my @Dis; |
|
my $Slvd=0; |
|
my $tmp; |
|
my $Sum1=0; |
|
my $Sum2=0; |
|
my $nIndex=0; |
|
my $nStudent=0; |
|
my %Proc=undef; |
|
while ($nIndex<$Count) { |
|
($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); |
|
@Dis=split(/\+/,$tmp); |
|
my $Temp = $Problem; |
|
do { |
|
$nIndex++; |
|
$nStudent++; |
|
$Sum1 += $Dis[0]; |
|
$Sum2 += $Dis[1]; |
|
($Problem,$tmp)=split(/\=/,$sortedList[$nIndex]); |
|
@Dis=split(/\+/,$tmp); |
|
} while ( $Problem eq $Temp && $nIndex < $Count ); |
|
# $Proc{$Temp}=($Sum1/$nStudent).':'.$nStudent; |
|
$Proc{$Temp}=($Sum1/$nStudent).':'.($Sum2/$nStudent); |
|
# $r->print("$nIndex) $Temp --> ($nStudent) $Proc{$Temp} <br>"); |
|
$Sum1=0; |
|
$Sum2=0; |
|
$nStudent=0; |
|
} |
|
|
|
return %Proc; |
|
} |
|
|
|
#------- Creating Discimination factor |
|
sub Discriminant { |
|
my ($discriminantFactor)=@_; |
|
my @discriminantKeys=keys(%$discriminantFactor); |
|
my $Count = scalar @discriminantKeys; |
|
|
|
my $UpCnt = int(0.27*$Count); |
|
my $low=0; |
|
my $up=$Count-$UpCnt; |
|
my @UpList=(); |
|
my @LowList=(); |
|
|
|
$Count=0; |
|
foreach my $key (sort(@discriminantKeys)) { |
|
$Count++; |
|
if($low < $UpCnt || $Count > $up) { |
|
$low++; |
|
my $str=$discriminantFactor->{$key}; |
|
foreach(split(/\:/,$str)){ |
|
if($_) { |
|
if($low<$UpCnt) { push(@LowList,$_); } |
|
else { push(@UpList,$_); } |
|
} |
|
} |
|
} |
|
} |
|
my %DisUp = &ProcessDiscriminant(\@UpList); |
|
my %DisLow = &ProcessDiscriminant(\@LowList); |
|
|
|
return (\%DisUp, \%DisLow); |
|
} |
|
|
|
|
|
|
#---- END Problem Statistics Web Page ---------------------------------------- |
#---- END Problem Statistics Web Page ---------------------------------------- |
|
|
#---- Problem Statistics Graph Web Page -------------------------------------- |
#---- Problem Statistics Graph Web Page -------------------------------------- |
|
|
# ------------------------------------------- Prepare data for Graphical chart |
# ------------------------------------------- Prepare data for Graphical chart |
|
|
|
sub BuildDiffGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('DiffGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
sub BuildWrongGraph { |
|
my ($r)=@_; |
|
|
|
my $graphData = &GetGraphData('WrongGraph', $r); |
|
return '<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />'; |
|
} |
|
|
|
|
sub GetGraphData { |
sub GetGraphData { |
my ($ylab,$r,%GraphDat)=@_; |
my ($ylab,$r,%GraphDat)=@_; |
my $Col; |
my $Col; |
Line 1051 sub GetGraphData {
|
Line 874 sub GetGraphData {
|
untie(%GraphDat); |
untie(%GraphDat); |
my $Course = $ENV{'course.'.$cid.'.description'}; |
my $Course = $ENV{'course.'.$cid.'.description'}; |
$Course =~ s/\ /"_"/eg; |
$Course =~ s/\ /"_"/eg; |
my $GData=$Course.'&'.'Problems'.'&'.$ylab.'&'.$Max.'&'.$count.'&'.$data; |
my $GData=$Course.'&'.'Problems'.'&'.$ylab.'&'. |
|
$Max.'&'.$count.'&'.$data; |
} |
} |
else { |
else { |
$r->print("Unable to tie hash to db file"); |
$r->print("Unable to tie hash to db file"); |
} |
} |
} |
} |
} |
} |
|
|
|
|
1; |
1; |
__END__ |
__END__ |