Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
#1

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

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

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

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

Линейный массив, рекурсия без циклов
Дан линейный массив. Реализовать рекурсивную функцию, печатающую элементы...

Одновременная работу двух циклов openMP
как можно сделать так чтобы два цикла работали одновременно? #pragma omp...

Найти сумму элементов массива без циклов
нужно написать функцию написания подсчета суммы элементов массива не используя...

Сумма ряда без циклов (через рекурсию)
Учусь работать с рекурсией, и застрял на самой реализации суммы через рекурсию...

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

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

Добавлено через 7 минут
Mulat, а код который выходит из 2-циклов с помощью return не напишеш?
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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
krolex
9 / 9 / 2
Регистрация: 27.01.2010
Сообщений: 63
27.04.2010, 00:48 #9
прост пример,где break срабатывает при такомто условии....
0
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 00:52  [ТС] #10
easybudda, как же я сам не додумался(((
только вот так лучше
C++
1
i = ROWS-1;
спасибо.

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

Добавлено через 7 минут
еще читал про функцию longjmp, но так и не разобрался, че она увеличивает, кому чего передает)
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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
PointsEqual
ниначмуроФ
838 / 522 / 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
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
27.04.2010, 05:47 #15
Вообще это тот случай, когда goto как раз кстати. Но если дело принципа то заводишь отдельную переменную, которая будет выполнять роль флага. Если нужно прервать оба цикла из внутреннего, устанавливаешь флаг, делаешь бряк. Во внешнем цикле после внутреннего сразу проверяешь флаг, если установлен, то опять бряк.
2
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
27.04.2010, 12:57  [ТС] #16
Цитата Сообщение от kazak Посмотреть сообщение
флага
я пробовал, уж очень некрасиво было, но работало)

Добавлено через 32 секунды
Цитата Сообщение от kazak Посмотреть сообщение
Но если дело принципа
ну да, не хочется ставить мне его
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
27.04.2010, 13:27 #17
Других вариантов нет. В неоторых случаях можно реторн применять, но только в функциях.
2
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
28.04.2010, 01:03  [ТС] #19
easybudda, в коде ищется элемент 0, а потом если он найден коипируются все элементы до 0?

Добавлено через 2 минуты
а куда они копируются?
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
28.04.2010, 01:12 #20
PointsEqual, не совсем так. std::find() возвращает итератор указывающий на третий параметр, или на конец списка, если его там нет. После чего в std::cout копируются разделённые пробелом элементы списка с итератора на начало списка до найденного итератора. После чего проверяется, равен ли найденный итератор итератору, указывающему на конец списка (это если элемент с нулевым значением не найден), если не равен, значит стоп-машина!
1
28.04.2010, 01:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2010, 01:12
Привет! Вот еще темы с решениями:

Перестановка значений в векторе без использования циклов
Написать функцию, которая принимает вектор из целых чисел в качестве параметра...

Перевернуть число без помощи массивов циклов
перевернуть число без помощи массивов циклов и тд. т.е stdio.h ,если это вообще...

Заполнение двумерного массива без вложенных циклов
Как такое можно реализовать? Нужно каким-то образом плясать от индекса, как мне...

Нужно переделать из двух циклов for в один цикл for
Народ у меня код считает сумму введенных элементов массив до последнего...


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

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

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