Когда я получаю в среднем 60 или 70, если оператор выдает «D» и «F» неправильно - PullRequest
0 голосов
/ 27 апреля 2020

Это программа, которая генерирует значения случайным образом и позволяет пользователю практиковаться в умножении с этими значениями. Если он неправильный, он хранится в виде массива 0, а если правильный, он хранится в виде массива 1. Программа затем выдает среднее значение и соответствующую ему буквенную оценку ... Однако буквенная оценка не работает для первых 2 операторов if.

В функции letterGrade первые два оператора if отключены на конечных точках 60 и 70, например: 60 выведет 'F', а 70 выведет 'C'

        #include <iostream>
        #include<time.h>
        #include<cstdlib>
        #include<stdlib.h>
        #include<ctime>
        using namespace std;
//global variables
        int num;
        int numValues=0;
        int a,b,c,d;
        int ans;
        int answer;
        double total=0;
        double avg=0;
        int choice;
//functions
        void menu();
        void hard(int math[], int num);
        void easy(int math[], int num);
        void print(int math[], int num);
        double average(int math[], int num);
        double Average2(int math[], int num);
        void letterGrade(int math[], int num);
        int main()
        {
        srand(time(NULL));//random generator
        int math[numValues];
        cout << "Math Program" << endl;
        cout<<"practice multiplying one or two digit numbers"<<endl;
//menu and user choice
        menu();
        cin>>choice;
        while(choice>0 && choice<3)
        {
        switch (choice)
        {
        case 1://easy math 
            {
                total=0;
                 cout<<"enter the amount of practice trials you wish to complete"<<endl;
                cin>>numValues;
                easy(math,numValues);
                print(math,numValues);
                average(math,numValues);
                avg=average(math,numValues);
                cout<<endl;
                cout<<"Average: "<<avg*100;
                cout<<" ";
                letterGrade(math,numValues);
                break;

            }
            case 2://hard math
            {
                 total=0;
                 cout<<"enter the amount of practice trials you wish to complete"<<endl;
                cin>>numValues;
                hard(math,numValues);
                print(math,numValues);
                average(math,numValues);
                avg=average(math,numValues);
                cout<<endl;
                cout<<"Average: "<<avg*100;
                cout<<" ";
                letterGrade(math,numValues);
                cout<<endl;
                break;
              }
             }
           menu();
           cin>>choice;
             }

            if(choice==3)
           {
           cout<<"goodbye"<<endl;
           }
           return 0;
           }



           void easy(int math[], int num)//generates random A and Random B then user enters answer and it compares it with ab, array then is 0 if incorrect and 1 if correct
          {
          for(int i=0; i<num; i++)
          {
          a=rand()%10+1;
          b=rand()%10+1;
          cout<<"multiply "<<a<<"*"<<b<<""<<endl;
         answer=a*b;
         cin>>ans;
         if(ans==answer)
         {
            math[i]=1;
         }
        else
        {
            math[i]=0;
        }
        }

        }
        void hard(int math[], int num)//similar to above with numbers between 10 and 20 now
        {
        for(int i=0; i<num; i++)
        {
        c=rand()%11+10;
        d=rand()%11+10;
        cout<<"multiply "<<c<<"*"<<d<<""<<endl;
        answer=c*d;
        cin>>ans;
        if(ans==answer)
        {
            math[i]=1;
        }
        else
        {
            math[i]=0;
        }
        }
        }
        void print(int math[], int num)// prints your score as a 1 or 0
        {
       for(int i=0; i<num; i++)
        {
        cout<<math[i]<<" | ";
        total+=math[i];
       }
       }
       double average(int math[], int num)//avergaes your score
       {
       avg=total/numValues;
       return avg;
       }
       void letterGrade(int math[], int num)//displays your score as a letter grade
       {
      int letter;
      letter=avg*100;
      if(letter>=0 && letter<60)
      {
        cout<<"F"<<endl;
      }
      if(letter>=60 && letter<70)
      {
        cout<<"D"<<endl;
      }
      if(letter>=70 && letter<80)
      {
        cout<<"C"<<endl;
      }
      if(letter>=80 && letter<90)
      {
        cout<<"B"<<endl;
      }
      if(letter>=90 && letter<=100)
      {
        cout<<"A"<<endl;
      }
      }


      void menu()
     {
      cout<<"1. Easy math"<<endl;
       cout<<"2. Hard math"<<endl;
       cout<<"3. Exit"<<endl;
       }

1 Ответ

1 голос
/ 27 апреля 2020

Вместо использования составных условий, подобных этому, просто начните с верхней части шкалы и используйте else if лестницу.

if (score >= 90) 
    cout<<"A"<<endl;
else if (score >= 80) 
    cout<<"B"<<endl;    
else if (score >= 70) 
    cout<<"C"<<endl;    
else if (score >= 60) 
    cout<<"D"<<endl;    
else
    cout<<"F"<<endl;

Эта функция

double average(int math[], int num)//avergaes your score
{
   avg=total/numValues;
   return avg;
}

выполняет целое число arithmeti c. Измените его так, чтобы он выполнял вычисления с плавающей запятой.

Ваше утверждение case:

case 1://easy math 
    {
        // lots of code here

делает слишком много. Измените его так, чтобы вы делегировали каждое из дел в функции.

case 1: DoTheEasyMathCase(someParameters);

В целом, в вашем коде много дезорганизации. Улучшение его организации и структуры, использование меньших функций и исправление отступа в скобках облегчат чтение и отладку.

...