#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
Однако я настоятельно рекомендую сначала изучить другие ответы.