From 5073200f8ef045d359baf3e508bb2754e8a5da3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Wed, 27 Nov 2019 09:01:45 +0100 Subject: [PATCH] Version19.78.3 --- swad_changelog.h | 3 ++- swad_figure.c | 2 +- swad_game.c | 13 ++++++++++--- swad_profile.c | 4 ++-- swad_statistic.c | 38 +++++++++++++++++++------------------- swad_string.c | 30 ++++++++++++++++++------------ swad_string.h | 2 +- swad_survey.c | 4 ++-- swad_test.c | 38 ++++++-------------------------------- swad_test.h | 1 - swad_test_import.c | 4 ++-- swad_user.c | 8 ++++---- 12 files changed, 67 insertions(+), 80 deletions(-) diff --git a/swad_changelog.h b/swad_changelog.h index 43cef249..a9fa3622 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -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) diff --git a/swad_figure.c b/swad_figure.c index 1acdc423..80cc936e 100644 --- a/swad_figure.c +++ b/swad_figure.c @@ -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); diff --git a/swad_game.c b/swad_game.c index dc531eed..e4f124f7 100644 --- a/swad_game.c +++ b/swad_game.c @@ -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); diff --git a/swad_profile.c b/swad_profile.c index e9e264a1..1cefd5f8 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -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; diff --git a/swad_statistic.c b/swad_statistic.c index 3c8b2872..d4953ad2 100644 --- a/swad_statistic.c +++ b/swad_statistic.c @@ -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; diff --git a/swad_string.c b/swad_string.c index 670ddabc..8d078780 100644 --- a/swad_string.c +++ b/swad_string.c @@ -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; } /*****************************************************************************/ diff --git a/swad_string.h b/swad_string.h index 886b681f..9e5f91d8 100644 --- a/swad_string.h +++ b/swad_string.h @@ -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); diff --git a/swad_survey.c b/swad_survey.c index 5c9f1caf..18be7f28 100644 --- a/swad_survey.c +++ b/swad_survey.c @@ -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); diff --git a/swad_test.c b/swad_test.c index 2e768952..59a463b7 100644 --- a/swad_test.c +++ b/swad_test.c @@ -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++) diff --git a/swad_test.h b/swad_test.h index 9462358e..54f8aa55 100644 --- a/swad_test.h +++ b/swad_test.h @@ -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); diff --git a/swad_test_import.c b/swad_test_import.c index dd9a68b1..84448402 100644 --- a/swad_test_import.c +++ b/swad_test_import.c @@ -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" "%lg%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; diff --git a/swad_user.c b/swad_user.c index f043256e..59640749 100644 --- a/swad_user.c +++ b/swad_user.c @@ -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);