这是一个菜鸟问题。我有一个名为Counter[N][N]
的数组,我想做类似的事情:
While (each element of Counter < 10000) {do something}
While (there exists an element of Counter < 10000) {do something}
在C中有一种简单的方法吗?
答案 0 :(得分:2)
此函数测试传入的计数器数组是否具有小于指定值的元素:
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中的可变维数组。它假设您有可用且包含的C99标题<stdbool.h>
。
这就是你要追求的吗?你提到'虽然'所以不清楚你是否需要使用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;你可以在循环之外声明i
和j
,它就变成了C89代码。此外,如果由于任何原因在循环后需要i
或j
(或更可能是两者),则需要在循环外声明变量。
具有for
循环的第二个解决方案是更惯用的C; for
循环非常适合这项工作,是您应该计划使用的,尤其是因为它将所有循环控件打包在一行上,这与具有初始化代码的while
循环解决方案不同在一行(在循环之外),条件在另一行,并重新初始化在第三行。
答案 1 :(得分:2)
你可以做到
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]
}
}
}
答案 2 :(得分:1)
这可以通过指针很好地完成
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;
}
答案 3 :(得分:1)
如果您可以编写一个函数,如果所有元素都小于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
}
对于问题的第二个版本(不再是'每个元素&lt; 10000',但'至少有一个元素&lt; 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被声明为#define
d N的数组,那么我的解决方案会在Jonathan的解析中衰减。
答案 4 :(得分:0)
使用嵌套for循环
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(counter[i][j]<10000)
{
//Do something
}
}
答案 5 :(得分:0)
这个怎么样?
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;
}
答案 6 :(得分:0)
解决EDITED问题
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。
答案 7 :(得分:0)
虽然你没有要求c#,但这是c#解决方案,因为它很容易:
var Counter = new int[N,N];
while(Counter.Cast<int>.Any(i => i < 10000)) { dosomething(); }