我有一个二维的整数数组,我想只接受与已经读过的值不同的值。我试着这样做:
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]);
}
}
}
}
}
原来它无法正常工作。如何进行此验证?
答案 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 == 2
和j == 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)
我们假设您的代码已到达内部循环,其值为i
和j
。
&#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个独立迭代变量。获得初始数组后,您的主要目标是迭代原始数据中的每个值,并验证您尝试添加到第二个值的新值在第一个中不存在。
以现有数组和第二个空数组(下面为a
和b
)为例:
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] = ;
(注意:任何非常大的数组,每次添加到第二个值时迭代每个值都是非常低效的。为了提高效率,对原始数据进行排序是有意义的(即使在temp中也是如此)数组)允许二分/包围类型搜索显着减少检查重复值所需的迭代次数)
检查重复项,从最简单的意义上讲,可以是一个整数函数,将原始数组和建议值作为参数(以及数组大小),然后比较值,返回1
或{{1} } 0
或unique
个确定。如下所示:
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;
}
}
,for
或while
。使用{进行简单的连续迭代找到唯一值之后的{1}}就像其他任何事情一样简单。)
最后,测试。在测试过程中不必一遍又一遍地输入建议值,有时候设置一个简单的方法来填充第二个数组是有意义的,以便进行彻底的验证。以下是将所有部分放在一起的简短示例。希望这会有所帮助。如果您有任何问题,请与我联系:
do .. while
<强>输出强>
break