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

выход из 2-ух циклов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:12     выход из 2-ух циклов #1
Здрасти, как можно выйти из нескольких циклов сразу? без 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     выход из 2-ух циклов
Посмотрите здесь:

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

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

Добавлено через 7 минут
Mulat, а код который выходит из 2-циклов с помощью return не напишеш?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.04.2010, 00:46     выход из 2-ух циклов #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     выход из 2-ух циклов #9
прост пример,где break срабатывает при такомто условии....
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:52  [ТС]     выход из 2-ух циклов #10
easybudda, как же я сам не додумался(((
только вот так лучше
C++
1
i = ROWS-1;
спасибо.

Добавлено через 56 секунд
Цитата Сообщение от krolex Посмотреть сообщение
прост пример,где break срабатывает при такомто условии....
срабатывает, но первый цикл продолжается ведь с новой итерации
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.04.2010, 00:52     выход из 2-ух циклов #11
Цитата Сообщение от PointsEqual Посмотреть сообщение
только вот так лучше
это чем же? по сути лишнее действие выполняется...
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 01:01  [ТС]     выход из 2-ух циклов #12
Цитата Сообщение от easybudda Посмотреть сообщение
это чем же?
а вот так
C++
1
i = ROWS;
ошибка выскакивает у меня

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

Добавлено через 32 секунды
Цитата Сообщение от kazak Посмотреть сообщение
Но если дело принципа
ну да, не хочется ставить мне его
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
27.04.2010, 13:27     выход из 2-ух циклов #17
Других вариантов нет. В неоторых случаях можно реторн применять, но только в функциях.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
28.04.2010, 00:54     выход из 2-ух циклов #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;
}
выход из 2-ух циклов
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
28.04.2010, 01:03  [ТС]     выход из 2-ух циклов #19
easybudda, в коде ищется элемент 0, а потом если он найден коипируются все элементы до 0?

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

Операторы циклов C++
C++ Программирование циклов
C++ Организация циклов в С

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

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

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