Видеть, произойдет ли бесконечный цикл в C ++ - PullRequest
0 голосов
/ 14 сентября 2009

Приведет ли следующий код к бесконечному циклу?

  x=0;
  y=0;

  while(x<100)
  {
    minnum=100;
    maxnum=100;
    while(y<150)
    {
    if(random[x][y]<minnum)
      {
      minnum=random[x][y];
      minX=x;
      minY=y;
      y++;
      }
    else if(random[x][y]>maxnum)
      {
      maxnum=random[x][y];
      maxX=y;
      maxY=y;
      y++;
      }
    }
    x++;
    y=0;
  }  

Ответы [ 11 ]

9 голосов
/ 14 сентября 2009

Если оба значения random[x][y]<minnum и random[x][y]>maxnum равны false, вы никогда не выйдете из внутреннего цикла. Точнее, если random[x][y] == 100, то вы первый раз выпьете.

Как связанный вопрос, какое поведение вы видите, когда отлаживаете источник, который вы опубликовали?

2 голосов
/ 15 сентября 2009

Было много хороших ответов на оригинальный вопрос, но даже при этом ни один из них не сработает! Это связано с тем, что во втором блоке «если» есть должным образом сохраненная опечатка - следует читать

maxX = x; // not y!
maxY = y;
1 голос
/ 15 сентября 2009

Это будет вводить бесконечный цикл каждый раз, когда значение вашего массива находится между minnum и maxnum. Первоначально, это только в 100. Один второй проход, это разница между минимальным и максимальным значением, которое вы видели. Например, если значение равно 3000, у вас будет minnum 100 и maxnum 3000. Теперь любое число от 100 до 3000 (включительно) вызовет бесконечный цикл. Смотрите другие ответы о том, как исправить код.

Jacob

1 голос
/ 14 сентября 2009

Если ни один из if и else if во внутреннем цикле не удовлетворен, вы никогда не увеличиваете y, что делает этот внутренний цикл бесконечным. Похоже, что y++ должно быть вне всех условных операторов.

0 голосов
/ 14 сентября 2009

Интересно, должны ли преподаватели в университетах знать, что студенты могут выходить в интернет и получать ответы?

В любом случае, как все говорили, если random [x] [y] == 100, то это всегда будет во внутреннем цикле.

0 голосов
/ 14 сентября 2009

Если вы замените циклы , в то время как циклы на для циклов , ваш код будет более понятным, менее подверженным ошибкам, и это решит проблему с бесконечным циклом:

minnum=100;
maxnum=100;
for (int x = 0; x<100; x++)
{
  for(int y=0; y<150; y++)
  {
    if(random[x][y]<minnum)
    {
      minnum=random[x][y];
      minX=x;
      minY=y;
    }
    else if(random[x][y]>maxnum)
    {
      maxnum=random[x][y];
      maxX=y;
      maxY=y;
    }
  }
}
0 голосов
/ 14 сентября 2009

Проблема в том, что вы повышаете y только тогда, когда случайное число меньше minnum или больше maxnum, создавая проблему там, где их нет.

Но почему вы продвигаете это, только если эти условия возникают? Вы хотите, чтобы вас повысили в должности независимо от этих условий.

Возможно, вы захотите изменить на:

while(y<150)
{
if(random[x][y]<minnum)
  {
  minnum=random[x][y];
  minX=x;
  minY=y;
  }
else if(random[x][y]>maxnum)
  {
  maxnum=random[x][y];
  maxX=y;
  maxY=y;
  }
  y++;
}

Таким образом, y и x всегда повышаются.

0 голосов
/ 14 сентября 2009

Вот мое видение этого цикла - некоторые задаются вопросом о том, как писать «хороший» код (с моей точки зрения - я действительно не гуру в программировании) - не обязательно следовать им, но я думаю, что они не так уж и плохо.

  // It's a good rule - to initialize minimum and maximum with one
  // (any) element from the array you will be working with
  minnum=random[0][0];
  maxnum=random[0][0];

  // This is my hamble opinion but I'll prefer to have variables for array sizes
  sizeX=100;
  sizeY=150;

  // Cannot you use for instead of while?
  for(x = 0; x < sizeX; ++x)
      for(y = 0; y < sizeY; ++y)
      {
          if(random[x][y] < minnum)
          {
              minnum = random[x][y];
              minX = x;
              minY = y;
          }
          else if(random[x][y] > maxnum)
          {
              maxnum = random[x][y];
              maxX = x;
              maxY = y;
          }
    }
0 голосов
/ 14 сентября 2009

Если random[x][y] равно точно 100, это будет бесконечным циклом, поскольку в этом случае он ничего не делает.

0 голосов
/ 14 сентября 2009

Если minnum <= random[x][y] <= maxnum, то y никогда не увеличивается во внутреннем цикле. Вероятно, вам следует увеличить y в любом случае, даже если ни одно из условий if не выполнено. Лучше всего переместить y++ за пределы if с перед закрывающей скобкой цикла while.

Вы также можете использовать for -loops для перебора возможных значений x и y, что уменьшит вероятность таких ошибок.

...