面临一些技术问题的平均分

时间:2020-12-24 13:13:41

标签: c

我已经遵循了书中的所有内容,但我的平均分数每次都不及格。我已经多次调试我的程序,但无济于事。

我的最小可执行代码:

#include <limits.h>

#include <stdbool.h>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <string.h>

#define MAX_TESTS 5
#define MAXQUESTION 10000

bool myread(const char * format, void * address) {
  char buffer[1024];
  fgets(buffer, sizeof buffer, stdin);
  return sscanf(buffer, format, address) == 1;
}

struct struc {
  int a;

  int b;

  int c;

  int add;

  int grade;
};

int sj(int n) {
  int t;

  t = rand() % n;

  return t;
}

void ctm_i(struct struc * t) {
  {
    t -> a = sj(101);
    t -> c = sj(4);
    if (t -> c == 1) {
      t -> b = sj(101 - (t -> a));
      t -> add = (t -> a) + (t -> b);
    } else {
      t -> b = sj((t -> a) + 1);
      t -> add = (t -> a) - (t -> b);
    }
    t -> grade = 0;
  }
}

void tcm_i(struct struc * t, int n) {
  int ad;

  printf(" ***********************************************************************"
    "*********\n");

  printf(" ......................................................................."
    ".........\n");

  printf(" Question %d\n\n", n + 1);

  printf(" You have 3 attempts for this question\n\n");

  if (t -> c == 1)
    printf(" %d+%d= ", t -> a, t -> b);
  else
    printf(" %d-%d= ", t -> a, t -> b);

  myread(" %d", & ad);
  if (ad == t -> add)

  {
    t -> grade = 10;

    printf(" You earned 10 marks\n\n");
  } else {
    printf("\n Incorrect, you have 2 attempts remaining\n\n");
    printf(" ");
    myread(" %d", & ad);

    if (ad == t -> add)

    {

      t -> grade = 7;

      printf(" You earned 7 marks\n\n");
    } else {
      printf("\n Incorrect, you have 1 attempt remaining\n\n");
      printf(" ");
      myread(" %d", & ad);

      if (ad == t -> add)

      {

        t -> grade = 5;

        printf(" You earned 5 marks\n\n");
      } else {
        t -> grade = 0;

        printf("\n Failure, 0 mark\n\n");

        printf("\n The correct answer is %d\n\n", t -> add);
      }
    }
  }

  printf(" ......................................................................."
    ".........\n");

  printf(" ***********************************************************************"
    "*********\n");
}

void quiz(char name[]) {
  int rounds = 0;
  int highest = 0;
  int lowest = INT_MAX;
  float allScore = 0;
  float avg = 0.0;

  int i, j, g = 0;
  struct struc test[MAX_TESTS];

  srand((unsigned) time(NULL));

  for (;;) {
    rounds++;
    for (i = 0; i < MAX_TESTS; i++) // generate all questions
    {
      ctm_i( & test[i]);

      for (j = 0; j < i; j++)

        if (test[i].a == test[j].a && test[i].b == test[j].b && test[i].c == test[j].c)
          //if question is already present
          ctm_i( & test[i]); //then re-generate
    }
    printf("\n Are you ready? Press Enter key to continue. ");
    myread("", NULL);

    for (i = 1; i <= 5; i++) {
      printf(" *******************************************************************"
        "**"
        "***********\n");

      printf(" ..................................................................."
        ".."
        "...........\n");
    }

    // Take quiz
    for (i = 0; i < MAX_TESTS; i++)
      tcm_i( & test[i], i);

    printf(" End\n\n");

    bool done = false;
    bool unsure = true;
    bool showS = true;

    while (unsure) {
      unsure = false;
      puts("\n");
      if (showS) {
        puts(" Enter 'S' to show results");
      }
      puts(" Enter 'P' to play another round");
      puts(" Enter 'R' to return to main menu");
      char choice;
      printf(" ");
      myread(" %c", & choice);
      printf("\n");
      if (choice == 'r' || choice == 'R') {
        done = true;
      } else {

        ///////////////////////// Changes    /////////////

        g = 0;
        // calculate total score for current round
        for (i = 0; i < MAX_TESTS; i++) {
          g += test[i].grade; //add score of each question
        }
        allScore += g; //add current round's score to total
        avg = allScore / rounds; //average of all rounds

        if (g > highest) {
          highest = g;
        }

        if (g < lowest) {
          lowest = g;
        }

        if (choice == 'S' || choice == 's') {
          showS = false;
          if (rounds == 1) {
            printf(" Final score: %d/100\n", g); //display round score
            printf(" ****** Player: %s ******\n", name);
          } else {
            printf(" Round %d score: %d/100\n", rounds, g); //display round score
            printf(" Highest score: %d/100\n", highest);
            printf(" Lowest score : %d/100\n", lowest);
            printf(" Average score: %f/100\n", avg);
            printf(" ****** Player: %s ******\n", name);
          }
          unsure = true;
        } else if (choice == 'P' || choice == 'p') {
          /// nothing to be done here
          //we will display next test
        } else {
          puts(" Invalid input!");
          unsure = true;
        }

        ////////////////////////////////////

      }
    }
    if (done)
      break;
  }
}

