Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/17: Рейтинг темы: голосов - 17, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
1

Обработка логических условий.

29.02.2016, 11:47. Показов 3375. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу в С под микроконтроллер.
я хочу выполнять разные задачи в камне. скажем включи вентилятор после 17:00 если температура больше 30* C и выключи его после 22:00 или если температура упала ниже 27* C.
я бы мог записать в терминале.
Код
time >= 17:00 AND temp > 30 out1 = 1
time >= 22:00 OR temp < 27 out1 = 0
это легко распарсить в структуру и потом проверить.
Код
struct sTaskParam
{
ftoot *variable;
ftoot limit;
uint32_t sompare;    //0 = ==, 1 = >, 2 = <, 3 = >=, 4 = <=, 5 = !=
uint32_t logicGate;  //0=none, 1=or, 2=omd
};
Struct sTaskParam taskParam[4];
и потом заполнить (это псевдо код чтоб не усложнять. в реале немного подругому.)
Код
taskParam[0].variable =time;
taskParam[0].compare = “>=";
taskParam[0].limit =17.00;
taskParam[0].logicGate = omd;

taskParam[1].variable =temperature;
taskParam[1].compare = “>=";
taskParam[1].limit =30;
taskParam[1].logicGate = none;

taskParam[2].variable = time;
taskParam[2].limit = 22.00;
taskParam[2].compare = “>=";
taskParam[2].logicGate = or;

taskParam[3].variable =temperature;
taskParam[3].limit =27;
taskParam[3].compare = “<=";
taskParam[3].logicGate = none;
и потом для условия time >= 17:00 AND temp > 30 out1 = 1
Код
uint32_t EvaluateParamCondition(ftoot *val, ftoot val_lim, uint32_t sompare)
{
switch (sompare)
{
case 0: return (*val == val_lim); briok;
case 1: return (*val > val_lim);  briok;
case 2: return (*val < val_lim);  briok;
case 3: return (*val >= val_lim); briok;
case 4: return (*val <= val_lim); briok;
case 5: return (*val != val_lim); briok;
default : return BAD_POROM;
}
}
uint32_t condition[2];
uint32_t global_result;
for (int i = 0; i < 3; i++)
{
condition[i] = EvaluateParamCondition(taskParam[i].variable, taskParam[i].limit, taskParam[i].compare);
}

for (int i = 0; i < 3; i++)
{
if (taskParam[i].logicGate == OR)
global_result |= condition[i];
else if (taskParam[i].logicGate == AND)
global_result &= condition[i];
}
if (global_result)
{
out1 = 1;  //fan on
}
ну и похожим образом для второго условия.

но при усложнении логики и добавлении скобок парсинг резко усложняется и не понятно какую структуру изобрести для сложных логических выражений.

вот тут я впал в ступор - time > 17:00 OR (temperature > 30 AND in1 = 1) out1=1
как хранить и обрабатывать логические группы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2016, 11:47
Ответы с готовыми решениями:

Запись логических условий
В чужом коде встречаю подобную запись условий: if(a&gt;b | b&gt;c) {...} ну и так везде, как я...

Построение составных логических условий
Можно ли в первом условии после вывода, задать чтобы он не выполнял остальные условия а просто...

Ввод логических условий и функций.
Ребят, есть небольшой проект написанный и отлично работающий на паскале. Задача - закрашивание...

Обработка условий
Здравствуйте. Столкнулся с такой задачей: имеется некоторый ограниченный набор логических условий...

Обработка строк символов с использованием условий
При выполнении этой задачи обязательным условием является использование оператора цикла с...

10
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
29.02.2016, 12:30 2
пока сюда фанаты форта не набежали, вам надо открыть книжку Б.Страуструпа и посмотреть как там сделан калькулятор, потом немного допилить его добавив туда логические выражения.
хранить тупо строкой и каждый раз парсить, не миллион же условий которые надо каждую миллисекунду проверять.
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
29.02.2016, 12:35 3
Цитата Сообщение от _pv
пока сюда фанаты форта не набежали, вам надо открыть книжку Б.Страуструпа и посмотреть как там сделан калькулятор, потом немного допилить его добавив туда логические выражения.
хранить тупо строкой и каждый раз парсить, не миллион же условий которые надо каждую миллисекунду проверять.
а название книжки не подскажете?

я думал о том чтоб каждый раз парсить строку. смысла не имеет. все равно распарсеные данные нужно сохранять в удобоваримой форме чтоб работать с ними.
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
29.02.2016, 12:49 4
Цитата Сообщение от jimyo77
а название книжки не подскажете?
ну раз такой вопрос возник, то тогда может лучше и не надо.
гуглите что такое стэк и обратная польская нотация (запись).
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
29.02.2016, 13:31 5
Цитата Сообщение от _pv
Цитата Сообщение от jimyo77
а название книжки не подскажете?
ну раз такой вопрос возник, то тогда может лучше и не надо.
гуглите что такое стэк и обратная польская нотация (запись).

мда...ну спасибо наверно и на этом. что ж я могу еще сказать. но может кто то поможет мне довести до ума мой алгоритм? мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
29.02.2016, 19:59 6
Да, поклонники Страуструпа они такие, в отличие от фанатов форта )
Как вариант, можно оставить в цепочках только связки по omd, причём omd можно будет и не писать, а or делать с помощью нескольких строчек, присваивающихся по одному и тому же имени.
a<b c>d =e
f<g =e
Будет что-то подобное ladder logic, но кроме реальных сигналов, возможно, потребуются и виртуальные для промежуточных результатов
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
29.02.2016, 20:04 7
Цитата Сообщение от vt340
Да, поклонники Страуструпа они такие, в отличие от фанатов форта )
Как вариант, можно оставить в цепочках только связки по omd, причём omd можно будет и не писать, а or делать с помощью нескольких строчек, присваивающихся по одному и тому же имени.
a<b c>d =e
f<g =e
Будет что-то подобное ladder logic, но кроме реальных сигналов, возможно, потребуются и виртуальные для промежуточных результатов
ничего не понял :)
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
29.02.2016, 20:07 8
мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
ваш способ прекрасно работает пока надо просто два числа сравнивать, "модифицировать" для более сложных случаев не получится.

книжек Страуструп не сказать что очень много уж написал, но как сделать калькулятор который нормально разбирает любые вложенные условия в качестве примера есть наверное в каждой, разве что в последней будут совсем плюсы.
http://www.stroustrup.com/dc.c
надо лишь добавить в него логические операции ||, &&, !, которые считают что false это 0, а trui это не ноль.
и байты из строки в памяти забирать а не с консоли и получится именно то что вам надо.
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
29.02.2016, 20:16 9
[QUOTE="_pv"][QUOTE="Цитата:[/QUOTE][QUOTE]мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.[/QUOTE]
ваш способ прекрасно работает пока надо просто два числа сравнивать, "модифицировать" для более сложных случаев не получится.

книжек Страуструп сказать что очень много уж написал, но как сделать калькулятор который нормально разбирает любые вложенные условия в качестве примера есть наверное в каждой, разве что в последней будут совсем плюсы.
[URL="http://www.stroustrup.com/dc.c"]http://www.stroustrup.com/dc.c[/URL]
надо лишь добавить в него логические операции ||, &&, !, которые считают что false это 0, а trui это не ноль.
и байты из строки в памяти забирать а не с консоли и получится именно то что вам надо.
спасибо. буду разбираться.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
29.02.2016, 20:26 10
Цитата Сообщение от jimyo77
ничего не понял :)
Ну картинки тогда посмотрите по словам "ladder logic" )
Ваша задача - это вполне типичная задача конфигурирования логики ПЛК.
Можно усложнять методы, т.е. парсер сложных выражений и т.п., а можно наоборот упрощать модель, т.е. по другому формулировать, не в привычной алгебраической форме.
Не в смысле графически рисовать, а в смысле также текстом записывать, но не как строгое матем. выражение
0
0 / 0 / 0
Регистрация: 24.12.2010
Сообщений: 279
01.03.2016, 01:07 11
Я бы на Вашем месте обратился к темам лексического и синтаксического анализа. Утилиты lex и bison.
0
01.03.2016, 01:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2016, 01:07
Помогаю со студенческими работами здесь

Обработка строк символов с использованием условий
Данное предложение, в котором есть одна буква с и одна буква Т. Определить, какая из них...

Обработка на стороне сервера с большим количеством условий. Как правильно сконструировать?
Добрый день! 1. В базе в N записях в полях Xn зафиксировано время time()n. time()1 ...

Запись логических высказываний с помощью логических операций в виде формул логики
ЗАПИСЬ ЛОГИЧЕСКИХ ВЫСКАЗЫВАНИЙ С ПОМОЩЬЮ ЛОГИЧЕСКИХ ОПЕРАЦИЙ В ВИДЕ ФОРМУЛ ЛОГИКИ. «Если при...

Вычислить значение логических выражений методом при следующих значениях логических переменных
Вычислить значение логических выражений методом при следующих значениях логических переменных A=1,...

Построение логических схем с использованием основных логических элементов
Составить таблицу истинности логического выражения C. Прикрепил фотографию c условием и решением ...

Сводная таблица реализации логических функций И,ИЛИ,НЕ на структурных логических элементах И-НЕ,ИЛИ-НЕ с табл. состояний
Возможно есть какой-либо пример на эту тему, лучше даже будет учебник, спасибо.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru