diff --git a/swad_changelog.h b/swad_changelog.h
index bfa92416..2986238d 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -556,7 +556,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
-#define Log_PLATFORM_VERSION "SWAD 19.255.1 (2020-06-23)"
+#define Log_PLATFORM_VERSION "SWAD 19.255.2 (2020-06-24)"
#define CSS_FILE "swad19.253.css"
#define JS_FILE "swad19.254.js"
/*
@@ -567,6 +567,7 @@ TODO: Fix bug: Cuando se pulsa en ver fichas, y luego en una ficha en "Ver traba
TODO: No limitar el número de preguntas en un examen a ExaPrn_MAX_QUESTIONS_PER_EXAM_PRINT, sino asignar PrintedQuestions dinámicamente con malloc
TODO: Que al generar un examen sólo se cojan preguntas válidas. Y si ya está generado, al entrar de nuevo, que se vean en rojo.
+ Version 19.255.2: Jun 24, 2020 Changes in listing of test and exam results. (303701 lines)
Version 19.255.1: Jun 23, 2020 Changes in listing of test results. (303655 lines)
Version 19.255: Jun 23, 2020 Code refactoring in test results. (303625 lines)
Version 19.254.2: Jun 23, 2020 Matches results can only be changed to visible when match is at the end.
diff --git a/swad_exam_print.c b/swad_exam_print.c
index 7e5bdf2b..3bf12cd0 100644
--- a/swad_exam_print.c
+++ b/swad_exam_print.c
@@ -531,7 +531,7 @@ static void ExaPrn_CreatePrintInDB (struct ExaPrn_Print *Print)
" (%ld,%ld,NOW(),NOW(),%u,0,'N',0)",
Print->SesCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
- Print->NumQsts);
+ Print->NumQsts.All);
/***** Store all questions (with blank answers)
of this exam print just generated in database *****/
diff --git a/swad_exam_result.c b/swad_exam_result.c
index 59de7cb2..fa94eddc 100644
--- a/swad_exam_result.c
+++ b/swad_exam_result.c
@@ -716,25 +716,25 @@ static void ExaRes_ShowHeaderResults (Usr_MeOrOther_t MeOrOther)
/***** First row *****/
HTM_TR_Begin (NULL);
- HTM_TH (3,2,"CT",Txt_User[MeOrOther == Usr_ME ? Gbl.Usrs.Me.UsrDat.Sex :
+ HTM_TH (3,2,"CT LINE_BOTTOM",Txt_User[MeOrOther == Usr_ME ? Gbl.Usrs.Me.UsrDat.Sex :
Usr_SEX_UNKNOWN]);
- HTM_TH (3,1,"LT",Txt_START_END_TIME[Dat_START_TIME]);
- HTM_TH (3,1,"LT",Txt_START_END_TIME[Dat_END_TIME ]);
- HTM_TH (3,1,"LT",Txt_Session);
+ HTM_TH (3,1,"LT LINE_BOTTOM",Txt_START_END_TIME[Dat_START_TIME]);
+ HTM_TH (3,1,"LT LINE_BOTTOM",Txt_START_END_TIME[Dat_END_TIME ]);
+ HTM_TH (3,1,"LT LINE_BOTTOM",Txt_Session);
HTM_TH (1,3,"CT LINE_LEFT",Txt_Questions);
HTM_TH (1,5,"CT LINE_LEFT",Txt_Valid_answers);
HTM_TH (1,2,"CT LINE_LEFT",Txt_Score);
- HTM_TH (3,1,"RT LINE_LEFT",Txt_Grade);
- HTM_TH (3,1,"LINE_LEFT",NULL);
+ HTM_TH (3,1,"RT LINE_BOTTOM LINE_LEFT",Txt_Grade);
+ HTM_TH (3,1,"LINE_BOTTOM LINE_LEFT",NULL);
HTM_TR_End ();
/***** Second row *****/
HTM_TR_Begin (NULL);
- HTM_TH (2,1,"RT LINE_LEFT",Txt_total);
- HTM_TH (2,1,"RT",Txt_QUESTIONS_valid);
- HTM_TH (2,1,"RT",Txt_QUESTIONS_invalid);
+ HTM_TH (2,1,"RT LINE_BOTTOM LINE_LEFT",Txt_total);
+ HTM_TH (2,1,"RT LINE_BOTTOM",Txt_QUESTIONS_valid);
+ HTM_TH (2,1,"RT LINE_BOTTOM",Txt_QUESTIONS_invalid);
HTM_TH (1,1,"RT LINE_LEFT",Txt_ANSWERS_correct);
HTM_TH (1,3,"CT",Txt_ANSWERS_wrong);
HTM_TH (1,1,"RT",Txt_ANSWERS_blank);
@@ -746,13 +746,13 @@ static void ExaRes_ShowHeaderResults (Usr_MeOrOther_t MeOrOther)
/***** Third row *****/
HTM_TR_Begin (NULL);
- HTM_TH (1,1,"RT LINE_LEFT","pi=1");
- HTM_TH (1,1,"RT","-1≤pi<0");
- HTM_TH (1,1,"RT","pi=0");
- HTM_TH (1,1,"RT","0<pi<1");
- HTM_TH (1,1,"RT","pi=0");
- HTM_TH (1,1,"RT LINE_LEFT","Σpi");
- HTM_TH (1,1,"RT","-1≤p≤1");
+ HTM_TH (1,1,"RT LINE_BOTTOM LINE_LEFT","pi=1");
+ HTM_TH (1,1,"RT LINE_BOTTOM","-1≤pi<0");
+ HTM_TH (1,1,"RT LINE_BOTTOM","pi=0");
+ HTM_TH (1,1,"RT LINE_BOTTOM","0<pi<1");
+ HTM_TH (1,1,"RT LINE_BOTTOM","pi=0");
+ HTM_TH (1,1,"RT LINE_BOTTOM LINE_LEFT","Σpi");
+ HTM_TH (1,1,"RT LINE_BOTTOM","-1≤p≤1");
HTM_TR_End ();
}
@@ -998,6 +998,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_Txt (Session.Title);
HTM_TD_End ();
+ /* Get and accumulate questions and score */
if (ICanView.Score)
{
/* Get questions and user's answers of exam print from database */
@@ -1012,7 +1013,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
NumTotalQsts.Valid.Wrong.Positive += Print.NumQsts.Valid.Wrong.Positive;
NumTotalQsts.Valid.Blank += Print.NumQsts.Valid.Blank;
NumTotalQsts.Valid.Total += Print.NumQsts.Valid.Total;
- TotalScore.Valid += Print.Score.Valid;
+ TotalScore.Valid += Print.Score.Valid;
}
/* Write total number of questions */
diff --git a/swad_match.c b/swad_match.c
index 2739e39e..83755030 100644
--- a/swad_match.c
+++ b/swad_match.c
@@ -4043,21 +4043,21 @@ void Mch_GetMatchQuestionsFromDB (long MchCod,long UsrCod,
struct Mch_UsrAnswer UsrAnswer;
/***** Get questions and answers of a match result *****/
- Print->NumQsts = (unsigned)
- DB_QuerySELECT (&mysql_res,"can not get questions and answers"
- " of a match result",
- "SELECT gam_questions.QstCod," // row[0]
- "gam_questions.QstInd," // row[1]
- "mch_indexes.Indexes" // row[2]
- " FROM mch_matches,gam_questions,mch_indexes"
- " WHERE mch_matches.MchCod=%ld"
- " AND mch_matches.GamCod=gam_questions.GamCod"
- " AND mch_matches.MchCod=mch_indexes.MchCod"
- " AND gam_questions.QstInd=mch_indexes.QstInd"
- " ORDER BY gam_questions.QstInd",
- MchCod);
- for (NumQst = 0, Print->NumQstsNotBlank = 0;
- NumQst < Print->NumQsts;
+ Print->NumQsts.All = (unsigned)
+ DB_QuerySELECT (&mysql_res,"can not get questions and answers"
+ " of a match result",
+ "SELECT gam_questions.QstCod," // row[0]
+ "gam_questions.QstInd," // row[1]
+ "mch_indexes.Indexes" // row[2]
+ " FROM mch_matches,gam_questions,mch_indexes"
+ " WHERE mch_matches.MchCod=%ld"
+ " AND mch_matches.GamCod=gam_questions.GamCod"
+ " AND mch_matches.MchCod=mch_indexes.MchCod"
+ " AND gam_questions.QstInd=mch_indexes.QstInd"
+ " ORDER BY gam_questions.QstInd",
+ MchCod);
+ for (NumQst = 0, Print->NumQsts.NotBlank = 0;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
row = mysql_fetch_row (mysql_res);
@@ -4081,7 +4081,7 @@ void Mch_GetMatchQuestionsFromDB (long MchCod,long UsrCod,
{
snprintf (Print->PrintedQuestions[NumQst].StrAnswers,Tst_MAX_BYTES_ANSWERS_ONE_QST + 1,
"%d",UsrAnswer.AnsInd);
- Print->NumQstsNotBlank++;
+ Print->NumQsts.NotBlank++;
}
else // UsrAnswer.AnsInd < 0 ==> no answer selected
Print->PrintedQuestions[NumQst].StrAnswers[0] = '\0'; // Empty answer
@@ -4101,7 +4101,7 @@ void Mch_ComputeScore (struct TstPrn_Print *Print)
struct Tst_Question Question;
for (NumQst = 0, Print->Score = 0.0;
- NumQst < Print->NumQsts;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
/***** Create test question *****/
diff --git a/swad_match_result.c b/swad_match_result.c
index a1ed807e..893af0a7 100644
--- a/swad_match_result.c
+++ b/swad_match_result.c
@@ -152,8 +152,8 @@ static void MchRes_UpdateMyMatchResult (long MchCod,const struct TstPrn_Print *P
"NumQstsNotBlank=%u,"
"Score='%.15lg'"
" WHERE MchCod=%ld AND UsrCod=%ld",
- Print->NumQsts,
- Print->NumQstsNotBlank,
+ Print->NumQsts.All,
+ Print->NumQsts.NotBlank,
Print->Score,
MchCod,Gbl.Usrs.Me.UsrDat.UsrCod);
else // Match print doesn't exist
@@ -170,8 +170,8 @@ static void MchRes_UpdateMyMatchResult (long MchCod,const struct TstPrn_Print *P
"%u," // NumQstsNotBlank
"'%.15lg')", // Score
MchCod,Gbl.Usrs.Me.UsrDat.UsrCod,
- Print->NumQsts,
- Print->NumQstsNotBlank,
+ Print->NumQsts.All,
+ Print->NumQsts.NotBlank,
Print->Score);
Str_SetDecimalPointToLocal (); // Return to local system
}
@@ -1284,7 +1284,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LB\"");
- HTM_Unsigned (Print.NumQsts);
+ HTM_Unsigned (Print.NumQsts.All);
HTM_TD_End ();
HTM_TR_End ();
@@ -1297,7 +1297,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LB\"");
- HTM_Unsigned (Print.NumQstsNotBlank);
+ HTM_Unsigned (Print.NumQsts.NotBlank);
HTM_TD_End ();
HTM_TR_End ();
@@ -1315,7 +1315,7 @@ void MchRes_ShowOneMchResult (void)
HTM_STRONG_Begin ();
HTM_Double2Decimals (Print.Score);
HTM_Txt ("/");
- HTM_Unsigned (Print.NumQsts);
+ HTM_Unsigned (Print.NumQsts.All);
HTM_STRONG_End ();
}
else
@@ -1335,7 +1335,7 @@ void MchRes_ShowOneMchResult (void)
if (ICanView.Score)
{
HTM_STRONG_Begin ();
- TstPrn_ComputeAndShowGrade (Print.NumQsts,Print.Score,Game.MaxGrade);
+ TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Game.MaxGrade);
HTM_STRONG_End ();
}
else
@@ -1407,12 +1407,12 @@ static void MchRes_GetMatchResultDataByMchCod (long MchCod,long UsrCod,
Print->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[StartEndTime]);
/* Get number of questions (row[2]) */
- if (sscanf (row[2],"%u",&Print->NumQsts) != 1)
- Print->NumQsts = 0;
+ if (sscanf (row[2],"%u",&Print->NumQsts.All) != 1)
+ Print->NumQsts.All = 0;
/* Get number of questions not blank (row[3]) */
- if (sscanf (row[3],"%u",&Print->NumQstsNotBlank) != 1)
- Print->NumQstsNotBlank = 0;
+ if (sscanf (row[3],"%u",&Print->NumQsts.NotBlank) != 1)
+ Print->NumQsts.NotBlank = 0;
/* Get score (row[4]) */
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
@@ -1422,8 +1422,8 @@ static void MchRes_GetMatchResultDataByMchCod (long MchCod,long UsrCod,
}
else
{
- Print->NumQsts = 0;
- Print->NumQstsNotBlank = 0;
+ Print->NumQsts.All =
+ Print->NumQsts.NotBlank = 0;
Print->Score = 0.0;
}
diff --git a/swad_test.c b/swad_test.c
index ac6f64ba..ccf1ac39 100644
--- a/swad_test.c
+++ b/swad_test.c
@@ -387,7 +387,7 @@ void Tst_ShowNewTest (void)
/***** Get questions *****/
TstPrn_ResetPrint (&Print);
Tst_GetQuestionsForNewTestFromDB (&Test,&Print);
- if (Print.NumQsts)
+ if (Print.NumQsts.All)
{
/***** Increase number of exams generated (answered or not) by me *****/
Tst_IncreaseMyNumAccessTst ();
@@ -550,7 +550,7 @@ void Tst_AssessTest (void)
HTM_Double2Decimals (Print.Score);
HTM_BR ();
HTM_TxtColonNBSP (Txt_Grade);
- TstPrn_ComputeAndShowGrade (Print.NumQsts,Print.Score,Tst_SCORE_MAX);
+ TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
HTM_DIV_End ();
}
@@ -570,7 +570,7 @@ static void TstPrn_GetAnswersFromForm (struct TstPrn_Print *Print)
/***** Loop for every question getting user's answers *****/
for (NumQst = 0;
- NumQst < Print->NumQsts;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
/* Get answers selected by user for this question */
@@ -2009,14 +2009,14 @@ static void Tst_GetQuestionsForNewTestFromDB (struct Tst_Test *Test,
Lay_ShowAlert (Lay_INFO,Query);
*/
/* Make the query */
- Print->NumQsts =
- Test->NumQsts = (unsigned) DB_QuerySELECT (&mysql_res,"can not get questions",
- "%s",
- Query);
+ Print->NumQsts.All =
+ Test->NumQsts = (unsigned) DB_QuerySELECT (&mysql_res,"can not get questions",
+ "%s",
+ Query);
/***** Get questions and answers from database *****/
for (NumQst = 0;
- NumQst < Print->NumQsts;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
/* Get question row */
diff --git a/swad_test_print.c b/swad_test_print.c
index 070decc9..5a545b9a 100644
--- a/swad_test_print.c
+++ b/swad_test_print.c
@@ -174,9 +174,8 @@ static void TstPrn_ShowHeaderPrints (void);
static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat);
static void TstPrn_ShowPrintsSummaryRow (bool ItsMe,
unsigned NumPrints,
- unsigned NumTotalQsts,
- unsigned NumTotalQstsNotBlank,
- double TotalScoreOfAllTests);
+ struct TstPrn_NumQuestions *NumTotalQsts,
+ double TotalScore);
static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print,
long UsrCod,
@@ -198,11 +197,11 @@ static void TstPrn_ResetPrintExceptPrnCod (struct TstPrn_Print *Print)
{
Print->TimeUTC[Dat_START_TIME] =
Print->TimeUTC[Dat_END_TIME ] = (time_t) 0;
- Print->NumQsts = 0;
- Print->NumQstsNotBlank = 0;
- Print->Sent = false; // After creating an exam, it's not sent
- Print->AllowTeachers = false; // Teachers can't seen the exam if student don't allow it
- Print->Score = 0.0;
+ Print->NumQsts.All =
+ Print->NumQsts.NotBlank = 0;
+ Print->Sent = false; // After creating an exam, it's not sent
+ Print->AllowTeachers = false; // Teachers can't seen the exam if student don't allow it
+ Print->Score = 0.0;
}
/*****************************************************************************/
@@ -220,7 +219,7 @@ void TstPrn_CreatePrintInDB (struct TstPrn_Print *Print)
" (%ld,%ld,NOW(),NOW(),%u,0,'N','N',0)",
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
- Print->NumQsts);
+ Print->NumQsts.All);
}
/*****************************************************************************/
@@ -240,7 +239,7 @@ void TstPrn_UpdatePrintInDB (const struct TstPrn_Print *Print)
"Score='%.15lg'"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld AND UsrCod=%ld", // Extra checks
- Print->NumQstsNotBlank,
+ Print->NumQsts.NotBlank,
Print->Sent ? 'Y' :
'N',
Print->AllowTeachers ? 'Y' :
@@ -281,7 +280,7 @@ void TstPrn_ShowTestPrintToFillIt (struct TstPrn_Print *Print,
Gbl.Hierarchy.Deg.DegCod,
Gbl.Hierarchy.Crs.CrsCod);
- if (Print->NumQsts)
+ if (Print->NumQsts.All)
{
/***** Begin form *****/
Frm_StartForm (Action[RequestOrConfirm]);
@@ -293,7 +292,7 @@ void TstPrn_ShowTestPrintToFillIt (struct TstPrn_Print *Print,
/***** Write one row for each question *****/
for (NumQst = 0;
- NumQst < Print->NumQsts;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
Gbl.RowEvenOdd = NumQst % 2;
@@ -600,11 +599,11 @@ void TstPrn_ShowPrintAfterAssess (struct TstPrn_Print *Print)
HTM_TABLE_BeginWideMarginPadding (10);
/***** Initialize score and number of questions not blank *****/
- Print->NumQstsNotBlank = 0;
+ Print->NumQsts.NotBlank = 0;
Print->Score = 0.0;
for (NumQst = 0;
- NumQst < Print->NumQsts;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
Gbl.RowEvenOdd = NumQst % 2;
@@ -627,7 +626,7 @@ void TstPrn_ShowPrintAfterAssess (struct TstPrn_Print *Print)
/***** Compute total score *****/
Print->Score += Print->PrintedQuestions[NumQst].Score;
if (Print->PrintedQuestions[NumQst].StrAnswers[0]) // User's answer is not blank
- Print->NumQstsNotBlank++;
+ Print->NumQsts.NotBlank++;
/***** Update the number of accesses and the score of this question *****/
if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
@@ -767,11 +766,11 @@ void TstPrn_ComputeScoresAndStoreQuestionsOfPrint (struct TstPrn_Print *Print,
/***** Initialize total score *****/
Print->Score = 0.0;
- Print->NumQstsNotBlank = 0;
+ Print->NumQsts.NotBlank = 0;
/***** Compute and store scores of all questions *****/
for (NumQst = 0;
- NumQst < Print->NumQsts;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
/* Compute question score */
@@ -788,7 +787,7 @@ void TstPrn_ComputeScoresAndStoreQuestionsOfPrint (struct TstPrn_Print *Print,
/* Accumulate total score */
Print->Score += Print->PrintedQuestions[NumQst].Score;
if (Print->PrintedQuestions[NumQst].StrAnswers[0]) // User's answer is not blank
- Print->NumQstsNotBlank++;
+ Print->NumQsts.NotBlank++;
/* Update the number of hits and the score of this question in tests database */
if (UpdateQstScore)
@@ -2009,14 +2008,14 @@ static void TstPrn_ShowHeaderPrints (void)
/***** First row *****/
HTM_TR_Begin (NULL);
- HTM_TH (3,2,"CT",Txt_User[Usr_SEX_UNKNOWN]);
- HTM_TH (3,1,"LT",Txt_START_END_TIME[Dat_START_TIME]);
- HTM_TH (3,1,"LT",Txt_START_END_TIME[Dat_END_TIME ]);
- HTM_TH (3,1,"RT LINE_LEFT",Txt_Questions);
+ HTM_TH (3,2,"CT LINE_BOTTOM",Txt_User[Usr_SEX_UNKNOWN]);
+ HTM_TH (3,1,"LT LINE_BOTTOM",Txt_START_END_TIME[Dat_START_TIME]);
+ HTM_TH (3,1,"LT LINE_BOTTOM",Txt_START_END_TIME[Dat_END_TIME ]);
+ HTM_TH (3,1,"RT LINE_BOTTOM LINE_LEFT",Txt_Questions);
HTM_TH (1,2,"CT LINE_LEFT",Txt_Answers);
HTM_TH (1,2,"CT LINE_LEFT",Txt_Score);
- HTM_TH (3,1,"RT LINE_LEFT",Txt_Grade);
- HTM_TH (3,1,"LINE_LEFT",NULL);
+ HTM_TH (3,1,"RT LINE_BOTTOM LINE_LEFT",Txt_Grade);
+ HTM_TH (3,1,"LINE_BOTTOM LINE_LEFT",NULL);
HTM_TR_End ();
@@ -2033,10 +2032,10 @@ static void TstPrn_ShowHeaderPrints (void)
/***** Third row *****/
HTM_TR_Begin (NULL);
- HTM_TH (1,1,"RT LINE_LEFT","-1≤pi≤1");
- HTM_TH (1,1,"RT","pi=0");
- HTM_TH (1,1,"RT LINE_LEFT","Σpi");
- HTM_TH (1,1,"RT","-1≤p≤1");
+ HTM_TH (1,1,"RT LINE_BOTTOM LINE_LEFT","-1≤pi≤1");
+ HTM_TH (1,1,"RT LINE_BOTTOM","pi=0");
+ HTM_TH (1,1,"RT LINE_BOTTOM LINE_LEFT","Σpi");
+ HTM_TH (1,1,"RT LINE_BOTTOM","-1≤p≤1");
HTM_TR_End ();
}
@@ -2056,14 +2055,22 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
Dat_StartEndTime_t StartEndTime;
char *Id;
struct TstPrn_Print Print;
- unsigned NumTotalQsts = 0;
- unsigned NumTotalQstsNotBlank = 0;
- double TotalScoreOfAllTests = 0.0;
+ unsigned NumQstsBlank;
+ struct TstPrn_NumQuestions NumTotalQsts;
+ double TotalScore;
unsigned NumPrintsVisibleByTchs = 0;
bool ItsMe = Usr_ItsMe (UsrDat->UsrCod);
struct TstRes_ICanView ICanView;
char *ClassDat;
+ /***** Reset print *****/
+ TstPrn_ResetPrint (&Print);
+
+ /***** Reset total number of questions and total score *****/
+ NumTotalQsts.All =
+ NumTotalQsts.NotBlank = 0;
+ TotalScore = 0.0;
+
/***** Make database query *****/
/* From here... ...to here
___________|_____ _____|___________
@@ -2129,10 +2136,20 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
free (Id);
}
+ /* Accumulate questions and score */
+ if (ICanView.Score)
+ {
+ NumTotalQsts.All += Print.NumQsts.All;
+ NumTotalQsts.NotBlank += Print.NumQsts.NotBlank;
+ TotalScore += Print.Score;
+ }
+
/* Write number of questions */
HTM_TD_Begin ("class=\"%s LINE_LEFT RT COLOR%u\"",ClassDat,Gbl.RowEvenOdd);
if (ICanView.Result)
- HTM_Unsigned (Print.NumQsts);
+ {
+ HTM_Unsigned (Print.NumQsts.All);
+ }
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@@ -2140,7 +2157,12 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
/* Write number of non-blank answers */
HTM_TD_Begin ("class=\"%s LINE_LEFT RT COLOR%u\"",ClassDat,Gbl.RowEvenOdd);
if (ICanView.Result)
- HTM_Unsigned (Print.NumQstsNotBlank);
+ {
+ if (Print.NumQsts.NotBlank)
+ HTM_Unsigned (Print.NumQsts.NotBlank);
+ else
+ HTM_Light0 ();
+ }
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@@ -2148,7 +2170,13 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
/* Write number of blank answers */
HTM_TD_Begin ("class=\"%s RT COLOR%u\"",ClassDat,Gbl.RowEvenOdd);
if (ICanView.Result)
- HTM_Unsigned (Print.NumQsts - Print.NumQstsNotBlank);
+ {
+ NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
+ if (NumQstsBlank)
+ HTM_Unsigned (NumQstsBlank);
+ else
+ HTM_Light0 ();
+ }
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@@ -2159,7 +2187,7 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
{
HTM_Double2Decimals (Print.Score);
HTM_Txt ("/");
- HTM_Unsigned (Print.NumQsts);
+ HTM_Unsigned (Print.NumQsts.All);
}
else
Ico_PutIconNotVisible ();
@@ -2168,9 +2196,9 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
/* Write average score per question */
HTM_TD_Begin ("class=\"%s RT COLOR%u\"",ClassDat,Gbl.RowEvenOdd);
if (ICanView.Score)
- HTM_Double2Decimals (Print.NumQsts ? Print.Score /
- (double) Print.NumQsts :
- 0.0);
+ HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
+ (double) Print.NumQsts.All :
+ 0.0);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@@ -2178,7 +2206,7 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
/* Write grade */
HTM_TD_Begin ("class=\"%s LINE_LEFT RT COLOR%u\"",ClassDat,Gbl.RowEvenOdd);
if (ICanView.Score)
- TstPrn_ComputeAndShowGrade (Print.NumQsts,Print.Score,Tst_SCORE_MAX);
+ TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@@ -2204,12 +2232,34 @@ static void TstPrn_ShowUsrPrints (struct UsrData *UsrDat)
/***** Write totals for this user *****/
TstPrn_ShowPrintsSummaryRow (ItsMe,NumPrintsVisibleByTchs,
- NumTotalQsts,NumTotalQstsNotBlank,
- TotalScoreOfAllTests);
+ &NumTotalQsts,TotalScore);
}
else
{
- HTM_TD_ColouredEmpty (8);
+ /* Columns for dates */
+ HTM_TD_Begin ("colspan=\"2\" class=\"LINE_BOTTOM COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_End ();
+
+ /* Column for questions */
+ HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_End ();
+
+ /* Columns for answers */
+ HTM_TD_Begin ("colspan=\"2\" class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_End ();
+
+ /* Columns for score */
+ HTM_TD_Begin ("colspan=\"2\" class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_End ();
+
+ /* Column for grade */
+ HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_End ();
+
+ /* Column for link to show the result */
+ HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_End ();
+
HTM_TR_End ();
}
@@ -2243,10 +2293,9 @@ long TstPrn_GetParamPrnCod (void)
/*****************************************************************************/
static void TstPrn_ShowPrintsSummaryRow (bool ItsMe,
- unsigned NumPrints,
- unsigned NumTotalQsts,
- unsigned NumTotalQstsNotBlank,
- double TotalScoreOfAllTests)
+ unsigned NumPrints,
+ struct TstPrn_NumQuestions *NumTotalQsts,
+ double TotalScore)
{
extern const char *Txt_Visible_tests;
bool ICanViewTotalScore;
@@ -2285,42 +2334,42 @@ static void TstPrn_ShowPrintsSummaryRow (bool ItsMe,
/***** Write total number of questions *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumPrints)
- HTM_Unsigned (NumTotalQsts);
+ HTM_Unsigned (NumTotalQsts->All);
HTM_TD_End ();
/***** Write total number of non-blank answers *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumPrints)
- HTM_Unsigned (NumTotalQstsNotBlank);
+ HTM_Unsigned (NumTotalQsts->NotBlank);
HTM_TD_End ();
/***** Write total number of blank answers *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumPrints)
- HTM_Unsigned (NumTotalQsts - NumTotalQstsNotBlank);
+ HTM_Unsigned (NumTotalQsts->All - NumTotalQsts->NotBlank);
HTM_TD_End ();
/***** Write total score *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RM COLOR%u\"",Gbl.RowEvenOdd);
if (ICanViewTotalScore)
{
- HTM_Double2Decimals (TotalScoreOfAllTests);
+ HTM_Double2Decimals (TotalScore);
HTM_Txt ("/");
- HTM_Unsigned (NumTotalQsts);
+ HTM_Unsigned (NumTotalQsts->All);
}
HTM_TD_End ();
/***** Write average score per question *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM RM COLOR%u\"",Gbl.RowEvenOdd);
if (ICanViewTotalScore)
- HTM_Double2Decimals (NumTotalQsts ? TotalScoreOfAllTests / (double) NumTotalQsts :
- 0.0);
+ HTM_Double2Decimals (NumTotalQsts->All ? TotalScore / (double) NumTotalQsts->All :
+ 0.0);
HTM_TD_End ();
/***** Write grade over Tst_SCORE_MAX *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RM COLOR%u\"",Gbl.RowEvenOdd);
if (ICanViewTotalScore)
- TstPrn_ComputeAndShowGrade (NumTotalQsts,TotalScoreOfAllTests,Tst_SCORE_MAX);
+ TstPrn_ComputeAndShowGrade (NumTotalQsts->All,TotalScore,Tst_SCORE_MAX);
HTM_TD_End ();
/***** Last cell *****/
@@ -2447,7 +2496,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LB\"");
- HTM_Unsigned (Print.NumQsts);
+ HTM_Unsigned (Print.NumQsts.All);
HTM_TD_End ();
HTM_TR_End ();
@@ -2460,7 +2509,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LB\"");
- HTM_Unsigned (Print.NumQstsNotBlank);
+ HTM_Unsigned (Print.NumQsts.NotBlank);
HTM_TD_End ();
HTM_TR_End ();
@@ -2478,7 +2527,7 @@ void TstPrn_ShowOnePrint (void)
HTM_STRONG_Begin ();
HTM_Double2Decimals (Print.Score);
HTM_Txt ("/");
- HTM_Unsigned (Print.NumQsts);
+ HTM_Unsigned (Print.NumQsts.All);
HTM_STRONG_End ();
}
else
@@ -2496,7 +2545,7 @@ void TstPrn_ShowOnePrint (void)
if (ICanView.Score)
{
HTM_STRONG_Begin ();
- TstPrn_ComputeAndShowGrade (Print.NumQsts,Print.Score,Tst_SCORE_MAX);
+ TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
HTM_STRONG_End ();
}
else
@@ -2618,7 +2667,7 @@ void TstPrn_ShowPrintAnswers (struct UsrData *UsrDat,
bool QuestionExists;
for (NumQst = 0;
- NumQst < Print->NumQsts;
+ NumQst < Print->NumQsts.All;
NumQst++)
{
Gbl.RowEvenOdd = NumQst % 2;
@@ -2674,12 +2723,12 @@ void TstPrn_GetPrintDataByPrnCod (struct TstPrn_Print *Print)
Print->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[2]);
/* Get number of questions (row[3]) */
- if (sscanf (row[3],"%u",&Print->NumQsts) != 1)
- Print->NumQsts = 0;
+ if (sscanf (row[3],"%u",&Print->NumQsts.All) != 1)
+ Print->NumQsts.All = 0;
/* Get number of questions not blank (row[4]) */
- if (sscanf (row[4],"%u",&Print->NumQstsNotBlank) != 1)
- Print->NumQstsNotBlank = 0;
+ if (sscanf (row[4],"%u",&Print->NumQsts.NotBlank) != 1)
+ Print->NumQsts.NotBlank = 0;
/* Get if exam has been sent (row[5]) */
Print->Sent = (row[5][0] == 'Y');
@@ -2725,7 +2774,7 @@ void TstPrn_GetPrintQuestionsFromDB (struct TstPrn_Print *Print)
Print->PrnCod);
/***** Get questions *****/
- if (NumQsts == Print->NumQsts)
+ if (NumQsts == Print->NumQsts.All)
for (NumQst = 0;
NumQst < NumQsts;
NumQst++)
@@ -2754,7 +2803,7 @@ void TstPrn_GetPrintQuestionsFromDB (struct TstPrn_Print *Print)
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
- if (NumQsts != Print->NumQsts)
+ if (NumQsts != Print->NumQsts.All)
Lay_WrongExamExit ();
}
diff --git a/swad_test_print.h b/swad_test_print.h
index 369988cd..e7ba5f0d 100644
--- a/swad_test_print.h
+++ b/swad_test_print.h
@@ -40,6 +40,12 @@
/******************************* Public types ********************************/
/*****************************************************************************/
+struct TstPrn_NumQuestions
+ {
+ unsigned All; // Total number of questions
+ unsigned NotBlank; // Answered questions
+ };
+
typedef enum
{
TstPrn_ANSWER_IS_CORRECT,
@@ -63,8 +69,7 @@ struct TstPrn_Print
{
long PrnCod; // Test print code
time_t TimeUTC[Dat_NUM_START_END_TIME];
- unsigned NumQsts; // Number of questions
- unsigned NumQstsNotBlank; // Number of questions not blank
+ struct TstPrn_NumQuestions NumQsts; // Number of questions
bool Sent; // This test print has been sent or not?
// "Sent" means that user has clicked "Send" button after finishing
bool AllowTeachers; // Are teachers allowed to see this test result?
diff --git a/swad_user.c b/swad_user.c
index 2444a4a3..b961f450 100644
--- a/swad_user.c
+++ b/swad_user.c
@@ -9974,10 +9974,10 @@ void Usr_ShowTableCellWithUsrData (struct UsrData *UsrDat,unsigned NumRows)
/***** Show user's photo *****/
if (NumRows)
- HTM_TD_Begin ("rowspan=\"%u\" class=\"LT COLOR%u\"",
+ HTM_TD_Begin ("rowspan=\"%u\" class=\"LT LINE_BOTTOM COLOR%u\"",
NumRows + 1,Gbl.RowEvenOdd);
else
- HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_Begin ("class=\"LT LINE_BOTTOM COLOR%u\"",Gbl.RowEvenOdd);
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
NULL,
@@ -9987,10 +9987,10 @@ void Usr_ShowTableCellWithUsrData (struct UsrData *UsrDat,unsigned NumRows)
/***** User's IDs and name *****/
/* Begin cell */
if (NumRows)
- HTM_TD_Begin ("rowspan=\"%u\" class=\"LT COLOR%u\"",
+ HTM_TD_Begin ("rowspan=\"%u\" class=\"LT LINE_BOTTOM COLOR%u\"",
NumRows + 1,Gbl.RowEvenOdd);
else
- HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd);
+ HTM_TD_Begin ("class=\"LT LINE_BOTTOM COLOR%u\"",Gbl.RowEvenOdd);
/* Action to go to user's record depending on role in course */
switch (UsrDat->Roles.InCurrentCrs.Role)