Version19.253

This commit is contained in:
acanas 2020-06-22 19:27:23 +02:00
parent 4838c07663
commit 4ab83769be
14 changed files with 706 additions and 272 deletions

View File

@ -2400,11 +2400,24 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
.DAT_N_BOLD {color:black; font-size:13pt; font-weight:bold;}
/*********************** Line in top part of a table row *********************/
.DAT_N_LINE_TOP
.LINE_TOP
{
color:black;
font-size:13pt;
border-style:solid none none none;
border-top-style:solid;
border-width:1px;
}
.LINE_BOTTOM
{
border-bottom-style:solid;
border-width:1px;
}
.LINE_LEFT
{
border-left-style:solid;
border-width:1px;
}
.LINE_RIGHT
{
border-right-style:solid;
border-width:1px;
}
@ -4216,6 +4229,10 @@ a.PAG:hover, .PAG_CUR
}
/************ Something that takes up space but which is invisible ***********/
.LIGHT
{
opacity:0.2;
}
.HIDDEN
{
visibility:hidden;

View File

@ -344,34 +344,34 @@ void HTM_TH_Begin (unsigned RowSpan,unsigned ColSpan,const char *Class)
{
if (Class)
HTM_TH_BeginAttr ("rowspan=\"%u\" colspan=\"%u\" class=\"%s\"",
RowSpan,ColSpan,Class);
RowSpan,ColSpan,Class);
else
HTM_TH_BeginAttr ("rowspan=\"%u\" colspan=\"%u\"",
RowSpan,ColSpan);
RowSpan,ColSpan);
}
else if (RowSpan > 1)
{
if (Class)
HTM_TH_BeginAttr ("rowspan=\"%u\" class=\"%s\"",
RowSpan,Class);
RowSpan,Class);
else
HTM_TH_BeginAttr ("rowspan=\"%u\"",
RowSpan);
RowSpan);
}
else if (ColSpan > 1)
{
if (Class)
HTM_TH_BeginAttr ("colspan=\"%u\" class=\"%s\"",
ColSpan,Class);
ColSpan,Class);
else
HTM_TH_BeginAttr ("colspan=\"%u\"",
ColSpan);
ColSpan);
}
else
{
if (Class)
HTM_TH_BeginAttr ("class=\"%s\"",
Class);
Class);
else
HTM_TH_BeginWithoutAttr ();
}
@ -1827,6 +1827,13 @@ void HTM_Unsigned (unsigned Num)
HTM_TxtF ("%u",Num);
}
void HTM_Light0 (void)
{
HTM_SPAN_Begin ("class=\"LIGHT\"");
HTM_Txt ("0");
HTM_SPAN_End ();
}
void HTM_Int (int Num)
{
HTM_TxtF ("%d",Num);

View File

@ -193,6 +193,7 @@ void HTM_Comma (void);
void HTM_Hyphen (void);
void HTM_Asterisk (void);
void HTM_Unsigned (unsigned Num);
void HTM_Light0 (void);
void HTM_Int (int Num);
void HTM_UnsignedLong (unsigned long Num);
void HTM_Long (long Num);

View File

@ -3356,7 +3356,7 @@ static void Att_ListUsrsAttendanceTable (const struct Att_Events *Events,
{
HTM_TR_Begin (NULL);
HTM_TD_Begin ("colspan=\"%u\" class=\"DAT_N_LINE_TOP RM\"",
HTM_TD_Begin ("colspan=\"%u\" class=\"DAT_N LINE_TOP RM\"",
Gbl.Usrs.Listing.WithPhotos ? 4 :
3);
HTM_TxtColon (Txt_Number_of_users);
@ -3367,14 +3367,14 @@ static void Att_ListUsrsAttendanceTable (const struct Att_Events *Events,
NumAttEvent++)
if (Events->Lst[NumAttEvent].Selected)
{
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (Events->Lst[NumAttEvent].NumStdsFromList);
HTM_TD_End ();
Total += Events->Lst[NumAttEvent].NumStdsFromList;
}
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (Total);
HTM_TD_End ();

View File

@ -556,8 +556,8 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.252.1 (2020-06-19)"
#define CSS_FILE "swad19.250.css"
#define Log_PLATFORM_VERSION "SWAD 19.253 (2020-06-22)"
#define CSS_FILE "swad19.253.css"
#define JS_FILE "swad19.246.1.js"
/*
TODO: Encarnación Hidalgo Tenorio: Antonio, ¿podría @swad_ugr mandar una notificación cuando el alumnado ha mandado su tarea?
@ -569,6 +569,7 @@ TODO: Que al generar un examen s
TODO: Refactorizar MchRes_CheckIfICanSeeMatchResult y MchRes_CheckIfICanViewScore uniéndolas en una función como ExaRes_CheckIfICanSeePrintResult
Y dentro de las funciones TstPrn_ShowUsrPrints y TstPrn_ShowOnePrint crear y llamar a una función común similar a ExaRes_CheckIfICanSeePrintResult
Version 19.253: Jun 22, 2020 More details in listing of exams. (303643 lines)
Version 19.252.1: Jun 19, 2020 Changes in listing of exams and matches results. (303245 lines)
Version 19.252: Jun 19, 2020 Fixed bug in exam results, reported by Francisco Ligero Ligero. (303243 lines)
Version 19.251: Jun 18, 2020 Changes in test, exam and match results. (303263 lines)

View File

@ -162,12 +162,17 @@ static void ExaPrn_ResetPrintExceptEvtCodAndUsrCod (struct ExaPrn_Print *Print)
Print->PrnCod = -1L;
Print->TimeUTC[Dat_START_TIME] =
Print->TimeUTC[Dat_END_TIME ] = (time_t) 0;
Print->NumQsts.All =
Print->NumQsts.Valid =
Print->NumQsts.NotBlank = 0;
Print->Sent = false; // After creating an exam print, it's not sent
Print->Score.All =
Print->Score.Valid = 0.0;
Print->NumQsts.All =
Print->NumQsts.NotBlank =
Print->NumQsts.Valid.Correct =
Print->NumQsts.Valid.Wrong.Negative =
Print->NumQsts.Valid.Wrong.Zero =
Print->NumQsts.Valid.Wrong.Positive =
Print->NumQsts.Valid.Blank =
Print->NumQsts.Valid.Total = 0;
Print->Score.All =
Print->Score.Valid = 0.0;
}
/*****************************************************************************/
@ -1426,9 +1431,10 @@ static void ExaPrn_GetNumQstsNotBlank (struct ExaPrn_Print *Print)
/***** Count number of questions not blank in exam print in database *****/
Print->NumQsts.NotBlank = (unsigned)
DB_QueryCOUNT ("can not get number of questions not blank",
"SELECT COUNT(*) FROM exa_print_questions"
" WHERE PrnCod=%ld AND Answers<>''",
Print->PrnCod);
"SELECT COUNT(*)"
" FROM exa_print_questions"
" WHERE PrnCod=%ld AND Answers<>''",
Print->PrnCod);
}
/*****************************************************************************/

View File

@ -38,8 +38,19 @@
struct ExaPrn_NumQuestions
{
unsigned All; // Total number of questions
unsigned Valid; // Number of valid questions (not invalidated by teachers)
unsigned NotBlank; // Number of answered questions (not blank)
unsigned NotBlank; // Answered questions (valid or not)
struct
{
struct
{
unsigned Negative;
unsigned Zero;
unsigned Positive;
} Wrong;
unsigned Correct;
unsigned Blank;
unsigned Total;
} Valid; // Number of valid questions
};
struct ExaPrn_Score

View File

@ -112,7 +112,6 @@ static void ExaRes_ShowResultsSummaryRow (unsigned NumResults,
const struct ExaPrn_NumQuestions *NumTotalQsts,
const struct ExaPrn_Score *TotalScore,
double TotalGrade);
static void ExaRes_ShowNumQsts (const struct ExaPrn_NumQuestions *NumQsts);
static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session,
@ -583,7 +582,7 @@ static void ExaRes_ShowResultsBegin (struct Exa_Exams *Exams,
/***** Begin session results table *****/
HTM_SECTION_Begin (ExaRes_RESULTS_TABLE_ID);
HTM_TABLE_BeginWidePadding (2);
HTM_TABLE_BeginWidePadding (5);
}
static void ExaRes_ShowResultsEnd (void)
@ -703,24 +702,57 @@ static void ExaRes_ShowHeaderResults (Usr_MeOrOther_t MeOrOther)
extern const char *Txt_Session;
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Questions;
extern const char *Txt_Non_blank_BR_questions;
extern const char *Txt_Valid_answers;
extern const char *Txt_Score;
extern const char *Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1;
extern const char *Txt_Grade;
extern const char *Txt_total;
extern const char *Txt_QUESTIONS_valid;
extern const char *Txt_QUESTIONS_invalid;
extern const char *Txt_correct_ANSWERS;
extern const char *Txt_wrong_ANSWERS;
extern const char *Txt_blank_ANSWERS;
extern const char *Txt_average;
/***** First row *****/
HTM_TR_Begin (NULL);
HTM_TH (1,2,"CT",Txt_User[MeOrOther == Usr_ME ? Gbl.Usrs.Me.UsrDat.Sex :
HTM_TH (3,2,"CT",Txt_User[MeOrOther == Usr_ME ? Gbl.Usrs.Me.UsrDat.Sex :
Usr_SEX_UNKNOWN]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Dat_START_TIME]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Dat_END_TIME ]);
HTM_TH (1,1,"LT",Txt_Session);
HTM_TH (1,1,"RT",Txt_Questions);
HTM_TH (1,1,"RT",Txt_Non_blank_BR_questions);
HTM_TH (1,1,"RT",Txt_Score);
HTM_TH (1,1,"RT",Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1);
HTM_TH (1,1,"RT",Txt_Grade);
HTM_TH_Empty (1);
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 (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_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 (1,1,"RT LINE_LEFT",Txt_correct_ANSWERS);
HTM_TH (1,3,"CT",Txt_wrong_ANSWERS);
HTM_TH (1,1,"RT",Txt_blank_ANSWERS);
HTM_TH (1,1,"RT LINE_LEFT",Txt_total);
HTM_TH (1,1,"RT",Txt_average);
HTM_TR_End ();
/***** Third row *****/
HTM_TR_Begin (NULL);
HTM_TH (1,1,"RT LINE_LEFT","<em>p<sub>i</sub></em>=1");
HTM_TH (1,1,"RT","-1&le;<em>p<sub>i</sub></em>&lt;0");
HTM_TH (1,1,"RT","<em>p<sub>i</sub></em>=0");
HTM_TH (1,1,"RT","0&lt;<em>p<sub>i</sub></em>&lt;1");
HTM_TH (1,1,"RT","<em>p<sub>i</sub></em>=0");
HTM_TH (1,1,"RT LINE_LEFT","<em>&Sigma;p<sub>i</sub></em>");
HTM_TH (1,1,"RT","-1&le;<em style=\"text-decoration:overline;\">p</em>&le;1");
HTM_TR_End ();
}
@ -783,6 +815,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
struct ExaSes_Session Session;
struct Exa_Exam Exam;
Dat_StartEndTime_t StartEndTime;
unsigned NumQstsInvalid;
struct ExaPrn_NumQuestions NumTotalQsts;
struct ExaPrn_Score TotalScore;
double Grade;
@ -795,11 +828,16 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
Exa_ResetExam (&Exam);
/***** Reset total number of questions and total score *****/
NumTotalQsts.All =
NumTotalQsts.Valid =
NumTotalQsts.NotBlank = 0;
TotalScore.All =
TotalScore.Valid = 0.0;
NumTotalQsts.All =
NumTotalQsts.NotBlank =
NumTotalQsts.Valid.Correct =
NumTotalQsts.Valid.Wrong.Negative =
NumTotalQsts.Valid.Wrong.Zero =
NumTotalQsts.Valid.Wrong.Positive =
NumTotalQsts.Valid.Blank =
NumTotalQsts.Valid.Total = 0;
TotalScore.All =
TotalScore.Valid = 0.0;
/***** Set user *****/
UsrDat = (MeOrOther == Usr_ME) ? &Gbl.Usrs.Me.UsrDat :
@ -883,8 +921,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
"SELECT exa_prints.PrnCod," // row[0]
"exa_prints.SesCod," // row[1]
"UNIX_TIMESTAMP(exa_prints.StartTime)," // row[2]
"UNIX_TIMESTAMP(exa_prints.EndTime)," // row[3]
"exa_prints.NumQstsNotBlank" // row[4]
"UNIX_TIMESTAMP(exa_prints.EndTime)" // row[3]
" FROM exa_prints,exa_sessions,exa_exams"
" WHERE exa_prints.UsrCod=%ld"
"%s" // Session subquery
@ -969,38 +1006,120 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
/* Compute score taking into account only valid questions */
ExaRes_ComputeValidPrintScore (&Print);
NumTotalQsts.Valid += Print.NumQsts.Valid;
NumTotalQsts.Valid.Correct += Print.NumQsts.Valid.Correct;
NumTotalQsts.Valid.Wrong.Negative += Print.NumQsts.Valid.Wrong.Negative;
NumTotalQsts.Valid.Wrong.Zero += Print.NumQsts.Valid.Wrong.Zero;
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;
/* Get number of questions not blank (row[4]) */
if (sscanf (row[4],"%u",&Print.NumQsts.NotBlank) != 1)
Print.NumQsts.NotBlank = 0;
NumTotalQsts.NotBlank += Print.NumQsts.NotBlank;
}
/* Write number of questions */
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
/* Write total number of questions */
HTM_TD_Begin ("class=\"DAT LINE_LEFT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
ExaRes_ShowNumQsts (&Print.NumQsts);
HTM_Unsigned (Print.NumQsts.All);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
/* Write number of questions not blank */
/* Valid questions */
HTM_TD_Begin ("class=\"DAT_GREEN RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
if (Print.NumQsts.Valid.Total)
HTM_Unsigned (Print.NumQsts.Valid.Total);
else
HTM_Light0 ();
}
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
/* Invalid questions */
HTM_TD_Begin ("class=\"DAT_RED RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total;
if (NumQstsInvalid)
HTM_Unsigned (NumQstsInvalid);
else
HTM_Light0 ();
}
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
/* Write number of correct questions */
HTM_TD_Begin ("class=\"DAT LINE_LEFT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
if (Print.NumQsts.Valid.Correct)
HTM_Unsigned (Print.NumQsts.Valid.Correct);
else
HTM_Light0 ();
}
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
/* Write number of wrong questions */
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
HTM_Unsigned (Print.NumQsts.NotBlank);
{
if (Print.NumQsts.Valid.Wrong.Negative)
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative);
else
HTM_Light0 ();
}
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
if (Print.NumQsts.Valid.Wrong.Zero)
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero);
else
HTM_Light0 ();
}
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
if (Print.NumQsts.Valid.Wrong.Positive)
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive);
else
HTM_Light0 ();
}
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
/* Write number of blank questions */
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
if (Print.NumQsts.Valid.Blank)
HTM_Unsigned (Print.NumQsts.Valid.Blank);
else
HTM_Light0 ();
}
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
/* Write score valid (taking into account only valid questions) */
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT LINE_LEFT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
HTM_Double2Decimals (Print.Score.Valid);
HTM_Txt ("/");
HTM_Unsigned (Print.NumQsts.Valid);
HTM_Unsigned (Print.NumQsts.Valid.Total);
}
else
Ico_PutIconNotVisible ();
@ -1009,18 +1128,18 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
/* Write average score per question (taking into account only valid questions) */
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
HTM_Double2Decimals (Print.NumQsts.Valid ? Print.Score.Valid /
(double) Print.NumQsts.Valid :
0.0);
HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid /
(double) Print.NumQsts.Valid.Total :
0.0);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
/* Write grade over maximum grade (taking into account only valid questions) */
HTM_TD_Begin ("class=\"DAT RT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT LINE_LEFT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Score)
{
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid,Print.Score.Valid,Exam.MaxGrade);
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade);
TstPrn_ShowGrade (Grade,Exam.MaxGrade);
TotalGrade += Grade;
}
@ -1029,7 +1148,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_End ();
/* Link to show this result */
HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"LINE_LEFT RT COLOR%u\"",Gbl.RowEvenOdd);
if (ICanView.Result)
{
Exams->ExaCod = Session.ExaCod;
@ -1081,49 +1200,99 @@ static void ExaRes_ShowResultsSummaryRow (unsigned NumResults,
double TotalGrade)
{
extern const char *Txt_Sessions;
unsigned NumTotalQstsInvalid;
/***** Start row *****/
HTM_TR_Begin (NULL);
/***** Row title *****/
HTM_TD_Begin ("colspan=\"3\" class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("colspan=\"3\" class=\"DAT_N LINE_TOP LINE_BOTTOM RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TxtColonNBSP (Txt_Sessions);
HTM_Unsigned (NumResults);
HTM_TD_End ();
/***** Write total number of questions *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumResults)
ExaRes_ShowNumQsts (NumTotalQsts);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Unsigned (NumTotalQsts->All);
HTM_TD_End ();
/***** Write total number of questions not blank *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumResults)
HTM_Unsigned (NumTotalQsts->NotBlank);
/***** Write total number of valid questions *****/
HTM_TD_Begin ("class=\"DAT_GREEN LINE_TOP LINE_BOTTOM RT COLOR%u\"",Gbl.RowEvenOdd);
if (NumTotalQsts->Valid.Total)
HTM_Unsigned (NumTotalQsts->Valid.Total);
else
HTM_Light0 ();
HTM_TD_End ();
/***** Write total number of invalid questions *****/
HTM_TD_Begin ("class=\"DAT_RED LINE_TOP LINE_BOTTOM RT COLOR%u\"",Gbl.RowEvenOdd);
NumTotalQstsInvalid = NumTotalQsts->All - NumTotalQsts->Valid.Total;
if (NumTotalQstsInvalid)
HTM_Unsigned (NumTotalQstsInvalid);
else
HTM_Light0 ();
HTM_TD_End ();
/***** Write number of correct questions *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RT COLOR%u\"",Gbl.RowEvenOdd);
if (NumTotalQsts->Valid.Correct)
HTM_Unsigned (NumTotalQsts->Valid.Correct);
else
HTM_Light0 ();
HTM_TD_End ();
/***** Write number of wrong questions *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM RT COLOR%u\"",Gbl.RowEvenOdd);
if (NumTotalQsts->Valid.Wrong.Negative)
HTM_Unsigned (NumTotalQsts->Valid.Wrong.Negative);
else
HTM_Light0 ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM RT COLOR%u\"",Gbl.RowEvenOdd);
if (NumTotalQsts->Valid.Wrong.Zero)
HTM_Unsigned (NumTotalQsts->Valid.Wrong.Zero);
else
HTM_Light0 ();
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM RT COLOR%u\"",Gbl.RowEvenOdd);
if (NumTotalQsts->Valid.Wrong.Positive)
HTM_Unsigned (NumTotalQsts->Valid.Wrong.Positive);
else
HTM_Light0 ();
HTM_TD_End ();
/***** Write number of blank questions *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM RT COLOR%u\"",Gbl.RowEvenOdd);
if (NumTotalQsts->Valid.Blank)
HTM_Unsigned (NumTotalQsts->Valid.Blank);
else
HTM_Light0 ();
HTM_TD_End ();
/***** Write total valid score *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Double2Decimals (TotalScore->Valid);
HTM_Txt ("/");
HTM_Unsigned (NumTotalQsts->Valid);
HTM_Unsigned (NumTotalQsts->Valid.Total);
HTM_TD_End ();
/***** Write average valid score per valid question *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Double2Decimals (NumTotalQsts->Valid ? TotalScore->Valid /
(double) NumTotalQsts->Valid :
0.0);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Double2Decimals (NumTotalQsts->Valid.Total ? TotalScore->Valid /
(double) NumTotalQsts->Valid.Total :
0.0);
HTM_TD_End ();
/***** Write total grade *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Double2Decimals (TotalGrade);
HTM_TD_End ();
/***** Last cell *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_End ();
/***** End row *****/
@ -1134,39 +1303,6 @@ static void ExaRes_ShowResultsSummaryRow (unsigned NumResults,
/*************************** Show one exam result ****************************/
/*****************************************************************************/
static void ExaRes_ShowNumQsts (const struct ExaPrn_NumQuestions *NumQsts)
{
extern const char *Txt_QUESTIONS_valid;
extern const char *Txt_QUESTIONS_invalid;
HTM_Unsigned (NumQsts->All);
if (NumQsts->All !=
NumQsts->Valid)
{
HTM_NBSP ();
HTM_Txt ("(");
/* Valid questions */
HTM_SPAN_Begin ("class=\"DAT_GREEN\" title=\"%s\"",Txt_QUESTIONS_valid);
HTM_Unsigned (NumQsts->Valid);
HTM_SPAN_End ();
HTM_Txt ("+");
/* Invalid questions */
HTM_SPAN_Begin ("class=\"DAT_RED\" title=\"%s\"",Txt_QUESTIONS_invalid);
HTM_Unsigned (NumQsts->All - NumQsts->Valid);
HTM_SPAN_End ();
HTM_Txt (")");
}
}
/*****************************************************************************/
/*************************** Show one exam result ****************************/
/*****************************************************************************/
void ExaRes_ShowOneExaResult (void)
{
struct Exa_Exams Exams;
@ -1206,6 +1342,7 @@ void ExaRes_ShowOneExaResult (void)
Print.UsrCod = UsrDat->UsrCod;
ExaPrn_GetDataOfPrintByCodAndUsrCod (&Print);
/***** Set log action and print code *****/
if (Gbl.Action.Act == ActEndExaPrn)
{
@ -1241,7 +1378,10 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
extern const char *Txt_Questions;
extern const char *Txt_QUESTIONS_valid;
extern const char *Txt_QUESTIONS_invalid;
extern const char *Txt_QUESTIONS_non_blank;
extern const char *Txt_Valid_answers;
extern const char *Txt_correct_ANSWERS;
extern const char *Txt_wrong_ANSWERS;
extern const char *Txt_blank_ANSWERS;
extern const char *Txt_Score;
extern const char *Txt_valid_score;
extern const char *Txt_Grade;
@ -1268,6 +1408,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
Gbl.Hierarchy.Deg.DegCod,
Gbl.Hierarchy.Crs.CrsCod);
/***** Begin table *****/
HTM_TABLE_BeginWideMarginPadding (10);
@ -1285,7 +1426,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
HTM_TxtColon (Txt_ROLES_SINGUL_Abc[UsrDat->Roles.InCurrentCrs.Role][UsrDat->Sex]);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
ID_WriteUsrIDs (UsrDat,NULL);
HTM_TxtF ("&nbsp;%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
@ -1314,7 +1455,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0)
Lay_NotEnoughMemoryExit ();
HTM_TD_Begin ("id=\"%s\" class=\"DAT LT\"",Id);
HTM_TD_Begin ("id=\"%s\" class=\"DAT LB\"",Id);
Dat_WriteLocalDateHMSFromUTC (Id,Print->TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
true,true,true,0x7);
@ -1331,31 +1472,30 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
HTM_TxtColon (Txt_Questions);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanView.Result)
{
HTM_TxtF ("%u",Print->NumQsts.All);
if (Print->NumQsts.All != Print->NumQsts.Valid)
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
{
HTM_Txt (" (");
/* Valid questions */
HTM_SPAN_Begin ("class=\"DAT_GREEN\"");
HTM_TxtColonNBSP (Txt_QUESTIONS_valid);
HTM_Unsigned (Print->NumQsts.Valid);
HTM_Unsigned (Print->NumQsts.Valid.Total);
HTM_SPAN_End ();
HTM_TxtF (", ");
HTM_TxtF ("; ");
/* Invalid questions */
HTM_SPAN_Begin ("class=\"DAT_RED\"");
HTM_TxtColonNBSP (Txt_QUESTIONS_invalid);
HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid);
HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid.Total);
HTM_SPAN_End ();
HTM_Txt (")");
}
HTM_TxtF ("; %s: %u",Txt_QUESTIONS_non_blank,Print->NumQsts.NotBlank);
}
else
Ico_PutIconNotVisible ();
@ -1363,6 +1503,31 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
HTM_TR_End ();
/***** Number of answers *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT_N RT\"");
HTM_TxtColon (Txt_Valid_answers);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanView.Result)
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1):&nbsp;%u; "
"%s(-1&le;<em>p<sub>i</sub></em>&lt;0):&nbsp;%u; "
"%s(<em>p<sub>i</sub></em>=0):&nbsp;%u; "
"%s(0&lt;<em>p<sub>i</sub></em>&lt;1):&nbsp;%u; "
"%s(<em>p<sub>i</sub></em>=0):&nbsp;%u",
Txt_correct_ANSWERS,Print->NumQsts.Valid.Correct,
Txt_wrong_ANSWERS ,Print->NumQsts.Valid.Wrong.Negative,
Txt_wrong_ANSWERS ,Print->NumQsts.Valid.Wrong.Zero,
Txt_wrong_ANSWERS ,Print->NumQsts.Valid.Wrong.Positive,
Txt_blank_ANSWERS ,Print->NumQsts.Valid.Blank);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
HTM_TR_End ();
/***** Score *****/
HTM_TR_Begin (NULL);
@ -1370,27 +1535,27 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
HTM_TxtColon (Txt_Score);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanView.Score)
{
/* Score counting all questions */
if (Print->NumQsts.All == Print->NumQsts.Valid)
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
HTM_STRONG_Begin ();
HTM_Double2Decimals (Print->Score.All);
HTM_Txt ("/");
HTM_Unsigned (Print->NumQsts.All);
if (Print->NumQsts.All == Print->NumQsts.Valid)
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
HTM_STRONG_End ();
/* Scoure counting only valid questions */
if (Print->NumQsts.All != Print->NumQsts.Valid)
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
{
HTM_Txt ("; ");
HTM_TxtColonNBSP (Txt_valid_score);
HTM_STRONG_Begin ();
HTM_Double2Decimals (Print->Score.Valid);
HTM_Txt ("/");
HTM_Unsigned (Print->NumQsts.Valid);
HTM_Unsigned (Print->NumQsts.Valid.Total);
HTM_STRONG_End ();
}
}
@ -1407,23 +1572,23 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
HTM_TxtColon (Txt_Grade);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanView.Score)
{
/* Grade counting all questions */
if (Print->NumQsts.All == Print->NumQsts.Valid)
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
HTM_STRONG_Begin ();
TstPrn_ComputeAndShowGrade (Print->NumQsts.All,Print->Score.All,Exam->MaxGrade);
if (Print->NumQsts.All == Print->NumQsts.Valid)
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
HTM_STRONG_End ();
/* Grade counting only valid questions */
if (Print->NumQsts.All != Print->NumQsts.Valid)
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
{
HTM_Txt ("; ");
HTM_TxtColonNBSP (Txt_valid_grade);
HTM_STRONG_Begin ();
TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid,Print->Score.Valid,Exam->MaxGrade);
TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid.Total,Print->Score.Valid,Exam->MaxGrade);
HTM_STRONG_End ();
}
}
@ -1503,7 +1668,12 @@ static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print)
bool QuestionExists;
/***** Initialize score valid *****/
Print->NumQsts.Valid = 0;
Print->NumQsts.Valid.Correct =
Print->NumQsts.Valid.Wrong.Negative =
Print->NumQsts.Valid.Wrong.Zero =
Print->NumQsts.Valid.Wrong.Positive =
Print->NumQsts.Valid.Blank =
Print->NumQsts.Valid.Total = 0;
Print->Score.Valid = 0.0;
for (NumQst = 0;
@ -1540,7 +1710,25 @@ static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print)
if (Question.Validity == Tst_VALID_QUESTION)
{
ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[NumQst],&Question);
Print->NumQsts.Valid++;
switch (Print->PrintedQuestions[NumQst].AnswerIsCorrect)
{
case TstPrn_ANSWER_IS_CORRECT:
Print->NumQsts.Valid.Correct++;
break;
case TstPrn_ANSWER_IS_WRONG_NEGATIVE:
Print->NumQsts.Valid.Wrong.Negative++;
break;
case TstPrn_ANSWER_IS_WRONG_ZERO:
Print->NumQsts.Valid.Wrong.Zero++;
break;
case TstPrn_ANSWER_IS_WRONG_POSITIVE:
Print->NumQsts.Valid.Wrong.Positive++;
break;
case TstPrn_ANSWER_IS_BLANK:
Print->NumQsts.Valid.Blank++;
break;
}
Print->NumQsts.Valid.Total++;
Print->Score.Valid += Print->PrintedQuestions[NumQst].Score;
}
}

