如何验证二维数组中的值?

时间:2015-06-26 23:00:15

标签: c arrays validation

我有一个二维的整数数组,我想只接受与已经读过的值不同的值。我试着这样做:

for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        printf("Number: ");
        scanf("%d", &d[i][j]);
        for (k = 0; k < i; k++)
        {
            for (l = 0; l < j; l++)
            {
                while (d[i][j] == d[k][l])
                {
                    printf("Number: ");
                    scanf("%d", &d[i][j]);
                }
            }
        }
    }
}

原来它无法正常工作。如何进行此验证?

6 个答案:

答案 0 :(得分:1)

while语句不应该在内部循环中,因为它只是针对特定的k,l进行验证而不是针对其他索引。

将您的测试拆分为一个单独的函数,以测试复制到i,j:

int duplicateExists(float value, int i, int j)
{
      for (k = 0; k <= i; k++)
      {
          for (l = 0; ((k < i) && (l < 5)) || (l < j); l++)
          {
              if(d[k][l] == value)
                  return 1;
          }               
      }
      return 0;
}

然后你可以这样验证:

for (i = 0; i < 5; i++)
{
  for (j = 0; j < 5; j++)
  {
      printf    ("Number: ");
      scanf     ("%d", &d[i][j]);
      while (duplicateExists(d[i][j], i, j))
      {
         printf    ("Number: ");
         scanf     ("%d", &d[i][j]);
      }       
  }
}

答案 1 :(得分:0)

问题是您没有检查以前输入的每个值。 因此,当i == 2j == 3,值已输入到d [0] [0到 4 ]时,d [1] [0到 4 ]和d [2] [0到2]。但是,由于您的for (l = 0; l < j; l++),您正在检查d [0] [0到 2 ],d [1] [0到 2 ]和d [2] [0到2]。

答案 2 :(得分:0)

我们假设您的代码已到达内部循环,其值为ij

&#34;验证&#34;需要将d[i][j]与以下几组值进行比较

 set1:   for k = 0 to i-1  compare with d[k][l] for l = 0 to 5

 set2:    compare with d[i][l] for l = 0 to j-1

基本上set1是关于比较之前读取的所有行,set2正在比较当前行中的所有前面的元素。

你的两个嵌套循环没有与这两组的组合/联合进行比较。

注意:命名变量l并不是一个特别好的主意,因为它看起来像1(数字1)并且很容易做出很难看到的错别字,但是真的搞砸了代码的含义。

答案 3 :(得分:0)

您应该尝试像这样更改代码。放一个'if',这样你就可以看出你写的数字是否相同,当然你应该改变我的代码,但这是逻辑的基础。

printf("Number: ");
          scanf     ("%d", &numb);              
          for (k = 0; k < i; k++)
          {
              for (l = 0; l < j; l++)
              {
                  if (numb == d[k][j])
                  {
                      printf("Same number, try again\n");
                  }
                  else
                  {
                      d[i][j] = numb;
                  }

              }             

答案 4 :(得分:0)

您错过了之前的一些条目,因为您没有检查前一行的整个,并且没有检查的任何当前行。

int had;
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        do
        {
            had = 0;
            printf    ("Number: ");
            scanf     ("%d", &d[i][j]);

            // check previous rows
            for (k = 0; k < i; k++)
            {
                for (l = 0; l < 5; l++)       // <--- change end condition
                {
                    if (d[i][j] == d[k][l])
                    {
                        had = 1;
                        continue;
                    }
                }               
            }

            //check this row
            for (l = 0; l < j; l++)
            {
                if (d[i][j] == d[i][l])
                {
                    had = 1;
                    continue;
                }
            }               
        } while (had);
    }
}

答案 5 :(得分:0)

如果您将任务分解为其他人指示的几个功能,它将对您有所帮助。这至少消除了嵌套循环中索引的4个独立迭代变量。获得初始数组后,您的主要目标是迭代原始数据中的每个值,并验证您尝试添加到第二个值的新值在第一个中不存在。

以现有数组和第二个空数组(下面为ab)为例:

int a[][ASZ] = {{19, 1,38,51,37}, 
                {95,74,42,23,76},
                {17,24,14,22,25},
                {11,50,10,84,45},
                {78,44,66,46,98}};
int b[ASZ][ASZ] = Before and After Sort;

注意:任何非常大的数组,每次添加到第二个值时迭代每个值都是非常低效的。为了提高效率,对原始数据进行排序是有意义的(即使在temp中也是如此)数组)允许二分/包围类型搜索显着减少检查重复值所需的迭代次数)

检查重复项,从最简单的意义上讲,可以是一个整数函数,将原始数组和建议值作为参数(以及数组大小),然后比较值,返回1或{{1} } 0unique个确定。如下所示:

non-unique

其中: int check_uniq (int a[][ASZ], size_t n, int v) { size_t i, j; for (i = 0; i < n; i++) for (j = 0; j < ASZ; j++) if (a[i][j] == v) return 0; return 1; } 只是数组行大小的常量)

通过检查唯一值的方法,填充数组可以简化为基本方法:

ASZ

注意:您可以使用自己喜欢的任何类型的内部循环。 /* fill second array with values unique to values in a[][] */ for (i = 0; i < n; i++) { for (j = 0; j < ASZ; j++) { for (;;) { tmp = rand() % 100 + 1; if (check_uniq (a, n, tmp)) break; } b[i][j] = tmp; } } forwhile。使用{进行简单的连续迭代找到唯一值之后的{1}}就像其他任何事情一样简单。)

最后,测试。在测试过程中不必一遍又一遍地输入建议值,有时候设置一个简单的方法来填充第二个数组是有意义的,以便进行彻底的验证。以下是将所有部分放在一起的简短示例。希望这会有所帮助。如果您有任何问题,请与我联系:

do .. while

<强>输出

break