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

Развертка циклов и не только

11.06.2013, 12:26. Показов 2223. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Помогите разобраться с техникой оптимизации циклов(коды не компилируются, не знаю по чему):
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
    for (int i = 0; i < iN; i++)
{
    res *= a[i];
}
    system("PAUSE");
    return 0; 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
  for (int i = 0; i < iN; i+=3)
{
       res *= a[i];
       res *= a[i+1];
       res *= a[i+2];
}
    system("PAUSE");
    return 0; 
}
Объясните пожалуйста:
1) Что обозначает iN(я так понял это число до которого необходимо считать)
2) Что происходит в первом и во втором коде
3) Что обозначает i+=3?
C++
1
2
3
4
5
6
7
for(int i = 0; i < iN; i++)
{
   a[i] = b[i] - 5;
}
   for(int i = 0; i < iN-1; i++){
   d[i] = e[i] * 3;
}
Что происходит в 3 коде, что он делает? И опять же он не компилируется, либо переменная не объявлена (возможно тип переменной) либо не подключена библиотека какая то (что такое "В gcc можно применить следующие ключи: -funroll-all-loops -funroll-loops."- не знаю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.06.2013, 12:26
Ответы с готовыми решениями:

Найти сумму ряда (с использованием только циклов)
Найти сумму ряда s=1-2+3-4+5-6...n . Всего n слогаемых. Использовать только циклы. Благодарю за помощь

Разное (параметры циклов и не только)
Буду очень признательна за помощь! Раздел I. (Массивы не использовать!) 1. Вычисление f = N! описать каждым из трех вариантов...

Оператор break даёт нам выход из обоих циклов или только из внутреннего
Господа, проконсультируйте в одном вопросе! Написав кучу программ, в голове образовался полный ахтунг, что стал тормозить на элементарных...

17
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
11.06.2013, 12:31
iN - переменная.
1. Первый код вычисляет произведение элементов массива.
2. Вычисляет произведение элементов массива, но за одну итерацию вычисляет произведение сразу трех элементов.
3. Сами разбирайтесь.
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
В gcc можно применить следующие ключи: -funroll-all-loops -funroll-loops
Значит запустить компилятор и передать ему следующие опции.
Bash
1
gcc -funroll-all-loops -funroll-loops ..
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 12:35
1) Что обозначает iN(я так понял это число до которого необходимо считать)

под iN подразумевается переменная-счетчик цикла. Пока условие истино (i < iN) - цикл будет крутиться. Но у вас она нигде не объявлена,как в прочем и остальные переменные (поэтому коды и не компилируются )

2) Что происходит в первом и во втором коде
Первый код, если в нем будет хватать соответствующих переменных - пытается найти произведение массива. Второй то же самое, только шаг цикла = три элемента.

3) Что обозначает i+=3?
Означает увеличить текущее значение переменной i на 3
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:36  [ТС]
А почему он не компилируется? gcc -funroll-all-loops -funroll-loops .. - получается надо вставить куда то...только куда, прочитав про gcc я понял что это программа, но я использую Dev-C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
    for (int i = 0; i < 10000; i++)
{
    res *= a[i];   //обижается на вот эту строчку, что необходимо с ней сделать?
}
    system("PAUSE");
    return 0; 
}
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
11.06.2013, 12:38
Переменные res и a не объявлены.
1
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 12:38
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
    int a[10000];
    int res = 1;
    for (int i = 0; i < 10000; i++)
{
    res *= a[i];
}
    system("PAUSE");
    return 0; 
}
1
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:40  [ТС]
Не ну как написано так и сделал: "Используй ключевое слово register перед определением переменных в циклах".
Спасибо большое ребята, а то мы с парнишкой сидим уже часа 2 понять не можем в чем проблема
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
11.06.2013, 12:40
Переменные у вас не объявлены!!!
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:44  [ТС]
Так это все хорошо, он компилируется, не чего не делается, просто написано:"Для продолжения нажмите клавишу....". Он же должен выводить счет до числа
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
11.06.2013, 12:45
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
Он же должен
он ничего не должен. Код работает так, как написал его автор.
0
11.06.2013, 12:46

Не по теме:

Ещё язык не освоили, а уже оптимизациями занимаетесь.

