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

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

Восстановить пароль Регистрация
 
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 259
21.06.2014, 22:47     Уменьшение количества циклов #1
Здрастье всем. Вопрос такой.

Есть 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; Но тогда тело цикла не выполняется.
Подскажите, кто знает.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
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 то четыре цикла, если не равно то пять
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
21.06.2014, 23:02     Уменьшение количества циклов #3
sergey.shuvalov, сделайте функцию передавайте bool параметр,если true - 4 цикла, false - 5.
Тоже самое можно и без функции
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
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()
    {тело цикла}
 
 
}
но изврат, по моему, еще тот
и будет или нет работать, не знаю
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
21.06.2014, 23:15     Уменьшение количества циклов #5
ValeryS, http://ideone.com/BfAZl7
Jewbacabra
1789 / 1504 / 538
Регистрация: 24.04.2014
Сообщений: 4,215
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) {
                    ...
                }
            }
        }
    }
}
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 259
21.06.2014, 23:19  [ТС]     Уменьшение количества циклов #7
ValeryS, Так то хорошо, но в программе 4 варианта количества вложенных циклов - 5,4,3,2.
И тело цикла порядка 1000 строк. Так что листинг программы в вышеуказанном варианте увеличится на 3000 строк. А вариант то, конечно, хороший.

А варианте с case, разве brake после каждого case не стоит?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
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 функции для циклов и одну функцию для тела
сопровождать программу легче будет
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
21.06.2014, 23:36     Уменьшение количества циклов #9
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
Так то хорошо, но в программе 4 варианта количества вложенных циклов - 5,4,3,2.
Тогда нужен,уже не bool,а int параметр.

Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
А варианте с case, разве brake после каждого case не стоит?
break ставят,чтобы не выполнился следующий case.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
21.06.2014, 23:37     Уменьшение количества циклов #10
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
программе 4 варианта количества вложенных циклов - 5,4,3,2.
они меняются в процессе работы программы или известны на этапе компиляции?
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
21.06.2014, 23:38     Уменьшение количества циклов #11
Цитата Сообщение от ValeryS Посмотреть сообщение
я думаю что при таком количестве ты запутаешся в ифах
я бы сделал 4 функции для циклов и одну функцию для тела
Так тоже можно запутаться, если вариантов не больше 5,то можно этого избежать
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
21.06.2014, 23:41     Уменьшение количества циклов #12
Цитата Сообщение от S_el Посмотреть сообщение
Так тоже можно запутаться, если вариантов не больше 5,
я за свою практику больше чем 3 цикла не использовал, край четыре
так что думаю алгоритм нужно пересматривать
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 259
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 и т.д.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
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
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 259
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; Программа работает замечательно. Спасибо всем!
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
22.06.2014, 08:12     Уменьшение количества циклов #16
sergey.shuvalov,
самому то нравится этот забор?
говорю же алгоритм менять нужно
нельзя "в лоб" решать проблемы, нужно отойти и подумать
и вот что я надумал,
использовать рекурсию
тогда хоть один цикл хоть сто
вот аналог моего свитча
C++
1
2
3
4
5
6
7
8
9
10
11
int func1(int n)// n количество циклов
{
int y=0;
 if(n>0)
    for(int i=0;i<2;i++)
      y+=func1(n-1);
 else
     y++;// тело цикла
 return y;
 
}
правда 30 циклов ну очень долго исполняются
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
22.06.2014, 09:21     Уменьшение количества циклов #17
ValeryS, только не факт,что тело у цикла всегда одинаковое.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
22.06.2014, 09:27     Уменьшение количества циклов #18
Цитата Сообщение от S_el Посмотреть сообщение
только не факт,что тело у цикла всегда одинаковое.
я сужу по вот этому
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
C++
1
2
3
4
5
6
for()
for()
for()
for()
//for()
{тело цикла}
а вообще да, задачу неплохо бы знать
если тело цикла не зависит от индексов
ну типа
C++
1
arr[i][j][k]
то можно и одним циклом обойтись, только изменяй граничные значения
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 259
22.06.2014, 11:14  [ТС]     Уменьшение количества циклов #19
ValeryS, Дело в том, что в теле цикла, для решения задачи, берутся значения ix[j] из самих итераций циклов и производятся с ними действия, для этого собственно циклы и создаются.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 11:20     Уменьшение количества циклов
Еще ссылки по теме:

Уменьшение времени работы программы C++
C++ Уменьшение размера программы
Вычислить произведение количества отрицательных и количества положительных элементов одномерного массива C++

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

Или воспользуйтесь поиском по форуму:
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
22.06.2014, 11:20     Уменьшение количества циклов #20
sergey.shuvalov, пересмотреть алгоритм, разбить на функции. Отладка кода в текущем виде может стать адом.
Yandex
Объявления
22.06.2014, 11:20     Уменьшение количества циклов
Ответ Создать тему
Опции темы

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