这是一个菜鸟问题。我有一个名为的数组Counter[N][N]
,我想做类似的事情:
While (each element of Counter < 10000) {do something}
While (there exists an element of Counter < 10000) {do something}
有没有一种简单的方法可以在 C 中做到这一点?
这是一个菜鸟问题。我有一个名为的数组Counter[N][N]
,我想做类似的事情:
While (each element of Counter < 10000) {do something}
While (there exists an element of Counter < 10000) {do something}
有没有一种简单的方法可以在 C 中做到这一点?
该函数测试传入的计数器数组是否有小于指定值的元素:
bool has_element_less_than(int value, int counter[N][N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (counter[i][j] < value)
return true;
}
}
return false;
}
你用吧:
if (has_element_less_than(10000, counter))
do_something();
您可以通过将 N 作为参数传递给函数来处理 C99 中的可变维度数组。它假定您有<stdbool.h>
可用的 C99 标头并包含在内。
这就是你所追求的吗?你提到'While'所以不清楚你是否需要使用while
循环 - 如果你这样做,我认为这可以完成工作:
int i = 0;
while (i < N)
{
int j = 0;
while (j < N)
{
if (counter[i][j] < 10000)
{
counter[i][j] = do_something(i, j, counter[i][j]);
}
j++;
}
i++;
}
或者,更通俗地说,但使用for
循环:
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (counter[i][j] < 10000)
{
counter[i][j] = do_something(i, j, counter[i][j]);
}
}
}
请注意,此代码使用 C99;你可以在循环之外声明它,它就变成了 C89 代码i
。j
此外,如果出于任何原因您需要i
或j
(或者更有可能两者都需要)在循环之后,则需要在循环外声明变量。
带有循环的第二种解决方案for
是更惯用的 C;循环非常适合这项for
工作,并且是您应该计划使用的,尤其是因为它将所有循环控件打包在一行中,这与while
在一行(循环外)有初始化代码的循环解决方案不同,另一个条件,以及第三行的重新初始化。
你可以做
for(int x = 0; x < N; x++) {
for(int y = 0; y < N; y++) {
if (Counter[x][y] < 10000){
//Do something with Counter[x][y]
}
}
}
这可以用指针很好地完成
while(true)
{
int* pEnd = &Counter[0][0] + N*N;
int* pCurrent = &Counter[0][0];
bool AnyLess = false;
while(pCurrent < pEnd && !AnyLess) { AnyLess |= *pCurrent++ < 10000; }
if(!AnyLess)
break;
}
如果您可以编写一个函数,如果所有元素都小于 10000 将返回 1 :
int check_array_lt(int row_count, int col_count, int** array, int value)
{
int i,j;
for(i=0;i<row_count;i++)
for(j=0;j<row_count;j++)
if (array[i][j]>=value)
return 0;
return 1;
}
然后使用它:
while( check_array_lt(N,N,counter,10000) ) {
do something
}
对于问题的第二个版本(不再是“每个元素 < 10000”,而是“至少一个元素 < 10000”):
int check_array_lt_atleast(int row_count, int col_count, int** array, int value)
{
int i,j;
for(i=0;i<row_count;i++)
for(j=0;j<row_count;j++)
if (array[i][j]<value)
return 1;
return 0;
}
正如 Jonathan Leffler 所说,这个解决方案只有在动态创建数组时才有效。如果 Counter 被声明为一个 d N 的数组#define
,那么我的解决方案会在 Jonathan 的解决方案中衰减。
使用嵌套的 for 循环
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(counter[i][j]<10000)
{
//Do something
}
}
那这个呢?
int flag=0;
for(i=o;i<n;i++)
{
for(j=o;j<n;j++)
{
if(counter[i][j]<10000)
//statements;
else
{
flag=1;
break;
}
}
if(flag==1)
break;
}
编辑问题的解决方案
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(counter[i][j]<10000)
{
//Do something
}else
goto OUT;
}
OUT:
printf("out of loops");
在我傲慢的意见中
去
语句是编程语言中最优雅的构造。如果有人想像比尔盖茨那样成为亿万富翁,他们必须在开发他们的开创性软件时使用大量的 goto。
尽管您没有要求 c#,但这是 c# 解决方案,因为它非常简单:
var Counter = new int[N,N];
while(Counter.Cast<int>.Any(i => i < 10000)) { dosomething(); }