Почему не работает арифметика переменных?

Вот код:

#include<iostream>  
#include<string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

int score_one;
int score_two;
int score_third;
int final_score = score_one * score_two * score_third;

int main()
{

cout << "What was your first score?" << endl;
cin >> score_one;

cout << "What was your second score?" << endl;
cin >> score_two;

cout << "What was your third score?" << endl;
cin >> score_third;

cout << "Your average score is: " << final_score << endl;

return 0;

}

Первоначально я пытаюсь получить среднее значение, разделив три балла, но это не работает, как и моя арифметика. Он даже не умножает переменные. Я использую cin, чтобы получить числа. Не уверен, что мне не хватает.

Примечание: если бы эти переменные не были глобальными (глобальные переменные инициализированы для вас по умолчанию), скорее всего, компилятор смог бы сказать вам, что вы делаете неправильно. С включенным оптимизатором и несколькими дополнительными флажками предупреждения (-O3 -pedantic -Wall -Wextra) вы могли бы получить несколько строк «предупреждение: 'score_one' используется в этой функции без инициализации»

user4581301 30.05.2018 02:02

это напоминает мне цитату Бэббиджа ... 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question.

Swift - Friday Pie 31.05.2018 09:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
152
5

Ответы 5

В то время, когда вы присваиваете final_score, значения других оценок равны 0 (поскольку вы еще не присвоили им значения, и они являются глобальными). Затем вы считываете оценки, но никогда не обновляете final_score!

Вам нужно добавить это после того, как прочтете третью партитуру:

final_score = score_one * score_two * score_third;

Это обновит final_score.


Я бы также посоветовал держаться подальше от глобальных переменных. Я также предлагаю инициализировать ваши переменные при их объявлении, чтобы избежать ненужных значений.

Кроме того, вы на самом деле не рассчитываете среднее значение! Для этого вам нужно сложить свои значения и разделить на 3, поскольку всего у вас есть 3 значения. Но вы указали final_score как целое число, поэтому вы не сможете сохранить среднее значение с полной точностью. Предлагаю объявить как double.

С учетом всех этих изменений ваш код будет выглядеть так:

int main()
{
    int score_one = 0;
    int score_two = 0;
    int score_third = 0;
    double final_score = 0;

    cout << "What was your first score?" << endl;
    cin >> score_one;

    cout << "What was your second score?" << endl;
    cin >> score_two;

    cout << "What was your third score?" << endl;
    cin >> score_third;

    final_score = (score_one + score_two + score_third) / static_cast<double>(3);

    cout << "Your average score is: " << final_score << endl;

    return 0;
}

+1 за то, что также указал, что оригинал не вычисляет среднее значение (я думаю, что все, включая меня, сосредоточились на фиксации порядка).

cantordust 30.05.2018 02:03

Чтобы закончить, вы должны проверить, что чтение прошло успешно.

user4581301 30.05.2018 02:04

Математика в C++ в целом работает не так, как математика. В математике вы определяете отношения типа total = x * y * z, которые всегда должны выполняться. В С ++ вы выполняете последовательные операции. Выражение total = x * y * z присваивает значение Текущий правой части левой стороне, и на этом связь между переменными заканчивается. Дальнейшие изменения любого из x, y или z никоим образом не повлияют на total (при условии, что эти переменные являются фундаментальными арифметическими типами, такими как int).

François Andrieux 30.05.2018 02:09

что такое static_cast <double> (3)? Я полностью новичок в C++, так что это может быть вне моей области прямо сейчас

Jonathan Garland 30.05.2018 02:28

Как именно умножить три числа, а затем разделить на 3 «среднее» чего-либо?

T.C. 30.05.2018 04:53

@ T.C. Ха! Хороший звонок - я это полностью упустил. Спасибо за улов! :)

scohe001 30.05.2018 06:39

@JonathanGarland взгляните на как работает целочисленное деление. А потом смотрите как ты можешь этого избежать.

scohe001 30.05.2018 06:41

Эту строку нужно переместить после, вы cin, в переменные в правой части уравнения.

int final_score = score_one * score_two * score_third;
cout << "Your average score is: " << final_score << endl;

Переменная каким-то образом не пересчитывается, когда эти переменные устанавливаются позже.

Эта часть

int final_score = score_one * score_two * score_third;

должен находиться внутри main() после последнего cin.

Вы уже получили некоторые ответы, но я хотел бы высказать другую точку зрения.

Мне кажется, что вы привыкли к такой программе, как Excel, где вы можете установить ячейку в формулу (например, произведение трех других ячеек), а затем, когда вы меняете любую из этих ячеек, продукт немедленно обновляется, автоматически. C++ (и вообще языки программирования) так не работает. Когда вы пишете строку вроде

int final_score = score_one * score_two * score_third;

вы устанавливаете правило нет, которое приведет к пересчету значения. Подход другой!

Программа выполняется от начала до конца (на практике сверху вниз), и каждый раз, когда вы присваиваете значение переменной (например, final_score), вы читаете текущее значение входных переменных. (здесь ваши три оценки), вычисляя результат (который в данном случае не определен, потому что вы не инициализировали ни одну из оценок), и присваивая его переменной только в этот раз. Вот и все. Если вы позже измените оценки, изменение нет автоматически отразится на вашем final_score. Если вы хотите, чтобы значение было пересчитано, вам придется сделать это вручную. Вот почему вы должны переместить эту строку после строк, которые читают ввод от пользователя, как говорили другие.

Вам действительно не следует использовать глобальные переменные глянь сюда, почему вам следует их избегать.

Далее, вместо того, чтобы делать using std::cin и т. д., Просто привыкните набирать его.

Наконец, используйте соответствующие флаги в вашем компиляторе, чтобы помочь вам обнаруживать ошибки. Компилятор должен быть вашим другом. Хороший компилятор скажет вам,

int score_one;
int score_two;
int score_third;
int final_score = score_one + score_two + score+third / 3;

Не инициализируется. Чтобы действительно достичь того, о чем вы думаете, вы можете использовать функцию, которая вернет двойное значение. И это выглядело бы примерно так

double doAverage(int score1, int score2, int score3)
{
    return (score1 + score2 + score3) / 3.0;
}

Но это, вероятно, придет позже в вашей практике кодирования.

#include<iostream>  


int main()
{
    // Delare your variables here and initialize them to zero.
    int score_one = 0;
    int score_two = 0;
    int score_third = 0;
    double final_score = 0;

    std::cout << "What was your first score?" << std::endl;
    std::cin >> score_one;

    std::cout << "What was your second score?" << std::endl;
    std::cin >> score_two;

    std::cout << "What was your third score?" << std::endl;
    std::cin >> score_third;

    // Take all scores and divide it. This is the important part since
    // order matters in your code.
    final_score = (score_one + score_two + score_third) / 3.0;

    std::cout << "Your average score is: " << final_score << std::endl;

    return 0;

}

Вы на правильном пути, вам просто нужно взглянуть на свой код и прочитать его вслух. Одна из лучших вещей, которые вы можете сделать в программировании, - это начать сверху и сказать: «Хорошо, где это ломается?» И следуйте за ним строка за строкой, чтобы понять это.

Вам понадобится () вокруг вашей суммы, иначе вы не получите среднего.

Holt 30.05.2018 14:37

Спасибо, изменения внесены

Sailanarmo 30.05.2018 14:50

Другие вопросы по теме