int main() {
  char i1 = '1';
  char name[25]; // ig;
  printf("\n Welcome");

  printf("\n");
  while (i1 != 0) {

    printf("\n");
    //printf(" **********************Welcome %s! *********************\n", name);
    printf(" ************************ Main Menu of Maths Quiz ***************************\n");
    printf(" * 1.Enter Quiz                                                             *\n");
    printf(" * 2.Quit                                                                   *\n");
    printf(" ****************************************************************************\n");
    printf(" Please choose one from 1-2:\n");
    printf(" ");
    myread(" %c", & i1);
    switch (i1) {
    case '1':
      printf("\n Enter Quiz:\n");
      quiz(name); // calling quiz function defined in file "maincode.c"
      break;
    case '2':
      printf(" Quit.\n\n");
    }
  }
  return 0;
}

希望满足 MRE 的定义。 所以我剪掉了一些夸张的台词,我认为剩下的才是重要的。

2 个答案:

答案 0 :(得分:0)

问题出在您的函数 quiz 中,尤其是在 while (unsure) 循环中。在此循环中,您将最新分数添加到运行总分中:

allScore += g; //add current round's score to total

这应该在每轮比赛中发生一次。但是如果用户输入“S”或无效的东西,你的程序就会设置

unsure = true;

这意味着循环将在下一轮开始之前再次运行。然后将最近的分数第二次添加到总计中。

最合乎逻辑的解决方案是将所有总计、最大值、最小值、平均值的计算移出 while 循环。循环有不同的用途:它用于用户交互和报告,而不是用于处理结果。

答案 1 :(得分:0)

