Скобы, вызывающие бесконечный цикл

0

Скобки, связанные со следующими тремя циклами For, заставляют функцию циклически вращаться,

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 .
Теги:
for-loop
infinite-loop
brackets

3 ответа

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. Второй цикл for выполняет как полностью отдельный объект

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню