尝试使用函数获取负整数

问题描述 投票:-1回答:2

所以基本上我试图让它停止重复。如果我正确输入数字,它可以正常工作。如果我输入不允许的负数并且需要尝试捕获异常,它会不断重复并且不会停止询问数字。我只有这个代码的源文件,我正在尝试为main创建一个函数。

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

void gcd(int x, int y);

int main()
{
    int x;
    int y;
    cout << "Please enter two integer values" << endl;
    cin >> x;
    cin >> y;
    gcd(x, y);

    return 0;
}

void gcd(int x, int y)
{
    int gcd;
    int s = 0;
    while (s == 0)
    {
        try
        {
            if (x < 0 || y < 0)
                throw 1;
            else
            {
                s == 1;
                break;
            }
        }
        catch (int x)
        {
            cout << "Wrong negative input please type in two Positive integers" << endl;
            cin >> x >> y;
            continue;
        }
    }
    for (int i = 1; i <= x && i <= y; i++)
    {
        if (x % i == 0 && y % i == 0)
            gcd = i;
    }
    cout << "The gcd of x: " << x << " and y: " << y << " is: " << gcd << endl;
}
c++ exception-handling
2个回答
1
投票

如果您不希望使用负值调用函数gcd(),则抛出std::invalid_argument异常。 gcd()的业务不是要求用户输入。在调用main()之前验证gcd()中的输入。

#include <limits>
#include <stdexcept>
#include <iostream>

int gcd(int, int);

int main()
{
    int x, y;
    while (std::cout << "Please enter two positive integers: ",
           !(std::cin >> x >> y) || x < 0 || y < 0)
    {
        std::cerr << "Input error :(\n\n";
        if (std::cin.fail()) {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }

    std::cout << "The gcd of x: " << x << " and y: " << y << " is: " << gcd(x, y) << "\n\n";
}

int gcd(int x, int y)
{
    if (x < 0 || y < 0)
        throw std::invalid_argument("No negative arguments to gcd(), please :(");
    return y == 0 ? x : gcd(y, x % y);
}

0
投票

您可以(也许应该)从gcd函数中删除逻辑,而是将其放在您从用户那里获得输入的位置,即在main中。另外,预先说明要求。例如:

int main()
{
    int x;
    int y;
    cout << "Please enter two positive integer values" << endl;
    cin >> x;
    cin >> y;
    if (x < 0 || y < 0)
    {
        cout << "Wrong negative input please type in two Positive integers" << endl;
        return 0;
    }

    gcd(x, y);

    return 0;
}

现在,您可以在gcd中放置断言以强制执行没有负值:

void gcd(int x, int y)
{
    assert(x >= 0);
    assert(y >= 0);
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.