Version19.78.3

This commit is contained in:
Antonio Cañas Vargas 2019-11-27 09:01:45 +01:00
parent 9974f5ea4d
commit 5073200f8e
12 changed files with 67 additions and 80 deletions

View File

@ -490,7 +490,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.78.2 (2019-11-27)"
#define Log_PLATFORM_VERSION "SWAD 19.78.3 (2019-11-27)"
#define CSS_FILE "swad19.78.1.css"
#define JS_FILE "swad19.70.js"
/*
@ -498,6 +498,7 @@ ps2pdf source.ps destination.pdf
// TODO: Impedir la creación y edición de proyectos si no son editables.
// TODO: En cada juego, poder listar los resultados en una tabla como la de resultados globales
Version 19.78.3: Nov 27, 2019 Getting maximum grade from game form. Not finished. (247159 lines)
Version 19.78.2: Nov 27, 2019 New field maximum grade in game form. Not finished. (247168 lines)
Version 19.78.1: Nov 27, 2019 Changes in edition of games, attendance, events, assignments. (247123 lines)
Version 19.78: Nov 25, 2019 Filtering of match results by games. (247106 lines)

View File

@ -3811,7 +3811,7 @@ static void Fig_GetAndShowFollowStats (void)
/***** Get average *****/
row = mysql_fetch_row (mysql_res);
Average = Str_GetDoubleNumFromStr (row[0]);
Average = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);

View File

@ -1223,7 +1223,7 @@ static void Gam_PutFormsEditionGame (struct Game *Game,bool ItsANewGame)
HTM_TD_Begin ("class=\"LM\"");
HTM_INPUT_FLOAT ("MaxGrade",(double) 0.0,(double) DBL_MAX,(double) 0.01,(double) 10.0,false,
NULL);
"required=\"required\"");
HTM_TD_End ();
HTM_TR_End ();
@ -1273,6 +1273,8 @@ void Gam_RecFormGame (void)
struct Game NewGame;
bool ItsANewGame;
bool NewGameIsCorrect = true;
char MaxGradeStr[64];
double MaxGrade;
char Txt[Cns_MAX_BYTES_TEXT + 1];
/***** Get the code of the game *****/
@ -1294,6 +1296,11 @@ void Gam_RecFormGame (void)
/***** Get game title *****/
Par_GetParToText ("Title",NewGame.Title,Gam_MAX_BYTES_TITLE);
/***** Get maximum grade *****/
Par_GetParToText ("MaxGrade",MaxGradeStr,sizeof (MaxGradeStr) - 1);
MaxGrade = Str_GetDoubleFromStr (MaxGradeStr);
Ale_ShowAlert (Ale_INFO,"DEBUG: MaxGrade = %lg",MaxGrade); // TODO: Remove this line
/***** Get game text and insert links *****/
Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous)
@ -2570,9 +2577,9 @@ double Gam_GetNumQstsPerCrsGame (Hie_Level_t Scope)
break;
}
/***** Get number of courses *****/
/***** Get average number of questions per game *****/
row = mysql_fetch_row (mysql_res);
NumQstsPerGame = Str_GetDoubleNumFromStr (row[0]);
NumQstsPerGame = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);

View File

