Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывание внешнего - помеченного цикла 
:(
    Опции темы
korob2001
Дата 30.11.2010, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Всем привет!
Столкнулся с такой проблемой.
У меня есть два цикла один из них вложенный. Внутри вложенного цикла через switch проверяется некоторое условие, при наступлении одного из условий в switch определяется необходим ли дальнейши сбор информации, т.е. в одном из case переключателя находится проверка условия через if. Врочем наверное будет всё гораздо понятнее, если посмотреть на код.
Код

do { // Внешний цикл - Начало
    do { // Внутренний цикл - Начало
        switch (.....) {
            case 0:
                // Собираем информацию
                break;
            case 1:
                // Собираем информацию
                break;
            case 2:
                // Проверяем нужно ли продолжать сбор информации
                if (.....) {
                    // Продолжаем сбор
                } else {
                    // Сбор информации необходимо прервать, т.е. необходимо досрочно прервать внутренний цикл с помощью break
                    // или же через continue перейти на следующую итерацию внешнего цикла
                    break INNER:
                }
                break;
            case 3:
                // Собираем информацию
                break;
        }
    } while (....);  // Внутренний цикл - Конец
} while (.....); // Внешний цикл - Конец

Собственно из коментариев понятно, что в блоке else необходимо сделать либо прерывание внутреннего цикла, либо досрочно перейти к следующей итерации внешнего цикла. С прерыванием внутреннего цикла не возникло бы проблем, если заменить переключатель switch на условную конструкцию if ... else if ... else if ... else, так как в моём случае break прерывает не цикл, do .. while, а переключатель switch. Логически здесь подходит именно switch. Я хотел сказать, что не нужно предлагать заменить switch на if ... else if ... else if ... else.
Я знаю что нужно, но не понял как это делается в С#. В Java я бы пометил внутренний цикл, после чего прервал бы его по метке, в C# с этим возникли проблемы. :((((((

Вот, как бы это выглядело на Java:
Код

do { // Внешний цикл - Начало
    INNER: do { // Внутренний цикл - Начало
        switch (.....) {
            case 0:
                // Собираем информацию
                break;
            case 1:
                // Собираем информацию
                break;
            case 2:
                // Проверяем нужно ли продолжать сбор информации
                if (.....) {
                    // Продолжаем сбор
                } else {
                    // Сбор информации необходимо прервать, т.е. необходимо досрочно прервать внутренний цикл с помощью break
                    // или же через continue перейти на следующую итерацию внешнего цикла
                    break INNER;
                }
                break;
            case 3:
                // Собираем информацию
                break;
        }
    } while (....);  // Внутренний цикл - Конец
} while (.....); // Внешний цикл - Конец

Так же можно было бы добавить и метку к внешнему циклу например OUTER, после чего при наступлении условия перейти к следующей итерации с помощью continue OUTER, предварительно ункрементировав переменную внешнего цикла. Вобщем мне нужно добиться идентичного результата, но только в C#. Нашёл в Google, что это нужно делать с помощью goto, но пока не разобрался, каким образом goto может прервать цикл. Попутно продолжу поиски.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
jonie
Дата 30.11.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



пример для goto:
Код

int length = 10;
            for (int i = 0; i < length; i++)
            {
            nextLoop:
                for (int j = 0; j < length; j++)
                {
                    goto nextLoop;
                }
            }


а вообще наверно стоит обернуть в функию и делать return


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
i2m
Дата 30.11.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 4.5.2010

Репутация: нет
Всего: 1



Если я вас правильно понял, то наверное так.

Код

do { // Внешний цикл - Начало
    do { // Внутренний цикл - Начало
        switch (.....) {
            case 0:
                // Собираем информацию
                break;
            case 1:
                // Собираем информацию
                break;
            case 2:
                // Проверяем нужно ли продолжать сбор информации
                if (.....) {
                    // Продолжаем сбор
                } else {
                    // Сбор информации необходимо прервать, т.е. необходимо досрочно прервать внутренний цикл с помощью break
                    // или же через continue перейти на следующую итерацию внешнего цикла
                    goto EXIT:
                }
                break;
            case 3:
                // Собираем информацию
                break;
        }
    } while (....);  // Внутренний цикл - Конец
EXIT: // Вышли из внутреннего цикла, или поставить куда точно нужно прыгнуть, можно выше объявления, например перед do
} while (.....); // Внешний цикл - Конец


PS согласен с jonie, вообще goto зло, если возможно сделать без него, то нужно делать.

Это сообщение отредактировал(а) i2m - 30.11.2010, 18:32
PM MAIL   Вверх
Экскалупатор
Дата 30.11.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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

[color=red]bool flag;[/color]
do { // Внешний цикл - Начало
[color=red]flag = true;[/color]
    do { // Внутренний цикл - Начало
        switch (.....) {
            case 0:
                // Собираем информацию
                break;
            case 1:
                // Собираем информацию
                break;
            case 2:
                // Проверяем нужно ли продолжать сбор информации
                if (.....) {
                    // Продолжаем сбор
                } else {
[color=red]flag = false;//когда нужно что бы эта итерация была последней[/color]
                    // Сбор информации необходимо прервать, т.е. необходимо досрочно прервать внутренний цикл с помощью break
                    // или же через continue перейти на следующую итерацию внешнего цикла
                    break INNER:
                }
                break;
            case 3:
                // Собираем информацию
                break;
        }
    } while ([color=red](какое то условие цикла)&&(flag)[/color]);  // Внутренний цикл - Конец
} while (.....); // Внешний цикл - Конец


Добавлено через 1 минуту и 19 секунд
что то теги цвета не срабатывают, но думаю что мысль понятна...
PM MAIL ICQ   Вверх
korob2001
Дата 1.12.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Большое спасибо, всем. Использовал прерывание с меткой которое предложил i2m.

boolean флаг в данном контексте лишняя переменная + лишняя проверка на каждой итерации. Собственно метки для того и нужны.

Цитата(i2m @  30.11.2010,  15:26 Найти цитируемый пост)
PS согласен с jonie, вообще goto зло, если возможно сделать без него, то нужно делать.

Не думаю, что с помощью этого goto получится сделать скачёк в любую точку программы. Злом goto считается именно из-за этого.
Насколько я понял, он вообще в C# применяется для прерывания внешних циклов и скачков по конструции switch.

Это сообщение отредактировал(а) korob2001 - 1.12.2010, 11:25


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.