Функция, возвращающая неверное значение в C ++ - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь вызвать функцию для возврата суммы введенного числа, но она возвращает только 0.

Цикл for правильно вычисляет сумму при применении в основном, без вызова функции. Тем не менее, когда я вызываю функцию, она возвращает неправильное значение.

#include <iostream>
using namespace std;

int EvenOrOdd(int Number, int Value)
{
    if (Number % 2 == 0)
        Value = 1;
    return(Value);
}

int CalculateSum(int Number, int Sum)
{
    for (int i = 1; i <= Number; i++)
        Sum = Sum + i;
    return(Sum)
}

void main()
{
    int Number = 0, Value = 0, Sum = 0;

    cout << "Please enter a positive integer: ";
    cin >> Number;

    while (Number >= 1 && Number <= 100)
    {

        EvenOrOdd(Number, Value);
        if (Value == 1)
            cout << Number << " is Even";
        else
            cout << Number << " is Odd";

        CalculateSum(Number, Sum);
        cout << "\n" << Sum << " is the sum of the first " << Number;

        cout << "\nPlease enter a positive integer: ";
        cin >> Number;
    }
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Вы получаете 0 за сумму, потому что вы не присваиваете возвращаемое значение чему-либо.

Попробуйте вместо этого:

int sum = CalculateSum(Number, Sum);

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

0 голосов
/ 03 апреля 2019

Вы никогда не используете return(Value);.Если вы хотите использовать новый value без использования return, вы должны передать ссылку, например, int EvenOrOdd(int Number, int& Value) (или передать обычный старый указатель).Аналогично с CalculateSum(Number, Sum);

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

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

Value = EvenOrOdd(Number, Value);

или (2) передать ссылку на значение, например,

int EvenOrOdd(int Number, int& Value)
{
    if (Number % 2 == 0)
        Value = 1;
    return(Value);
}

Передавссылка, любые изменения, сделанные в Value в функции, автоматически вносятся в исходную переменную обратно в вызывающую программу, поскольку ссылка является просто псевдонимом для исходной переменной.То же самое относится к использованию Sum в CalculateSum(Number, Sum);

Пример использования ссылок

#include <iostream>
using namespace std;

int EvenOrOdd(int Number, int& Value)
{
    if (Number % 2 == 0)
        Value = 1;
    return(Value);
}

int CalculateSum(int Number, int& Sum)
{
    for (int i = 1; i <= Number; i++)
        Sum = Sum + i;
    return(Sum);
}

int main (void)
{
    int Number = 0, Value = 0, Sum = 0;

    cout << "Please enter a positive integer: ";
    cin >> Number;

    while (Number >= 1 && Number <= 100)
    {

        EvenOrOdd(Number, Value);
        if (Value == 1)
            cout << Number << " is Even";
        else
            cout << Number << " is Odd";

        CalculateSum(Number, Sum);
        cout << "\n" << Sum << " is the sum of the first " << Number;

        cout << "\nPlease enter a positive integer: ";
        cin >> Number;
    }
}

( примечание: Я использовалсоответствующий вызов main() выше - см. ниже)

Вы также используете несоответствующий вызов main().Соответствующие вызовы: int main (void) или int main (int argc, char **argv) (хотя argc и argv могут быть названы как угодно. Если вы используете несоответствующую встроенную систему, для которой требуется void main(), то все в порядке, в противном случае вам нужно исправитьэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...