Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857

Создание формул по шаблону

03.10.2014, 15:52. Показов 925. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!
Столкнулся с некой проблемой при реализации одной задачи. Ну пожалуй с задачи и начну:
В общем суть очень проста - порой по работе необходимо заниматься написание формул на ПО SCADA системы.
Логика формул чаще всего простейшая, например:
IF(N1861>(0.9*N11159) OR N1857>(0.9*N11160) OR N1861>(0.9*ТИ14482),1,0)
Где "N" это некая переменная, которая берется из БД.
Дело в том, что даже при такой просто логике в формуле должно быть около 300-400 параметров.
Из за монотонности работы решил написать некий создатель формул по шаблону, но не хватает фантазии что ли чтобы придумать некую гибкую форму, в которой можно будет эти шаблоны создавать без применения изменений в коде.
Допустим сейчас для конкретно этой формулы в 300 параметров сделано так....есть некий файл TXT в котром с каждой новой строки написано число (Номер нашей переменной N), ну и потом:

Гружу

C++
1
2
3
4
if (OpenDialog1->Execute()) 
{
SL->LoadFromFile(OpenDialog1->FileName); // SL - TStringList
}
ну и обрабатываю

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AnsiString FCR1="IF(";
int n=0;
Memo2->Clear();
for (int i =1; i <= (SL->Count/2); i++) {
 
    if (i!=(SL->Count/2)) {
    FCR1=FCR1+"N"+SL->Strings[n]+">(0.9*N"+SL->Strings[n+1]+") OR ";
    n=n+2;
    }
    else
    {
    FCR1=FCR1+"N"+SL->Strings[n]+">(0.9*N"+SL->Strings[n+1]+"),1,0)";
    }
 
    }
Memo2->Text=FCR1;
Хотелось бы придумать как сохранять такой шаблон, чтоб потом допустим, грузим файл с данными (списком номеров переменных), выбираем к какому шаблону их применить, после выбора создается формула на основе шаблона и входных номеров.

Прошу просто подсказать, как можно это реализовать, приветствуется любая помощь!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.10.2014, 15:52
Ответы с готовыми решениями:

Создание функции для работы со стеками по шаблону
Доброго времени суток. Решил написать ряд универсальных функций, которые бы работали со стеками на основе списков, а заодно разобраться с...

Создание экрана по шаблону
Здравствуйте. Никогда не сталкивался с программированием GUI и поэтому на первый взгляд элементарная задача создания экрана по шаблону...

Создание обьекта «по шаблону»
Мне надо создать объект как бы по шаблону, например: Есть класс, в нем рисуется кнопка! В другом классе эту кнопку надо...

5
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
04.10.2014, 12:29
Для таких целей лучше воспользоваться Excel, Statistica или Matlab.
Сохранить возможно так:

C++
1
Memo2->Lines->SaveToFile("C:\/text.txt");
Добавлено через 10 минут
но вероятно вам надо не только сохранять но и иметь уникальный признак для выбора шаблона.
В качестве такого признака обычно используют контрольные коды (например, MD5), но если это слишком сложно, то надо смотреть в сторону идентификации, например по сумме переменных N (могут ли они повторяться?), или по имени файла в котором хранятся переменные N (могут ли повторяться эти имена или различаться для одинаковых наборов N).
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
07.10.2014, 10:47  [ТС]
еще раз объясню идею:
Допустим мне необходимо создать такую формулу
IF(N1>(0.9*N2) OR N3>(0.9*N4) OR N5>(0.9*N6),1,0) (помним что это пример в оригинале таких параметров N около 300+)
хотелось бы просто написать шаблон, для этой формулы он будет выглядеть вот так:
IF( #1>(0.9*#2) OR ,1,0)
при этом в отдельном поле я говорю что -
#1>(0.9*#2) OR - часть которая повторяется.
вот как и чем реализовать парсер который будет при виде шаблона и повторяющейся части делать что то вроде этого:

A - начало
A="IF("

B - промежуточное значение 1
B=">(0.9*"

C - промежуточное значение 2
C=") OR "

D - конец
D=",1,0)"

n - счетчик
n=0

SL - StringList с переменными

Формируем часть которая повторяется.
C++
1
2
3
for (int i=1; i<=SL->Count/2; i++){
Formul+=SL->Strings[n]+B+SL->Strings[n+1]+C;
n=n+2;}
Результирующая строка
C++
1
2
Result=A;
Result+=Formul+D;
Надеюсь мысль стала понятнее...Знаю что задача не простая, но любые идеи по реализации - было не плохо.
Заранее извиняюсь за пример, писал его на коленке.
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
07.10.2014, 14:47
Обычная строка с подстановочными символами
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SChar = '#';
for (i=1;i<=s.Length();i++) {
  if (s[i]!=SChar) {
    sResult = SResult + s[i];
    continue;
  }
  if (s[i+1]=='A') SResult = SResult + SetParam(1); else
  if (s[i+1]=='B') SResult = SResult + SetParam(2); else
  //...
  else SResult = SResult+s[i+1];
  i++;
}
String SetParam(int idx)
{
  switch (idx) {
  case 1:return "IF(";
  case 2:return ">(0.9*"; 
  //и так далее
  }
}
При этом обработать "циклические" символы, к примеру '{' '}'
Если открывающая скобка встретилась, найти закрывающую и колво повторов
При этом исходная строка выглядит так:
#A{N#n#BN#n#C}5
и делаем подмены #A #B #C как ты написал
#n - текущий индекс
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
07.10.2014, 15:02  [ТС]
Спасибо большое что обратили внимание, но я не уверен что такой подход будет гибок.
масок будет много и хотелось бы обходиться без "редактирования кода" при обнаружении в маске нового сочетания символов.
Но как вариант использовать Ваш вариант подмен при супер грамотном парсинге.
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
07.10.2014, 15:39
Здесь идея именно в обработке повторяемой части стоки-шаблона через указание скобок
И реализация напрашивается рекурсивная.
А реализовывать ли прямую подмену A B C D - это уже по месту видно будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2014, 15:39
Помогаю со студенческими работами здесь

Создание текстового файла по шаблону
Добрый день! Необходимо создавать на основе некоторых данных текстовый отчет по некому шаблону. Например: {10...

Создание Локальных Пользователей по шаблону
Добрый день есть необходимость в создании пользователей по шаблону Но основной вопрос состоит как доделать скрипт ,чтоб при первоэтапном...

Создание документа Word по шаблону
Добрый день! Подскажите, как сделать такой макрос. Нужно составить отчет в Word на основе данных из текстового документа (получен в...

Создание списка элементов по шаблону
Подскажте пожалуйста как можно осуществить такую конструкцию? class InputTable { private Type arr; ...

Скрипт на создание теста PerfMon по шаблону
ДВС камрады. Есть задачка на n-количестве компов собрать статистику по загруженности проц+оператива+диск. Компов овер-много и руками на...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru