Результат не такой, как я ожидал

#c

Вопрос:

Ответ, который я хочу, должен быть 88,5, но он оказывается 3,60434 e 006. Я думаю, что с моей формулой коэффициента проблем нет. Что мне делать?

 #include <iostream>

using namespace std;

int main()
{
    int Grade_one, Grade_two;
    int Average = Grade_one Grade_two;
    double average = Average/2;

    cout<<"Please input your Grade No.1: ";
    cin>>Grade_one;
    cout<<"Please input your Grade No.2: ";
    cin>>Grade_two;

    if (Grade_one == Grade_two){
        cout<<"Your Grades are Same."<< endl;
    }
    if(Grade_one >= 50 amp;amp; Grade_two >= 50 amp;amp; Grade_one <= 74 amp;amp; Grade_two <= 74){
        cout<<"Hey! You should focus on your study, your grade is concerningly LOW."<< endl;
    }
    else if(Grade_one <= 49 amp;amp; Grade_two <= 49){
        cout<<"DUDE! you will fail for sure if you don't study."<< endl;
    }
    else if(Grade_one >= 75 amp;amp; Grade_two >= 75 amp;amp; Grade_one <= 100 amp;amp; Grade_two <= 100){
        cout<<average <<endl;
    }

    return 0;
}
 

«результат»

 Please input your Grade No.1: 88

Please input your Grade No.2: 89
3.60434e 006

Process returned 0 (0x0)   execution time : 3.238 s

Press any key to continue.
 

Ответ должен быть 88,5. Как мне это исправить?

Комментарии:

1. Это неопределенное поведение. Вы не можете вычислять с помощью переменных, которые вы не читали. Сначала вы должны прочитать значения, а затем вы можете рассчитать Grade_one Grade_two . Программирование на C не похоже на математику, где вы определяете отношения. Это больше похоже на кулинарный рецепт, в котором вы указываете своему компьютеру, что делать.

2. int Average = Grade_one Grade_two; не настраивает какие-то магические средства, с помощью которых Average изменения происходят всякий Grade_one раз, когда что-то Grade_two меняется. Он получает доступ к текущему значению (в момент выполнения, где встречается эта строка) Grade_one и Grade_two (что вызывает неопределенное поведение в вашем коде, поскольку оба Grade_one и Grade_two неинициализированы) и инициализируется Average их суммой. Если Grade_one или Grade_two впоследствии будет изменено, эти изменения не окажут никакого влияния на Average .

Ответ №1:

Grade_one и Grade_two не определены, когда вы их впервые используете. Вам также нужно Average выполнить двойное приведение, если вы хотите, чтобы результат также был двойным.

 #include <iostream>

using namespace std;

int main()
{
    int Grade_one, Grade_two;


    cout<<"Please input your Grade No.1: ";
    cin>>Grade_one;
    cout<<"Please input your Grade No.2: ";
    cin>>Grade_two;
    
    int Average = Grade_one Grade_two;
    double average = (double)Average/2;

    if (Grade_one == Grade_two){
        cout<<"Your Grades are Same."<< endl;
    }
    if(Grade_one >= 50 amp;amp; Grade_two >= 50 amp;amp; Grade_one <= 74 amp;amp; Grade_two <= 74){
        cout<<"Hey! You should focus on your study, your grade is concerningly LOW."<< endl;
    }
    else if(Grade_one <= 49 amp;amp; Grade_two <= 49){
        cout<<"DUDE! you will fail for sure if you don't study."<< endl;
    }
    else if(Grade_one >= 75 amp;amp; Grade_two >= 75 amp;amp; Grade_one <= 100 amp;amp; Grade_two <= 100){
        cout<<average <<endl;
    }

    return 0;
}
 

Комментарии:

1. Average / 2. также может быть использован.

2. На мой взгляд, если результат должен быть двойным (с десятичными знаками, например, 88,5), то по крайней мере один из int оперантов должен быть явно приведен к двойному ( Average или 2 ).

3. И это то, что 2 2. эффективно делает замена на. 😉 2 есть int 2. (или 2.0 , для ясности) есть double .

4. О, ладно, я этого не знал 🙂

5. @Evg меньше символов не значит лучше, я бы предположил Average / 2.0 . .0 это не так сложно пропустить, просто . 😉

Ответ №2:

 int Grade_one, Grade_two;
int Average = Grade_one Grade_two;
 

Здесь вы читаете неинициализированные переменные. Это неопределенное поведение, и все может произойти: сбой, ненужные данные, странное поведение,…

Вам нужно отложить использование переменной только после того, как вы установите для нее полезное значение, например:

 int Grade_one, Grade_two;

cout<<"Please input your Grade No.1: ";
cin>>Grade_one;
cout<<"Please input your Grade No.2: ";
cin>>Grade_two;

int Average = Grade_one Grade_two;
double average = Average/2;
 

Комментарии:

1. И тогда вы заметите что-то странное в том, что среднее значение составляет 88 вместо 88,5. Исправьте это, разделив быть 2.0 вместо 2 .

Ответ №3:

Вы вычисляете average раньше Grade_one и Grade_two инициализируетесь, это не может работать (это неопределенное поведение). Если вы хотите определить что-то сейчас и выполнить это позже, это функция. Здесь вы можете использовать лямбда-выражение. Average это неправильное название, это сумма, а не среднее значение. Вы используете целочисленную арифметику для деления, но чтобы получить правильный результат, он должен быть рассчитан с плавающей запятой. Я думаю, что у вас есть условия для if правильного, но последний случай проще, если вы просто сделаете это else без условий. И последнее, но не менее важное: вы всегда должны инициализировать переменные:

 #include <iostream>

using namespace std;

int main()
{
    int Grade_one = 0;
    int Grade_two = 0;
    auto average = [amp;](){
        int Sum = Grade_one   Grade_two;
        return Sum / 2.0;        
    };

    Grade_one = 42;
    Grade_two = 12;

    if (Grade_one == Grade_two){
        cout<<"Your Grades are Same."<< endl;
    }
    if(Grade_one >= 50 amp;amp; Grade_two >= 50 amp;amp; Grade_one <= 74 amp;amp; Grade_two <= 74){
        cout<<"Hey! You should focus on your study, your grade is concerningly LOW."<< endl;
    }
    else if(Grade_one <= 49 amp;amp; Grade_two <= 49){
        cout<<"DUDE! you will fail for sure if you don't study."<< endl;
    }
    else {
        cout<<average() <<endl;
              // ^^ call the lambda
    }

    return 0;
}
 

Ответ №4:

Вам нужно немного изменить свой код. Сохраните этот фрагмент универсально полезного кода где-нибудь (желательно в файле заголовка):

   template <class Lam>
  class Expr
  {
      public:
          using ResultType = std::remove_reference_t<decltype((std::declval<Lam>())())>;
          operator ResultType() { return lam(); }
          ResultType value() { return lam(); }
          Expr(Lamamp;amp; lam) : lam(std::move(lam)) {}
      private:
          Lam lam;
  };

  #define EXPR(...) Expr([amp;](){return (__VA_ARGS__) ;})
 

Когда вы #include включите эту часть в свою программу, вы сможете продолжить с минимальными изменениями:

 int Grade_one, Grade_two;
auto Average = EXPR(Grade_one Grade_two); // note the auto
auto average = EXPR(Average/2.0);         // and the decimal point
 

Однако я настоятельно рекомендую сначала изучить другие ответы.