【问题标题】:C While loop for an array of integersC While 循环用于整数数组
【发布时间】:2012-09-14 17:41:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可以使用双重嵌套循环来检查,然后你可以使用if来做某事。
  • @Francisco:看我的帖子,它会给你答案
  • 您现在是否要求“如果 Counter 中的单个元素小于 10000”?
  • 这正是我的意思。
  • 好吧,我不确定这是什么应用。为每个 while 循环循环一个 2D 数组可能不是最好的主意。如果有一个元素,你打算做什么?如果您计划操作元素以使其小于或大于 10000,则需要像我的示例中那样使用 FOR 循环。这样你就只会遍历数组一次。

标签: c arrays while-loop


【解决方案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
}

对于第二个版本的问题(不再是“每个元素

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 被声明为带有 #defined N 的数组,那么我的解决方案会在 Jonathan 的解决方案中衰减。

【讨论】:

  • “所有小于 10000 的元素”不同于“至少有一个元素小于 10000”。
  • @JonathanLeffler 对……这只是对 OP 的“初稿”的回答。我会更新我的帖子。 ...完成:)
  • 我知道我是个害虫,但是... int **array 参数与 int array[][N] 参数非常不同。前者需要一个指针数组,每个指针指向一个int数组(的第一个元素);第二个需要一个二维数组。如果您尝试使用实际的二维数组编写代码,我认为您会遇到问题,尤其是当数组中的大多数值为零时。
  • @JonathanLeffler 根本不是害虫,这就是我喜欢这里的地方,我总能学到一些东西。我修改了我的答案以反映您的观点。谢谢 :)
【解决方案2】:

这个怎么样?

 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;
        }

【讨论】:

  • 谢谢,如果我的问题是第一个问题,那就可以了,但我不是那个意思,抱歉。
  • 它检查是否存在值为1000的元素,如果存在则继续工作,如果它的值> 1000则打破循环
  • break 语句需要一些解释。如果元素小于 1000(注意问题说的是 10000,但是朋友之间的数量级是多少),你做一些陈述并打破;否则,你无论如何都会打破。这不是一个内部循环。它最多迭代一次。
  • 设置标志...非常好的机制来摆脱多个循环..学到了一些新东西..thanx..upvoted
  • 修改后的代码仍然表现得不正统。我认为if (flag == 1) break; 片段应该在内部循环的大括号之后;那么它会起作用。将整个东西打包成一个函数可能会更好。该操作可能嵌入也可能不嵌入函数中(如果不是,代码可以成为通用目的;如果是,它与现有的利基紧密耦合,并且在重构之前不容易重用)。您可能需要也可能不需要通过指针参数返回找到的第一个低于限制的元素的位置。
【解决方案3】:

该函数测试传入的计数器数组是否有小于指定值的元素:

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 标头 &lt;stdbool.h&gt; 可用并包含在内。


这就是你所追求的吗?你提到了'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;你可以在循环之外声明ij,它就变成了C89 代码。此外,如果出于某种原因在循环之后需要ij(或者更有可能两者都需要),则需要在循环外声明变量。

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

【讨论】:

  • @Francisco:您可能会注意到,通过将代码放入函数中,当第一个值小于您的限制被发现,然后立即返回。唯一的缺点是将动作硬连接到其他通用例程中。此外,如果您需要知道哪个元素小于限制,则需要一对has_element_less_than() 函数的输出(指针)参数。
【解决方案4】:

这可以用指针很好地完成

  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;

  }

【讨论】:

  • 我认为这不是 OP 所要求的,我认为他们希望循环遍历 Counter 中小于 10000 的每个元素,而不是循环遍历前 10000 个元素。
  • 指针非常好,如果您想快速完成并使用简短的源代码,如果您想在没有指针的情况下完成,请查看其他答案
  • @mhasan 不应该。他们没那么糟糕。你最终将不得不学习它们......
  • @mhasan:OP 要求在 C 中提供一种简单的方法。当出现数组时,使用指针玩游戏几乎总是答案。
  • 但是当今最流行的语言,如 Java、C# 没有指针。无论如何,我将在考试中介绍指针概念,然后深入研究 OOP。这就是现在所有行动的地方。还是我错了?
【解决方案5】:

虽然您没有要求 c#,但这里是 c# 解决方案,因为它会很简单:

    var Counter = new int[N,N];
    while(Counter.Cast<int>.Any(i => i < 10000)) { dosomething(); } 

【讨论】:

    【解决方案6】:

    已编辑问题的解决方案

        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。

    【讨论】:

    • 假设 counter[0][0] 包含 1000000 并且每个其他值都是 0。您的代码在它查看的第一个元素上跳出循环,忽略所有其他表明需要完成处理的元素。请以更正统的方式缩进你的循环。另请参阅 McConnell 的“代码完成”和GOTO still considered harmful?,了解 GOTO 的许多讨论。
    【解决方案7】:

    你可以的

    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]
            }
        }
    }
    

    【讨论】:

      【解决方案8】:

      使用嵌套的for循环

      for(i=0;i<N;i++)
      for(j=0;j<N;j++){
      
      if(counter[i][j]<10000)
      {
      //Do something
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 2021-01-19
        • 2014-01-10
        相关资源
        最近更新 更多