0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:49  [ТС]
Цитата Сообщение от Пaтрик Посмотреть сообщение
он ничего не должен. Код работает так, как написал его автор.
Почему он не чего не должен? Как я понял программа выводит счет от 0 до iN, во 2 коде получается либо идет так 0-3-6-9 и т.д. либо сразу выполняется 3 действия, получается код работает в 3 раза быстрее.
Я могу ошибаться и не понимать, но тогда почему тут он считает и выводит на экран значения?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
    int a;
    for (int i=0;i<3000;i++)
 
 
 
    cout<<"a="<<i<<endl;
    system("PAUSE");
    return 0; 
}
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 13:06
DVGU.MAKC, Мил человек. Код делает то, что хотите вы, а не то, что хочет код. Добавили cout - стал выводить результаты работы на консоль. Не добавили - не стал.
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 13:08  [ТС]
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, Мил человек. Код делает то, что хотите вы, а не то, что хочет код. Добавили cout - стал выводить результаты работы на консоль. Не добавили - не стал.
Все догнал, и не надо писать в основах не разобрался, лезет в оптимизацию - пошло же до меня, логика смекалка и все будет, вот что у меня получилось:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{
    int a[10000];
    int res = 1;
 for (int i = 0; i < 10000; i+=3)
{
 res *= a[i];
 res *= a[i+1];
 res *= a[i+2];
 cout<<"a="<<i<<endl;
}
    system("PAUSE");
    return 0; 
}
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 13:10
DVGU.MAKC, B и что у вас получилось?) вывели номера элементов массива? А для чего тогда вычислять произведение? может и его выведете (после цикла только).
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 13:16  [ТС]
Так, теперь другой вопрос: "Почему когда вводишь в int a [1000000]; и в for (int i = 0; i < 1000000; i++) , открывается окно и windows сообщает об ошибке?

Добавлено через 4 минуты
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, B и что у вас получилось?) вывели номера элементов массива? А для чего тогда вычислять произведение? может и его выведете (после цикла только).
Это как получается... надо подумать....вычислять произведение.... это получается так? полюбому не правильно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
    int a[10000];
    int res = 1;
 for (int i = 0; i < 10000; i+=3)
{
 res *= a[i];
 res *= a[i+1];
 res *= a[i+2];
 cout<<"a="<<i<<endl;
}
    cout<<"a+1="<<i+1<<endl;
    cout<<"a+2="<<i+2<<endl;
    system("PAUSE");
    return 0; 
}
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 13:17
DVGU.MAKC, массив слишком большой - зачем вам столько, возможно стек переполняется.
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 13:45  [ТС]
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, массив слишком большой - зачем вам столько, возможно стек переполняется.
Правильно или нет? мне кажется не правильно

Добавлено через 4 минуты
Так тоже не правильно...
C
1
2
std::cout <<"a+1=" <<res *= a[i+1] <<std::endl;
std::cout <<"a+2=" <<res *= a[i+2] <<std::endl;
Добавлено через 4 минуты
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, B и что у вас получилось?) вывели номера элементов массива? А для чего тогда вычислять произведение? может и его выведете (после цикла только).
Я сдаюсь, не могу понять как надо... Будьте так любезны подскажите пожалуйста или где про это можно прочитать?

Добавлено через 13 минут
kventin_zhuk, А другой вопрос, а оно вообще мне надо чтоб объяснить другому человеку на данном примере как оптимизировать цикл при помощи развертки цикла? Вставить в 2 цикла просто const clock_t start = clock(); и т.д. запустить и получается допустим на вывод номеров массива 1 программы ушло 10сек во второй программе 4сек? Мне интересно, и хотелось бы понять, как вывести результаты вычислений, получается я прошу программу вывести мне совершенно не то что она делает и поэтому результаты которые будут выданы являются неверными, только как их вывести...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <ctime>
using namespace std;
 
int main()
{
    const clock_t start = clock();
    int a[100];
    int res = 1;
 for (int i = 0; i < 100; i+=3)
{
 res *= a[i];
 res *= a[i+1];
 res *= a[i+2];
 cout<<"a="<<i<<endl;
}
    const double time = static_cast<double>(clock() 
    - start) / CLOCKS_PER_SEC;
    std::cout << time << " seconds" << std::endl;
    system("PAUSE");
    return 0; 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.06.2013, 13:45
Помогаю со студенческими работами здесь

Функция сложения двух чисел, используя только прибавление единицы, реализованную с помощью циклов
1. функцию сложения двух чисел, используя только прибавление единицы, реализованную с помощью циклов; 2. функцию сложения двух чисел,...

Как получить сумму и произведение циклов с использованием одной строки циклов
Как получить сумму и произведение циклов с использованием одной строки циклов, а не трёх?. class ForDrmo2 { public static...

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

Развертка детали
Здравствуйте. Подскажите пожалуйста, возможно ли сделать развертку детали в сборке. Деталь представляет собой цилиндрическую поверхность...

Развертка геосферы
Посоветуйте где можно найти формулы Есть прямоугольная карта мира и геосфера из равных треугольников задача - определить цвет вершины...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru