3

这是一个菜鸟问题。我有一个名为的数组Counter[N][N],我想做类似的事情:

While (each element of Counter < 10000) {do something}

While (there exists an element of Counter < 10000) {do something}

有没有一种简单的方法可以在 C 中做到这一点?

4

8 回答 8

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 中的可变维度数组。它假定您有<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 代码ij此外,如果出于任何原因您需要ij(或者更有可能两者都需要)在循环之后,则需要在循环外声明变量。

带有循环的第二种解决方案for是更惯用的 C;循环非常适合这项for工作,并且是您应该计划使用的,尤其是因为它将所有循环控件打包在一行中,这与while在一行(循环外)有初始化代码的循环解决方案不同,另一个条件,以及第三行的重新初始化。

于 2012-09-22T15:36:20.137 回答
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]
        }
    }
}
于 2012-09-22T15:37:28.300 回答
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;

  }
于 2012-09-22T15:33:56.800 回答
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
}

对于问题的第二个版本(不再是“每个元素 < 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 的解决方案中衰减。

于 2012-09-22T15:40:39.200 回答
0

使用嵌套的 for 循环

for(i=0;i<N;i++)
for(j=0;j<N;j++){

if(counter[i][j]<10000)
{
//Do something
}
}
于 2012-09-22T15:36:00.707 回答
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;
        }
于 2012-09-22T15:36:03.513 回答
0

编辑问题的解决方案

    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。

于 2012-09-22T15:56:13.660 回答
0

尽管您没有要求 c#,但这是 c# 解决方案,因为它非常简单:

    var Counter = new int[N,N];
    while(Counter.Cast<int>.Any(i => i < 10000)) { dosomething(); } 
于 2012-09-22T16:02:00.360 回答