Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
#1

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

27.04.2010, 00:12. Просмотров 3367. Ответов 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];
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2010, 00:12     Выход из двух циклов сразу (без goto)
Посмотрите здесь:

C++ Критично ли использование goto при выходе из циклов?
Повторно запустить оператор switch без goto, циклов и доп. функций C++
Перевернуть число без помощи массивов циклов C++
Заполнение двумерного массива без вложенных циклов C++
C++ Запускается без cmd и закрывается сразу
Нужно переделать из двух циклов for в один цикл for C++
сумма элементов массива без циклов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mulat
7 / 7 / 0
Регистрация: 09.01.2009
Сообщений: 41
27.04.2010, 00:23     Выход из двух циклов сразу (без goto) #2
return?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:25  [ТС]     Выход из двух циклов сразу (без goto) #3
Цитата Сообщение от Mulat Посмотреть сообщение
return?
return требует число, а если поставлю число (return 1) то конец программе
krolex
9 / 9 / 1
Регистрация: 27.01.2010
Сообщений: 63
27.04.2010, 00:27     Выход из двух циклов сразу (без goto) #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);
Миниатюры
Выход из двух циклов сразу (без goto)  
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:30  [ТС]     Выход из двух циклов сразу (без goto) #5
Цитата Сообщение от krolex Посмотреть сообщение
break;
break - выход из одного цикла
krolex
9 / 9 / 1
Регистрация: 27.01.2010
Сообщений: 63
27.04.2010, 00:34     Выход из двух циклов сразу (без goto) #6
Цитата Сообщение от PointsEqual Посмотреть сообщение
break - выход из одного цикла
а сразу поставить второй break во внешнем цикле?)))
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:44  [ТС]     Выход из двух циклов сразу (без goto) #7
krolex, пример пожалуста можно?

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

Добавлено через 7 минут
Mulat, а код который выходит из 2-циклов с помощью return не напишеш?
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
27.04.2010, 00:46     Выход из двух циклов сразу (без goto) #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];
    }
}
...
krolex
9 / 9 / 1
Регистрация: 27.01.2010
Сообщений: 63
27.04.2010, 00:48     Выход из двух циклов сразу (без goto) #9
прост пример,где break срабатывает при такомто условии....
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:52  [ТС]     Выход из двух циклов сразу (без goto) #10
easybudda, как же я сам не додумался(((
только вот так лучше
C++
1
i = ROWS-1;
спасибо.

Добавлено через 56 секунд
Цитата Сообщение от krolex Посмотреть сообщение
прост пример,где break срабатывает при такомто условии....
срабатывает, но первый цикл продолжается ведь с новой итерации
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
27.04.2010, 00:52     Выход из двух циклов сразу (без goto) #11
Цитата Сообщение от PointsEqual Посмотреть сообщение
только вот так лучше
это чем же? по сути лишнее действие выполняется...
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 01:01  [ТС]     Выход из двух циклов сразу (без goto) #12
Цитата Сообщение от easybudda Посмотреть сообщение
это чем же?
а вот так
C++
1
i = ROWS;
ошибка выскакивает у меня

Добавлено через 7 минут
еще читал про функцию longjmp, но так и не разобрался, че она увеличивает, кому чего передает)
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
27.04.2010, 01:04     Выход из двух циклов сразу (без goto) #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 но для таких лучше в качестве индексов более ёмкие типы данных использовать...
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 01:09  [ТС]     Выход из двух циклов сразу (без goto) #14
easybudda, может из за этого ?)
C++
1
std::vector< std::vector<int> > mas(ROWS, std::vector<int>(COLS));
а твой код, да, компилится без проблем
kazak
 Аватар для kazak
3030 / 2351 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
27.04.2010, 05:47     Выход из двух циклов сразу (без goto) #15
Вообще это тот случай, когда goto как раз кстати. Но если дело принципа то заводишь отдельную переменную, которая будет выполнять роль флага. Если нужно прервать оба цикла из внутреннего, устанавливаешь флаг, делаешь бряк. Во внешнем цикле после внутреннего сразу проверяешь флаг, если установлен, то опять бряк.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 12:57  [ТС]     Выход из двух циклов сразу (без goto) #16
Цитата Сообщение от kazak Посмотреть сообщение
флага
я пробовал, уж очень некрасиво было, но работало)

Добавлено через 32 секунды
Цитата Сообщение от kazak Посмотреть сообщение
Но если дело принципа
ну да, не хочется ставить мне его
kazak
 Аватар для kazak
3030 / 2351 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
27.04.2010, 13:27     Выход из двух циклов сразу (без goto) #17
Других вариантов нет. В неоторых случаях можно реторн применять, но только в функциях.
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
28.04.2010, 00:54     Выход из двух циклов сразу (без goto) #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)
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
28.04.2010, 01:03  [ТС]     Выход из двух циклов сразу (без goto) #19
easybudda, в коде ищется элемент 0, а потом если он найден коипируются все элементы до 0?

Добавлено через 2 минуты
а куда они копируются?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2010, 01:12     Выход из двух циклов сразу (без goto)
Еще ссылки по теме:

Вставка одного вектора в другой через один без циклов C++
C++ Вычислить сумму следующего ряда без вложенных циклов
Одновременная работу двух циклов openMP C++
C++ Страуструп. Сортировка трех чисел .Как сделать проще код без циклов и массивов?
C++ Как скопировать массив в вектор одной строкой без использования циклов и алгоритмов STL?

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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
28.04.2010, 01:12     Выход из двух циклов сразу (без goto) #20
PointsEqual, не совсем так. std::find() возвращает итератор указывающий на третий параметр, или на конец списка, если его там нет. После чего в std::cout копируются разделённые пробелом элементы списка с итератора на начало списка до найденного итератора. После чего проверяется, равен ли найденный итератор итератору, указывающему на конец списка (это если элемент с нулевым значением не найден), если не равен, значит стоп-машина!
Yandex
Объявления
28.04.2010, 01:12     Выход из двух циклов сразу (без goto)
Ответ Создать тему
Опции темы

Текущее время: 07:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru