【问题标题】:How do I make a C++ int array loop that will not allow repeated values? [closed]如何制作一个不允许重复值的 C++ int 数组循环? [关闭]
【发布时间】:2019-02-24 07:16:32
【问题描述】:

我需要一个循环,它会一直要求输入,直到数组中没有重复值。当我运行我的代码时,它会识别出存在重复,但它会遍历我的其余代码并且不再要求输入。我已经尝试了很多不同的方法,因此非常感谢任何见解

cout << "Enter 10 integers with no repeated values: ";
for (x = 0; x < n; x++)
{
    cin >> d[x];
}

while (duplicateTest(d))
{
    for (x = 0; x < n; x++)
    {
        cin >> d[x];
    }
}



bool duplicateTest (int d[])
{
int i, j;
bool duplicate;
for (i = 0; i < 10; i++)
{
    for (j = i + 1; j < 10 + 1; j++)
    {
        if (d[i] == d[j])
        {
            cout << "Invalid entry, do not repeat values." << endl
                 << "Enter 10 integers with no repeated values: " << endl;  
            duplicate = true;
        }
        else 
            duplicate = false;

    }
}

return duplicate;

【问题讨论】:

  • 在输入 while 循环中使用计数器,而不是 for 循环。重复测试应将 for 循环限制为当前数据中的元素数。问问自己,您是否希望用户在输入重复项时必须从头开始,或者您只是想告诉他们并继续前进,直到他们拥有 10 个唯一值。

标签: c++ arrays loops input int


【解决方案1】:

您的duplicateTest 函数应该被重写以在找到单个重复项后立即返回true

bool duplicateTest(int (&d)[10]) {
    for (int i = 0; i < 10; ++ i)
        for (int j = i + 1; j < 10; j++)
            if (d[i] == d[j]) {
                std::cout << "Invalid entry, do not repeat values\n"
                             "Enter 10 integers with no repeated values:\n";
                return true;
            }
    return false;
}

现在它在找到重复项时将duplicate 设置为true,但在稍后的迭代中,当某些d[i] d[j] 对不是一对时,它可能会将其设置回false重复

我必须做一些工作才能使您的代码能够编译,下面是一个工作示例:

#include <iostream>

bool duplicateTest(int (&d)[10]) {
    for (int i = 0; i < 10; ++ i)
        for (int j = i + 1; j < 10; j++)
            if (d[i] == d[j]) {
                std::cout << "Invalid entry, do not repeat values\n"
                             "Enter 10 integers with no repeated values:\n";
                return true;
            }
    return false;
}

int main() {
    int d[10];

    std::cout << "Enter 10 integers with no repeated values:\n";
    for (int i = 0; i < 10; i++)
        std::cin >> d[i];

    while (duplicateTest(d))
        for (int i = 0; i < 10; i++)
            std::cin >> d[i];

    std::cout << "Done\n";
    return 0;
}

【讨论】:

  • 这有帮助,谢谢!
【解决方案2】:

问题是你覆盖了 duplicateTest() 中的重复标志。

    cout << "Enter 10 integers with no repeated values: ";
    for (x = 0; x < n; x++)
    {
        cin >> d[x];
    }

    while (duplicateTest(d))
    {
        cout << "Duplicate value found. Enter 10 integers with no repeated values: ";
        for (x = 0; x < n; x++)
        {
            cin >> d[x];
        }
    }



bool duplicateTest (int d[])
{
    int i, j;
    bool duplicate = false; //Better to initialize.
    for (i = 0; i < 10; i++)
    {
        for (j = i + 1; j < 10 + 1; j++)
        {
            if (d[i] == d[j])
            {
                cout << "Invalid entry, do not repeat values." << endl
                     << "Enter 10 integers with no repeated values: " << endl;  
                duplicate = true;
                break; //If you detect at least one duplicate, exit the loop.
            }
            else 
                duplicate = false;

        }
        if(duplicate) break; //Break the outerloop.
    }

    return duplicate;
}

【讨论】:

  • 只提供一堵代码墙而没有说明您修复了什么并不是一个好的答案。 - 此外,您仍然有错误 - 一旦找到重复项,您需要打破两个循环,而不仅仅是内部循环。更容易return
  • 同意。实际上我已经在 cmets 中添加了解释。无论如何感谢您的反馈。 :)
【解决方案3】:

duplicateTest()设置duplicate = true后需要返回。考虑[0][1] 是相同的。您将设置duplicate = true,然后比较[1][2],它们是不同的,所以duplicate 将返回false。一旦找到重复项,您就可以停止查找 - 您不在乎有多少个重复项。

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多