View File

@ -431,7 +431,7 @@ static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role)
(Gbl.Scope.Current == Hie_DEG ? Gbl.Hierarchy.Deg.DegCod :
(Gbl.Scope.Current == Hie_CRS ? Gbl.Hierarchy.Crs.CrsCod :
-1L)))));
char *Class = (Role == Rol_UNK) ? "DAT_N_LINE_TOP RB" :
char *Class = (Role == Rol_UNK) ? "DAT_N LINE_TOP RB" :
"DAT RB";
unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) |
(1 << Rol_NET) |
@ -959,7 +959,7 @@ static void Fig_GetAndShowHierarchyTotal (void)
/***** Write total number of elements *****/
Fig_ShowHierarchyRow ("",Txt_Total,
"DAT_N_LINE_TOP",
"DAT_N LINE_TOP",
(int) NumCtysTotal,
(int) NumInssTotal,
(int) NumCtrsTotal,
@ -2577,7 +2577,7 @@ static void Fig_WriteRowStatsFileBrowsers1 (const char *NameOfFileZones,
char StrNumGrps[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
char StrNumUsrs[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
char *Class = (FileZone == Brw_UNKNOWN) ? "DAT_N_LINE_TOP" :
char *Class = (FileZone == Brw_UNKNOWN) ? "DAT_N LINE_TOP" :
"DAT";
Fil_WriteFileSizeFull ((double) SizeOfFileZones->Size,FileSizeStr);
@ -2650,7 +2650,7 @@ static void Fig_WriteRowStatsFileBrowsers2 (const char *NameOfFileZones,
char StrNumFoldersPerCrs[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
char StrNumFilesPerCrs[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
char FileSizePerCrsStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
char *Class = (FileZone == Brw_UNKNOWN) ? "DAT_N_LINE_TOP" :
char *Class = (FileZone == Brw_UNKNOWN) ? "DAT_N LINE_TOP" :
"DAT";
if (SizeOfFileZones->NumCrss == -1) // Not applicable
@ -2708,7 +2708,7 @@ static void Fig_WriteRowStatsFileBrowsers3 (const char *NameOfFileZones,
char StrNumFoldersPerUsr[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
char StrNumFilesPerUsr[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
char FileSizePerUsrStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
char *Class = (FileZone == Brw_UNKNOWN) ? "DAT_N_LINE_TOP" :
char *Class = (FileZone == Brw_UNKNOWN) ? "DAT_N LINE_TOP" :
"DAT";
if (SizeOfFileZones->NumUsrs == -1) // Not applicable
@ -3138,7 +3138,7 @@ static void Fig_GetAndShowTestsStats (void)
extern const char *Txt_Number_of_BR_times_that_BR_questions_BR_have_been_BR_responded;
extern const char *Txt_Average_BR_number_of_BR_times_that_BR_questions_BR_have_been_BR_responded_BR_per_course;
extern const char *Txt_Average_BR_number_of_BR_times_that_BR_a_question_BR_has_been_BR_responded;
extern const char *Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1;
extern const char *Txt_Average_BR_score_BR_per_question;
extern const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES];
extern const char *Txt_Total;
Tst_AnswerType_t AnsType;
@ -3160,7 +3160,7 @@ static void Fig_GetAndShowTestsStats (void)
HTM_TH (1,1,"RM",Txt_Number_of_BR_times_that_BR_questions_BR_have_been_BR_responded);
HTM_TH (1,1,"RM",Txt_Average_BR_number_of_BR_times_that_BR_questions_BR_have_been_BR_responded_BR_per_course);
HTM_TH (1,1,"RM",Txt_Average_BR_number_of_BR_times_that_BR_a_question_BR_has_been_BR_responded);
HTM_TH (1,1,"RM",Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1);
HTM_TH (1,1,"RM",Txt_Average_BR_score_BR_per_question);
HTM_TR_End ();
@ -3223,15 +3223,15 @@ static void Fig_GetAndShowTestsStats (void)
/***** Write number of assignments *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP LM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LM\"");
HTM_Txt (Txt_Total);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (Stats.NumCoursesWithQuestions);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_TxtF ("%u (%.1f%%)",
Stats.NumCoursesWithPluggableQuestions,
Stats.NumCoursesWithQuestions ? (double) Stats.NumCoursesWithPluggableQuestions * 100.0 /
@ -3239,27 +3239,27 @@ static void Fig_GetAndShowTestsStats (void)
0.0);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (Stats.NumQsts);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (Stats.AvgQstsPerCourse);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_UnsignedLong (Stats.NumHits);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (Stats.AvgHitsPerCourse);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (Stats.AvgHitsPerQuestion);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (Stats.AvgScorePerQuestion);
HTM_TD_End ();
@ -3661,25 +3661,25 @@ static void Fig_GetAndShowTimelineActivityStats (void)
/* Write totals */
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP LM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LM\"");
HTM_Txt (Txt_Total);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_UnsignedLong (NumNotes);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (NumUsrs);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Percentage (NumUsrsTotal ? (double) NumUsrs * 100.0 /
(double) NumUsrsTotal :
0.0);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (NumUsrs ? (double) NumNotes / (double) NumUsrs :
0.0);
HTM_TD_End ();
@ -4288,38 +4288,38 @@ static void Fig_WriteForumTotalStats (struct Fig_FiguresForum *FiguresForum)
/***** Write forum name and stats *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP\" style=\"width:20px;\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP\" style=\"width:20px;\"");
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP LM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LM\"");
HTM_Txt (Txt_Total);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (FiguresForum->NumForums);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (FiguresForum->NumThreads);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (FiguresForum->NumPosts);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (FiguresForum->NumUsrsToBeNotifiedByEMail);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (NumThrsPerForum);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (NumPostsPerThread);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Double2Decimals (NumPostsPerForum);
HTM_TD_End ();
@ -4530,25 +4530,25 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void)
/***** Write total number of users who want to be notified by email on some event *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP LM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LM\"");
HTM_Txt (Txt_Total);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (NumUsrsTotalWhoWantToBeNotifiedByEMailAboutSomeEvent);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Percentage (NumUsrsTotal ? (double) NumUsrsTotalWhoWantToBeNotifiedByEMailAboutSomeEvent * 100.0 /
(double) NumUsrsTotal :
0.0);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (NumEventsTotal);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (NumMailsTotal);
HTM_TD_End ();

View File

@ -707,15 +707,15 @@ static void Ind_ShowNumCoursesWithIndicators (const struct Ind_Indicators *Indic
if (PutForm)
HTM_TD_Empty (1);
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Txt (Txt_Total);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_Unsigned (NumCrss);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM\"");
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM\"");
HTM_TxtF ("(%.1f%%)",100.0);
HTM_TD_End ();

View File

@ -614,7 +614,7 @@ static void MchRes_ShowResultsBegin (struct Gam_Games *Games,
/***** Begin match results table *****/
HTM_SECTION_Begin (MchRes_RESULTS_TABLE_ID);
HTM_TABLE_BeginWidePadding (2);
HTM_TABLE_BeginWidePadding (5);
}
static void MchRes_ShowResultsEnd (void)
@ -735,7 +735,7 @@ static void MchRes_ShowHeaderMchResults (Usr_MeOrOther_t MeOrOther)
extern const char *Txt_Questions;
extern const char *Txt_Non_blank_BR_questions;
extern const char *Txt_Score;
extern const char *Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1;
extern const char *Txt_Average_BR_score_BR_per_question;
extern const char *Txt_Grade;
HTM_TR_Begin (NULL);
@ -748,7 +748,7 @@ static void MchRes_ShowHeaderMchResults (Usr_MeOrOther_t MeOrOther)
HTM_TH (1,1,"RT",Txt_Questions);
HTM_TH (1,1,"RT",Txt_Non_blank_BR_questions);
HTM_TH (1,1,"RT",Txt_Score);
HTM_TH (1,1,"RT",Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1);
HTM_TH (1,1,"RT",Txt_Average_BR_score_BR_per_question);
HTM_TH (1,1,"RT",Txt_Grade);
HTM_TH_Empty (1);
@ -1082,44 +1082,44 @@ static void MchRes_ShowMchResultsSummaryRow (unsigned NumResults,
HTM_TR_Begin (NULL);
/***** Row title *****/
HTM_TD_Begin ("colspan=\"3\" class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("colspan=\"3\" class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TxtColonNBSP (Txt_Matches);
HTM_Unsigned (NumResults);
HTM_TD_End ();
/***** Write total number of questions *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumResults)
HTM_Unsigned (NumTotalQsts);
HTM_TD_End ();
/***** Write total number of questions not blank *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumResults)
HTM_Unsigned (NumTotalQstsNotBlank);
HTM_TD_End ();
/***** Write total score *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Double2Decimals (TotalScoreOfAllResults);
HTM_Txt ("/");
HTM_Unsigned (NumTotalQsts);
HTM_TD_End ();
/***** Write average score per question *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Double2Decimals (NumTotalQsts ? TotalScoreOfAllResults /
(double) NumTotalQsts :
0.0);
HTM_TD_End ();
/***** Write total grade *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_Double2Decimals (TotalGrade);
HTM_TD_End ();
/***** Last cell *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_End ();
/***** End row *****/
@ -1137,7 +1137,7 @@ void MchRes_ShowOneMchResult (void)
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Questions;
extern const char *Txt_QUESTIONS_non_blank;
extern const char *Txt_Answers;
extern const char *Txt_Score;
extern const char *Txt_Grade;
extern const char *Txt_Tags;
@ -1242,7 +1242,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TxtColon (Txt_ROLES_SINGUL_Abc[UsrDat->Roles.InCurrentCrs.Role][UsrDat->Sex]);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
ID_WriteUsrIDs (UsrDat,NULL);
HTM_TxtF ("&nbsp;%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
@ -1271,7 +1271,7 @@ void MchRes_ShowOneMchResult (void)
if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0)
Lay_NotEnoughMemoryExit ();
HTM_TD_Begin ("id=\"%s\" class=\"DAT LT\"",Id);
HTM_TD_Begin ("id=\"%s\" class=\"DAT LB\"",Id);
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
true,true,true,0x7);
@ -1288,9 +1288,21 @@ void MchRes_ShowOneMchResult (void)
HTM_TxtColon (Txt_Questions);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TxtF ("%u; %s: %u",
Print.NumQsts,Txt_QUESTIONS_non_blank,Print.NumQstsNotBlank);
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Print.NumQsts);
HTM_TD_End ();
HTM_TR_End ();
/***** Number of answers *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT_N RT\"");
HTM_TxtColon (Txt_Answers);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Print.NumQstsNotBlank);
HTM_TD_End ();
HTM_TR_End ();
@ -1302,7 +1314,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TxtColon (Txt_Score);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanViewScore)
{
HTM_STRONG_Begin ();
@ -1324,7 +1336,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TxtColon (Txt_Grade);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanViewScore)
{
HTM_STRONG_Begin ();
@ -1344,7 +1356,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TxtColon (Txt_Tags);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
Gam_ShowTstTagsPresentInAGame (Match.GamCod);
HTM_TD_End ();

View File

@ -187,7 +187,7 @@ static void TstPrn_ResetPrintExceptPrnCod (struct TstPrn_Print *Print)
{
Print->TimeUTC[Dat_START_TIME] =
Print->TimeUTC[Dat_END_TIME ] = (time_t) 0;
Print->NumQsts =
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
@ -1026,11 +1026,19 @@ void TstPrn_ComputeIntAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
{
long AnswerUsr;
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_BLANK;
PrintedQuestion->Score = 0.0; // Default score for blank or wrong answer
if (PrintedQuestion->StrAnswers[0]) // If user has answered the answer
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_ZERO;
if (sscanf (PrintedQuestion->StrAnswers,"%ld",&AnswerUsr) == 1)
if (AnswerUsr == Question->Answer.Integer) // Correct answer
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_CORRECT;
PrintedQuestion->Score = 1.0;
}
}
}
void TstPrn_ComputeFltAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
@ -1038,30 +1046,47 @@ void TstPrn_ComputeFltAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
{
double AnswerUsr;
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_BLANK;
PrintedQuestion->Score = 0.0; // Default score for blank or wrong answer
if (PrintedQuestion->StrAnswers[0]) // If user has answered the answer
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_ZERO;
AnswerUsr = Str_GetDoubleFromStr (PrintedQuestion->StrAnswers);
// A bad formatted floating point answer will interpreted as 0.0
PrintedQuestion->Score = (AnswerUsr >= Question->Answer.FloatingPoint[0] &&
AnswerUsr <= Question->Answer.FloatingPoint[1]) ? 1.0 : // If correct (inside the interval)
0.0; // If wrong (outside the interval)
if (AnswerUsr >= Question->Answer.FloatingPoint[0] &&
AnswerUsr <= Question->Answer.FloatingPoint[1])
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_CORRECT;
PrintedQuestion->Score = 1.0; // Correct (inside the interval)
}
}
}
void TstPrn_ComputeTF_AnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question)
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_BLANK;
PrintedQuestion->Score = 0.0;
if (PrintedQuestion->StrAnswers[0]) // If user has selected T or F
PrintedQuestion->Score = (PrintedQuestion->StrAnswers[0] == Question->Answer.TF) ? 1.0 : // Correct
-1.0; // Wrong
else
PrintedQuestion->Score = 0.0;
{
if (PrintedQuestion->StrAnswers[0] == Question->Answer.TF)
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_CORRECT;
PrintedQuestion->Score = 1.0; // Correct
}
else
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_NEGATIVE;
PrintedQuestion->Score = -1.0; // Wrong
}
}
}
void TstPrn_ComputeChoAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question)
const struct Tst_Question *Question)
{
unsigned Indexes[Tst_MAX_OPTIONS_PER_QUESTION]; // Indexes of all answers of this question
bool UsrAnswers[Tst_MAX_OPTIONS_PER_QUESTION];
@ -1071,6 +1096,9 @@ void TstPrn_ComputeChoAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumAnsGood = 0;
unsigned NumAnsBad = 0;
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_BLANK;
PrintedQuestion->Score = 0.0;
/***** Get indexes for this question from string *****/
TstPrn_GetIndexesFromStr (PrintedQuestion->StrIndexes,Indexes);
@ -1095,39 +1123,68 @@ void TstPrn_ComputeChoAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
}
}
/* The answer is blank? */
/* The answer is not blank? */
if (NumAnsGood || NumAnsBad) // If user has answered the answer
{
/* Compute the score */
if (Question->Answer.Type == Tst_ANS_UNIQUE_CHOICE)
{
if (NumOptTotInQst >= 2) // It should be 2 options at least
PrintedQuestion->Score = (double) NumAnsGood -
(double) NumAnsBad / (double) (NumOptTotInQst - 1);
else // 0 or 1 options (impossible)
PrintedQuestion->Score = (double) NumAnsGood;
{
if (NumAnsGood == 1 && NumAnsBad == 0)
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_CORRECT;
PrintedQuestion->Score = 1;
}
else if (NumAnsGood == 0 && NumAnsBad == 1)
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_NEGATIVE;
PrintedQuestion->Score = -1.0 / (double) (NumOptTotInQst - 1);
}
// other case should be impossible
}
// other case should be impossible
}
else // AnswerType == Tst_ANS_MULTIPLE_CHOICE
{
if (NumOptCorrInQst) // There are correct options in the question
{
if (NumOptCorrInQst < NumOptTotInQst) // If there are correct options and wrong options (typical case)
PrintedQuestion->Score = (double) NumAnsGood / (double) NumOptCorrInQst -
(double) NumAnsBad / (double) (NumOptTotInQst - NumOptCorrInQst);
else // If all options are correct (extrange case)
PrintedQuestion->Score = (double) NumAnsGood / (double) NumOptCorrInQst;
}
else
{
if (NumOptTotInQst) // There are options but none is correct (extrange case)
PrintedQuestion->Score = - (double) NumAnsBad / (double) NumOptTotInQst;
else // There are no options (impossible!)
PrintedQuestion->Score = 0.0;
if (NumAnsGood == NumOptCorrInQst && NumAnsBad == 0)
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_CORRECT;
PrintedQuestion->Score = 1.0;
}
else
{
if (NumOptCorrInQst < NumOptTotInQst) // If there are correct options and wrong options (typical case)
{
PrintedQuestion->Score = (double) NumAnsGood / (double) NumOptCorrInQst -
(double) NumAnsBad / (double) (NumOptTotInQst - NumOptCorrInQst);
if (PrintedQuestion->Score > 0.000001)
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_POSITIVE;
else if (PrintedQuestion->Score < -0.000001)
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_NEGATIVE;
else // Score is 0
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_ZERO;
}
else // If all options are correct (extrange case)
{
if (NumAnsGood == 0)
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_ZERO;
PrintedQuestion->Score = 0.0;
}
else
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_POSITIVE;
PrintedQuestion->Score = (double) NumAnsGood / (double) NumOptCorrInQst;
}
}
}
}
// other case should be impossible
}
}
else // Answer is blank
PrintedQuestion->Score = 0.0;
}
void TstPrn_ComputeTxtAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
@ -1137,7 +1194,9 @@ void TstPrn_ComputeTxtAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
char TextAnsUsr[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
char TextAnsOK[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_BLANK;
PrintedQuestion->Score = 0.0; // Default score for blank or wrong answer
if (PrintedQuestion->StrAnswers[0]) // If user has answered the answer
{
/* Filter the user answer */
@ -1149,6 +1208,7 @@ void TstPrn_ComputeTxtAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
Str_ReplaceSeveralSpacesForOne (TextAnsUsr);
Str_ConvertToComparable (TextAnsUsr);
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_WRONG_ZERO;
for (NumOpt = 0;
NumOpt < Question->Answer.NumOptions;
NumOpt++)
@ -1160,7 +1220,11 @@ void TstPrn_ComputeTxtAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
/* Check is user answer is correct */
if (!strcoll (TextAnsUsr,TextAnsOK))
{
PrintedQuestion->AnswerIsCorrect = TstPrn_ANSWER_IS_CORRECT;
PrintedQuestion->Score = 1.0; // Correct answer
break;
}
}
}
}
@ -1889,7 +1953,7 @@ static void TstPrn_ShowUsrsPrints (__attribute__((unused)) void *Args)
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_Results,
NULL,NULL,
Hlp_ASSESSMENT_Tests_results,Box_NOT_CLOSABLE,2);
Hlp_ASSESSMENT_Tests_results,Box_NOT_CLOSABLE,5);
/***** Header of the table with the list of users *****/
TstPrn_ShowHeaderPrints ();
@ -1925,7 +1989,7 @@ static void TstPrn_ShowHeaderPrints (void)
extern const char *Txt_Questions;
extern const char *Txt_Non_blank_BR_questions;
extern const char *Txt_Score;
extern const char *Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1;
extern const char *Txt_Average_BR_score_BR_per_question;
extern const char *Txt_Grade;
HTM_TR_Begin (NULL);
@ -1936,7 +2000,7 @@ static void TstPrn_ShowHeaderPrints (void)
HTM_TH (1,1,"RT",Txt_Questions);
HTM_TH (1,1,"RT",Txt_Non_blank_BR_questions);
HTM_TH (1,1,"RT",Txt_Score);
HTM_TH (1,1,"RT",Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1);
HTM_TH (1,1,"RT",Txt_Average_BR_score_BR_per_question);
HTM_TH (1,1,"RT",Txt_Grade);
HTM_TH_Empty (1);
@ -2223,25 +2287,25 @@ static void TstPrn_ShowPrintsSummaryRow (bool ItsMe,
HTM_TR_Begin (NULL);
/***** Row title *****/
HTM_TD_Begin ("colspan=\"2\" class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("colspan=\"2\" class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TxtColonNBSP (Txt_Visible_tests);
HTM_Unsigned (NumPrints);
HTM_TD_End ();
/***** Write total number of questions *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumPrints)
HTM_Unsigned (NumTotalQsts);
HTM_TD_End ();
/***** Write total number of questions not blank *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (NumPrints)
HTM_Unsigned (NumTotalQstsNotBlank);
HTM_TD_End ();
/***** Write total score *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (ICanViewTotalScore)
{
HTM_Double2Decimals (TotalScoreOfAllTests);
@ -2251,20 +2315,20 @@ static void TstPrn_ShowPrintsSummaryRow (bool ItsMe,
HTM_TD_End ();
/***** Write average score per question *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (ICanViewTotalScore)
HTM_Double2Decimals (NumTotalQsts ? TotalScoreOfAllTests / (double) NumTotalQsts :
0.0);
HTM_TD_End ();
/***** Write score over Tst_SCORE_MAX *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
if (ICanViewTotalScore)
TstPrn_ComputeAndShowGrade (NumTotalQsts,TotalScoreOfAllTests,Tst_SCORE_MAX);
HTM_TD_End ();
/***** Last cell *****/
HTM_TD_Begin ("class=\"DAT_N_LINE_TOP COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_End ();
/***** End row *****/
@ -2283,7 +2347,7 @@ void TstPrn_ShowOnePrint (void)
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Questions;
extern const char *Txt_QUESTIONS_non_blank;
extern const char *Txt_Answers;
extern const char *Txt_Score;
extern const char *Txt_Grade;
extern const char *Txt_Tags;
@ -2381,7 +2445,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TxtColon (Txt_ROLES_SINGUL_Abc[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs.Role][Gbl.Usrs.Other.UsrDat.Sex]);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL);
HTM_TxtF ("&nbsp;%s",Gbl.Usrs.Other.UsrDat.Surname1);
if (Gbl.Usrs.Other.UsrDat.Surname2[0])
@ -2411,7 +2475,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TxtColon (Txt_START_END_TIME[StartEndTime]);
HTM_TD_End ();
HTM_TD_Begin ("id=\"%s\" class=\"DAT LT\"",Id);
HTM_TD_Begin ("id=\"%s\" class=\"DAT LB\"",Id);
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
true,true,true,0x7);
@ -2429,9 +2493,21 @@ void TstPrn_ShowOnePrint (void)
HTM_TxtColon (Txt_Questions);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TxtF ("%u; %s: %u",
Print.NumQsts,Txt_QUESTIONS_non_blank,Print.NumQstsNotBlank);
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Print.NumQsts);
HTM_TD_End ();
HTM_TR_End ();
/***** Number of answers *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT_N RT\"");
HTM_TxtColon (Txt_Answers);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Print.NumQstsNotBlank);
HTM_TD_End ();
HTM_TR_End ();
@ -2443,7 +2519,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TxtColon (Txt_Score);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanViewScore)
{
HTM_STRONG_Begin ();
@ -2463,7 +2539,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TxtColon (Txt_Grade);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
if (ICanViewScore)
{
HTM_STRONG_Begin ();
@ -2483,7 +2559,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TxtColon (Txt_Tags);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
HTM_TD_Begin ("class=\"DAT LB\"");
TstPrn_ShowTagsPresentInAPrint (Print.PrnCod);
HTM_TD_End ();

View File

@ -40,13 +40,23 @@
/******************************* Public types ********************************/
/*****************************************************************************/
typedef enum
{
TstPrn_ANSWER_IS_CORRECT,
TstPrn_ANSWER_IS_WRONG_NEGATIVE,
TstPrn_ANSWER_IS_WRONG_ZERO,
TstPrn_ANSWER_IS_WRONG_POSITIVE,
TstPrn_ANSWER_IS_BLANK,
} TstPrn_Correct_t;
struct TstPrn_PrintedQuestion
{
long QstCod; // Question code
long SetCod; // Only for exams
char StrIndexes[Tst_MAX_BYTES_INDEXES_ONE_QST + 1]; // 0 1 2 3, 3 0 2 1, etc.
char StrAnswers[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; // Answers selected by user
double Score; // Question score
TstPrn_Correct_t AnswerIsCorrect; // Is question wrong, medium or correct?
double Score; // Question score
};
struct TstPrn_Print

View File

@ -2522,6 +2522,27 @@ const char *Txt_Availability =
"Disponibilidade";
#endif
const char *Txt_average =
#if L==1 // ca
"mitjana";
#elif L==2 // de
"Mittel";
#elif L==3 // en
"average";
#elif L==4 // es
"media";
#elif L==5 // fr
"moyenne";
#elif L==6 // gn
"media"; // Okoteve traducción
#elif L==7 // it
"media";
#elif L==8 // pl
"&sacute;rednia";
#elif L==9 // pt
"m&eacute;dia";
#endif
const char *Txt_Average_number_BR_of_ASSIG_BR_per_course =
#if L==1 // ca
"Nombre mitj&acute;<br />d'activitats<br />per assignatura";
@ -2819,25 +2840,25 @@ const char *Txt_AVERAGE_PHOTO_TYPES[Pho_NUM_AVERAGE_PHOTO_TYPES] =
#endif
};
const char *Txt_Average_BR_score_BR_per_question_BR_less_than_or_equal_to_1 =
const char *Txt_Average_BR_score_BR_per_question =
#if L==1 // ca
"Puntuaci&oacute;<br />mitjana<br />per pregunta<br />(&le;1)";
"Puntuaci&oacute;<br />mitjana<br />per pregunta";
#elif L==2 // de
"Durchschnittliche<br />Punktzahl<br />pro Frage<br />(&le;1)";
"Durchschnittliche<br />Punktzahl<br />pro Frage";
#elif L==3 // en
"Average<br />score<br />per question<br />(&le;1)";
"Average<br />score<br />per question";
#elif L==4 // es
"Puntuaci&oacute;n<br />media<br />por pregunta<br />(&le;1)";
"Puntuaci&oacute;n<br />media<br />por pregunta";
#elif L==5 // fr
"Score<br />moyen<br />par question<br />(&le;1)";
"Score<br />moyen<br />par question";
#elif L==6 // gn
"Puntuaci&oacute;n<br />media<br />por pregunta<br />(&le;1)"; // Okoteve traducción
"Puntuaci&oacute;n<br />media<br />por pregunta"; // Okoteve traducción
#elif L==7 // it
"Punteggio<br />medio<br />per domanda<br />(&le;1)";
"Punteggio<br />medio<br />per domanda";
#elif L==8 // pl
"&Sacute;rednia<br />ocena<br />za pytanie<br />(&le;1)";
"&Sacute;rednia<br />ocena<br />za pytanie";
#elif L==9 // pt
"Pontua&ccedil;&atilde;o<br />m&eacute;dia por<br />pergunta<br />(&le;1)";
"Pontua&ccedil;&atilde;o<br />m&eacute;dia por<br />pergunta";
#endif
const char *Txt_Average_type =
@ -3086,6 +3107,27 @@ const char *Txt_Before_going_to_any_other_option_you_must_fill_in_your_email_add
"voc&ecirc; deve preencher seu endere&ccedil;o de email.";
#endif
const char *Txt_blank_ANSWERS =
#if L==1 // ca
"en&nbsp;blanc";
#elif L==2 // de
"leere";
#elif L==3 // en
"blank";
#elif L==4 // es
"en&nbsp;blanco";
#elif L==5 // fr
"vides";
#elif L==6 // gn
"en&nbsp;blanco"; // Okoteve traducción
#elif L==7 // it
"vuote";
#elif L==8 // pl
"puste";
#elif L==9 // pt
"em&nbsp;branco";
#endif
const char *Txt_Briefcase_of_THE_USER_X_has_been_removed = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Se ha eliminado el malet&iacute;n de <strong>%s</strong>."; // Necessita traduccio
@ -4988,6 +5030,27 @@ const char *Txt_Copy_source =
"Origem da copia";
#endif
const char *Txt_correct_ANSWERS =
#if L==1 // ca
"correctes";
#elif L==2 // de
"richtige";
#elif L==3 // en
"correct";
#elif L==4 // es
"correctas";
#elif L==5 // fr
"bonnes";
#elif L==6 // gn
"correctas"; // Okoteve traducción
#elif L==7 // it
"corrette";
#elif L==8 // pl
"prawid&lstrok;owe";
#elif L==9 // pt
"corretas";
#endif
const char *Txt_Could_not_detect_any_face_in_front_position_ =
#if L==1 // ca
"No s'ha detectat cap rostre en posici&oacute; frontal.";
@ -33056,27 +33119,6 @@ const char *Txt_Questions_and_problems =
"Perguntas e problemas";
#endif
const char *Txt_QUESTIONS_non_blank =
#if L==1 // ca
"contestades";
#elif L==2 // de
"Non-blank";
#elif L==3 // en
"non-blank";
#elif L==4 // es
"contestadas";
#elif L==5 // fr
"non vide";
#elif L==6 // gn
"contestadas"; // Okoteve traducción
#elif L==7 // it
"risposte";
#elif L==8 // pl
"niepustych";
#elif L==9 // pt
"respondidas";
#endif
const char *Txt_QUESTIONS_invalid =
#if L==1 // ca
"anul&middot;lades";
@ -53694,6 +53736,27 @@ const char *Txt_Total =
"Total";
#endif
const char *Txt_total =
#if L==1 // ca
"total";
#elif L==2 // de
"Gesamtzahl";
#elif L==3 // en
"total";
#elif L==4 // es
"total";
#elif L==5 // fr
"total";
#elif L==6 // gn
"total"; // Okoteve traducción
#elif L==7 // it
"totale";
#elif L==8 // pl
"ca&lstrok;kowity";
#elif L==9 // pt
"total";
#endif
const char *Txt_TST_Answer_given_by_the_teachers =
#if L==1 // ca
"Resposta donada pels professors";
@ -56008,6 +56071,27 @@ const char *Txt_Vacants =
"Desocupados";
#endif
const char *Txt_Valid_answers =
#if L==1 // ca
"Respostes v&agrave;lides";
#elif L==2 // de
"G&uuml;ltige Antworten";
#elif L==3 // en
"Valid answers";
#elif L==4 // es
"Respuestas v&aacute;lidas";
#elif L==5 // fr
"R&eacute;ponses valides";
#elif L==6 // gn
"Respuestas v&aacute;lidas"; // Okoteve traducción
#elif L==7 // it
"Risposte valide";
#elif L==8 // pl
"Prawid&lstrok;owe odpowiedzi";
#elif L==9 // pt
"Respostas v&aacute;lidas";
#endif
const char *Txt_valid_grade =
#if L==1 // ca
"nota v&agrave;lida";
@ -57106,6 +57190,27 @@ const char *Txt_Write_a_message =
"Escrever uma mensagem";
#endif
const char *Txt_wrong_ANSWERS =
#if L==1 // ca
"incorrectes";
#elif L==2 // de
"falsche";
#elif L==3 // en
"wrong";
#elif L==4 // es
"err&oacute;neas";
#elif L==5 // fr
"mauvaises";
#elif L==6 // gn
"err&oacute;neas"; // Okoteve traducción
#elif L==7 // it
"sbagliate";
#elif L==8 // pl
"z&lstrok;e";
#elif L==9 // pt
"erradas";
#endif
const char *Txt_Wrong_file_type =
#if L==1 // ca
"Tipus d'arxiu incorrecte.";