Version 20.68.1: Apr 26, 2021 Code refactoring in exams and tests.

This commit is contained in:
acanas 2021-04-26 17:29:04 +02:00
parent 9af6b0d4f9
commit 40a4e56125
12 changed files with 312 additions and 300 deletions

View File

@ -1654,7 +1654,7 @@ static int API_WritePageIntoHTMLBuffer (struct soap *soap,
/***** Write page from file to text buffer *****/ /***** Write page from file to text buffer *****/
/* Open file */ /* Open file */
if ((FileHTML = fopen (PathRelFileHTML,"rb")) == NULL) if ((FileHTML = fopen (PathRelFileHTML,"rb")) == NULL)
Err_ShowErrorAndExit ("Can not open XML file."); Err_FileFolderNotFoundExit ();
/* Compute file size */ /* Compute file size */
fseek (FileHTML,0L,SEEK_END); fseek (FileHTML,0L,SEEK_END);

View File

@ -600,13 +600,14 @@ TODO: Salvador Romero Cort
TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria. TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria.
*/ */
#define Log_PLATFORM_VERSION "SWAD 20.68 (2021-04-26)" #define Log_PLATFORM_VERSION "SWAD 20.68.1 (2021-04-26)"
#define CSS_FILE "swad20.45.css" #define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.6.2.js" #define JS_FILE "swad20.6.2.js"
/* /*
TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.68.1: Apr 26, 2021 Code refactoring in exams and tests. (309862 lines)
Version 20.68: Apr 26, 2021 New module swad_error. (309853 lines) Version 20.68: Apr 26, 2021 New module swad_error. (309853 lines)
Version 20.67.11: Apr 26, 2021 Fixed bug in departments. (309677 lines) Version 20.67.11: Apr 26, 2021 Fixed bug in departments. (309677 lines)
Version 20.67.10: Apr 25, 2021 Fixed bug in notification about new assignment, reported by Eva Martínez Ortigosa. (? lines) Version 20.67.10: Apr 25, 2021 Fixed bug in notification about new assignment, reported by Eva Martínez Ortigosa. (? lines)

View File

@ -79,7 +79,7 @@ void Cfg_GetConfigFromFile (void)
/***** Read config from file to string *****/ /***** Read config from file to string *****/
/* Open config file */ /* Open config file */
if ((FileCfg = fopen (Cfg_FILE_CONFIG,"rb")) == NULL) if ((FileCfg = fopen (Cfg_FILE_CONFIG,"rb")) == NULL)
Err_ShowErrorAndExit ("Can not open config file."); Err_FileFolderNotFoundExit ();
/* Compute file size */ /* Compute file size */
fseek (FileCfg,0L,SEEK_END); fseek (FileCfg,0L,SEEK_END);

View File

@ -561,7 +561,7 @@ void Enr_UpdateUsrData (struct UsrData *UsrDat)
/***** Check if user's code is initialized *****/ /***** Check if user's code is initialized *****/
if (UsrDat->UsrCod <= 0) if (UsrDat->UsrCod <= 0)
Err_ShowErrorAndExit ("Can not update user's data. Wrong user's code."); Err_WrongUserExit ();
/***** Filter some user's data before updating */ /***** Filter some user's data before updating */
Enr_FilterUsrDat (UsrDat); Enr_FilterUsrDat (UsrDat);

View File

@ -202,6 +202,15 @@ void Err_WrongFileBrowserExit (void)
Err_ShowErrorAndExit ("Wrong file browser."); Err_ShowErrorAndExit ("Wrong file browser.");
} }
/*****************************************************************************/
/******* Write error message and exit when file/folder does not exist ********/
/*****************************************************************************/
void Err_FileFolderNotFoundExit (void)
{
Err_ShowErrorAndExit ("File/folder not found.");
}
/*****************************************************************************/ /*****************************************************************************/
/*********** Write error message and exit when wrong copy source *************/ /*********** Write error message and exit when wrong copy source *************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -58,6 +58,7 @@ void Err_WrongItemsListExit (void);
void Err_WrongItemExit (void); void Err_WrongItemExit (void);
void Err_WrongSyllabusFormatExit (void); void Err_WrongSyllabusFormatExit (void);
void Err_WrongFileBrowserExit (void); void Err_WrongFileBrowserExit (void);
void Err_FileFolderNotFoundExit (void);
void Err_WrongCopySrcExit (void); void Err_WrongCopySrcExit (void);
void Err_WrongNumberOfRowsExit (void); void Err_WrongNumberOfRowsExit (void);
void Err_WrongGrpTypExit (void); void Err_WrongGrpTypExit (void);

View File

@ -87,32 +87,32 @@ static void ExaPrn_GetAndWriteDescription (long ExaCod);
static void ExaPrn_ShowTableWithQstsToFill (struct Exa_Exams *Exams, static void ExaPrn_ShowTableWithQstsToFill (struct Exa_Exams *Exams,
const struct ExaPrn_Print *Print); const struct ExaPrn_Print *Print);
static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question); struct Tst_Question *Question);
static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question); struct Tst_Question *Question);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void ExaPrn_WriteIntAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteIntAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
static void ExaPrn_WriteFltAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteFltAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question); struct Tst_Question *Question);
static void ExaPrn_WriteTxtAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteTxtAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void ExaPrn_WriteJSToUpdateExamPrint (const struct ExaPrn_Print *Print, static void ExaPrn_WriteJSToUpdateExamPrint (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
const char *Id,int NumOpt); const char *Id,int NumOpt);
static void ExaPrn_GetAnswerFromForm (struct ExaPrn_Print *Print,unsigned QstInd); static void ExaPrn_GetAnswerFromForm (struct ExaPrn_Print *Print,unsigned QstInd);
@ -120,7 +120,7 @@ static void ExaPrn_GetAnswerFromForm (struct ExaPrn_Print *Print,unsigned QstInd
static unsigned ExaPrn_GetParamQstInd (void); static unsigned ExaPrn_GetParamQstInd (void);
static void ExaPrn_ComputeScoreAndStoreQuestionOfPrint (struct ExaPrn_Print *Print, static void ExaPrn_ComputeScoreAndStoreQuestionOfPrint (struct ExaPrn_Print *Print,
unsigned NumQst); unsigned QstInd);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void ExaPrn_GetCorrectAndComputeIntAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion, static void ExaPrn_GetCorrectAndComputeIntAnsScore (struct TstPrn_PrintedQuestion *PrintedQuestion,
@ -144,7 +144,7 @@ static void ExaPrn_GetCorrectTxtAnswerFromDB (struct Tst_Question *Question);
static void ExaPrn_GetAnswerFromDB (struct ExaPrn_Print *Print,long QstCod, static void ExaPrn_GetAnswerFromDB (struct ExaPrn_Print *Print,long QstCod,
char StrAnswers[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]); char StrAnswers[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]);
static void ExaPrn_StoreOneQstOfPrintInDB (const struct ExaPrn_Print *Print, static void ExaPrn_StoreOneQstOfPrintInDB (const struct ExaPrn_Print *Print,
unsigned NumQst); unsigned QstInd);
static void ExaPrn_GetNumQstsNotBlank (struct ExaPrn_Print *Print); static void ExaPrn_GetNumQstsNotBlank (struct ExaPrn_Print *Print);
static void ExaPrn_ComputeTotalScoreOfPrint (struct ExaPrn_Print *Print); static void ExaPrn_ComputeTotalScoreOfPrint (struct ExaPrn_Print *Print);
@ -580,7 +580,7 @@ static void ExaPrn_GenerateChoiceIndexes (struct TstPrn_PrintedQuestion *Printed
static void ExaPrn_CreatePrintInDB (struct ExaPrn_Print *Print) static void ExaPrn_CreatePrintInDB (struct ExaPrn_Print *Print)
{ {
unsigned NumQst; unsigned QstInd;
/***** Insert new exam print into table *****/ /***** Insert new exam print into table *****/
Print->PrnCod = Print->PrnCod =
@ -597,10 +597,10 @@ static void ExaPrn_CreatePrintInDB (struct ExaPrn_Print *Print)
/***** Store all questions (with blank answers) /***** Store all questions (with blank answers)
of this exam print just generated in database *****/ of this exam print just generated in database *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
ExaPrn_StoreOneQstOfPrintInDB (Print,NumQst); ExaPrn_StoreOneQstOfPrintInDB (Print,QstInd);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -611,7 +611,7 @@ void ExaPrn_GetPrintQuestionsFromDB (struct ExaPrn_Print *Print)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumQst; unsigned QstInd;
/***** Get questions of an exam print from database *****/ /***** Get questions of an exam print from database *****/
Print->NumQsts.All = (unsigned) Print->NumQsts.All = (unsigned)
@ -628,33 +628,33 @@ void ExaPrn_GetPrintQuestionsFromDB (struct ExaPrn_Print *Print)
/***** Get questions *****/ /***** Get questions *****/
if (Print->NumQsts.All <= ExaPrn_MAX_QUESTIONS_PER_EXAM_PRINT) if (Print->NumQsts.All <= ExaPrn_MAX_QUESTIONS_PER_EXAM_PRINT)
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/* Get question code (row[0]) */ /* Get question code (row[0]) */
if ((Print->PrintedQuestions[NumQst].QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0) if ((Print->PrintedQuestions[QstInd].QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Err_WrongQuestionExit (); Err_WrongQuestionExit ();
/* Get set code (row[1]) */ /* Get set code (row[1]) */
if ((Print->PrintedQuestions[NumQst].SetCod = Str_ConvertStrCodToLongCod (row[1])) < 0) if ((Print->PrintedQuestions[QstInd].SetCod = Str_ConvertStrCodToLongCod (row[1])) < 0)
Err_WrongSetExit (); Err_WrongSetExit ();
/* Get score (row[2]) */ /* Get score (row[2]) */
Str_SetDecimalPointToUS (); // To get the decimal point as a dot Str_SetDecimalPointToUS (); // To get the decimal point as a dot
if (sscanf (row[2],"%lf",&Print->PrintedQuestions[NumQst].Score) != 1) if (sscanf (row[2],"%lf",&Print->PrintedQuestions[QstInd].Score) != 1)
Err_ShowErrorAndExit ("Wrong question score."); Err_ShowErrorAndExit ("Wrong question score.");
Str_SetDecimalPointToLocal (); // Return to local system Str_SetDecimalPointToLocal (); // Return to local system
/* Get indexes for this question (row[3]) */ /* Get indexes for this question (row[3]) */
Str_Copy (Print->PrintedQuestions[NumQst].StrIndexes,row[3], Str_Copy (Print->PrintedQuestions[QstInd].StrIndexes,row[3],
sizeof (Print->PrintedQuestions[NumQst].StrIndexes) - 1); sizeof (Print->PrintedQuestions[QstInd].StrIndexes) - 1);
/* Get answers selected by user for this question (row[4]) */ /* Get answers selected by user for this question (row[4]) */
Str_Copy (Print->PrintedQuestions[NumQst].StrAnswers,row[4], Str_Copy (Print->PrintedQuestions[QstInd].StrAnswers,row[4],
sizeof (Print->PrintedQuestions[NumQst].StrAnswers) - 1); sizeof (Print->PrintedQuestions[QstInd].StrAnswers) - 1);
} }
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
@ -740,26 +740,26 @@ static void ExaPrn_ShowTableWithQstsToFill (struct Exa_Exams *Exams,
const struct ExaPrn_Print *Print) const struct ExaPrn_Print *Print)
{ {
extern const char *Txt_I_have_finished; extern const char *Txt_I_have_finished;
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
/***** Begin table *****/ /***** Begin table *****/
HTM_TABLE_BeginWideMarginPadding (10); HTM_TABLE_BeginWideMarginPadding (10);
/***** Write one row for each question *****/ /***** Write one row for each question *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
/* Create test question */ /* Create test question */
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
Question.QstCod = Print->PrintedQuestions[NumQst].QstCod; Question.QstCod = Print->PrintedQuestions[QstInd].QstCod;
/* Get question from database */ /* Get question from database */
ExaSet_GetQstDataFromDB (&Question); ExaSet_GetQstDataFromDB (&Question);
/* Write question and answers */ /* Write question and answers */
ExaPrn_WriteQstAndAnsToFill (Print,NumQst,&Question); ExaPrn_WriteQstAndAnsToFill (Print,QstInd,&Question);
/* Destroy test question */ /* Destroy test question */
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
@ -780,7 +780,7 @@ static void ExaPrn_ShowTableWithQstsToFill (struct Exa_Exams *Exams,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) struct Tst_Question *Question)
{ {
static struct ExaSet_Set CurrentSet = static struct ExaSet_Set CurrentSet =
@ -792,10 +792,10 @@ static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print,
.Title[0] = '\0' .Title[0] = '\0'
}; };
if (Print->PrintedQuestions[NumQst].SetCod != CurrentSet.SetCod) if (Print->PrintedQuestions[QstInd].SetCod != CurrentSet.SetCod)
{ {
/***** Get data of this set *****/ /***** Get data of this set *****/
CurrentSet.SetCod = Print->PrintedQuestions[NumQst].SetCod; CurrentSet.SetCod = Print->PrintedQuestions[QstInd].SetCod;
ExaSet_GetDataOfSetByCod (&CurrentSet); ExaSet_GetDataOfSetByCod (&CurrentSet);
/***** Title for this set *****/ /***** Title for this set *****/
@ -811,7 +811,7 @@ static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print,
/***** Number of question and answer type *****/ /***** Number of question and answer type *****/
HTM_TD_Begin ("class=\"RT\""); HTM_TD_Begin ("class=\"RT\"");
Tst_WriteNumQst (NumQst + 1,"BIG_INDEX"); Tst_WriteNumQst (QstInd + 1,"BIG_INDEX");
Tst_WriteAnswerType (Question->Answer.Type,"DAT_SMALL"); Tst_WriteAnswerType (Question->Answer.Type,"DAT_SMALL");
HTM_TD_End (); HTM_TD_End ();
@ -828,7 +828,7 @@ static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print,
/* Answers */ /* Answers */
Frm_BeginFormNoAction (); // Form that can not be submitted, to avoid enter key to send it Frm_BeginFormNoAction (); // Form that can not be submitted, to avoid enter key to send it
ExaPrn_WriteAnswersToFill (Print,NumQst,Question); ExaPrn_WriteAnswersToFill (Print,QstInd,Question);
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();
@ -842,11 +842,11 @@ static void ExaPrn_WriteQstAndAnsToFill (const struct ExaPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) struct Tst_Question *Question)
{ {
void (*ExaPrn_WriteAnsToFill[Tst_NUM_ANS_TYPES]) (const struct ExaPrn_Print *Print, void (*ExaPrn_WriteAnsToFill[Tst_NUM_ANS_TYPES]) (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) = struct Tst_Question *Question) =
{ {
[Tst_ANS_INT ] = ExaPrn_WriteIntAnsToFill, [Tst_ANS_INT ] = ExaPrn_WriteIntAnsToFill,
@ -858,7 +858,7 @@ static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print,
}; };
/***** Write answers *****/ /***** Write answers *****/
ExaPrn_WriteAnsToFill[Question->Answer.Type] (Print,NumQst,Question); ExaPrn_WriteAnsToFill[Question->Answer.Type] (Print,QstInd,Question);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -866,17 +866,17 @@ static void ExaPrn_WriteAnswersToFill (const struct ExaPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteIntAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteIntAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
/***** Write input field for the answer *****/ /***** Write input field for the answer *****/
snprintf (Id,sizeof (Id),"Ans%010u",NumQst); snprintf (Id,sizeof (Id),"Ans%010u",QstInd);
HTM_TxtF ("<input type=\"text\" id=\"%s\" name=\"Ans\"" HTM_TxtF ("<input type=\"text\" id=\"%s\" name=\"Ans\""
" size=\"11\" maxlength=\"11\" value=\"%s\"", " size=\"11\" maxlength=\"11\" value=\"%s\"",
Id,Print->PrintedQuestions[NumQst].StrAnswers); Id,Print->PrintedQuestions[QstInd].StrAnswers);
ExaPrn_WriteJSToUpdateExamPrint (Print,NumQst,Id,-1); ExaPrn_WriteJSToUpdateExamPrint (Print,QstInd,Id,-1);
HTM_Txt (" />"); HTM_Txt (" />");
} }
@ -885,18 +885,18 @@ static void ExaPrn_WriteIntAnsToFill (const struct ExaPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteFltAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteFltAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
/***** Write input field for the answer *****/ /***** Write input field for the answer *****/
snprintf (Id,sizeof (Id),"Ans%010u",NumQst); snprintf (Id,sizeof (Id),"Ans%010u",QstInd);
HTM_TxtF ("<input type=\"text\" id=\"%s\" name=\"Ans\"" HTM_TxtF ("<input type=\"text\" id=\"%s\" name=\"Ans\""
" size=\"11\" maxlength=\"%u\" value=\"%s\"", " size=\"11\" maxlength=\"%u\" value=\"%s\"",
Id,Tst_MAX_BYTES_FLOAT_ANSWER, Id,Tst_MAX_BYTES_FLOAT_ANSWER,
Print->PrintedQuestions[NumQst].StrAnswers); Print->PrintedQuestions[QstInd].StrAnswers);
ExaPrn_WriteJSToUpdateExamPrint (Print,NumQst,Id,-1); ExaPrn_WriteJSToUpdateExamPrint (Print,QstInd,Id,-1);
HTM_Txt (" />"); HTM_Txt (" />");
} }
@ -905,7 +905,7 @@ static void ExaPrn_WriteFltAnsToFill (const struct ExaPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
extern const char *Txt_TF_QST[2]; extern const char *Txt_TF_QST[2];
@ -915,13 +915,13 @@ static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print,
/* Initially user has not answered the question ==> initially all the answers will be blank. /* Initially user has not answered the question ==> initially all the answers will be blank.
If the user does not confirm the submission of their exam ==> If the user does not confirm the submission of their exam ==>
==> the exam may be half filled ==> the answers displayed will be those selected by the user. */ ==> the exam may be half filled ==> the answers displayed will be those selected by the user. */
snprintf (Id,sizeof (Id),"Ans%010u",NumQst); snprintf (Id,sizeof (Id),"Ans%010u",QstInd);
HTM_TxtF ("<select id=\"%s\" name=\"Ans\"",Id); HTM_TxtF ("<select id=\"%s\" name=\"Ans\"",Id);
ExaPrn_WriteJSToUpdateExamPrint (Print,NumQst,Id,-1); ExaPrn_WriteJSToUpdateExamPrint (Print,QstInd,Id,-1);
HTM_Txt (" />"); HTM_Txt (" />");
HTM_OPTION (HTM_Type_STRING,"" ,Print->PrintedQuestions[NumQst].StrAnswers[0] == '\0',false,"&nbsp;"); HTM_OPTION (HTM_Type_STRING,"" ,Print->PrintedQuestions[QstInd].StrAnswers[0] == '\0',false,"&nbsp;");
HTM_OPTION (HTM_Type_STRING,"T",Print->PrintedQuestions[NumQst].StrAnswers[0] == 'T' ,false,"%s",Txt_TF_QST[0]); HTM_OPTION (HTM_Type_STRING,"T",Print->PrintedQuestions[QstInd].StrAnswers[0] == 'T' ,false,"%s",Txt_TF_QST[0]);
HTM_OPTION (HTM_Type_STRING,"F",Print->PrintedQuestions[NumQst].StrAnswers[0] == 'F' ,false,"%s",Txt_TF_QST[1]); HTM_OPTION (HTM_Type_STRING,"F",Print->PrintedQuestions[QstInd].StrAnswers[0] == 'F' ,false,"%s",Txt_TF_QST[1]);
HTM_Txt ("</select>"); HTM_Txt ("</select>");
} }
@ -930,7 +930,7 @@ static void ExaPrn_WriteTF_AnsToFill (const struct ExaPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) struct Tst_Question *Question)
{ {
unsigned NumOpt; unsigned NumOpt;
@ -942,10 +942,10 @@ static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print,
Tst_ChangeFormatAnswersText (Question); Tst_ChangeFormatAnswersText (Question);
/***** Get indexes for this question from string *****/ /***** Get indexes for this question from string *****/
TstPrn_GetIndexesFromStr (Print->PrintedQuestions[NumQst].StrIndexes,Indexes); TstPrn_GetIndexesFromStr (Print->PrintedQuestions[QstInd].StrIndexes,Indexes);
/***** Get the user's answers for this question from string *****/ /***** Get the user's answers for this question from string *****/
TstPrn_GetAnswersFromStr (Print->PrintedQuestions[NumQst].StrAnswers,UsrAnswers); TstPrn_GetAnswersFromStr (Print->PrintedQuestions[QstInd].StrAnswers,UsrAnswers);
/***** Begin table *****/ /***** Begin table *****/
HTM_TABLE_BeginPadding (2); HTM_TABLE_BeginPadding (2);
@ -963,26 +963,26 @@ static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print,
If the user does not confirm the submission of their exam ==> If the user does not confirm the submission of their exam ==>
==> the exam may be half filled ==> the answers displayed will be those selected by the user. */ ==> the exam may be half filled ==> the answers displayed will be those selected by the user. */
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
snprintf (Id,sizeof (Id),"Ans%010u",NumQst); snprintf (Id,sizeof (Id),"Ans%010u",QstInd);
HTM_TxtF ("<input type=\"%s\" id=\"%s_%u\" name=\"Ans\" value=\"%u\"%s", HTM_TxtF ("<input type=\"%s\" id=\"%s_%u\" name=\"Ans\" value=\"%u\"%s",
Question->Answer.Type == Tst_ANS_UNIQUE_CHOICE ? "radio" : Question->Answer.Type == Tst_ANS_UNIQUE_CHOICE ? "radio" :
"checkbox", "checkbox",
Id,NumOpt,Indexes[NumOpt], Id,NumOpt,Indexes[NumOpt],
UsrAnswers[Indexes[NumOpt]] ? " checked=\"checked\"" : UsrAnswers[Indexes[NumOpt]] ? " checked=\"checked\"" :
""); "");
ExaPrn_WriteJSToUpdateExamPrint (Print,NumQst,Id,(int) NumOpt); ExaPrn_WriteJSToUpdateExamPrint (Print,QstInd,Id,(int) NumOpt);
HTM_Txt (" />"); HTM_Txt (" />");
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",NumQst,NumOpt); HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",QstInd,NumOpt);
HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt); HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt);
HTM_LABEL_End (); HTM_LABEL_End ();
HTM_TD_End (); HTM_TD_End ();
/***** Write the option text *****/ /***** Write the option text *****/
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",NumQst,NumOpt); HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",QstInd,NumOpt);
HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text); HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
HTM_LABEL_End (); HTM_LABEL_End ();
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media, Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
@ -1002,18 +1002,18 @@ static void ExaPrn_WriteChoAnsToFill (const struct ExaPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteTxtAnsToFill (const struct ExaPrn_Print *Print, static void ExaPrn_WriteTxtAnsToFill (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char Id[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
/***** Write input field for the answer *****/ /***** Write input field for the answer *****/
snprintf (Id,sizeof (Id),"Ans%010u",NumQst); snprintf (Id,sizeof (Id),"Ans%010u",QstInd);
HTM_TxtF ("<input type=\"text\" id=\"%s\" name=\"Ans\"" HTM_TxtF ("<input type=\"text\" id=\"%s\" name=\"Ans\""
" size=\"40\" maxlength=\"%u\" value=\"%s\"", " size=\"40\" maxlength=\"%u\" value=\"%s\"",
Id,Tst_MAX_CHARS_ANSWERS_ONE_QST, Id,Tst_MAX_CHARS_ANSWERS_ONE_QST,
Print->PrintedQuestions[NumQst].StrAnswers); Print->PrintedQuestions[QstInd].StrAnswers);
ExaPrn_WriteJSToUpdateExamPrint (Print,NumQst,Id,-1); ExaPrn_WriteJSToUpdateExamPrint (Print,QstInd,Id,-1);
HTM_Txt (" />"); HTM_Txt (" />");
} }
@ -1023,20 +1023,20 @@ static void ExaPrn_WriteTxtAnsToFill (const struct ExaPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_WriteJSToUpdateExamPrint (const struct ExaPrn_Print *Print, static void ExaPrn_WriteJSToUpdateExamPrint (const struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
const char *Id,int NumOpt) const char *Id,int NumOpt)
{ {
if (NumOpt < 0) if (NumOpt < 0)
HTM_TxtF (" onchange=\"updateExamPrint('examprint','%s','Ans'," HTM_TxtF (" onchange=\"updateExamPrint('examprint','%s','Ans',"
"'act=%ld&ses=%s&SesCod=%ld&NumQst=%u',%u);", "'act=%ld&ses=%s&SesCod=%ld&QstInd=%u',%u);",
Id, Id,
Act_GetActCod (ActAnsExaPrn),Gbl.Session.Id,Print->SesCod,NumQst, Act_GetActCod (ActAnsExaPrn),Gbl.Session.Id,Print->SesCod,QstInd,
(unsigned) Gbl.Prefs.Language); (unsigned) Gbl.Prefs.Language);
else // NumOpt >= 0 else // NumOpt >= 0
HTM_TxtF (" onclick=\"updateExamPrint('examprint','%s_%d','Ans'," HTM_TxtF (" onclick=\"updateExamPrint('examprint','%s_%d','Ans',"
"'act=%ld&ses=%s&SesCod=%ld&NumQst=%u',%u);", "'act=%ld&ses=%s&SesCod=%ld&QstInd=%u',%u);",
Id,NumOpt, Id,NumOpt,
Act_GetActCod (ActAnsExaPrn),Gbl.Session.Id,Print->SesCod,NumQst, Act_GetActCod (ActAnsExaPrn),Gbl.Session.Id,Print->SesCod,QstInd,
(unsigned) Gbl.Prefs.Language); (unsigned) Gbl.Prefs.Language);
HTM_Txt (" return false;\""); // return false is necessary to not submit form HTM_Txt (" return false;\""); // return false is necessary to not submit form
} }
@ -1145,18 +1145,17 @@ static void ExaPrn_GetAnswerFromForm (struct ExaPrn_Print *Print,unsigned QstInd
} }
/*****************************************************************************/ /*****************************************************************************/
/******************* Get parameter with index of question ********************/ /********************* Get parameter with question index *********************/
/*****************************************************************************/ /*****************************************************************************/
static unsigned ExaPrn_GetParamQstInd (void) static unsigned ExaPrn_GetParamQstInd (void)
{ {
long NumQst; long QstInd;
NumQst = Par_GetParToLong ("NumQst"); if ((QstInd = Par_GetParToLong ("QstInd")) < 0)
if (NumQst < 0) Err_WrongQuestionIndexExit ();
Err_ShowErrorAndExit ("Wrong number of question.");
return (unsigned) NumQst; return (unsigned) QstInd;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1164,36 +1163,36 @@ static unsigned ExaPrn_GetParamQstInd (void)
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_ComputeScoreAndStoreQuestionOfPrint (struct ExaPrn_Print *Print, static void ExaPrn_ComputeScoreAndStoreQuestionOfPrint (struct ExaPrn_Print *Print,
unsigned NumQst) unsigned QstInd)
{ {
struct Tst_Question Question; struct Tst_Question Question;
char CurrentStrAnswersInDB[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; // Answers selected by user char CurrentStrAnswersInDB[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; // Answers selected by user
/***** Compute question score *****/ /***** Compute question score *****/
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
Question.QstCod = Print->PrintedQuestions[NumQst].QstCod; Question.QstCod = Print->PrintedQuestions[QstInd].QstCod;
Question.Answer.Type = ExaSet_GetQstAnswerTypeFromDB (Question.QstCod); Question.Answer.Type = ExaSet_GetQstAnswerTypeFromDB (Question.QstCod);
ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[NumQst],&Question); ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[QstInd],&Question);
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
/***** If type is unique choice and the option (radio button) is checked /***** If type is unique choice and the option (radio button) is checked
==> uncheck it by deleting answer *****/ ==> uncheck it by deleting answer *****/
if (Question.Answer.Type == Tst_ANS_UNIQUE_CHOICE) if (Question.Answer.Type == Tst_ANS_UNIQUE_CHOICE)
{ {
ExaPrn_GetAnswerFromDB (Print,Print->PrintedQuestions[NumQst].QstCod, ExaPrn_GetAnswerFromDB (Print,Print->PrintedQuestions[QstInd].QstCod,
CurrentStrAnswersInDB); CurrentStrAnswersInDB);
if (!strcmp (Print->PrintedQuestions[NumQst].StrAnswers,CurrentStrAnswersInDB)) if (!strcmp (Print->PrintedQuestions[QstInd].StrAnswers,CurrentStrAnswersInDB))
{ {
/* The answer just clicked by user /* The answer just clicked by user
is the same as the last one checked and stored in database */ is the same as the last one checked and stored in database */
Print->PrintedQuestions[NumQst].StrAnswers[0] = '\0'; // Uncheck option Print->PrintedQuestions[QstInd].StrAnswers[0] = '\0'; // Uncheck option
Print->PrintedQuestions[NumQst].Score = 0; // Clear question score Print->PrintedQuestions[QstInd].Score = 0; // Clear question score
} }
} }
/***** Store test exam question in database *****/ /***** Store test exam question in database *****/
ExaPrn_StoreOneQstOfPrintInDB (Print, ExaPrn_StoreOneQstOfPrintInDB (Print,
NumQst); // 0, 1, 2, 3... QstInd); // 0, 1, 2, 3...
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1463,7 +1462,7 @@ static void ExaPrn_GetAnswerFromDB (struct ExaPrn_Print *Print,long QstCod,
/*****************************************************************************/ /*****************************************************************************/
static void ExaPrn_StoreOneQstOfPrintInDB (const struct ExaPrn_Print *Print, static void ExaPrn_StoreOneQstOfPrintInDB (const struct ExaPrn_Print *Print,
unsigned NumQst) unsigned QstInd)
{ {
/***** Insert question and user's answers into database *****/ /***** Insert question and user's answers into database *****/
Str_SetDecimalPointToUS (); // To print the floating point as a dot Str_SetDecimalPointToUS (); // To print the floating point as a dot
@ -1473,12 +1472,12 @@ static void ExaPrn_StoreOneQstOfPrintInDB (const struct ExaPrn_Print *Print,
" VALUES" " VALUES"
" (%ld,%ld,%u,%ld,'%.15lg','%s','%s')", " (%ld,%ld,%u,%ld,'%.15lg','%s','%s')",
Print->PrnCod, Print->PrnCod,
Print->PrintedQuestions[NumQst].QstCod, Print->PrintedQuestions[QstInd].QstCod,
NumQst, // 0, 1, 2, 3... QstInd, // 0, 1, 2, 3...
Print->PrintedQuestions[NumQst].SetCod, Print->PrintedQuestions[QstInd].SetCod,
Print->PrintedQuestions[NumQst].Score, Print->PrintedQuestions[QstInd].Score,
Print->PrintedQuestions[NumQst].StrIndexes, Print->PrintedQuestions[QstInd].StrIndexes,
Print->PrintedQuestions[NumQst].StrAnswers); Print->PrintedQuestions[QstInd].StrAnswers);
Str_SetDecimalPointToLocal (); // Return to local system Str_SetDecimalPointToLocal (); // Return to local system
} }

View File

@ -142,7 +142,7 @@ static void ExaRes_ShowExamAnswers (struct UsrData *UsrDat,
unsigned Visibility); unsigned Visibility);
static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat, static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
struct ExaPrn_Print *Print, struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question, struct Tst_Question *Question,
unsigned Visibility); unsigned Visibility);
@ -1548,7 +1548,7 @@ static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
bool QuestionExists; bool QuestionExists;
@ -1561,12 +1561,12 @@ static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print)
Print->NumQsts.Valid.Total = 0; Print->NumQsts.Valid.Total = 0;
Print->Score.Valid = 0.0; Print->Score.Valid = 0.0;
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
/***** Copy question code *****/ /***** Copy question code *****/
Question.QstCod = Print->PrintedQuestions[NumQst].QstCod; Question.QstCod = Print->PrintedQuestions[QstInd].QstCod;
/***** Get validity and answer type from database *****/ /***** Get validity and answer type from database *****/
QuestionExists = (DB_QuerySELECT (&mysql_res,"can not get a question", QuestionExists = (DB_QuerySELECT (&mysql_res,"can not get a question",
@ -1594,8 +1594,8 @@ static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print)
if (QuestionExists) if (QuestionExists)
if (Question.Validity == Tst_VALID_QUESTION) if (Question.Validity == Tst_VALID_QUESTION)
{ {
ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[NumQst],&Question); ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[QstInd],&Question);
switch (Print->PrintedQuestions[NumQst].AnswerIsCorrect) switch (Print->PrintedQuestions[QstInd].AnswerIsCorrect)
{ {
case TstPrn_ANSWER_IS_CORRECT: case TstPrn_ANSWER_IS_CORRECT:
Print->NumQsts.Valid.Correct++; Print->NumQsts.Valid.Correct++;
@ -1614,7 +1614,7 @@ static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print)
break; break;
} }
Print->NumQsts.Valid.Total++; Print->NumQsts.Valid.Total++;
Print->Score.Valid += Print->PrintedQuestions[NumQst].Score; Print->Score.Valid += Print->PrintedQuestions[QstInd].Score;
} }
} }
} }
@ -1889,24 +1889,24 @@ static void ExaRes_ShowExamAnswers (struct UsrData *UsrDat,
struct ExaPrn_Print *Print, struct ExaPrn_Print *Print,
unsigned Visibility) unsigned Visibility)
{ {
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/***** Create test question *****/ /***** Create test question *****/
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
Question.QstCod = Print->PrintedQuestions[NumQst].QstCod; Question.QstCod = Print->PrintedQuestions[QstInd].QstCod;
/***** Get question data *****/ /***** Get question data *****/
ExaSet_GetQstDataFromDB (&Question); ExaSet_GetQstDataFromDB (&Question);
/***** Write questions and answers *****/ /***** Write questions and answers *****/
ExaRes_WriteQstAndAnsExam (UsrDat,Print,NumQst,&Question,Visibility); ExaRes_WriteQstAndAnsExam (UsrDat,Print,QstInd,&Question,Visibility);
/***** Destroy test question *****/ /***** Destroy test question *****/
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
@ -1919,7 +1919,7 @@ static void ExaRes_ShowExamAnswers (struct UsrData *UsrDat,
static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat, static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
struct ExaPrn_Print *Print, struct ExaPrn_Print *Print,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question, struct Tst_Question *Question,
unsigned Visibility) unsigned Visibility)
{ {
@ -1980,7 +1980,7 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
/***** Number of question and answer type *****/ /***** Number of question and answer type *****/
HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd); HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd);
Tst_WriteNumQst (NumQst + 1,ClassNumQst[Question->Validity]); Tst_WriteNumQst (QstInd + 1,ClassNumQst[Question->Validity]);
Tst_WriteAnswerType (Question->Answer.Type,ClassAnswerType[Question->Validity]); Tst_WriteAnswerType (Question->Answer.Type,ClassAnswerType[Question->Validity]);
HTM_TD_End (); HTM_TD_End ();
@ -1998,8 +1998,8 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
"TEST_MED_SHOW"); "TEST_MED_SHOW");
/* Answers */ /* Answers */
ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[NumQst],Question); ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[QstInd],Question);
TstPrn_WriteAnswersExam (UsrDat,&Print->PrintedQuestions[NumQst],Question, TstPrn_WriteAnswersExam (UsrDat,&Print->PrintedQuestions[QstInd],Question,
ICanView, ICanView,
ClassTxt[Question->Validity], ClassTxt[Question->Validity],
ClassFeedback[Question->Validity]); ClassFeedback[Question->Validity]);
@ -2010,11 +2010,11 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
HTM_DIV_Begin ("class=\"DAT_SMALL LM\""); HTM_DIV_Begin ("class=\"DAT_SMALL LM\"");
HTM_TxtColonNBSP (Txt_Score); HTM_TxtColonNBSP (Txt_Score);
HTM_SPAN_Begin ("class=\"%s\"", HTM_SPAN_Begin ("class=\"%s\"",
Print->PrintedQuestions[NumQst].StrAnswers[0] ? Print->PrintedQuestions[QstInd].StrAnswers[0] ?
(Print->PrintedQuestions[NumQst].Score > 0 ? "ANS_OK" : // Correct/semicorrect (Print->PrintedQuestions[QstInd].Score > 0 ? "ANS_OK" : // Correct/semicorrect
"ANS_BAD") : // Wrong "ANS_BAD") : // Wrong
"ANS_0"); // Blank answer "ANS_0"); // Blank answer
HTM_Double2Decimals (Print->PrintedQuestions[NumQst].Score); HTM_Double2Decimals (Print->PrintedQuestions[QstInd].Score);
if (Question->Validity == Tst_INVALID_QUESTION) if (Question->Validity == Tst_INVALID_QUESTION)
HTM_TxtF (" (%s)",Txt_Invalid_question); HTM_TxtF (" (%s)",Txt_Invalid_question);
HTM_SPAN_End (); HTM_SPAN_End ();

View File

@ -1223,7 +1223,7 @@ static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
extern const char *Txt_Questions; extern const char *Txt_Questions;
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
extern const char *Txt_Question; extern const char *Txt_Question;
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
char *Anchor; char *Anchor;
static Act_Action_t NextAction[Tst_NUM_VALIDITIES] = static Act_Action_t NextAction[Tst_NUM_VALIDITIES] =
@ -1254,11 +1254,11 @@ static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
HTM_TR_End (); HTM_TR_End ();
/***** Write rows *****/ /***** Write rows *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < NumQsts; QstInd < NumQsts;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/***** Create test question *****/ /***** Create test question *****/
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
@ -1292,7 +1292,7 @@ static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
HTM_TD_End (); HTM_TD_End ();
/***** List question *****/ /***** List question *****/
ExaSet_ListQuestionForEdition (&Question,NumQst + 1,Anchor); ExaSet_ListQuestionForEdition (&Question,QstInd + 1,Anchor);
/***** End row *****/ /***** End row *****/
HTM_TR_End (); HTM_TR_End ();

View File

@ -6650,7 +6650,7 @@ void Brw_RemFileFromTree (void)
FileNameToShow); FileNameToShow);
} }
else // File / link not found else // File / link not found
Err_ShowErrorAndExit ("File / link not found."); Err_FileFolderNotFoundExit ();
} }
else else
Err_ShowErrorAndExit (Txt_You_can_not_remove_this_file_or_link); Err_ShowErrorAndExit (Txt_You_can_not_remove_this_file_or_link);
@ -6703,7 +6703,7 @@ void Brw_RemFolderFromTree (void)
Gbl.FileBrowser.FilFolLnk.Name); Gbl.FileBrowser.FilFolLnk.Name);
} }
else // Folder not found else // Folder not found
Err_ShowErrorAndExit ("Folder not found."); Err_FileFolderNotFoundExit ();
} }
else else
Err_ShowErrorAndExit (Txt_You_can_not_remove_this_folder); Err_ShowErrorAndExit (Txt_You_can_not_remove_this_folder);

View File

@ -155,7 +155,7 @@ static void Tst_ListOneQstToEdit (struct Tst_Test *Test);
static void Tst_ListOneOrMoreQuestionsForEdition (struct Tst_Test *Test, static void Tst_ListOneOrMoreQuestionsForEdition (struct Tst_Test *Test,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Tst_WriteHeadingRowQuestionsForEdition (struct Tst_Test *Test); static void Tst_WriteHeadingRowQuestionsForEdition (struct Tst_Test *Test);
static void Tst_WriteQuestionListing (struct Tst_Test *Test,unsigned NumQst); static void Tst_WriteQuestionListing (struct Tst_Test *Test,unsigned QstInd);
static void Tst_ListOneOrMoreQuestionsForSelectionForSet (struct Exa_Exams *Exams, static void Tst_ListOneOrMoreQuestionsForSelectionForSet (struct Exa_Exams *Exams,
unsigned NumQsts, unsigned NumQsts,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
@ -163,7 +163,7 @@ static void Tst_ListOneOrMoreQuestionsForSelectionForGame (struct Gam_Games *Gam
unsigned NumQsts, unsigned NumQsts,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Tst_PutCheckboxToSelectAllQuestions (void); static void Tst_PutCheckboxToSelectAllQuestions (void);
static void Tst_WriteQuestionRowForSelection (unsigned NumQst, static void Tst_WriteQuestionRowForSelection (unsigned QstInd,
struct Tst_Question *Question); struct Tst_Question *Question);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -564,19 +564,19 @@ void Tst_AssessTest (void)
static void TstPrn_GetAnswersFromForm (struct TstPrn_Print *Print) static void TstPrn_GetAnswersFromForm (struct TstPrn_Print *Print)
{ {
unsigned NumQst; unsigned QstInd;
char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
/***** Loop for every question getting user's answers *****/ /***** Loop for every question getting user's answers *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
/* Get answers selected by user for this question */ /* Get answers selected by user for this question */
snprintf (StrAns,sizeof (StrAns),"Ans%010u",NumQst); snprintf (StrAns,sizeof (StrAns),"Ans%010u",QstInd);
Par_GetParMultiToText (StrAns,Print->PrintedQuestions[NumQst].StrAnswers, Par_GetParMultiToText (StrAns,Print->PrintedQuestions[QstInd].StrAnswers,
Tst_MAX_BYTES_ANSWERS_ONE_QST); /* If answer type == T/F ==> " ", "T", "F"; if choice ==> "0", "2",... */ Tst_MAX_BYTES_ANSWERS_ONE_QST); /* If answer type == T/F ==> " ", "T", "F"; if choice ==> "0", "2",... */
Par_ReplaceSeparatorMultipleByComma (Print->PrintedQuestions[NumQst].StrAnswers); Par_ReplaceSeparatorMultipleByComma (Print->PrintedQuestions[QstInd].StrAnswers);
} }
} }
@ -1890,7 +1890,7 @@ static void Tst_GetQuestionsForNewTestFromDB (struct Tst_Test *Test,
Tst_AnswerType_t AnswerType; Tst_AnswerType_t AnswerType;
bool Shuffle; bool Shuffle;
char StrNumQsts[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char StrNumQsts[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
unsigned NumQst; unsigned QstInd;
/***** Trivial check: number of questions *****/ /***** Trivial check: number of questions *****/
if (Test->NumQsts == 0 || if (Test->NumQsts == 0 ||
@ -1987,9 +1987,9 @@ static void Tst_GetQuestionsForNewTestFromDB (struct Tst_Test *Test,
Query); Query);
/***** Get questions and answers from database *****/ /***** Get questions and answers from database *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
/* Get question row */ /* Get question row */
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
@ -2000,7 +2000,7 @@ static void Tst_GetQuestionsForNewTestFromDB (struct Tst_Test *Test,
*/ */
/* Get question code (row[0]) */ /* Get question code (row[0]) */
if ((Print->PrintedQuestions[NumQst].QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0) if ((Print->PrintedQuestions[QstInd].QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Err_ShowErrorAndExit ("Wrong code of question."); Err_ShowErrorAndExit ("Wrong code of question.");
/* Get answer type (row[1]) */ /* Get answer type (row[1]) */
@ -2016,13 +2016,13 @@ static void Tst_GetQuestionsForNewTestFromDB (struct Tst_Test *Test,
case Tst_ANS_FLOAT: case Tst_ANS_FLOAT:
case Tst_ANS_TRUE_FALSE: case Tst_ANS_TRUE_FALSE:
case Tst_ANS_TEXT: case Tst_ANS_TEXT:
Print->PrintedQuestions[NumQst].StrIndexes[0] = '\0'; Print->PrintedQuestions[QstInd].StrIndexes[0] = '\0';
break; break;
case Tst_ANS_UNIQUE_CHOICE: case Tst_ANS_UNIQUE_CHOICE:
case Tst_ANS_MULTIPLE_CHOICE: case Tst_ANS_MULTIPLE_CHOICE:
/* If answer type is unique or multiple option, /* If answer type is unique or multiple option,
generate indexes of answers depending on shuffle */ generate indexes of answers depending on shuffle */
Tst_GenerateChoiceIndexes (&Print->PrintedQuestions[NumQst],Shuffle); Tst_GenerateChoiceIndexes (&Print->PrintedQuestions[QstInd],Shuffle);
break; break;
default: default:
break; break;
@ -2032,7 +2032,7 @@ static void Tst_GetQuestionsForNewTestFromDB (struct Tst_Test *Test,
Initially user has not answered the question ==> initially all the answers will be blank. Initially user has not answered the question ==> initially all the answers will be blank.
If the user does not confirm the submission of their exam ==> If the user does not confirm the submission of their exam ==>
==> the exam may be half filled ==> the answers displayed will be those selected by the user. */ ==> the exam may be half filled ==> the answers displayed will be those selected by the user. */
Print->PrintedQuestions[NumQst].StrAnswers[0] = '\0'; Print->PrintedQuestions[QstInd].StrAnswers[0] = '\0';
} }
/***** Get if test exam will be visible by teachers *****/ /***** Get if test exam will be visible by teachers *****/
@ -2145,7 +2145,7 @@ static void Tst_ListOneOrMoreQuestionsForEdition (struct Tst_Test *Test,
{ {
extern const char *Hlp_ASSESSMENT_Tests; extern const char *Hlp_ASSESSMENT_Tests;
extern const char *Txt_Questions; extern const char *Txt_Questions;
unsigned NumQst; unsigned QstInd;
MYSQL_ROW row; MYSQL_ROW row;
/***** Begin box *****/ /***** Begin box *****/
@ -2158,11 +2158,11 @@ static void Tst_ListOneOrMoreQuestionsForEdition (struct Tst_Test *Test,
Tst_WriteHeadingRowQuestionsForEdition (Test); Tst_WriteHeadingRowQuestionsForEdition (Test);
/***** Write rows *****/ /***** Write rows *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < Test->NumQsts; QstInd < Test->NumQsts;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/***** Create test question *****/ /***** Create test question *****/
Tst_QstConstructor (&Test->Question); Tst_QstConstructor (&Test->Question);
@ -2173,7 +2173,7 @@ static void Tst_ListOneOrMoreQuestionsForEdition (struct Tst_Test *Test,
Err_WrongQuestionExit (); Err_WrongQuestionExit ();
/***** Write question row *****/ /***** Write question row *****/
Tst_WriteQuestionListing (Test,NumQst); Tst_WriteQuestionListing (Test,QstInd);
/***** Destroy test question *****/ /***** Destroy test question *****/
Tst_QstDestructor (&Test->Question); Tst_QstDestructor (&Test->Question);
@ -2254,7 +2254,7 @@ static void Tst_WriteHeadingRowQuestionsForEdition (struct Tst_Test *Test)
/********** Write question row in listing of questions for edition ***********/ /********** Write question row in listing of questions for edition ***********/
/*****************************************************************************/ /*****************************************************************************/
static void Tst_WriteQuestionListing (struct Tst_Test *Test,unsigned NumQst) static void Tst_WriteQuestionListing (struct Tst_Test *Test,unsigned QstInd)
{ {
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
char *Id; char *Id;
@ -2280,7 +2280,7 @@ static void Tst_WriteQuestionListing (struct Tst_Test *Test,unsigned NumQst)
/* Number of question and answer type */ /* Number of question and answer type */
HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd); HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd);
Tst_WriteNumQst (NumQst + 1,"BIG_INDEX"); Tst_WriteNumQst (QstInd + 1,"BIG_INDEX");
Tst_WriteAnswerType (Test->Question.Answer.Type,"DAT_SMALL"); Tst_WriteAnswerType (Test->Question.Answer.Type,"DAT_SMALL");
HTM_TD_End (); HTM_TD_End ();
@ -2388,7 +2388,7 @@ static void Tst_ListOneOrMoreQuestionsForSelectionForSet (struct Exa_Exams *Exam
extern const char *Txt_Shuffle; extern const char *Txt_Shuffle;
extern const char *Txt_Question; extern const char *Txt_Question;
extern const char *Txt_Add_questions; extern const char *Txt_Add_questions;
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
MYSQL_ROW row; MYSQL_ROW row;
@ -2421,11 +2421,11 @@ static void Tst_ListOneOrMoreQuestionsForSelectionForSet (struct Exa_Exams *Exam
HTM_TR_End (); HTM_TR_End ();
/***** Write rows *****/ /***** Write rows *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < NumQsts; QstInd < NumQsts;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/* Create test question */ /* Create test question */
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
@ -2436,7 +2436,7 @@ static void Tst_ListOneOrMoreQuestionsForSelectionForSet (struct Exa_Exams *Exam
Err_WrongQuestionExit (); Err_WrongQuestionExit ();
/* Write question row */ /* Write question row */
Tst_WriteQuestionRowForSelection (NumQst,&Question); Tst_WriteQuestionRowForSelection (QstInd,&Question);
/* Destroy test question */ /* Destroy test question */
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
@ -2473,7 +2473,7 @@ static void Tst_ListOneOrMoreQuestionsForSelectionForGame (struct Gam_Games *Gam
extern const char *Txt_Shuffle; extern const char *Txt_Shuffle;
extern const char *Txt_Question; extern const char *Txt_Question;
extern const char *Txt_Add_questions; extern const char *Txt_Add_questions;
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
MYSQL_ROW row; MYSQL_ROW row;
@ -2506,11 +2506,11 @@ static void Tst_ListOneOrMoreQuestionsForSelectionForGame (struct Gam_Games *Gam
HTM_TR_End (); HTM_TR_End ();
/***** Write rows *****/ /***** Write rows *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < NumQsts; QstInd < NumQsts;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/* Create test question */ /* Create test question */
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
@ -2521,7 +2521,7 @@ static void Tst_ListOneOrMoreQuestionsForSelectionForGame (struct Gam_Games *Gam
Err_WrongQuestionExit (); Err_WrongQuestionExit ();
/* Write question row */ /* Write question row */
Tst_WriteQuestionRowForSelection (NumQst,&Question); Tst_WriteQuestionRowForSelection (QstInd,&Question);
/* Destroy test question */ /* Destroy test question */
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
@ -2561,7 +2561,7 @@ static void Tst_PutCheckboxToSelectAllQuestions (void)
/********************** Write question row for selection *********************/ /********************** Write question row for selection *********************/
/*****************************************************************************/ /*****************************************************************************/
static void Tst_WriteQuestionRowForSelection (unsigned NumQst, static void Tst_WriteQuestionRowForSelection (unsigned QstInd,
struct Tst_Question *Question) struct Tst_Question *Question)
{ {
extern const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES]; extern const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES];
@ -2584,7 +2584,7 @@ static void Tst_WriteQuestionRowForSelection (unsigned NumQst,
/* Write number of question */ /* Write number of question */
HTM_TD_Begin ("class=\"DAT_SMALL CT COLOR%u\"",Gbl.RowEvenOdd); HTM_TD_Begin ("class=\"DAT_SMALL CT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TxtF ("%u&nbsp;",NumQst + 1); HTM_TxtF ("%u&nbsp;",QstInd + 1);
HTM_TD_End (); HTM_TD_End ();
/* Write question code */ /* Write question code */
@ -2889,11 +2889,11 @@ void Tst_WriteAnsTF (char AnsTF)
/*************** Write parameter with the code of a question *****************/ /*************** Write parameter with the code of a question *****************/
/*****************************************************************************/ /*****************************************************************************/
void Tst_WriteParamQstCod (unsigned NumQst,long QstCod) void Tst_WriteParamQstCod (unsigned QstInd,long QstCod)
{ {
char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
snprintf (StrAns,sizeof (StrAns),"Qst%010u",NumQst); snprintf (StrAns,sizeof (StrAns),"Qst%010u",QstInd);
Par_PutHiddenParamLong (NULL,StrAns,QstCod); Par_PutHiddenParamLong (NULL,StrAns,QstCod);
} }

View File

@ -80,27 +80,27 @@ extern struct Globals Gbl;
static void TstPrn_ResetPrintExceptPrnCod (struct TstPrn_Print *Print); static void TstPrn_ResetPrintExceptPrnCod (struct TstPrn_Print *Print);
static void TstPrn_WriteQstAndAnsToFill (struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteQstAndAnsToFill (struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question); struct Tst_Question *Question);
static void TstPrn_WriteAnswersToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteAnswersToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question); struct Tst_Question *Question);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void TstPrn_WriteIntAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteIntAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
static void TstPrn_WriteFltAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteFltAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
static void TstPrn_WriteTF_AnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteTF_AnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
static void TstPrn_WriteChoAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteChoAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question); struct Tst_Question *Question);
static void TstPrn_WriteTxtAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteTxtAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question); __attribute__((unused)) struct Tst_Question *Question);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -108,7 +108,7 @@ static void TstPrn_PutCheckBoxAllowTeachers (bool AllowTeachers);
static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat, static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
struct TstPrn_PrintedQuestion PrintedQuestions[TstCfg_MAX_QUESTIONS_PER_TEST], struct TstPrn_PrintedQuestion PrintedQuestions[TstCfg_MAX_QUESTIONS_PER_TEST],
unsigned NumQst, unsigned QstInd,
time_t TimeUTC[Dat_NUM_START_END_TIME], time_t TimeUTC[Dat_NUM_START_END_TIME],
struct Tst_Question *Question, struct Tst_Question *Question,
bool QuestionExists, bool QuestionExists,
@ -167,7 +167,7 @@ static void TstPrn_WriteTxtAnsPrint (struct UsrData *UsrDat,
static void TstPrn_WriteHeadUserCorrect (struct UsrData *UsrDat); static void TstPrn_WriteHeadUserCorrect (struct UsrData *UsrDat);
static void TstPrn_StoreOneQstOfPrintInDB (const struct TstPrn_Print *Print, static void TstPrn_StoreOneQstOfPrintInDB (const struct TstPrn_Print *Print,
unsigned NumQst); unsigned QstInd);
static void TstPrn_PutFormToSelectUsrsToViewUsrsPrints (__attribute__((unused)) void *Args); static void TstPrn_PutFormToSelectUsrsToViewUsrsPrints (__attribute__((unused)) void *Args);
@ -270,7 +270,7 @@ void TstPrn_ShowTestPrintToFillIt (struct TstPrn_Print *Print,
extern const char *Txt_Test; extern const char *Txt_Test;
extern const char *Txt_Continue; extern const char *Txt_Continue;
extern const char *Txt_Send; extern const char *Txt_Send;
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
static const Act_Action_t Action[Tst_NUM_REQUEST_OR_CONFIRM] = static const Act_Action_t Action[Tst_NUM_REQUEST_OR_CONFIRM] =
{ {
@ -294,49 +294,51 @@ void TstPrn_ShowTestPrintToFillIt (struct TstPrn_Print *Print,
TstPrn_PutParamPrnCod (Print->PrnCod); TstPrn_PutParamPrnCod (Print->PrnCod);
Par_PutHiddenParamUnsigned (NULL,"NumTst",NumExamsGeneratedByMe); Par_PutHiddenParamUnsigned (NULL,"NumTst",NumExamsGeneratedByMe);
/***** Begin table *****/ /***** Begin table *****/
HTM_TABLE_BeginWideMarginPadding (10); HTM_TABLE_BeginWideMarginPadding (10);
/***** Write one row for each question *****/ /***** Write one row for each question *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/* Create test question */ /* Create test question */
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
Question.QstCod = Print->PrintedQuestions[NumQst].QstCod; Question.QstCod = Print->PrintedQuestions[QstInd].QstCod;
/* Show question */ /* Show question */
if (!Tst_GetQstDataFromDB (&Question)) // Question exists if (!Tst_GetQstDataFromDB (&Question)) // Question exists
Err_WrongQuestionExit (); Err_WrongQuestionExit ();
/* Write question and answers */ /* Write question and answers */
TstPrn_WriteQstAndAnsToFill (&Print->PrintedQuestions[NumQst],NumQst,&Question); TstPrn_WriteQstAndAnsToFill (&Print->PrintedQuestions[QstInd],QstInd,&Question);
/* Destroy test question */ /* Destroy test question */
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
} }
/***** End table *****/ /***** End table *****/
HTM_TABLE_End (); HTM_TABLE_End ();
/***** Button *****/
switch (RequestOrConfirm)
{
case TstPrn_REQUEST:
/* Send button */
Btn_PutConfirmButton (Txt_Continue);
break;
case TstPrn_CONFIRM:
/* Will the test exam be visible by teachers? */
TstPrn_PutCheckBoxAllowTeachers (true);
/* Send button */
Btn_PutCreateButton (Txt_Send);
break;
}
/***** End form *****/ /***** End form *****/
switch (RequestOrConfirm)
{
case TstPrn_REQUEST:
/* Send button */
Btn_PutConfirmButton (Txt_Continue);
break;
case TstPrn_CONFIRM:
/* Will the test exam be visible by teachers? */
TstPrn_PutCheckBoxAllowTeachers (true);
/* Send button */
Btn_PutCreateButton (Txt_Send);
break;
}
Frm_EndForm (); Frm_EndForm ();
} }
@ -349,36 +351,36 @@ void TstPrn_ShowTestPrintToFillIt (struct TstPrn_Print *Print,
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_WriteQstAndAnsToFill (struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteQstAndAnsToFill (struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) struct Tst_Question *Question)
{ {
/***** Begin row *****/ /***** Begin row *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/***** Number of question and answer type *****/ /***** Number of question and answer type *****/
HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd); HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd);
Tst_WriteNumQst (NumQst + 1,"BIG_INDEX"); Tst_WriteNumQst (QstInd + 1,"BIG_INDEX");
Tst_WriteAnswerType (Question->Answer.Type,"DAT_SMALL"); Tst_WriteAnswerType (Question->Answer.Type,"DAT_SMALL");
HTM_TD_End (); HTM_TD_End ();
/***** Stem, media and answers *****/ /***** Stem, media and answers *****/
HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd); HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd);
/* Write parameter with question code */ /* Write parameter with question code */
Tst_WriteParamQstCod (NumQst,Question->QstCod); Tst_WriteParamQstCod (QstInd,Question->QstCod);
/* Stem */ /* Stem */
Tst_WriteQstStem (Question->Stem,"TEST_TXT",true); Tst_WriteQstStem (Question->Stem,"TEST_TXT",true);
/* Media */ /* Media */
Med_ShowMedia (&Question->Media, Med_ShowMedia (&Question->Media,
"TEST_MED_SHOW_CONT", "TEST_MED_SHOW_CONT",
"TEST_MED_SHOW"); "TEST_MED_SHOW");
/* Answers */ /* Answers */
TstPrn_WriteAnswersToFill (PrintedQuestion,NumQst,Question); TstPrn_WriteAnswersToFill (PrintedQuestion,QstInd,Question);
HTM_TD_End (); HTM_TD_End ();
/***** End row *****/ /***** End row *****/
HTM_TR_End (); HTM_TR_End ();
@ -389,11 +391,11 @@ static void TstPrn_WriteQstAndAnsToFill (struct TstPrn_PrintedQuestion *PrintedQ
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_WriteAnswersToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteAnswersToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) struct Tst_Question *Question)
{ {
void (*TstPrn_WriteAnsBank[Tst_NUM_ANS_TYPES]) (const struct TstPrn_PrintedQuestion *PrintedQuestion, void (*TstPrn_WriteAnsBank[Tst_NUM_ANS_TYPES]) (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) = struct Tst_Question *Question) =
{ {
[Tst_ANS_INT ] = TstPrn_WriteIntAnsToFill, [Tst_ANS_INT ] = TstPrn_WriteIntAnsToFill,
@ -405,7 +407,7 @@ static void TstPrn_WriteAnswersToFill (const struct TstPrn_PrintedQuestion *Prin
}; };
/***** Write answers *****/ /***** Write answers *****/
TstPrn_WriteAnsBank[Question->Answer.Type] (PrintedQuestion,NumQst,Question); TstPrn_WriteAnsBank[Question->Answer.Type] (PrintedQuestion,QstInd,Question);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -413,13 +415,13 @@ static void TstPrn_WriteAnswersToFill (const struct TstPrn_PrintedQuestion *Prin
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_WriteIntAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteIntAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
/***** Write input field for the answer *****/ /***** Write input field for the answer *****/
snprintf (StrAns,sizeof (StrAns),"Ans%010u",NumQst); snprintf (StrAns,sizeof (StrAns),"Ans%010u",QstInd);
HTM_INPUT_TEXT (StrAns,11,PrintedQuestion->StrAnswers, HTM_INPUT_TEXT (StrAns,11,PrintedQuestion->StrAnswers,
HTM_DONT_SUBMIT_ON_CHANGE, HTM_DONT_SUBMIT_ON_CHANGE,
"size=\"11\""); "size=\"11\"");
@ -430,13 +432,13 @@ static void TstPrn_WriteIntAnsToFill (const struct TstPrn_PrintedQuestion *Print
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_WriteFltAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteFltAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
/***** Write input field for the answer *****/ /***** Write input field for the answer *****/
snprintf (StrAns,sizeof (StrAns),"Ans%010u",NumQst); snprintf (StrAns,sizeof (StrAns),"Ans%010u",QstInd);
HTM_INPUT_TEXT (StrAns,Tst_MAX_BYTES_FLOAT_ANSWER,PrintedQuestion->StrAnswers, HTM_INPUT_TEXT (StrAns,Tst_MAX_BYTES_FLOAT_ANSWER,PrintedQuestion->StrAnswers,
HTM_DONT_SUBMIT_ON_CHANGE, HTM_DONT_SUBMIT_ON_CHANGE,
"size=\"11\""); "size=\"11\"");
@ -447,7 +449,7 @@ static void TstPrn_WriteFltAnsToFill (const struct TstPrn_PrintedQuestion *Print
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_WriteTF_AnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteTF_AnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
extern const char *Txt_TF_QST[2]; extern const char *Txt_TF_QST[2];
@ -457,7 +459,7 @@ static void TstPrn_WriteTF_AnsToFill (const struct TstPrn_PrintedQuestion *Print
If the user does not confirm the submission of their exam ==> If the user does not confirm the submission of their exam ==>
==> the exam may be half filled ==> the answers displayed will be those selected by the user. */ ==> the exam may be half filled ==> the answers displayed will be those selected by the user. */
HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE, HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,
"name=\"Ans%010u\"",NumQst); "name=\"Ans%010u\"",QstInd);
HTM_OPTION (HTM_Type_STRING,"" ,PrintedQuestion->StrAnswers[0] == '\0',false,"&nbsp;"); HTM_OPTION (HTM_Type_STRING,"" ,PrintedQuestion->StrAnswers[0] == '\0',false,"&nbsp;");
HTM_OPTION (HTM_Type_STRING,"T",PrintedQuestion->StrAnswers[0] == 'T' ,false,"%s",Txt_TF_QST[0]); HTM_OPTION (HTM_Type_STRING,"T",PrintedQuestion->StrAnswers[0] == 'T' ,false,"%s",Txt_TF_QST[0]);
HTM_OPTION (HTM_Type_STRING,"F",PrintedQuestion->StrAnswers[0] == 'F' ,false,"%s",Txt_TF_QST[1]); HTM_OPTION (HTM_Type_STRING,"F",PrintedQuestion->StrAnswers[0] == 'F' ,false,"%s",Txt_TF_QST[1]);
@ -469,7 +471,7 @@ static void TstPrn_WriteTF_AnsToFill (const struct TstPrn_PrintedQuestion *Print
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_WriteChoAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteChoAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
struct Tst_Question *Question) struct Tst_Question *Question)
{ {
unsigned NumOpt; unsigned NumOpt;
@ -503,20 +505,20 @@ static void TstPrn_WriteChoAnsToFill (const struct TstPrn_PrintedQuestion *Print
==> the exam may be half filled ==> the answers displayed will be those selected by the user. */ ==> the exam may be half filled ==> the answers displayed will be those selected by the user. */
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
snprintf (StrAns,sizeof (StrAns),"Ans%010u",NumQst); snprintf (StrAns,sizeof (StrAns),"Ans%010u",QstInd);
if (Question->Answer.Type == Tst_ANS_UNIQUE_CHOICE) if (Question->Answer.Type == Tst_ANS_UNIQUE_CHOICE)
HTM_INPUT_RADIO (StrAns,false, HTM_INPUT_RADIO (StrAns,false,
"id=\"Ans%010u_%u\" value=\"%u\"%s" "id=\"Ans%010u_%u\" value=\"%u\"%s"
" onclick=\"selectUnselectRadio(this,this.form.Ans%010u,%u);\"", " onclick=\"selectUnselectRadio(this,this.form.Ans%010u,%u);\"",
NumQst,NumOpt, QstInd,NumOpt,
Indexes[NumOpt], Indexes[NumOpt],
UsrAnswers[Indexes[NumOpt]] ? " checked=\"checked\"" : UsrAnswers[Indexes[NumOpt]] ? " checked=\"checked\"" :
"", "",
NumQst,Question->Answer.NumOptions); QstInd,Question->Answer.NumOptions);
else // Answer.Type == Tst_ANS_MULTIPLE_CHOICE else // Answer.Type == Tst_ANS_MULTIPLE_CHOICE
HTM_INPUT_CHECKBOX (StrAns,HTM_DONT_SUBMIT_ON_CHANGE, HTM_INPUT_CHECKBOX (StrAns,HTM_DONT_SUBMIT_ON_CHANGE,
"id=\"Ans%010u_%u\" value=\"%u\"%s", "id=\"Ans%010u_%u\" value=\"%u\"%s",
NumQst,NumOpt, QstInd,NumOpt,
Indexes[NumOpt], Indexes[NumOpt],
UsrAnswers[Indexes[NumOpt]] ? " checked=\"checked\"" : UsrAnswers[Indexes[NumOpt]] ? " checked=\"checked\"" :
""); "");
@ -524,14 +526,14 @@ static void TstPrn_WriteChoAnsToFill (const struct TstPrn_PrintedQuestion *Print
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",NumQst,NumOpt); HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",QstInd,NumOpt);
HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt); HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt);
HTM_LABEL_End (); HTM_LABEL_End ();
HTM_TD_End (); HTM_TD_End ();
/***** Write the option text *****/ /***** Write the option text *****/
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",NumQst,NumOpt); HTM_LABEL_Begin ("for=\"Ans%010u_%u\" class=\"TEST_TXT\"",QstInd,NumOpt);
HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text); HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
HTM_LABEL_End (); HTM_LABEL_End ();
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media, Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
@ -551,13 +553,13 @@ static void TstPrn_WriteChoAnsToFill (const struct TstPrn_PrintedQuestion *Print
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_WriteTxtAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion, static void TstPrn_WriteTxtAnsToFill (const struct TstPrn_PrintedQuestion *PrintedQuestion,
unsigned NumQst, unsigned QstInd,
__attribute__((unused)) struct Tst_Question *Question) __attribute__((unused)) struct Tst_Question *Question)
{ {
char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x" char StrAns[3 + Cns_MAX_DECIMAL_DIGITS_UINT + 1]; // "Ansxx...x"
/***** Write input field for the answer *****/ /***** Write input field for the answer *****/
snprintf (StrAns,sizeof (StrAns),"Ans%010u",NumQst); snprintf (StrAns,sizeof (StrAns),"Ans%010u",QstInd);
HTM_INPUT_TEXT (StrAns,Tst_MAX_CHARS_ANSWERS_ONE_QST,PrintedQuestion->StrAnswers, HTM_INPUT_TEXT (StrAns,Tst_MAX_CHARS_ANSWERS_ONE_QST,PrintedQuestion->StrAnswers,
HTM_DONT_SUBMIT_ON_CHANGE, HTM_DONT_SUBMIT_ON_CHANGE,
"size=\"40\""); "size=\"40\"");
@ -590,7 +592,7 @@ static void TstPrn_PutCheckBoxAllowTeachers (bool AllowTeachers)
void TstPrn_ShowPrintAfterAssess (struct TstPrn_Print *Print) void TstPrn_ShowPrintAfterAssess (struct TstPrn_Print *Print)
{ {
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
bool QuestionExists; bool QuestionExists;
@ -601,37 +603,37 @@ void TstPrn_ShowPrintAfterAssess (struct TstPrn_Print *Print)
Print->NumQsts.NotBlank = 0; Print->NumQsts.NotBlank = 0;
Print->Score = 0.0; Print->Score = 0.0;
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/***** Create test question *****/ /***** Create test question *****/
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
Question.QstCod = Print->PrintedQuestions[NumQst].QstCod; Question.QstCod = Print->PrintedQuestions[QstInd].QstCod;
/***** Get question data *****/ /***** Get question data *****/
QuestionExists = Tst_GetQstDataFromDB (&Question); QuestionExists = Tst_GetQstDataFromDB (&Question);
/***** Write question and answers *****/ /***** Write question and answers *****/
TstPrn_WriteQstAndAnsExam (&Gbl.Usrs.Me.UsrDat, TstPrn_WriteQstAndAnsExam (&Gbl.Usrs.Me.UsrDat,
Print->PrintedQuestions,NumQst, Print->PrintedQuestions,QstInd,
Print->TimeUTC, Print->TimeUTC,
&Question,QuestionExists, &Question,QuestionExists,
TstCfg_GetConfigVisibility ()); TstCfg_GetConfigVisibility ());
/***** Store test exam question in database *****/ /***** Store test exam question in database *****/
TstPrn_StoreOneQstOfPrintInDB (Print,NumQst); TstPrn_StoreOneQstOfPrintInDB (Print,QstInd);
/***** Compute total score *****/ /***** Compute total score *****/
Print->Score += Print->PrintedQuestions[NumQst].Score; Print->Score += Print->PrintedQuestions[QstInd].Score;
if (Print->PrintedQuestions[NumQst].StrAnswers[0]) // User's answer is not blank if (Print->PrintedQuestions[QstInd].StrAnswers[0]) // User's answer is not blank
Print->NumQsts.NotBlank++; Print->NumQsts.NotBlank++;
/***** Update the number of accesses and the score of this question *****/ /***** Update the number of accesses and the score of this question *****/
if (Gbl.Usrs.Me.Role.Logged == Rol_STD) if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
Tst_UpdateQstScoreInDB (&Print->PrintedQuestions[NumQst]); Tst_UpdateQstScoreInDB (&Print->PrintedQuestions[QstInd]);
/***** Destroy test question *****/ /***** Destroy test question *****/
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
@ -647,7 +649,7 @@ void TstPrn_ShowPrintAfterAssess (struct TstPrn_Print *Print)
static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat, static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
struct TstPrn_PrintedQuestion PrintedQuestions[TstCfg_MAX_QUESTIONS_PER_TEST], struct TstPrn_PrintedQuestion PrintedQuestions[TstCfg_MAX_QUESTIONS_PER_TEST],
unsigned NumQst, unsigned QstInd,
time_t TimeUTC[Dat_NUM_START_END_TIME], time_t TimeUTC[Dat_NUM_START_END_TIME],
struct Tst_Question *Question, struct Tst_Question *Question,
bool QuestionExists, bool QuestionExists,
@ -699,7 +701,7 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
/***** Number of question and answer type *****/ /***** Number of question and answer type *****/
HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd); HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd);
Tst_WriteNumQst (NumQst + 1,"BIG_INDEX"); Tst_WriteNumQst (QstInd + 1,"BIG_INDEX");
if (QuestionUneditedAfterExam) if (QuestionUneditedAfterExam)
Tst_WriteAnswerType (Question->Answer.Type,"DAT_SMALL"); Tst_WriteAnswerType (Question->Answer.Type,"DAT_SMALL");
HTM_TD_End (); HTM_TD_End ();
@ -720,8 +722,8 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
"TEST_MED_SHOW"); "TEST_MED_SHOW");
/* Answers */ /* Answers */
TstPrn_ComputeAnswerScore (&PrintedQuestions[NumQst],Question); TstPrn_ComputeAnswerScore (&PrintedQuestions[QstInd],Question);
TstPrn_WriteAnswersExam (UsrDat,&PrintedQuestions[NumQst],Question, TstPrn_WriteAnswersExam (UsrDat,&PrintedQuestions[QstInd],Question,
ICanView,"TEST_TXT","TEST_TXT_LIGHT"); ICanView,"TEST_TXT","TEST_TXT_LIGHT");
} }
else else
@ -736,11 +738,11 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
HTM_DIV_Begin ("class=\"DAT_SMALL LM\""); HTM_DIV_Begin ("class=\"DAT_SMALL LM\"");
HTM_TxtColonNBSP (Txt_Score); HTM_TxtColonNBSP (Txt_Score);
HTM_SPAN_Begin ("class=\"%s\"", HTM_SPAN_Begin ("class=\"%s\"",
PrintedQuestions[NumQst].StrAnswers[0] ? PrintedQuestions[QstInd].StrAnswers[0] ?
(PrintedQuestions[NumQst].Score > 0 ? "ANS_OK" : // Correct/semicorrect (PrintedQuestions[QstInd].Score > 0 ? "ANS_OK" : // Correct/semicorrect
"ANS_BAD") :// Wrong "ANS_BAD") :// Wrong
"ANS_0"); // Blank answer "ANS_0"); // Blank answer
HTM_Double2Decimals (PrintedQuestions[NumQst].Score); HTM_Double2Decimals (PrintedQuestions[QstInd].Score);
HTM_SPAN_End (); HTM_SPAN_End ();
HTM_DIV_End (); HTM_DIV_End ();
} }
@ -763,7 +765,7 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
void TstPrn_ComputeScoresAndStoreQuestionsOfPrint (struct TstPrn_Print *Print, void TstPrn_ComputeScoresAndStoreQuestionsOfPrint (struct TstPrn_Print *Print,
bool UpdateQstScore) bool UpdateQstScore)
{ {
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
/***** Initialize total score *****/ /***** Initialize total score *****/
@ -771,29 +773,29 @@ void TstPrn_ComputeScoresAndStoreQuestionsOfPrint (struct TstPrn_Print *Print,
Print->NumQsts.NotBlank = 0; Print->NumQsts.NotBlank = 0;
/***** Compute and store scores of all questions *****/ /***** Compute and store scores of all questions *****/
for (NumQst = 0; for (QstInd = 0;
NumQst < Print->NumQsts.All; QstInd < Print->NumQsts.All;
NumQst++) QstInd++)
{ {
/* Compute question score */ /* Compute question score */
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
Question.QstCod = Print->PrintedQuestions[NumQst].QstCod; Question.QstCod = Print->PrintedQuestions[QstInd].QstCod;
Question.Answer.Type = Tst_GetQstAnswerTypeFromDB (Question.QstCod); Question.Answer.Type = Tst_GetQstAnswerTypeFromDB (Question.QstCod);
TstPrn_ComputeAnswerScore (&Print->PrintedQuestions[NumQst],&Question); TstPrn_ComputeAnswerScore (&Print->PrintedQuestions[QstInd],&Question);
Tst_QstDestructor (&Question); Tst_QstDestructor (&Question);
/* Store test exam question in database */ /* Store test exam question in database */
TstPrn_StoreOneQstOfPrintInDB (Print, TstPrn_StoreOneQstOfPrintInDB (Print,
NumQst); // 0, 1, 2, 3... QstInd); // 0, 1, 2, 3...
/* Accumulate total score */ /* Accumulate total score */
Print->Score += Print->PrintedQuestions[NumQst].Score; Print->Score += Print->PrintedQuestions[QstInd].Score;
if (Print->PrintedQuestions[NumQst].StrAnswers[0]) // User's answer is not blank if (Print->PrintedQuestions[QstInd].StrAnswers[0]) // User's answer is not blank
Print->NumQsts.NotBlank++; Print->NumQsts.NotBlank++;
/* Update the number of hits and the score of this question in tests database */ /* Update the number of hits and the score of this question in tests database */
if (UpdateQstScore) if (UpdateQstScore)
Tst_UpdateQstScoreInDB (&Print->PrintedQuestions[NumQst]); Tst_UpdateQstScoreInDB (&Print->PrintedQuestions[QstInd]);
} }
} }
@ -1834,7 +1836,7 @@ static void TstPrn_WriteHeadUserCorrect (struct UsrData *UsrDat)
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_StoreOneQstOfPrintInDB (const struct TstPrn_Print *Print, static void TstPrn_StoreOneQstOfPrintInDB (const struct TstPrn_Print *Print,
unsigned NumQst) unsigned QstInd)
{ {
/***** Insert question and user's answers into database *****/ /***** Insert question and user's answers into database *****/
Str_SetDecimalPointToUS (); // To print the floating point as a dot Str_SetDecimalPointToUS (); // To print the floating point as a dot
@ -1844,11 +1846,11 @@ static void TstPrn_StoreOneQstOfPrintInDB (const struct TstPrn_Print *Print,
" VALUES" " VALUES"
" (%ld,%ld,%u,'%.15lg','%s','%s')", " (%ld,%ld,%u,'%.15lg','%s','%s')",
Print->PrnCod, Print->PrnCod,
Print->PrintedQuestions[NumQst].QstCod, Print->PrintedQuestions[QstInd].QstCod,
NumQst, // 0, 1, 2, 3... QstInd, // 0, 1, 2, 3...
Print->PrintedQuestions[NumQst].Score, Print->PrintedQuestions[QstInd].Score,
Print->PrintedQuestions[NumQst].StrIndexes, Print->PrintedQuestions[QstInd].StrIndexes,
Print->PrintedQuestions[NumQst].StrAnswers); Print->PrintedQuestions[QstInd].StrAnswers);
Str_SetDecimalPointToLocal (); // Return to local system Str_SetDecimalPointToLocal (); // Return to local system
} }
@ -2660,26 +2662,26 @@ void TstPrn_ShowPrintAnswers (struct UsrData *UsrDat,
time_t TimeUTC[Dat_NUM_START_END_TIME], time_t TimeUTC[Dat_NUM_START_END_TIME],
unsigned Visibility) unsigned Visibility)
{ {
unsigned NumQst; unsigned QstInd;
struct Tst_Question Question; struct Tst_Question Question;
bool QuestionExists; bool QuestionExists;
for (NumQst = 0; for (QstInd = 0;
NumQst < NumQsts; QstInd < NumQsts;
NumQst++) QstInd++)
{ {
Gbl.RowEvenOdd = NumQst % 2; Gbl.RowEvenOdd = QstInd % 2;
/***** Create test question *****/ /***** Create test question *****/
Tst_QstConstructor (&Question); Tst_QstConstructor (&Question);
Question.QstCod = PrintedQuestions[NumQst].QstCod; Question.QstCod = PrintedQuestions[QstInd].QstCod;
/***** Get question data *****/ /***** Get question data *****/
QuestionExists = Tst_GetQstDataFromDB (&Question); QuestionExists = Tst_GetQstDataFromDB (&Question);
/***** Write questions and answers *****/ /***** Write questions and answers *****/
TstPrn_WriteQstAndAnsExam (UsrDat, TstPrn_WriteQstAndAnsExam (UsrDat,
PrintedQuestions,NumQst, PrintedQuestions,QstInd,
TimeUTC, TimeUTC,
&Question,QuestionExists, &Question,QuestionExists,
Visibility); Visibility);
@ -2759,7 +2761,7 @@ void TstPrn_GetPrintQuestionsFromDB (struct TstPrn_Print *Print)
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumQsts; unsigned NumQsts;
unsigned NumQst; unsigned QstInd;
/***** Get questions of a test exam print from database *****/ /***** Get questions of a test exam print from database *****/
NumQsts = (unsigned) NumQsts = (unsigned)
@ -2775,29 +2777,29 @@ void TstPrn_GetPrintQuestionsFromDB (struct TstPrn_Print *Print)
/***** Get questions *****/ /***** Get questions *****/
if (NumQsts == Print->NumQsts.All) if (NumQsts == Print->NumQsts.All)
for (NumQst = 0; for (QstInd = 0;
NumQst < NumQsts; QstInd < NumQsts;
NumQst++) QstInd++)
{ {
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/* Get question code (row[0]) */ /* Get question code (row[0]) */
if ((Print->PrintedQuestions[NumQst].QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0) if ((Print->PrintedQuestions[QstInd].QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Err_WrongQuestionExit (); Err_WrongQuestionExit ();
/* Get score (row[1]) */ /* Get score (row[1]) */
Str_SetDecimalPointToUS (); // To get the decimal point as a dot Str_SetDecimalPointToUS (); // To get the decimal point as a dot
if (sscanf (row[1],"%lf",&Print->PrintedQuestions[NumQst].Score) != 1) if (sscanf (row[1],"%lf",&Print->PrintedQuestions[QstInd].Score) != 1)
Err_ShowErrorAndExit ("Wrong question score."); Err_ShowErrorAndExit ("Wrong question score.");
Str_SetDecimalPointToLocal (); // Return to local system Str_SetDecimalPointToLocal (); // Return to local system
/* Get indexes for this question (row[2]) */ /* Get indexes for this question (row[2]) */
Str_Copy (Print->PrintedQuestions[NumQst].StrIndexes,row[2], Str_Copy (Print->PrintedQuestions[QstInd].StrIndexes,row[2],
sizeof (Print->PrintedQuestions[NumQst].StrIndexes) - 1); sizeof (Print->PrintedQuestions[QstInd].StrIndexes) - 1);
/* Get answers selected by user for this question (row[3]) */ /* Get answers selected by user for this question (row[3]) */
Str_Copy (Print->PrintedQuestions[NumQst].StrAnswers,row[3], Str_Copy (Print->PrintedQuestions[QstInd].StrAnswers,row[3],
sizeof (Print->PrintedQuestions[NumQst].StrAnswers) - 1); sizeof (Print->PrintedQuestions[QstInd].StrAnswers) - 1);
} }
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/