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

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

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

Студворк — интернет-сервис помощи студентам
Пишу в С под микроконтроллер.
я хочу выполнять разные задачи в камне. скажем включи вентилятор после 17:00 если температура больше 30* C и выключи его после 22:00 или если температура упала ниже 27* C.
я бы мог записать в терминале.
Code
1
2
time >= 17:00 AND temp > 30 out1 = 1
time >= 22:00 OR temp < 27 out1 = 0
это легко распарсить в структуру и потом проверить.
Code
1
2
3
4
5
6
7
8
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];
и потом заполнить (это псевдо код чтоб не усложнять. в реале немного подругому.)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
Code
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
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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
пока сюда фанаты форта не набежали, вам надо открыть книжку Б.Страуструпа и посмотреть как там сделан калькулятор, потом немного допилить его добавив туда логические выражения.
хранить тупо строкой и каждый раз парсить, не миллион же условий которые надо каждую миллисекунду проверять.
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
29.02.2016, 12:35
Цитата Сообщение от _pv
пока сюда фанаты форта не набежали, вам надо открыть книжку Б.Страуструпа и посмотреть как там сделан калькулятор, потом немного допилить его добавив туда логические выражения.
хранить тупо строкой и каждый раз парсить, не миллион же условий которые надо каждую миллисекунду проверять.
а название книжки не подскажете?

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

мда...ну спасибо наверно и на этом. что ж я могу еще сказать. но может кто то поможет мне довести до ума мой алгоритм? мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
29.02.2016, 19:59
Да, поклонники Страуструпа они такие, в отличие от фанатов форта )
Как вариант, можно оставить в цепочках только связки по 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
Цитата Сообщение от 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
мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
ваш способ прекрасно работает пока надо просто два числа сравнивать, "модифицировать" для более сложных случаев не получится.

книжек Страуструп не сказать что очень много уж написал, но как сделать калькулятор который нормально разбирает любые вложенные условия в качестве примера есть наверное в каждой, разве что в последней будут совсем плюсы.
http://www.stroustrup.com/dc.c
надо лишь добавить в него логические операции ||, &&, !, которые считают что false это 0, а trui это не ноль.
и байты из строки в памяти забирать а не с консоли и получится именно то что вам надо.
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
29.02.2016, 20:16
[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
Цитата Сообщение от jimyo77
ничего не понял :)
Ну картинки тогда посмотрите по словам "ladder logic" )
Ваша задача - это вполне типичная задача конфигурирования логики ПЛК.
Можно усложнять методы, т.е. парсер сложных выражений и т.п., а можно наоборот упрощать модель, т.е. по другому формулировать, не в привычной алгебраической форме.
Не в смысле графически рисовать, а в смысле также текстом записывать, но не как строгое матем. выражение
0
0 / 0 / 0
Регистрация: 24.12.2010
Сообщений: 279
01.03.2016, 01:07
Я бы на Вашем месте обратился к темам лексического и синтаксического анализа. Утилиты lex и bison.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2016, 01:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru