将“for”循环转换为“while”循环

时间:2018-03-10 16:05:08

标签: c for-loop while-loop

我目前正在处理我的学期工作,这是我的一部分代码。正如你所看到的那样,有一个带有if语句的for循环,我正在使用一个结构。我想把这个for循环转换成while循环,但我不太确定如何。也许有人可能会给我一个提示?

for(X = 1; X <= 100; X++) 
        {
          if(structure[X].number == -1)
          {
            structure[X].number = number;
            structure[X].first_info = position;
            structure[X].second_info = position;
            break;
          }
          if(structure[X].number == number)
          {
            if(structure[X].first_info == -1) 
              structure[X].first_info = position;
              structure[X].second_info = position;
              break;
          }
        }

6 个答案:

答案 0 :(得分:2)

您可以执行此操作以转换为while循环。但我建议您自己搜索并理解loop结构。

X=0;   /* for arrays indexing always starts at 0 */
while(X<100)
{
      if(structure[X].number == -1)
      {
        structure[X].number = number;
        structure[X].first_info = position;
        structure[X].second_info = position;
        break;
      }
      if(structure[X].number == number)
      {
        if(structure[X].first_info == -1)  /* adding braces */
        { 
          structure[X].first_info = position;
          structure[X].second_info = position;
          break;
        }
      }
      X++;
}

答案 1 :(得分:2)

所有基本循环都有三个组成部分:

  • 初始值设定项(分配给变量的初始值)
  • 条件(我们要检查的值以保持循环)
  • 修饰符(修饰我们的变量的东西)

使用for循环,你会注意到这里的所有三个:

for(X = 1; X <= 100; X++) 

括号中的第一个组件是初始化器(X = 1),下一个组件是条件(X <= 100),最后一个组件是修饰符(X ++)。

我们可以使用与while循环完全相同的组件。我们只是以不同的方式放置它们:

int x = 1; //our intializer
while (x <= 100){ //our condition
      if(structure[X].number == -1)
      {
        structure[X].number = number;
        structure[X].first_info = position;
        structure[X].second_info = position;
        break;
      }
      if(structure[X].number == number)
      {
          if(structure[X].first_info == -1){
              structure[X].first_info = position;
          }
          structure[X].second_info = position;
          break;
      }
      x++; //our modifier
   }

有了这个说法,C中的数组总是从索引0开始。我保持你的代码与你的代码相同,但一般来说无论你是使用for循环还是while循环,你都需要更改你的初始化程序和条件如下:

  • 您的初始化程序可能应为x = 0(不是x = 1)
  • 你的病情可能是x < 100或x <= 99(不是x <= 100)

这是因为包含100个项目的数组将具有0到99的索引。

还有两点:

通过像这样的索引数组进行计数时,代码通常更容易被读取为for循环而不是while循环。您是否有理由想要使用while循环?

根据您的缩进,不清楚最后一个if子句应包含哪些内容。我已经在你的最后一个if子句中添加了大括号以便于阅读,但也许其他行也应该包含在大括号中?

答案 2 :(得分:2)

for循环转换为while循环很容易,但for循环是一个更安全的构造,因为它将索引变量的初始化,测试和增量分组在一个清楚的地方。

顺便提一下,您的代码是错误的,嵌套的if语句可能不一致:

      if(structure[X].number == number)
      {
        if(structure[X].first_info == -1) 
          structure[X].first_info = position;
          structure[X].second_info = position;
          break;
      }

正确重新格式化后,它变为:

      if (structure[X].number == number) {
          if (structure[X].first_info == -1) 
              structure[X].first_info = position;
          structure[X].second_info = position;
          break;
      }
这是你的意图吗?对缩进更加小心,它有助于避免愚蠢的错误。

以下是已转换的代码,但请注意,与for语句相反,continue语句将绕过X++更新表达式。另外值得注意的是,X令人惊讶地使用了基于1的索引值。索引值为0,基于C,可以使用<比较而不是<=来检查数组大小。

X = 1;
while (X <= 100) {
    if (structure[X].number == -1) {
        structure[X].number = number;
        structure[X].first_info = position;
        structure[X].second_info = position;
        break;
    }
    if (structure[X].number == number) {
        if (structure[X].first_info == -1) 
            structure[X].first_info = position;
        structure[X].second_info = position;
        break;
    }
    X++;
}

如果structure有100个元素,则必须将代码更改为:

X = 0;
while (X < 100) {
    if (structure[X].number == -1) {
        structure[X].number = number;
        structure[X].first_info = position;
        structure[X].second_info = position;
        break;
    }
    if (structure[X].number == number) {
        if (structure[X].first_info == -1) 
            structure[X].first_info = position;
        structure[X].second_info = position;
        break;
    }
    X++;
}

答案 3 :(得分:0)

for循环构造将循环的索引变量初始化,循环条件和索引增量步骤分组到一个语句中。因此,为了将for循环转换为while循环,您只需将此分组解包为三个单独的语句。通常,您可以使用以下算法将任何for循环转换为while循环。像这样循环for

for(A;B;C) { /* where A,B,C are valid C statements (e.g., X=0), not variables */
   /* operational code */
}

使用A,B,C占位符中的相同语句转到以下while循环:

A;
while(B) {
   /* operational code */
   C;
}

使用此算法,您应该能够将任何for循环转换为等效的while循环。

答案 4 :(得分:-2)

我觉得这个很简单。也许我误解了你的情况,如果那时请原谅我:)。

我的方法是这样的:

var X = 1;
while (X<=100)
{
  if(structure[X].number == -1)
  {
    structure[X].number = number;
    structure[X].first_info = position;
    structure[X].second_info = position;
    break;
  }
  if(structure[X].number == number)
  {
    if(structure[X].first_info == -1) 
    structure[X].first_info = position;
    structure[X].second_info = position;
    break;
  }
  X++;
}

答案 5 :(得分:-2)

现有代码可以转换为以下内容

int x =1;
while(x!=100)
{
    //Your code here 
    x++;
}