Что не так с моим кодом? Как я могу улучшить его дальше?

avatar
StumblingBlock001
1 июля 2021 в 18:38
72
2
1

Проблема в том, что моя программа не дает точного среднего значения для чисел, состоящих более чем из 9 цифр.

Может ли кто-нибудь указать, что я делаю неправильно и как это исправить? Могу ли я что-нибудь сделать для дальнейшего улучшения кода?

Код

#include <iostream>
using namespace std;

int main(){
    cout << "                 Average Finder           \n";  //So that the title is displayed properly.
    int NUM1,NUM2,AVG;  /*I am defining the variables as integers, seemed like the best option.
                          Should I use long float? Does that even work?*/ 
    cout << "Type the First Number:   "; // for the display
    cin >> NUM1; // the program asks for the first user input and stores it in integer variable NUM1
    cout << " \n";
    cout << "Type the Second Number:  ";
    cin >> NUM2;  // the program asks for the second user input and stores it in integer variable NUM2
    cout << " \n";
    AVG = ((NUM1+NUM2)/2); //this line calculates their average
    cout << "The Average of given numbers is = ";
    cout << AVG;
    
    return 0;
}

Вот выполнение командной строки.

PS D:\Workspace\Coding\C++> .\ALG001.EXE

                 Average Finder
Type the First Number:   1111111111

Type the Second Number:  1111111111

The Average of given numbers is = -1036372537
Источник
Wyck
2 июля 2021 в 05:16
0

Вы рассматривали, какое максимальное значение можно сохранить в переменной типа int?

Ответы (2)

avatar
SomeProgrammer
1 июля 2021 в 18:44
2

Ваши NUM1 и NUM2 имеют тип int. Переменные int имеют максимальное значение, в большинстве систем это 2147483647.

Когда NUM1 = 1111111111 и NUM2 = 1111111111, тогда NUM1 + NUM2 будет больше, чем максимальное значение 2147483647. Это называется переполнением.

Технически в c++ это неопределенное поведение, но в большинстве систем оно будет оборачиваться, давая вам отрицательные значения и объясняя ваш вывод.

Если вы хотите, чтобы ваши переменные хранили большие значения, используйте long или даже long long.

2785528
1 июля 2021 в 21:42
0

А когда int64_t слишком мал, можно использовать gmpxx.h и его тип mpz_class. Элементы этого типа представляют собой целое число с множественной точностью.

StumblingBlock001
19 июля 2021 в 19:00
0

Таким образом, пользовательский ввод превысил максимальный предел, как переполненная чашка. Это приводит к переполнению. И решение было просто увеличить объем чашки. Я правильно понял?

SomeProgrammer
23 июля 2021 в 15:02
0

Да, хотя (технически) сумма ваших двух чисел превысила максимальный предел, а не пользовательский ввод.

avatar
Thomas Matthews
1 июля 2021 в 20:24
0

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

double average = 0.0;
average = (1 + 2 + 3) / 3.0;
std::cout << average << "\n";

С целочисленным делением, 1 / 3 == 0.

StumblingBlock001
19 июля 2021 в 19:02
0

Не могли бы вы уточнить. Я не думаю, что понял логику этого.