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

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

Войти
Регистрация
Восстановить пароль
 
 
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
#1

Уменьшение количества циклов - C++

21.06.2014, 22:47. Просмотров 511. Ответов 19
Метки нет (Все метки)

Здрастье всем. Вопрос такой.

Есть 5 вложенных циклов и тело цикла.

C++
1
2
3
4
5
6
for()
for()
for()
for()
for()
{тело цикла}
Иногда, нужно не 5, а всего лишь 4 вложенных цикла. Тогда просто вручную
строчку с 5-ым циклом закомментироваваю слешом //.
Получается
C++
1
2
3
4
5
6
for()
for()
for()
for()
//for()
{тело цикла}
Можно ли, как то программно это оформить?
Пробовал continue; Но тогда тело цикла не выполняется.
Подскажите, кто знает.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2014, 22:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Уменьшение количества циклов (C++):

Вычислить произведение количества отрицательных и количества положительных элементов одномерного массива - C++
Указатели. Вычислить произведение количества отрицательных и количества положительных элементов одномерного массива. Использовать функцию...

Функции вычисления количества дней заданного месяца и количества месяцев между двумя датами - C++
Область first - положительное целое число , год; second - положительное целое число от 1 до 12 - номер месяца. Реализовать методы daysCount...

Увеличение и уменьшение квадрата С++ - C++
Доброе время суток! Кто может подсказать как можно реализовать увеличение и уменьшение квадрата динамически? То есть квадрат то...

Уменьшение числа(динамика) - C++
Здравствуйте, помогите найти ошибку в коде для задачи - имеется натуральное число(1<=n<=10^6), к нему применимы операции -1 /2 и /3, при...

Уменьшение размера программы - C++
Здравствуйте, мне нужно уменьшить размер программы, прочитал что нужно добавлять строки: #pragma optimize("gsy",on) #pragma...

Уменьшение зависимостей скомпилированной программы - C++
#include <iostream> using namespace std; void main() { cout << "hi" << endl; system("pause"); } На чистой WinXpSp2 ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
21.06.2014, 23:01 #2
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
Иногда, нужно не 5, а всего лишь 4 вложенных цикла. Тогда просто вручную
строчку с 5-ым циклом закомментироваваю слешом //.
есть такая штука условная компиляция
например

C++
1
2
3
4
5
6
7
8
for()
for()
for()
for()
#if 0
 for()
#endif
{тело цикла}
можно сделать например так

C++
1
2
3
4
5
6
7
8
9
#define forcile 4
for()
for()
for()
for()
#if forcile!=4
 for()
#endif
{тело цикла}
если forcile равно 4 то четыре цикла, если не равно то пять
1
S_el
2100 / 1611 / 308
Регистрация: 15.12.2013
Сообщений: 6,451
21.06.2014, 23:02 #3
sergey.shuvalov, сделайте функцию передавайте bool параметр,если true - 4 цикла, false - 5.
Тоже самое можно и без функции
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
21.06.2014, 23:14 #4
S_el, примерчик покажи
а то я как то не могу сообразить
изменение количество циклов это изменение алгоритма и менять его на лету только одно в голову приходит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(n)
{
for()
for()
for()
for()
for()
{тело цикла}
}
else
{
for()
for()
for()
for()
{тело цикла}
}
Добавлено через 7 минут
тут вроде еще придумал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
switch(n)
{
 
 case 5:
   for()
case 4:
  for()
 case 3:
   for()
 case 2:
  for()
 case 1:
   for()
    {тело цикла}
 
 
}
но изврат, по моему, еще тот
и будет или нет работать, не знаю
1
S_el
2100 / 1611 / 308
Регистрация: 15.12.2013
Сообщений: 6,451
21.06.2014, 23:15 #5
ValeryS, http://ideone.com/BfAZl7
2
Jewbacabra
Эксперт PHP
2471 / 2059 / 779
Регистрация: 24.04.2014
Сообщений: 6,064
21.06.2014, 23:15 #6
можно попробовать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (...) {
    for (...) {
        for (...) {
            for (...) {
                // cond - логическое значение. true - 4 цикла, false - 5.
                // если cond - true, то 5 цикл выполнится 1 раз, т.е. как-будто цикла и нету
                int num = cond ? 1 : ... ;
                for (int i=0; i < num; ++i) {
                    ...
                }
            }
        }
    }
}
1
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
21.06.2014, 23:19  [ТС] #7
ValeryS, Так то хорошо, но в программе 4 варианта количества вложенных циклов - 5,4,3,2.
И тело цикла порядка 1000 строк. Так что листинг программы в вышеуказанном варианте увеличится на 3000 строк. А вариант то, конечно, хороший.

А варианте с case, разве brake после каждого case не стоит?
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
21.06.2014, 23:35 #8
S_el, но "тело функции" у тебя разнесено

Добавлено через 6 минут
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
А варианте с case, разве brake после каждого case не стоит?
в том то и дело что не стоит
если выпадет например два
то цикл должен отработать по case 2: а потом упасть по case 1:
но повторяю, это я сейчас придумал и не проверял
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
но в программе 4 варианта количества вложенных циклов - 5,4,3,2.
И тело цикла порядка 1000 строк.
я думаю что при таком количестве ты запутаешся в ифах
я бы сделал 4 функции для циклов и одну функцию для тела
сопровождать программу легче будет
1
S_el
2100 / 1611 / 308
Регистрация: 15.12.2013
Сообщений: 6,451
21.06.2014, 23:36 #9
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
Так то хорошо, но в программе 4 варианта количества вложенных циклов - 5,4,3,2.
Тогда нужен,уже не bool,а int параметр.

Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
А варианте с case, разве brake после каждого case не стоит?
break ставят,чтобы не выполнился следующий case.
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
21.06.2014, 23:37 #10
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
программе 4 варианта количества вложенных циклов - 5,4,3,2.
они меняются в процессе работы программы или известны на этапе компиляции?
1
S_el
2100 / 1611 / 308
Регистрация: 15.12.2013
Сообщений: 6,451
21.06.2014, 23:38 #11
Цитата Сообщение от ValeryS Посмотреть сообщение
я думаю что при таком количестве ты запутаешся в ифах
я бы сделал 4 функции для циклов и одну функцию для тела
Так тоже можно запутаться, если вариантов не больше 5,то можно этого избежать
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
21.06.2014, 23:41 #12
Цитата Сообщение от S_el Посмотреть сообщение
Так тоже можно запутаться, если вариантов не больше 5,
я за свою практику больше чем 3 цикла не использовал, край четыре
так что думаю алгоритм нужно пересматривать
1
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
21.06.2014, 23:45  [ТС] #13
Jewbacabra, Гениально. Немножко усовершенствовал.
Циклы обозвал int i[5]. И соответственно по обстоятельствам передаю значения int maxi[5].
Получается

C++
1
2
3
4
5
6
7
8
int i[5]
int maxi[5]
 
for(i[0]=0;i[0]<maxi[0];i[0]++)
for(i[1]=0;i[1]<maxi[1];i[1]++)
for(i[2]=0;i[2]<maxi[2];i[2]++)
for(i[3]=0;i[3]<maxi[3];i[3]++)
for(i[4]=0;i[4]<maxi[4];i[4]++)
Когда нужно 4 цикла передаю на maxi[4] значение 1 и т. д.
Спасибо всем. Разум когда-нибудь победит.

Добавлено через 3 минуты
ValeryS, Вообще в программе стоит 15 вложенных циклов. Нужно варианты перебора просматривать 3 в 15 степени, в 14 и т.д.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
22.06.2014, 00:14 #14
короче проверил свитч работает
после доработки напильником
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
#include <iostream>
using namespace std;
int func(int s);
int main() {
 
    cout<<func(1)<<" "<<func(2)<<" " <<func(3)<<" "<<func(4)<<"  "<<func(5)<<endl;
    return 0;
}
int func(int n)
{
    int y=0;
    int i=10,j=10,k=10,l=10,m=10;
switch(n)
{
 
 case 5:
   for(i=0;i<2;i++)
case 4:
  for( j=0;j<2;j++)
 case 3:
   for( k=0;k<2;k++)
 case 2:
  for( l=0;l<2;l++)
 case 1:
   for( m=0;m<2;m++)
     y++;
 
 
}
 
    return y;
}
компилятор VS2008
инициализация обязательна(int i=10,j=10,k=10,l=10,m=10; )
иначе при значении меньше 5 цикл лезет на предыдущую строчку а поскольку нет инициализации счетчика программа рухает
а так мы задали число заведомо больше чем предел и цикл не исполняется

Добавлено через 14 минут
вот онлайн компилятор
http://ideone.com/6IWJxJ
2
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
22.06.2014, 00:16  [ТС] #15
ValeryS, Спасибо, я уже сделал способом передачи значения максимального значения количества итераций цикла от 1 до 15 цикла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  for(ix[0]=1;ix[0]<mx[0];ix[0]++)
  for(ix[1]=1;ix[1]<mx[1];ix[1]++)
  for(ix[2]=1;ix[2]<mx[2];ix[2]++)
  for(ix[3]=1;ix[3]<mx[3];ix[3]++)
  for(ix[4]=1;ix[4]<mx[4];ix[4]++)
  for(ix[5]=1;ix[5]<mx[5];ix[5]++)
  for(ix[6]=1;ix[6]<mx[6];ix[6]++)
  for(ix[7]=1;ix[7]<mx[7];ix[7]++)
  for(ix[8]=1;ix[8]<mx[8];ix[8]++)
  for(ix[9]=1;ix[9]<mx[9];ix[9]++)
  for(ix[10]=1;ix[10]<mx[10];ix[10]++)
  for(ix[11]=1;ix[11]<mx[11];ix[11]++)
  for(ix[12]=1;ix[12]<mx[12];ix[12]++)
  for(ix[13]=1;ix[13]<mx[13];ix[13]++)
  for(ix[14]=1;ix[14]<mx[14];ix[14]++)
Программа предварительно заполняет массив mx[15]. Там где цикл нужен передаёт значение mx[i]=4,
а там где цикл не нужен передаёт значение mx[i]=2; Программа работает замечательно. Спасибо всем!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 00:16
Привет! Вот еще темы с ответами:

Работа с консолью. Уменьшение нагрузки на ЦП - C++
Значит имеется следующий код: #include &lt;conio.h&gt; #include &lt;iostream&gt; int main() { bool bExit = false; while (!bExit) { ...

Уменьшение времени выполнения цикла - C++
Нужна помощь, мне надо засечь время выполнения цикла, который инициализирует элементы массива. А потом надо как-то развернуть цикл и...

Уменьшение времени работы программы - C++
Добрый вечер. Решил задачу, и решил прогнать по ********. Программа заваливается по времени выполнения, выходит 2.5 секунд, в идеале должно...

Сначала увеличение числа, потом уменьшение - C++
Добрый день! Подскажите пожалуйста, как можно сделать так, чтобы число сначала увеличивалось, а потом, дойдя до определенного значения,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.06.2014, 00:16
Ответ Создать тему
Опции темы

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