什么是我的功能错了

时间:2011-05-12 05:28:57

标签: c++

void getLottoPicks()
{
    int i,k, num[7], num1;

    bool nodup(int num[7],int k, int num1), noover= true;
    for(i=0; i<7; i++)
        num[i]=51;

    cout << "please enter the seven numbers you think will win the lottery: "<< endl;
    for (i=0; i<7;i++)
    {
        cin >> num[i];
        if(num[i] < 1 || num[i] > 40)
        {
            i= i-1;
            noover = false;
            cout << "The number is out of range. Please enter a new number ";
        }

        if(noover)
        {
            num1=num[i];
            k=i;
            if (!nodup(num,k, num1))
            {   
                i=i-1 ;
                cout <<" you type the duplicated number. please enter another number"; 
            }
        }
    }
}
bool nodup(int num[7],int i, int num1)
{
    bool dup = false;
    int k;
    for(k=0; k<i-1; k++)
    {
        if (num[k] = num1)
            dup = true;
    }
    return !dup;
}

每当我输入相同数字的2时,它总是会“你输入重复的数字。请输入另一个数字”;

6 个答案:

答案 0 :(得分:6)

bool nodup(int num[7],int k, int num1), noover= true;

我可以诚实地说,我认为我之前没有曾经看过这样的前瞻声明(并不是说这篇文章对你有所帮助;)

答案 1 :(得分:4)

我认为这一行是错误的:

    if (num[k] = num1)

我认为它应该是:

    if (num[k] == num1)

答案 2 :(得分:3)

您正在从不同位置开始填充阵列。在getLottoPicks()中,您从1开始,在nodup()中从0开始。在C ++中,您通常从0开始数组。

答案 3 :(得分:1)

还有另一个问题:getLottoPicks()中的for循环从1开始,而nodup()的for循环从0开始。

答案 4 :(得分:1)

您的代码在技术和美学方面存在相当多的问题。

  1. 您的for循环for (i=1; i<7;i++)错误。这只会运行6次。您应该尝试使用i=0
  2. 启动它
  3. 不是像bool nodup(int num[7],int k, int num1), noover= true;那样执行前向声明,而是在方法getlottopicks之前移动前向声明,或者在乐透选择之前移动整个方法nodup。这在某种程度上看起来并不容易。
  4. if (num[k] = num1)错了。将其替换为if (num[k] == num1)
  5. 使用i--代替i=i-1并使用continue而不是使用变量noover
  6. 修复这些问题,您的代码会更好。

答案 5 :(得分:1)

问题显然在于if (num[k] = num1),应该写成if (num[k]== num1)。也就是说,将赋值运算符更改为相等运算符。

同样for循环的条件应为:

for(k=0; k <= i ; k++)  //in nodup function
       //^^^^^^ I think you want this!

getLottoPicks中,循环应该是这样的:

for (i = 0 ; i<7;i++)
    //^^^^ start from zero

顺便说一句,如果我正确地理解了你的代码(以及它所做的工作),那么我认为你应该使用std::set来自动解决许多问题。首先,std::set总是在将新项目添加到自身之前检查重复项。这意味着,std::set中的每个项目都是唯一的。

考虑使用:std::set<int>

如果您使用std::set<int>,您的代码将减少到:

#include <set>

void getLottoPicks()
{
    set::set<int> nums;
    int input;
    while(nums.size() < 7)
    {
        std::cin >> input;
        if(input < 1 || num > 40 )
        {
            std::cout << "Out of range. Please enter number between [1-40] : ";
        }
        else if(nums.insert(input).second == false)
        {
            std::cout <<"Duplicate number. Please try again : "; 
        }
    }
}

您不再需要nodup()功能了。