Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277

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

21.06.2014, 22:47. Показов 2484. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2014, 22:47
Ответы с готовыми решениями:

Уменьшение визуального вида кода (скрытие циклов, функций)
Доброго времени суток. При открытии проекта всегда все функции и циклы развернуты и показаны полностью. В QT нет случайно настройки,...

Уменьшение и увеличение количества
Здравствуйте, проблема моя такова: есть бд Библиотеки и там нужно сделать чтоб при выдаче книги уменьшалось колво книг а при сдаче...

Уменьшение количества цветов
Форумчане, здравствуйте! У меня вопросец есть. Есть ли какое-либо простое решение для решения моей задачки. Мне необходимо уменьшить...

19
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
21.06.2014, 23:01
Цитата Сообщение от 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
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
21.06.2014, 23:02
sergey.shuvalov, сделайте функцию передавайте bool параметр,если true - 4 цикла, false - 5.
Тоже самое можно и без функции
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
21.06.2014, 23:14
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
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
21.06.2014, 23:15
ValeryS, http://ideone.com/BfAZl7
2
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.06.2014, 23:15
можно попробовать так:
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
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
21.06.2014, 23:19  [ТС]
ValeryS, Так то хорошо, но в программе 4 варианта количества вложенных циклов - 5,4,3,2.
И тело цикла порядка 1000 строк. Так что листинг программы в вышеуказанном варианте увеличится на 3000 строк. А вариант то, конечно, хороший.

А варианте с case, разве brake после каждого case не стоит?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
21.06.2014, 23:35
S_el, но "тело функции" у тебя разнесено

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

Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
А варианте с case, разве brake после каждого case не стоит?
break ставят,чтобы не выполнился следующий case.
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
21.06.2014, 23:37
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
программе 4 варианта количества вложенных циклов - 5,4,3,2.
они меняются в процессе работы программы или известны на этапе компиляции?
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
21.06.2014, 23:38
Цитата Сообщение от ValeryS Посмотреть сообщение
я думаю что при таком количестве ты запутаешся в ифах
я бы сделал 4 функции для циклов и одну функцию для тела
Так тоже можно запутаться, если вариантов не больше 5,то можно этого избежать
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
21.06.2014, 23:41
Цитата Сообщение от S_el Посмотреть сообщение
Так тоже можно запутаться, если вариантов не больше 5,
я за свою практику больше чем 3 цикла не использовал, край четыре
так что думаю алгоритм нужно пересматривать
1
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
21.06.2014, 23:45  [ТС]
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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
22.06.2014, 00: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
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
22.06.2014, 00:16  [ТС]
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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
22.06.2014, 08:12
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 циклов ну очень долго исполняются
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
22.06.2014, 09:21
ValeryS, только не факт,что тело у цикла всегда одинаковое.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
22.06.2014, 09:27
Цитата Сообщение от S_el Посмотреть сообщение
только не факт,что тело у цикла всегда одинаковое.
я сужу по вот этому
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
C++
1
2
3
4
5
6
for()
for()
for()
for()
//for()
{тело цикла}
а вообще да, задачу неплохо бы знать
если тело цикла не зависит от индексов
ну типа
C++
1
arr[i][j][k]
то можно и одним циклом обойтись, только изменяй граничные значения
0
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
22.06.2014, 11:14  [ТС]
ValeryS, Дело в том, что в теле цикла, для решения задачи, берутся значения ix[j] из самих итераций циклов и производятся с ними действия, для этого собственно циклы и создаются.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.06.2014, 11:20
sergey.shuvalov, пересмотреть алгоритм, разбить на функции. Отладка кода в текущем виде может стать адом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2014, 11:20
Помогаю со студенческими работами здесь

Уменьшение количества событий в коде
Добрый день! Пишу код с большим количеством действий для кнопок и окон для ввода данных. Получается много однотипного текста следующего...

Уменьшение количества комплектующих на складе
Всех с прошедшим Новым Годом парни, назрел такой вопрос: у меня есть таблица с комплектующими на складе, с количеством для каждого...

Уменьшение количества в табличной части
Здраствуйте! Имеются 2 документа РегистрацияТовара и ОтгрузкаТовара. В РегистрацииТовара в табличной части имеем реквизит Количество. В...

Уменьшение количества внешних ссылок
Здравствуйте. При просмотре инфы о сайте с яндекса начал замечать уменьшение количества внешних ссылок на страницы сайта. В день по 30...

Уменьшение количества индексированых страниц
Здравствуйте. Подскажите пожалуйста связано ли уменьшение страниц в яндексе с баном, фильтром или еще чем нибудь. У меня сайт обновляется...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru