Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Полиморфизм:от применить фdouble к double arr  (Прочитано 9944 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Nick
Интересующийся

ru
Offline Offline

« : 14-07-2015 13:41 » 

Доброе время суток!
Такой вопрос:
есть функции
double f1(double x)
double f2(double x)
double f3(double x)

Нужно сформировать массивы с результатами работы(10000 элементов)

Собственно, как это можно сделать по-умному, без копи-паста и не объединяя в один цикл. В общем решение на основе полиморфизма(Возможно не правильно классифицировал? Ага)
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 14-07-2015 14:18 » 

Сорри, совсем не понял, что Вам надо сделать. Что Вы понимаете, под
Нужно сформировать массивы с результатами работы(10000 элементов)
Если Вам надо получить массив значений из 10000 элементов, на основании вызова функций - вызовите для каждого элемента соответствующую функцию. Хоть в цикле, хоть копипастой, хоть макросами типа
Код: (C)
#include <stdio.h>

double f1(double x) { return x * 1 ;}
double f2(double x) { return x * 2 ;}
double f3(double x) { return x * 3 ;}

#define fillelem3(arr, idx, x) { (arr)[(idx)] = f1(x); (arr)[(idx+ 1)] = f2(x); (arr)[(idx + 2)] = f3(x); }
#define fillelem9(arr, idx, x) { fillelem3(arr, (idx), x); fillelem3(arr, (idx) + 3, x); fillelem3(arr, (idx) + 6, x); }
#define fillelem27(arr, idx, x) { fillelem9(arr, (idx), x); fillelem9(arr, (idx) + 9, x); fillelem9(arr, (idx) + 18, x); }
#define fillelem81(arr, idx, x) { fillelem27(arr, (idx), x); fillelem27(arr, (idx) + 27, x); fillelem27(arr, (idx) + 54, x); }
#define fillelem243(arr, idx, x) { fillelem81(arr, (idx), x); fillelem81(arr, (idx) + 81, x); fillelem81(arr, (idx) + 162, x); }
#define fillelem729(arr, idx, x) { fillelem243(arr, (idx), x); fillelem243(arr, (idx) + 243, x); fillelem243(arr, (idx) + 486, x); }
#define fillelem2187(arr, idx, x) { fillelem729(arr, (idx), x); fillelem729(arr, (idx) + 729, x); fillelem729(arr, (idx) + 1458, x); }
#define fillelem6561(arr, idx, x) { fillelem2187(arr, (idx), x); fillelem2187(arr, (idx) + 2187, x); fillelem2187(arr, (idx) + 4274, x); }
#define fillelem10000(arr, x) { fillelem6561(arr, 0, x); fillelem2187(arr, 6561, x); fillelem729(arr, 8748, x); fillelem243(arr, 9477, x); fillelem243(arr, 9720, x); fillelem27(arr,9963, x); fillelem9(arr, 9990, x); (arr)[9999] = f1(x); }

int main(int argc, char* argv[])
{ double arr[10000];
  int i;

  fillelem10000(arr, 3);

  for (i = 0; i < 10000; i++)
    printf("%d %f\n", i, arr[i]);

  return 0;
}

Хотя, конечно, так делать не надо.

А чем Вас не устроили циклы, если не секрет?
« Последнее редактирование: 14-07-2015 14:28 от darkelf » Записан
Victor
Интересующийся

ru
Offline Offline

« Ответ #2 : 14-07-2015 18:37 » 

В целом я понял. Вам нужно использовать решение на основе патернов проектирования, а если точнее Декоратор.

Вот посмтори http://know-all.net/articles/view/54" здесь хороший пример реализации на СИ

Добавлено через 26 минут и 4 секунды:
Шаблон проектирования
Декторатор
« Последнее редактирование: 05-08-2015 10:23 от Вад » Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-07-2015 20:05 » 

Я тоже не понял. Тут как ни назови - для расчёта таблицы из 10000 элементов, даже по одной функции, её придётся вызвать 10000 раз. Можно сделать это циклом - экономим объём кода, теряем в скорости, хотя, учитывая работу с double это, имхо, мизер. Другой вариант - развернуть цикл. Макрос - лишь визуальное разворачивание, настоящим будет копирование расчёта для каждого элемента без вызова функции каждый раз. Тут, наоборот - вес кода будет эпичным, зато, может появиться прибавка в скорости.
Записан
Nick
Интересующийся

ru
Offline Offline

« Ответ #4 : 14-07-2015 20:42 » 

Сорри всем, если не понятно написал.
2Victor, пример - именно то что нужно.

СПАСИБО! Да-да
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 14-07-2015 22:37 » 

Victor, а ты часом не спамер? Не обижайся. По патерну поведения.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 15-07-2015 00:54 » 

Скорее "старые паттерны на новый лад". Как в театре Виктюка: вроде бы по названию и классика, а вот поди ж ты...
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Victor
Интересующийся

ru
Offline Offline

« Ответ #7 : 15-07-2015 08:30 » 

Не спамер). Просто почему то на этом форуме отредактировать пост нетривиальная задача
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines