Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обработка логических условий. / 25 сообщений из 49, страница 1 из 2
01.03.2016, 10:55
    #39182203
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Пишу в С под микроконтроллер.
я хочу выполнять разные задачи в камне. скажем включи вентилятор после 17:00 если температура больше 30* C и выключи его после 22:00 или если температура упала ниже 27* C.
я бы мог записать в терминале.
Код: plaintext
1.
2.
time >= 17:00 AND temp > 30 out1 = 1
time >= 22:00 OR temp < 27 out1 = 0


это легко распарсить в структуру и потом проверить.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct sTaskParam
{
	float *variable;
	float limit;
	uint32_t compare;    //0 = '==', 1 = '>', 2 = '<', 3 = '>=', 4 = '<=', 5 = '!='
	uint32_t logicGate;  //0=none, 1=or, 2=and
};
Struct sTaskParam taskParam[4]; 


и потом заполнить (это псевдо код чтоб не усложнять. в реале немного подругому.)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
taskParam[0].variable =time;
taskParam[0].compare = “>=”;
taskParam[0].limit =17.00;
taskParam[0].logicGate = and;

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
Код: plaintext
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(float *val, float val_lim, uint32_t compare)
{
	switch (compare)
	{
	    case 0: return (*val == val_lim); break;
	    case 1: return (*val > val_lim);  break;
	    case 2: return (*val < val_lim);  break;
	    case 3: return (*val >= val_lim); break;
	    case 4: return (*val <= val_lim); break;
	    case 5: return (*val != val_lim); break;
	    default : return BAD_PARAM;
	}
}
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;
}


ну и похожим образом для второго условия.

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

вот тут я впал в ступор - time > 17:00 OR (temperature > 30 AND in1 = 1) out1=1
как хранить и обрабатывать логические группы?
...
Рейтинг: 0 / 0
01.03.2016, 11:32
    #39182261
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Код: sql
1.
2.
time = 23:00 
temp = 31


Что будет при таких данных?
...
Рейтинг: 0 / 0
01.03.2016, 11:37
    #39182270
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Dima T
Код: sql
1.
2.
time = 23:00 
temp = 31


Что будет при таких данных?

мда. вопрос поставлен верно. тут наверно надо выставлять границы time>17:00 and time<18:00
...
Рейтинг: 0 / 0
01.03.2016, 11:50
    #39182309
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Храни в массиве в Польской нотации и напиши свой вычислятор. Это не не сложно.
...
Рейтинг: 0 / 0
01.03.2016, 11:55
    #39182316
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7как хранить и обрабатывать логические группы?
Начать можно с подхода "по-дилетантски". Снять нагрузку с парсера и переложить её на оператора. Т.е. пойти по пути разбиения на элементарные выражения. И трансформировать
jenya7time > 17:00 OR (temperature > 30 AND in1 = 1) out1=1
в вид

time > 17:00 => memory1
temperature > 30 => memory2
in1 = 1 => memory3
memory2 AND memory3 => memory2
memory1 OR memory2 => memory1
memory1 IS TRUE => SET out1=1
...
Рейтинг: 0 / 0
01.03.2016, 11:57
    #39182323
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Dima TХрани в массиве в Польской нотации и напиши свой вычислятор. Это не не сложно.

пользователь ничего не знает о польской нотации и програмировании.
он может написать простое логическое условие понятное каждому.
и потом зачем влезать в - форты, стеки, польские нотации - это все прекрасно но есть место и для других решений.
мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
...
Рейтинг: 0 / 0
01.03.2016, 12:03
    #39182331
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7пользователь ничего не знает о польской нотации и програмировании.На калькуляторе он считать умеет? ячейкой памяти на нём пользоваться умеет? этой квалификации достаточно...
...
Рейтинг: 0 / 0
01.03.2016, 12:03
    #39182333
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Akinajenya7как хранить и обрабатывать логические группы?
Начать можно с подхода "по-дилетантски". Снять нагрузку с парсера и переложить её на оператора. Т.е. пойти по пути разбиения на элементарные выражения. И трансформировать
jenya7time > 17:00 OR (temperature > 30 AND in1 = 1) out1=1
в вид

time > 17:00 => memory1
temperature > 30 => memory2
in1 = 1 => memory3
memory2 AND memory3 => memory2
memory1 OR memory2 => memory1
memory1 IS TRUE => SET out1=1

вот тут как раз затык :) как знать програмно что memory2 AND memory3 - это одна группа а memory1 OR memory2 вторая.
...
Рейтинг: 0 / 0
01.03.2016, 12:05
    #39182335
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Akinajenya7пользователь ничего не знает о польской нотации и програмировании.На калькуляторе он считать умеет? ячейкой памяти на нём пользоваться умеет? этой квалификации достаточно...
у меня нет никакой математики. только логические условия.
...
Рейтинг: 0 / 0
01.03.2016, 12:09
    #39182344
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7Dima TХрани в массиве в Польской нотации и напиши свой вычислятор. Это не не сложно.

пользователь ничего не знает о польской нотации и програмировании.
он может написать простое логическое условие понятное каждому.
и потом зачем влезать в - форты, стеки, польские нотации - это все прекрасно но есть место и для других решений.
мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
При чем тут пользователь? Вопрос стоял так
jenya7но при усложнении логики и добавлении скобок парсинг резко усложняется и не понятно какую структуру изобрести для сложных логических выражений.
вот и парси то что ввел пользователь в польскую нотацию, а при проверках вычисляй. Можешь просто парсить каждый раз, но с предобработкой быстрее.

ИМХУ тут код не сложнее твоего будет. Но универсальный, любое выражение пользователя в такую структуру впишется.

PS Akina, по сути тоже самое предлагает.
...
Рейтинг: 0 / 0
01.03.2016, 12:13
    #39182349
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Dima Tjenya7пропущено...


пользователь ничего не знает о польской нотации и програмировании.
он может написать простое логическое условие понятное каждому.
и потом зачем влезать в - форты, стеки, польские нотации - это все прекрасно но есть место и для других решений.
мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
При чем тут пользователь? Вопрос стоял так
jenya7но при усложнении логики и добавлении скобок парсинг резко усложняется и не понятно какую структуру изобрести для сложных логических выражений.
вот и парси то что ввел пользователь в польскую нотацию, а при проверках вычисляй. Можешь просто парсить каждый раз, но с предобработкой быстрее.

ИМХУ тут код не сложнее твоего будет. Но универсальный, любое выражение пользователя в такую структуру впишется.

PS Akina, по сути тоже самое предлагает.
боюсь польскую нотацию мне не потянуть. :)
...
Рейтинг: 0 / 0
01.03.2016, 12:23
    #39182362
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7боюсь польскую нотацию мне не потянуть. :)
Но в конце-концов именно ее ты и "изобретешь"
Все придумано до нас :)
Почитай про Обратную польскую запись Там все вплоть до алгоритмов как из обычной преобразовать.
Примеры кода там же
...
Рейтинг: 0 / 0
01.03.2016, 12:31
    #39182373
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Если смущает что у тебя >=, OR, AND а там +,- и т.д. рассматривай >=, OR, AND как такие же действия как и +,-
...
Рейтинг: 0 / 0
01.03.2016, 12:39
    #39182389
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7как знать програмно что memory2 AND memory3 - это одна группа а memory1 OR memory2 вторая.ЗАЧЕМ?
То, что я привёл - это именно то, что оператор должен передать контроллеру.
...
Рейтинг: 0 / 0
01.03.2016, 13:00
    #39182443
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Akinajenya7как знать програмно что memory2 AND memory3 - это одна группа а memory1 OR memory2 вторая.ЗАЧЕМ?
То, что я привёл - это именно то, что оператор должен передать контроллеру.
я понял. да это неплохое решение. но дело в том что я не хочу сильно загружать пользователя. ему должно быть максимально комфортно.
представте себе что вы купили какой нибудь прибор и вам предлагают писать там скрипты чтоб запустить его а вы на минуточку не програмист а водитель автобуса. я немного утрирую но дрифт такой. :)
...
Рейтинг: 0 / 0
01.03.2016, 13:06
    #39182454
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7,

как устроен пользовательский интерфейс? физически
...
Рейтинг: 0 / 0
01.03.2016, 13:37
    #39182501
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7представте себе что вы купили какой нибудь прибор и вам предлагают писать там скрипты чтоб запустить его а вы на минуточку не програмист а водитель автобуса.
Пример некорректен.

jenya7дело в том что я не хочу сильно загружать пользователя. ему должно быть максимально комфортно.Ну так и сделайте ему комфортный интерфейс программирования. С унифицированными блоками и конструкциями, отслеживанием, автогенерацией, контекстной справкой, эмуляцией выполнения с отладкой...
А если оператор, в должностные обязанности которого входит программирование контроллера, не умеет этого делать и неспособен во вменяемые сроки научиться - надо ставить вопрос о его профнепригодности, а не подтирать ему задницу.
...
Рейтинг: 0 / 0
01.03.2016, 13:56
    #39182532
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Изопропилjenya7,

как устроен пользовательский интерфейс? физически

обычный терминал.
...
Рейтинг: 0 / 0
01.03.2016, 14:05
    #39182547
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Akinajenya7представте себе что вы купили какой нибудь прибор и вам предлагают писать там скрипты чтоб запустить его а вы на минуточку не програмист а водитель автобуса.
Пример некорректен.

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

это расчитано на обычного пользователя. я сделаю со временем десктопную апликацию но нужно дать возможность работать с обычного терминала.
...
Рейтинг: 0 / 0
01.03.2016, 16:20
    #39182761
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7но нужно дать возможность работать с обычного терминала.
значит командный язык внятный разработать нужно и задокументировать,
внутреннее представление - вторично
...
Рейтинг: 0 / 0
01.03.2016, 16:56
    #39182803
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7это расчитано на обычного пользователя. я сделаю со временем десктопную апликацию но нужно дать возможность работать с обычного терминала.
Помнится, во времена ROM-BASIC распрекрасно программа вводилась в режиме терминала, и никого это не парило. Сделай аналогичный BASIC для своего контроллера - и всего-то делов, что нумеровать строки и иметь операцию вставки строки с заданным номером (при наличии такого номера выполняя замещение) и удаление строки с заданным номером. Всё равно созданный тобой код работает в режиме интерпретации.
...
Рейтинг: 0 / 0
01.03.2016, 18:57
    #39182957
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Akinajenya7это расчитано на обычного пользователя. я сделаю со временем десктопную апликацию но нужно дать возможность работать с обычного терминала.
Помнится, во времена ROM-BASIC распрекрасно программа вводилась в режиме терминала, и никого это не парило. Сделай аналогичный BASIC для своего контроллера - и всего-то делов, что нумеровать строки и иметь операцию вставки строки с заданным номером (при наличии такого номера выполняя замещение) и удаление строки с заданным номером. Всё равно созданный тобой код работает в режиме интерпретации.
да. действительно. всего то делов. и чего я на форум за помощью пришел. :)
...
Рейтинг: 0 / 0
01.03.2016, 19:01
    #39182964
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Изопропилjenya7но нужно дать возможность работать с обычного терминала.
значит командный язык внятный разработать нужно и задокументировать,
внутреннее представление - вторично
да вот как раз внутренняя реализация это проблема. парсинг такой или другой я сделаю.
...
Рейтинг: 0 / 0
01.03.2016, 19:03
    #39182969
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
jenya7да. действительно. всего то делов. и чего я на форум за помощью пришел. :)
Это 18881581 почитал? Там все элементарно. Не изобретай велосипед, потрать чуть больше времени на разбор и напиши один раз на всю оставшуюся жизнь.
...
Рейтинг: 0 / 0
01.03.2016, 19:09
    #39182975
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка логических условий.
Dima Tjenya7да. действительно. всего то делов. и чего я на форум за помощью пришел. :)
Это 18881581 почитал? Там все элементарно. Не изобретай велосипед, потрать чуть больше времени на разбор и напиши один раз на всю оставшуюся жизнь.

да. там есть один пример где учитываются скобки. пытаюсь его вкурить. спасибо.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обработка логических условий. / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]