【问题标题】:How to fill an array with distinct values如何用不同的值填充数组
【发布时间】:2014-07-16 14:03:01
【问题描述】:

我希望我的数组输入不能有两次相同的数字: 然而,这将有一个输出 "值存在请重新输入:"; 两次。我如何检查它是否是唯一的,如果它之前已经初始化,则只显示一次?

int main(){
  int arr_size = 10;
  int value;
  int aArray[10];
  for(int i=0;i<arr_size;i++)
  {
        cout<<"enter value of slot"<<i+1<<": ";
        cin>>value;

        for(int j=0;j<arr_size;j++){

          if(value == aArray[j])
          {
            cout<<"value exist please re enter: ";
            cin>>value;
          }
          else{

          aArray[i] = value;
          }
        }
    }

  }

【问题讨论】:

  • 使用std::set&lt;int&gt; 代替原始整数数组。
  • 您可以考虑插入std::set 并检查其结果。即使是最小的更改,也可以使用std::find 而不是循环。另请注意,如果到目前为止在这些集合中找不到该元素,则您正在读取未初始化的数据。
  • 或者你只是在再次输入值后引入一个break。但是尽管如此,您并没有初始化错误,因此 existence 检查的上限(即j-loop)应该是i 而不是arr_size,因为在每个大于@ 的元素中987654330@里面可以放任何东西。
  • @isme 另一个注意事项:您应该使用const int arr_size = 10;,然后定义int aArray[arr_size],以便稍后您必须更改数组的大小,您可以在一个地方进行,并且最重要的是,您将避免忘记在这两个地方进行更改(这些错误很难检测到,因为它们只会在运行时出现,并且有时会出现难以恢复到原始错误的疯狂行为)。

标签: c++ arrays unique


【解决方案1】:

改为:

  for(int i=0;i<arr_size;i++)
  {
      cout<<"enter value of slot"<<i+1<<": ";
      while(1) { //You must keep reading until you have read a valid value
        cin>>value;
        bool alreadyPresent = false;    

        for(int j=0;j<i;j++){ //You only have to check against already inserted values!
                              //Before you were checking against uninitialized values!!
          if(value == aArray[j])
          {
            alreadyPresent = true;
            break; //I don't need to further iterate the array
          }

        }

        if (alreadyPresent)
          cout<< std::endl << value exists, please re enter: ";
        else
          break; //I can proceed with the next value, user has not to reenter the value
       }
     aArray[i] = value;

     std::cout << std::endl; //next line...
  }

替代方案:

  for(int i=0;i<arr_size;i++)
  {
      cout<<"enter value of slot"<<i+1<<": ";

      bool alreadyPresent;
      do { //You must keep reading until you have read a valid value
        cin>>value;
        alreadyPresent = false;    

        for(int j=0;j<i;j++){ //You only have to check against already inserted values!
                              //Before you were checking against uninitialized values!!
          if(value == aArray[j])
          {
            alreadyPresent = true;
            cout<< std::endl << value exists, please re enter: ";
            break; //I don't need to further iterate the array
          }

        }

      } while (alreadyPresent);
     aArray[i] = value;

     std::cout << std::endl; //next line...
  }

【讨论】:

  • @Erbureth 是的,你肯定是对的,否则它只会检查第一个值
  • 您应该删除第二个break 并将while(1) 更改为while(alreadyPresent),同时将bool alreadyPresent = true 移动到外部for-loop。或者甚至在第一次获得value 时将while-loop 更改为do ... while-loop
  • 您可以使用bool alreadyPresent = std::find(aArray, aArray + i, value) != aArray + i; 代替您自己的循环。
  • @Jarod42 是的,但是使用库函数可能不会帮助 OP 理解他的代码中的问题。
  • @a_guest 我还添加了您的解决方案,它流动得更好,我同意
猜你喜欢
  • 2015-08-30
  • 1970-01-01
  • 2020-12-02
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多