@ -1715,8 +1715,8 @@ void Prf_GetAndShowRankingClicksPerDay (void)
Usr_GetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS);
ItsMe = (UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod);
/* Get number of clicks per day (row[1]) */
NumClicksPerDay = Str_GetDoubleNumFromStr (row[1]);
/* Get average number of clicks per day (row[1]) */
NumClicksPerDay = Str_GetDoubleFromStr (row[1]);
if (NumClicksPerDay < NumClicksPerDayHigh)
{
Rank = NumUsr;

View File

@ -1866,7 +1866,7 @@ static void Sta_ShowNumHitsPerUsr (unsigned long NumRows,MYSQL_RES *mysql_res)
HTM_TD_End ();
/* Write the number of clicks */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
if (NumRow == 1)
Hits.Max = Hits.Num;
if (Hits.Max > 0.0)
@ -1948,7 +1948,7 @@ static void Sta_ShowNumHitsPerDay (unsigned long NumRows,MYSQL_RES *mysql_res)
Lay_ShowErrorAndExit ("Wrong date.");
/* Get number of pages generated (in row[1]) */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Dat_AssignDate (&Date,&LastDate);
NumDaysFromLastDateToCurrDate = Dat_GetNumDaysBetweenDates (&ReadDate,&LastDate);
@ -2158,7 +2158,7 @@ static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES
Lay_ShowErrorAndExit ("Wrong hour.");
/* Get number of pages generated (in row[2]) */
Hits.Num = Str_GetDoubleNumFromStr (row[2]);
Hits.Num = Str_GetDoubleFromStr (row[2]);
/* If this is the first read date, initialize PreviousReadDate */
if (NumRow == 1)
@ -2523,7 +2523,7 @@ static void Sta_ShowNumHitsPerWeek (unsigned long NumRows,
Lay_ShowErrorAndExit ("Wrong date.");
/* Get number of pages generated (in row[1]) */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Dat_AssignDate (&Date,&LastDate);
NumWeeksBetweenLastDateAndCurDate = Dat_GetNumWeeksBetweenDates (&ReadDate,&LastDate);
@ -2623,7 +2623,7 @@ static void Sta_ShowNumHitsPerMonth (unsigned long NumRows,
Lay_ShowErrorAndExit ("Wrong date.");
/* Get number of pages generated (in row[1]) */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Dat_AssignDate (&Date,&LastDate);
NumMonthsBetweenLastDateAndCurDate = Dat_GetNumMonthsBetweenDates (&ReadDate,
@ -2723,7 +2723,7 @@ static void Sta_ShowNumHitsPerYear (unsigned long NumRows,
Lay_ShowErrorAndExit ("Wrong date.");
/* Get number of pages generated (in row[1]) */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Dat_AssignDate (&Date,&LastDate);
NumYearsBetweenLastDateAndCurDate = Dat_GetNumYearsBetweenDates (&ReadDate,
@ -2827,7 +2827,7 @@ static void Sta_ShowNumHitsPerHour (unsigned long NumRows,
H++, Hour++)
Sta_WriteAccessHour (H,&Hits,ColumnWidth);
Hits.Num = Str_GetDoubleNumFromStr (row[1]) / (float) NumDays;
Hits.Num = Str_GetDoubleFromStr (row[1]) / (float) NumDays;
Sta_WriteAccessHour (ReadHour,&Hits,ColumnWidth);
Hour++;
@ -2917,7 +2917,7 @@ static void Sta_ShowAverageAccessesPerMinute (unsigned long NumRows,MYSQL_RES *m
if (sscanf (row[0],"%02u%02u",&ReadHour,&MinuteRead) != 2) // In row[0] is the date in formato HHMM
Lay_ShowErrorAndExit ("Wrong hour-minute.");
/* Get number of pages generated */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
MinuteDayRead = ReadHour * 60 + MinuteRead;
for (i = MinuteDay;
i < MinuteDayRead;
@ -3150,7 +3150,7 @@ static void Sta_ShowNumHitsPerAction (unsigned long NumRows,
HTM_TD_End ();
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,500);
@ -3205,7 +3205,7 @@ static void Sta_ShowNumHitsPerPlugin (unsigned long NumRows,
HTM_TD_End ();
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,500);
@ -3257,7 +3257,7 @@ static void Sta_ShowNumHitsPerWSFunction (unsigned long NumRows,
HTM_TD_End ();
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,500);
@ -3297,7 +3297,7 @@ static void Sta_ShowNumHitsPerBanner (unsigned long NumRows,
row = mysql_fetch_row (mysql_res);
/* Get number of pages generated */
NumClicks = Str_GetDoubleNumFromStr (row[1]);
NumClicks = Str_GetDoubleFromStr (row[1]);
if (NumRow == 1)
MaxClicks = NumClicks;
TotalClicks += NumClicks;
@ -3326,7 +3326,7 @@ static void Sta_ShowNumHitsPerBanner (unsigned long NumRows,
HTM_A_End ();
/* Draw bar proportional to number of clicks */
NumClicks = Str_GetDoubleNumFromStr (row[1]);
NumClicks = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
NumClicks,MaxClicks,TotalClicks,500);
@ -3385,7 +3385,7 @@ static void Sta_ShowNumHitsPerCountry (unsigned long NumRows,
Sta_WriteCountry (CtyCod);
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,375);
@ -3475,7 +3475,7 @@ static void Sta_ShowNumHitsPerInstitution (unsigned long NumRows,
Sta_WriteInstitution (InsCod);
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,375);
@ -3567,7 +3567,7 @@ static void Sta_ShowNumHitsPerCentre (unsigned long NumRows,
Sta_WriteCentre (CtrCod);
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,375);
@ -3659,7 +3659,7 @@ static void Sta_ShowNumHitsPerDegree (unsigned long NumRows,
Sta_WriteDegree (DegCod);
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,375);
@ -3792,7 +3792,7 @@ static void Sta_ShowNumHitsPerCourse (unsigned long NumRows,
HTM_TD_End ();
/* Draw bar proportional to number of hits */
Hits.Num = Str_GetDoubleNumFromStr (row[1]);
Hits.Num = Str_GetDoubleFromStr (row[1]);
Sta_DrawBarNumHits ('o', // orange background
Hits.Num,Hits.Max,Hits.Total,375);
@ -3821,7 +3821,7 @@ void Sta_ComputeMaxAndTotalHits (struct Sta_Hits *Hits,
row = mysql_fetch_row (mysql_res);
/* Get number of hits */
Hits->Num = Str_GetDoubleNumFromStr (row[Field]);
Hits->Num = Str_GetDoubleFromStr (row[Field]);
if (Divisor > 1)
Hits->Num /= (double) Divisor;

View File

@ -929,24 +929,30 @@ void Str_ConvertStrFloatCommaToStrFloatPoint (char *Str)
}
/*****************************************************************************/
/************** Read a number in floating point from a string ****************/
/************************ Get a double from a string *************************/
/*****************************************************************************/
// This function may change Str on wrong double
double Str_GetDoubleNumFromStr (const char *Str)
double Str_GetDoubleFromStr (char *Str)
{
double Num;
double DoubleNum;
if (Str)
{
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
if (sscanf (Str,"%lf",&Num) != 1)
Lay_ShowErrorAndExit ("Bad floating point format.");
Str_SetDecimalPointToLocal (); // Return to local system
/***** Trivial check *****/
if (Str == NULL) // If no string...
return 0.0; // ...the number is reset to 0
/***** The string is "scanned" in floating point
(it must have a point, not a comma as decimal separator) *****/
Str_ConvertStrFloatCommaToStrFloatPoint (Str);
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
if (sscanf (Str,"%lg",&DoubleNum) != 1)
{ // If the string does not hold a valid number...
DoubleNum = 0.0; // ...the number is reset to 0
Str[0] = '\0'; // ...and the string is reset to ""
}
else // Str == NULL
Num = 0.0;
Str_SetDecimalPointToLocal (); // Return to local system
return Num;
return DoubleNum;
}
/*****************************************************************************/

View File

@ -94,7 +94,7 @@ char Str_ConvertToLowerLetter (char Ch);
void Str_WriteDoubleNumToFile (FILE *FileDst,double Number);
void Str_DoubleNumToStr (char **Str,double Number);
void Str_ConvertStrFloatCommaToStrFloatPoint (char *Str);
double Str_GetDoubleNumFromStr (const char *Str);
double Str_GetDoubleFromStr (char *Str);
void Str_SetDecimalPointToUS (void);
void Str_SetDecimalPointToLocal (void);

View File

@ -4103,9 +4103,9 @@ double Svy_GetNumQstsPerCrsSurvey (Hie_Level_t Scope)
break;
}
/***** Get number of courses *****/
/***** Get average number of questions per survey *****/
row = mysql_fetch_row (mysql_res);
NumQstsPerSurvey = Str_GetDoubleNumFromStr (row[0]);
NumQstsPerSurvey = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);

View File

@ -3318,7 +3318,7 @@ void Tst_WriteAnswersEdit (long QstCod)
i++)
{
row = mysql_fetch_row (mysql_res);
FloatNum[i] = Tst_GetFloatAnsFromStr (row[1]);
FloatNum[i] = Str_GetDoubleFromStr (row[1]);
}
HTM_SPAN_Begin ("class=\"TEST_EDI\"");
HTM_TxtF ("([%lg; %lg])",FloatNum[0],FloatNum[1]);
@ -4611,7 +4611,7 @@ static void Tst_WriteFloatAnsAssessTest (struct UsrData *UsrDat,
i++)
{
row = mysql_fetch_row (mysql_res);
FloatAnsCorr[i] = Tst_GetFloatAnsFromStr (row[1]);
FloatAnsCorr[i] = Str_GetDoubleFromStr (row[1]);
}
if (FloatAnsCorr[0] > FloatAnsCorr[1]) // The maximum and the minimum are swapped
{
@ -4632,7 +4632,7 @@ static void Tst_WriteFloatAnsAssessTest (struct UsrData *UsrDat,
/***** Write the user answer *****/
if (Gbl.Test.StrAnswersOneQst[NumQst][0]) // If user has answered the question
{
FloatAnsUsr = Tst_GetFloatAnsFromStr (Gbl.Test.StrAnswersOneQst[NumQst]);
FloatAnsUsr = Str_GetDoubleFromStr (Gbl.Test.StrAnswersOneQst[NumQst]);
if (Gbl.Test.StrAnswersOneQst[NumQst][0]) // It's a correct floating point number
{
HTM_TD_Begin ("class=\"%s CM\"",
@ -5722,7 +5722,7 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
case Tst_ANS_FLOAT:
if (Gbl.Test.Answer.NumOptions != 2)
Lay_ShowErrorAndExit ("Wrong answer.");
Gbl.Test.Answer.FloatingPoint[NumOpt] = Tst_GetFloatAnsFromStr (row[1]);
Gbl.Test.Answer.FloatingPoint[NumOpt] = Str_GetDoubleFromStr (row[1]);
break;
case Tst_ANS_TRUE_FALSE:
if (Gbl.Test.Answer.NumOptions != 1)
@ -6176,7 +6176,7 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void)
for (i = 0;
i < 2;
i++)
Gbl.Test.Answer.FloatingPoint[i] = Tst_GetFloatAnsFromStr (Gbl.Test.Answer.Options[i].Text);
Gbl.Test.Answer.FloatingPoint[i] = Str_GetDoubleFromStr (Gbl.Test.Answer.Options[i].Text);
if (Gbl.Test.Answer.FloatingPoint[0] >
Gbl.Test.Answer.FloatingPoint[1])
{
@ -6328,32 +6328,6 @@ long Tst_GetIntAnsFromStr (char *Str)
return LongNum;
}
/*****************************************************************************/
/************ Get a float number from a string in floating point *************/
/*****************************************************************************/
double Tst_GetFloatAnsFromStr (char *Str)
{
double DoubleNum;
if (Str == NULL)
return 0.0;
/***** Change commnas to points *****/
Str_ConvertStrFloatCommaToStrFloatPoint (Str);
/***** The string is "scanned" in floating point (it must have a point, not a colon as decimal separator) *****/
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
if (sscanf (Str,"%lg",&DoubleNum) != 1) // If the string does not hold a valid floating point number...
{
DoubleNum = 0.0; // ...the number is reset to 0
Str[0] = '\0'; // ...and the string is reset to ""
}
Str_SetDecimalPointToLocal (); // Return to local system
return DoubleNum;
}
/*****************************************************************************/
/***************** Check if this tag exists for current course ***************/
/*****************************************************************************/
@ -6732,7 +6706,7 @@ static void Tst_InsertAnswersIntoDB (void)
Gbl.Test.Answer.Integer);
break;
case Tst_ANS_FLOAT:
Str_SetDecimalPointToUS (); // To print the floating point as a dot
Str_SetDecimalPointToUS (); // To print the floating point as a dot
for (i = 0;
i < 2;
i++)

View File

@ -195,7 +195,6 @@ Tst_AnswerType_t Tst_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeBD);
void Tst_ReceiveQst (void);
bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void);
long Tst_GetIntAnsFromStr (char *Str);
double Tst_GetFloatAnsFromStr (char *Str);
void Tst_RequestRemoveQst (void);
void Tst_RemoveQst (void);
void Tst_ChangeShuffleQst (void);

View File

@ -328,7 +328,7 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
i++)
{
row = mysql_fetch_row (mysql_res);
FloatNum[i] = Tst_GetFloatAnsFromStr (row[1]);
FloatNum[i] = Str_GetDoubleFromStr (row[1]);
}
fprintf (Gbl.Test.XML.FileXML,"%s"
"<lower>%lg</lower>%s"
@ -753,7 +753,7 @@ static bool TsI_CheckIfQuestionExistsInDB (void)
i++)
{
row = mysql_fetch_row (mysql_res_ans);
IdenticalAnswers = (Tst_GetFloatAnsFromStr (row[0]) == Gbl.Test.Answer.FloatingPoint[i]);
IdenticalAnswers = (Str_GetDoubleFromStr (row[0]) == Gbl.Test.Answer.FloatingPoint[i]);
}
IdenticalQuestionFound = IdenticalAnswers;
break;

View File

@ -9604,9 +9604,9 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
break;
}
/***** Get number of courses *****/
/***** Get averga number of courses per user *****/
row = mysql_fetch_row (mysql_res);
NumCrssPerUsr = Str_GetDoubleNumFromStr (row[0]);
NumCrssPerUsr = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@ -9763,9 +9763,9 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
break;
}
/***** Get number of users *****/
/***** Get average number of users per course *****/
row = mysql_fetch_row (mysql_res);
NumUsrsPerCrs = Str_GetDoubleNumFromStr (row[0]);
NumUsrsPerCrs = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);