C while循环为整数数组

时间:2012-09-22 15:30:42

标签: c arrays while-loop

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

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

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

在C中有一种简单的方法吗?

8 个答案:

答案 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;你可以在循环之外声明ij,它就变成了C89代码。此外,如果由于任何原因在循环后需要ij(或更可能是两者),则需要在循环外声明变量。

具有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(); }