可能再次对同一轮进行多次平均计算。保持flag来跟踪分数的统计,所以我们不会重复多次,直到游戏不再进行。

    #include <limits.h>

    #include <stdbool.h>

    #include <stdio.h>

    #include <stdlib.h>

    #include <time.h>

    #include <string.h>

    #define MAX_TESTS 5
    #define MAXQUESTION 10000

    bool myread(const char * format, void * address) {
      char buffer[1024];
      fgets(buffer, sizeof buffer, stdin);
      return sscanf(buffer, format, address) == 1;
    }

    struct struc {
      int a;

      int b;

      int c;

      int add;

      int grade;
    };

    int sj(int n) {
      int t;

      t = rand() % n;

      return t;
    }
    void ctm_i(struct struc * t) {
      {
        t -> a = sj(101);
        t -> c = sj(4);
        if (t -> c == 1) {
          t -> b = sj(101 - (t -> a));
          t -> add = (t -> a) + (t -> b);
        } else {
          t -> b = sj((t -> a) + 1);
          t -> add = (t -> a) - (t -> b);
        }
        t -> grade = 0;
      }
    }

    void tcm_i(struct struc * t, int n) {
      int ad;

      printf(" ***********************************************************************"
"*********\n");
      printf(" ......................................................................."
".........\n");

      printf(" Question %d\n\n", n + 1);

      printf(" You have 3 attempts for this question\n\n");

      if (t -> c == 1)
        printf(" %d+%d= ", t -> a, t -> b);
      else
        printf(" %d-%d= ", t -> a, t -> b);

      myread(" %d", & ad);
      if (ad == t -> add)

      {
        t -> grade = 10;

        printf(" You earned 10 marks\n\n");
      } else {
        printf("\n Incorrect, you have 2 attempts remaining\n\n");
        printf(" ");
        myread(" %d", & ad);

        if (ad == t -> add)

        {

          t -> grade = 7;

          printf(" You earned 7 marks\n\n");
        } else {
          printf("\n Incorrect, you have 1 attempt remaining\n\n");
          printf(" ");
          myread(" %d", & ad);

          if (ad == t -> add)

          {

            t -> grade = 5;

            printf(" You earned 5 marks\n\n");
          } else {
            t -> grade = 0;

            printf("\n Failure, 0 mark\n\n");

            printf("\n The correct answer is %d\n\n", t -> add);
          }
        }
      }

      printf(" ......................................................................."
".........\n");

      printf(" ***********************************************************************"
"*********\n");
    }

    void quiz(char name[]) {
      int rounds = 0;
      int highest = 0;
      int lowest = INT_MAX;
      float allScore = 0;
      float avg = 0.0;

      int i, j, g = 0;
      struct struc test[MAX_TESTS];

      srand((unsigned) time(NULL));

      for (;;) {
        rounds++;
        for (i = 0; i < MAX_TESTS; i++) // generate all questions
        {
          ctm_i( & test[i]);

          for (j = 0; j < i; j++)

            if (test[i].a == test[j].a && test[i].b == test[j].b && test[i].c == test[j].c)
              //if question is already present
              ctm_i( & test[i]); //then re-generate
        }
        printf("\n Are you ready? Press Enter key to continue. ");
        myread("", NULL);

        for (i = 1; i <= 5; i++) {
          printf(" *******************************************************************"
    "**"
    "***********\n");

          printf(" ..................................................................."
    ".."
    "...........\n");
        }

        // Take quiz
        for (i = 0; i < MAX_TESTS; i++)
          tcm_i( & test[i], i);

        printf(" End\n\n");

        bool done = false;
        bool unsure = true;
        bool showS = true;
        bool acct = false;

while (unsure) {
  unsure = false;
  puts("\n");
  if (showS) {
    puts(" Enter 'S' to show results");
  }
  puts(" Enter 'P' to play another round");
  puts(" Enter 'R' to return to main menu");
  char choice;
  printf(" ");
  myread(" %c", & choice);
  printf("\n");
  if (choice == 'r' || choice == 'R') {
    done = true;
  } else {

    ///////////////////////// Changes    /////////////
    if (false == acct) {
    g = 0;
    // calculate total score for current round
    for (i = 0; i < MAX_TESTS; i++) {
      g += test[i].grade; //add score of each question
    }
    allScore += g; //add current round's score to total
    avg = allScore / rounds; //average of all rounds

    if (g > highest) {
      highest = g;
    }

    if (g < lowest) {
      lowest = g;
    }
    acct = true;
    }
    if (showS &&(choice == 'S' || choice == 's')) {
      showS = false;
      if (rounds == 1) {
        printf(" Final score: %d/100\n", g); //display round score
        printf(" ****** Player: %s ******\n", name);
      } else {
        printf(" Round %d score: %d/100\n", rounds, g); //display round score
        printf(" Highest score: %d/100\n", highest);
        printf(" Lowest score : %d/100\n", lowest);
        printf(" Average score: %f/100\n", avg);
        printf(" ****** Player: %s ******\n", name);
      }
      unsure = true;
    } else if (choice == 'P' || choice == 'p') {
      /// nothing to be done here
      //we will display next test
    } else {
      puts(" Invalid input!");
      unsure = true;
    }

    ////////////////////////////////////

  }
}
if (done)
  break;
      }
    }

    int main() {
      char i1 = '1';
      char name[25]; // ig;
      printf("\n Welcome");

      printf("\n");
      while (i1 != 0) {

printf("\n");
//printf(" **********************Welcome %s! *********************\n", name);
printf(" ************************ Main Menu of Maths Quiz ***************************\n");
printf(" * 1.Enter Quiz                                                             *\n");
printf(" * 2.Quit                                                                   *\n");
printf(" ****************************************************************************\n");
printf(" Please choose one from 1-2:\n");
printf(" ");
myread(" %c", & i1);
switch (i1) {
case '1':
          printf("\n Enter Quiz:\n");
          quiz(name); // calling quiz function defined in file "maincode.c"
          break;
        case '2':
          printf(" Quit.\n\n");
        }
      }
      return 0;
    }

输出:

     Enter 'S' to show results
      Enter 'P' to play another round
      Enter 'R' to return to main menu
      s

      Round 2 score: 47/100
      Highest score: 50/100
      Lowest score : 47/100
      Average score: 48.500000/100
      ****** Player:  ******