Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/86: Рейтинг темы: голосов - 86, средняя оценка - 4.78
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
1

Выход из двух циклов сразу (без goto)

27.04.2010, 00:12. Просмотров 16422. Ответов 19
Метки нет (Все метки)

Здрасти, как можно выйти из нескольких циклов сразу? без goto.

C++
1
2
3
4
5
 for (int i=0; i<ROWS; i++)
    for (int j=0; j<COLS; j++){
        if (mas[i][j]==0) //то выход из обоих циклов
        std::cout<<mas[i][j];
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2010, 00:12
Ответы с готовыми решениями:

Повторно запустить оператор switch без goto, циклов и доп. функций
Как сабж? int intSum = 0; int main(void) { int intInteger01, intInteger02; int intSwitch;...

Выход из двух циклов for
Как можно выйти из двух циклов for ? break выйдет из второго цикла, а exit из процедуры. Можно...

Превращение кода с goto в код без goto
Помогите переписать это код без goto и потери производительности.А то мне кажется написано...

Сравнение двух массивов без вложенных циклов
Извиняюсь, что помещаю здесь этот вопрос, я сам по идее должен был догадаться, но никак не могу....

19
7 / 7 / 0
Регистрация: 09.01.2009
Сообщений: 41
27.04.2010, 00:23 2
return?
0
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:25  [ТС] 3
Цитата Сообщение от Mulat Посмотреть сообщение
return?
return требует число, а если поставлю число (return 1) то конец программе
0
9 / 9 / 2
Регистрация: 27.01.2010
Сообщений: 63
27.04.2010, 00:27 4
Оператор досрочного завершения break

break;

Пример Ex1_04. Суммирование до 10 чисел вводимой последовательности. При вводе отрицательного числа работа программы завершается.

C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
void main()
{ int s=0, i, k;
  puts("Input up to 10 numbers.");
  for (i=1; i<11; i++)
   { 
     scanf("%d",&k);
     if (k<0) break;  
     s+=k;
   }
  printf("Result = %d.\n",s);
0
Миниатюры
Выход из двух циклов сразу (без goto)  
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:30  [ТС] 5
Цитата Сообщение от krolex Посмотреть сообщение
break;
break - выход из одного цикла
0
9 / 9 / 2
Регистрация: 27.01.2010
Сообщений: 63
27.04.2010, 00:34 6
Цитата Сообщение от PointsEqual Посмотреть сообщение
break - выход из одного цикла
а сразу поставить второй break во внешнем цикле?)))
0
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:44  [ТС] 7
krolex, пример пожалуста можно?

Добавлено через 1 минуту
Цитата Сообщение от krolex Посмотреть сообщение
При вводе отрицательного числа работа программы завершается.
это к чему? мне же надо выход из циклов, а не завершение программы

