2014-01-29 2 views
0

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

void Bubblesort (char ulist[27], char slist[27], int n) 
{ 
int i,j; 
char temp; 
for (i=1;i<=n;i++) 
{ 
    slist[i] = ulist[i]; 
    for (j=1; j <= n-1 ;j++) 
    { 
     for (i = 1; i <=n-j;i++) 
     {  
      if (slist[i] < slist[i+1]) 
      { 

       temp = slist[i]; 
       slist[i] = slist[i+1]; 
       slist[i+1] = temp; 
      } 

      } 
     } 
    } 
} 

В то время как без скобок; функция достигает конца.

void Bubblesort (char ulist[27], char slist[27], int n) 
{ 
int i,j; 
char temp; 
for (i=1;i<=n;i++) 
    slist[i] = ulist[i]; 
    for (j=1; j <= n-1 ;j++) 
     for (i = 1; i <=n-j;i++) 
      if (slist[i] < slist[i+1]) 
      { 
       cout << "Step 4"; 
       temp = slist[i]; 
       slist[i] = slist[i+1]; 
       slist[i+1] = temp; 
      } 



} 

Может кто-нибудь объяснить причину этого?

+1

И ваши самые внутренние и внешние контуры 'for' используют одну и ту же индексную переменную' i'. Для 3 циклов используйте 3 переменные, например. 'i',' j', 'k'. – Matt

ответ

2

Вы изменили семантику цикла, и ваши отступы вводят в заблуждение.

void Bubblesort (char ulist[27], char slist[27], int n) 
{ 
    int i,j; 
    char temp; 
    for (i=1;i<=n;i++) 
     slist[i] = ulist[i]; 
     for (j=1; j <= n-1 ;j++) 
      for (i = 1; i <=n-j;i++) 
       if (slist[i] < slist[i+1]) 
       { 
        cout << "Step 4"; 
        temp = slist[i]; 
        slist[i] = slist[i+1]; 
        slist[i+1] = temp; 
       } 
} 

должны быть отступы, как

void Bubblesort (char ulist[27], char slist[27], int n) 
{ 
    int i,j; 
    char temp; 
    for (i=1;i<=n;i++) 
     slist[i] = ulist[i]; 

    for (j=1; j <= n-1 ;j++) 
     for (i = 1; i <=n-j;i++) 
      if (slist[i] < slist[i+1]) 
      { 
       cout << "Step 4"; 
       temp = slist[i]; 
       slist[i] = slist[i+1]; 
       slist[i+1] = temp; 
      } 
} 
1

Проблема в том, что без скобок вы фактически не гнездились для петель. Рассмотрим

for (i=1;i<=n;i++) 
    slist[i] = ulist[i]; 
    for (j=1; j <= n-1 ;j++) 

Без скобок только slist[i] = ... линия выполняет как часть первого для цикла. Второй цикл цикла выполняется как полностью отдельный объект

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

0

Эти две функции имеют разные алгоритмы. В первой функции у вас три вложенные петли. И в третьем цикле используется один и тот же элемент управления «i» как первый цикл. Таким образом, циклы бесконечны, поскольку после третьего цикла i всегда равен 2.

Во второй функции первый цикл представляет собой отдельный цикл, который является двумя другими петлями, не вложенными в первый цикл. Таким образом, изменяющаяся управляющая переменная «i» в третьем цикле не влияет на первый цикл.

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