2013-10-25 2 views
0

этот код создает мне бесконечный цикл я хочу выполнить несколько шагов получать дебютный номер 0, ADN печать, сколько шагов он Наталья принимает программу, чтобы сделать этоБесконечный цикл While Loop В C

int debut,i; 
    printf("de (>= 1) ? "); 
    do 
    {    
     scanf("%d",&debut); 
    } 
    while (debut < 1); 

    int fin; 
    printf("a >= << <<) ? "); 
    do 
    {    
     scanf("%d",&fin) ; 
    } 
    while (fin < debut); 

    for (;debut<=fin;debut++){ 
     i=0; 
     while(debut!=0) 
     { 
      if(debut%3==0) 
      { 
       debut+=4; 
      } 
      else if (debut%3!=0 && debut%4==0){ 
       debut/=2; 
      } 
      else if (debut%3!=0 && debut%4!=0) 
      { 
       debut-=1; 
      } 
      i+=1; 

     } 
     printf("%d\n->%d",debut,i);  
     } 
+0

Если проблема устранена, вы должны отметить один из ответов, как принято. – nhgrif

ответ

2
for(debut<=fin;debut++) { 
    while(debut!=0) { 
     //do stuff 
    } 
    //debut == 0, debut <= fin 
} 

Хорошо, массивное редактирование моего ответа. Я искал неправильный цикл.

Для того, чтобы ввести петлю for, debut должно быть <=fin. В любое время, когда fin - >0, и петля for введена, вы застряли в цикле for.

Вы застреваете в цикле while до debut == 0. Возврат true. До тех пор, как debut++ <= fin, вы застряли в цикле for. Вы изменяете debut в цикле while, но fin остается того же значения. Таким образом, петля while уменьшает debut до 0, а цикл for каждый раз переходит к следующей итерации.

+1

неправда (в теории): есть дебют - = 1. Делать так 2^32 раза или около того должен это делать – Thomas

+0

Я не думаю, что вы понимаете проблему здесь. Это похоже на последовательность syracuse. Нет доказательств бесконечной петли или нет. Переход на> 0 не должен делать ничего – Thomas

+0

, даже при этом этот код все еще не работает –

2

Короткий ответ: Я подозреваю, что вы намеренным время цикла для работы на копии из debut, а не сам debut.


  • Давайте предположим, что debut == 3 и fin == 5.
  • Выполняем первую итерацию цикла for, которая включает в себя полное прохождение цикла while.
  • После цикла while у нас есть debut == 0, fin == 5 и i == 12.
  • Затем мы печатаем некоторую информацию.
  • Однако теперь мы снова ищем в цикле for. debut был уменьшен до 0, из-за работы, которую мы сделали, и поэтому каждый раз, когда мы запускаем этот код, в конце итерации цикла for, у нас будет debut == 0, что приведет к тому, что цикл for никогда не выйдет ,

Это может быть более полезным, чтобы показать это инлайн с кодом ...

for (;debut<=fin;debut++){ 
    // Let's assume we get here. We can assume some sane debut and fin values, 
    // such as the 3 and 5 suggested above. 

    int i=0; 
    while (debut != 0) { 
     // Stuff happens that makes debut go to zero. 
    } 

    // To get to this point, we __know__ that debut == 0. 
    // We know this because that's the condition in the while loop. 

    // Therefore, when we do the comparison in the for loop above for the 
    // next iteration, it will succeed over and over again, because debut 
    // has been changed to zero. 

    printf("%d->%d\n",debut,i); 
} 

Лично я подозреваю, что вы ищете число итераций для набора чисел. Это для меня звучит как идеальное место для использования функции. Код, который я бы предложил, будет выглядеть примерно так.

#include <stdio.h> 

int iterations(int debut) { 
    int i = 0; 

    while(debut!=0) 
    { 
     if(debut%3==0) 
     { 
      debut+=4; 
     } 
     else if (debut%3!=0 && debut%4==0){ 
      debut/=2; 
     } 
     else if (debut%3!=0 && debut%4!=0) 
     { 
      debut-=1; 
     } 

     i+=1; 
    } 

    return i; 
} 

int main() { 
    int debut = 3; 
    int fin = 5; 

    for (;debut<=fin;debut++) { 
     printf("%d -> %d\n", debut, iterations(debut)); 
    } 
} 

Кроме того, только ради отметить то, пожалуйста, обратите внимание, что в примере кода, который я дал в конце концов, я удалил все входные Scanf кода. Это не связано с вашей реальной проблемой, и это уменьшает общий объем кода, который каждый должен сканировать, чтобы понять, где ваша проблема.

+0

Ударьте меня на удар! :) – mocj

Смежные вопросы