Добавлено через 7 минут
Mulat, а код который выходит из 2-циклов с помощью return не напишеш?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10855 / 6732 / 1616
Регистрация: 25.07.2009
Сообщений: 12,470
27.04.2010, 00:46 8
PointsEqual, попробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
..
for (int i=0; i<ROWS; i++)
    for (int j=0; j<COLS; j++){
        if (mas[i][j]==0){
            i = ROWS;
            break;
        } //то выход из обоих циклов
        std::cout<<mas[i][j];
    }
}
...
2
9 / 9 / 2
Регистрация: 27.01.2010
Сообщений: 63
27.04.2010, 00:48 9
прост пример,где break срабатывает при такомто условии....
0
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:52  [ТС] 10
easybudda, как же я сам не додумался(((
только вот так лучше
C++
1
i = ROWS-1;
спасибо.

Добавлено через 56 секунд
Цитата Сообщение от krolex Посмотреть сообщение
прост пример,где break срабатывает при такомто условии....
срабатывает, но первый цикл продолжается ведь с новой итерации
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10855 / 6732 / 1616
Регистрация: 25.07.2009
Сообщений: 12,470
27.04.2010, 00:52 11
Цитата Сообщение от PointsEqual Посмотреть сообщение
только вот так лучше
это чем же? по сути лишнее действие выполняется...
0
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 01:01  [ТС] 12
Цитата Сообщение от easybudda Посмотреть сообщение
это чем же?
а вот так
C++
1
i = ROWS;
ошибка выскакивает у меня

Добавлено через 7 минут
еще читал про функцию longjmp, но так и не разобрался, че она увеличивает, кому чего передает)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10855 / 6732 / 1616
Регистрация: 25.07.2009
Сообщений: 12,470
27.04.2010, 01:04 13
Цитата Сообщение от PointsEqual Посмотреть сообщение
ошибка выскакивает у меня
странно, с чего бы?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
#define ROWS 3
#define COLS 4
int main(void){
    int m[ROWS][COLS] = {
        { 3, 4, 2, 1 },
        { 5, 7, 0, 9 },
        { 4, 2, 1, 3 }
    };
    int i, j;
    
    for ( i = 0; i < ROWS; ++i ){
        for ( j = 0; j < COLS; ++j ){
            if ( !m[i][j] ){
                i = ROWS;
                break;
            }
            printf("%d ", m[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}
Выход из двух циклов сразу (без goto)

Единственная опасность при маргинальных случаях типа ROWS = INT_MAX но для таких лучше в качестве индексов более ёмкие типы данных использовать...
1
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 01:09  [ТС] 14
easybudda, может из за этого ?)
C++
1
std::vector< std::vector<int> > mas(ROWS, std::vector<int>(COLS));
а твой код, да, компилится без проблем
0
3073 / 2394 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
27.04.2010, 05:47 15
Вообще это тот случай, когда goto как раз кстати. Но если дело принципа то заводишь отдельную переменную, которая будет выполнять роль флага. Если нужно прервать оба цикла из внутреннего, устанавливаешь флаг, делаешь бряк. Во внешнем цикле после внутреннего сразу проверяешь флаг, если установлен, то опять бряк.
2
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 12:57  [ТС] 16
Цитата Сообщение от kazak Посмотреть сообщение
флага
я пробовал, уж очень некрасиво было, но работало)

Добавлено через 32 секунды
Цитата Сообщение от kazak Посмотреть сообщение
Но если дело принципа
ну да, не хочется ставить мне его
0
3073 / 2394 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
27.04.2010, 13:27 17
Других вариантов нет. В неоторых случаях можно реторн применять, но только в функциях.
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10855 / 6732 / 1616
Регистрация: 25.07.2009
Сообщений: 12,470
28.04.2010, 00:54 18
PointsEqual, всё может быть проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <ctime>
 
int main(){
    const int ROWS = 5;
    const int COLS = 10;
 
    std::srand(std::time(NULL));
    std::vector<std::vector<int> > vec(ROWS, std::vector<int>(COLS));
    for ( std::vector<std::vector<int> >::iterator i = vec.begin(); i != vec.end(); ++i )
        for ( std::vector<int>::iterator j = (*i).begin(); j != (*i).end(); ++j )
            *j = std::rand() % 10;
 
    std::cout << "All matrix:" << std::endl;
    for ( std::vector<std::vector<int> >::iterator i = vec.begin(); i != vec.end(); ++i ){
        std::copy((*i).begin(), (*i).end(), std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
    }
 
    std::cout << "Before zero value:" << std::endl;
    for ( std::vector<std::vector<int> >::iterator i = vec.begin(); i != vec.end(); ++i ){
        std::vector<int>::iterator j = std::find((*i).begin(), (*i).end(), 0);
        std::copy((*i).begin(), j, std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
        if ( j != (*i).end() )
            break;
    }
 
    std::cout << std::endl;
    return 0;
}
Выход из двух циклов сразу (без goto)
1
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
28.04.2010, 01:03  [ТС] 19
easybudda, в коде ищется элемент 0, а потом если он найден коипируются все элементы до 0?

Добавлено через 2 минуты
а куда они копируются?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10855 / 6732 / 1616
Регистрация: 25.07.2009
Сообщений: 12,470
28.04.2010, 01:12 20
PointsEqual, не совсем так. std::find() возвращает итератор указывающий на третий параметр, или на конец списка, если его там нет. После чего в std::cout копируются разделённые пробелом элементы списка с итератора на начало списка до найденного итератора. После чего проверяется, равен ли найденный итератор итератору, указывающему на конец списка (это если элемент с нулевым значением не найден), если не равен, значит стоп-машина!
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2010, 01:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Критично ли использование goto при выходе из циклов?
#include &lt;conio.h&gt; #include &lt;iostream.h&gt; void main() { int a,n,i,s=0; cout&lt;&lt;&quot;\tInput...

Выход с циклов
Добрый день. Как можно выйти из такого цикла. Есть идея передать значение i через глобальную...

Выход из 2-ух циклов
у меня есть цикл for, а в нем еще 1 цикл for. После выхода из 1 цикла мне нужно выйти из второго...

Текстовый редактор. Выход с сохранением. Выход без сохранения.
привет! помогите, плиз: Создайте простейший текстовый редактор, в котором при выходе содержимое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.