Проверка нескольких условий
- Войдите на сайт для отправки комментариев
Втр, 14/04/2015 - 11:46
Всем привет.
Вопрос такой: при совпадении 3х условий необходимо выполнить функцию 1. Как будет правильно организовать проверку? В одном цикле if (A && B && C), или тоже через if, но на каждую проверку свой цикл? Или с точки зрения программы это одно и тоже?
Т.е. "религиозно" правильно будет проверять одним циклом?
лучше так
Да, так. Только почему вы называете эту фиговину "циклом"? :)
:) потому что пишу по if, а думаю по for. Спасибо за замечание.
Т.е. "религиозно" правильно будет проверять одним циклом?
Религиозно правильно так, как требует ситуация. Каких то правил на эту тему нет.
Есть рекомендации при сравнении с константами - указывать сначала константу. Типа if (25==C), тогда меньше шансов написать некорректно, типа как в сообщении #1, if (C = 25) - это ошибка.
Я бы ещё порекомендовал пользоваться скобками, чтобы не нарываться на проблему с приоритетами, но это не обязательно.
Не могу найти в гугле свою ситуацию.
Мне нужно, чтобы переменная с допуском лежала вне диапазона и выполнялось условие по флагу.
Такая конструкция if будет работать? А можно как-то проще? Может без скобок? Как там у него с приоритетами проверки условий? Последовательно?
float flow = 2.0; //требуемая подача float flowTolerance = 0.2; //допуск на подачу float currentFlow; //текущая средняя подача за интервал корректировки, вычисляется в не представленном куске кода boolean valveStatus = 0; //текущий статус электромагнитного клапана void() { if (((currentFlow + flowTolerance) < flow || flow < (currentFlow - flowTolerance)) && valveStatus ==1) {...} else {...} }Такая конструкция if будет работать? А можно как-то проще? Может без скобок?
нормальная конструкция. работать будет. Скобки лучше оставить, с ними нагляднее.
Можно ли проще? - а зачем?
Единственное замечание- в вашем случае логичнее переписать условия так: (currentflow > flow + tolerance)
Меня интересует как будет выполняться вот такое условие
if(a < b || a >b & & a == c)
И вот такое
if(a < b & & a == c || a >b )
Второе будет звучать как "если а меньше б и а равно с ИЛИ а больше б"?
Ну то есть у математических операций есть приоритеты, а у логических?
https://www.viva64.com/ru/t/0064/ Сначало выполняется && а потом ||
у логических тоже. Можно посмотреть по ссылке в сообщении выше.
Однако настоятельно рекомендую использовать скобки. И самому меньше вероятности ошибиться, и другим ваш код будет понятнее. В отличии от арифметических операций, приоритеты логических, битовых и прочих (коих вообще в Си десятка три примерно) - мало кто помнит. Не жалейте ставить скобок - они бесплатны.
Добрый вечер, друзья. Подскажите пожалуйста. В данном куске кода выдает следующую ошибку:
expected unqualified-id before 'if'
if (cur_h >= 7 && cur_h < 19 && airT < 23) { digitalWrite(Relay_Heat, LOW); // включаем подогрев дня digitalWrite(Relay_Fan, LOW); //включаем кулер myGLCD.setColor(VGA_RED); myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 167, 268); }before 'if' - переведите!
ожидается безусловный-ID В 'если'
ну так яндекс переводчик пишет)
)) ДО if. Считайте фигурные скобки.
#include <iarduino_RTC.h> iarduino_RTC time(RTC_DS3231); #include <Wire.h> #include <iarduino_AM2320.h> #include <memorysaver.h> #include <UTFT.h> #define moisture_sensor A0 //пин подключения датчика влажности почвы int very_moist_value = 231;//переменная 100% увлажненния const uint8_t RS = 6; // const uint8_t WR = 5; // const uint8_t CS = 4; // const uint8_t RST = 3; // const uint8_t SER = 2; // UTFT myGLCD(TFT01_24SP, RS, WR, CS, RST, SER); // Создаём объект для работы с дисплеем // НАСТРОЙКИ ДИСПЛЕЯ extern uint8_t SmallFont[]; extern uint8_t BigFont[]; iarduino_AM2320 sensor; #define Relay_Lamp 9 // пин реле включения освещения #define Relay_Heat 10 // пин реле включения подогрева #define Relay_Vent 11 // пин реле включения вентиляции #define Relay_Fan 12 // пин реле включения кулера (с обогревателем) void setup() { sensor.begin(); //запуск датчика АМ2320 time.begin(); //запуск модуля RTC3231 time.settime(0, 58, 18, 06, 11, 19, 2); pinMode(Relay_Lamp, OUTPUT); pinMode(Relay_Heat, OUTPUT); pinMode(Relay_Vent, OUTPUT); pinMode(Relay_Fan, OUTPUT); digitalWrite(Relay_Lamp, HIGH); //выключаем реле digitalWrite(Relay_Heat, HIGH); digitalWrite(Relay_Vent, HIGH); digitalWrite(Relay_Fan, HIGH); //кулер совместно с подогревом myGLCD.InitLCD(PORTRAIT); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); } void loop() { sensor.read(); float airT = sensor.tem; //переменная температуры воздуха float airH = sensor.hum; //переменная влажности воздуха int cur_h = time.Hours; // текущее время - количество часов в 24 часовом формате int cur_min = time.minutes; //текущее время -количество минут myGLCD.setFont(BigFont); myGLCD.setColor(VGA_GREEN); myGLCD.print("GROWCONTROL 1.0", CENTER, 10); myGLCD.setColor(VGA_RED); //Блок вывода с RTC DS_3231 myGLCD.print("TIME", 43, 43); myGLCD.setColor(VGA_WHITE); myGLCD.setFont(SmallFont); // Вывод времени на экран myGLCD.print(String(time.gettime("H:i:s, D")), 25, 70); //разлиновка дисплея myGLCD.drawLine(5, 30, 232, 30); myGLCD.drawLine(5, 98, 232, 98); myGLCD.drawLine(5, 170, 232, 170); myGLCD.drawLine(5, 240, 232, 240); myGLCD.drawLine(150, 40, 150, 310); //вертикальная линия myGLCD.setFont(BigFont); //блок вывода температуры myGLCD.setColor(VGA_PURPLE); myGLCD.print("AirTemp.", 12, 110); myGLCD.setColor(VGA_WHITE); myGLCD.printNumF(sensor.tem, 1, 40, 142); //блок вывода влажности myGLCD.setColor(VGA_BLUE); myGLCD.print("AirHum.", 20, 181); myGLCD.setColor(VGA_WHITE); myGLCD.printNumF(sensor.hum, 1, 40, 212); delay(1000); myGLCD.setColor(VGA_TEAL); //блок вывода влажности почвы myGLCD.print("SoilHum.", 13, 252); int moisture_value = analogRead(moisture_sensor); //переменная влажности почвы int moisture_value_percent = map(moisture_value, very_moist_value, 1023, 100, 0); //myGLCD.print(String (moisture_value), 35, 275); myGLCD.setColor(VGA_WHITE); myGLCD.print(String (moisture_value_percent) + '%', 50, 282); delay(1000); //Включаем реле освещения if (cur_h >= 7 && cur_h < 19) { //если активно digitalWrite(Relay_Lamp, LOW); //включаем реле myGLCD.setColor(VGA_RED); myGLCD.print("LAMP", 162, 55); } else if (cur_h >= 19) { digitalWrite(Relay_Lamp, HIGH); //отключаем реле myGLCD.setColor(VGA_BLACK); myGLCD.print("LAMP", 162, 55); } else digitalWrite(Relay_Lamp, HIGH); //отключаем реле myGLCD.print("LAMP", 162, 55); } // Управление подогревом if (cur_h >= 7 && cur_h < 19 && airT < 23) { digitalWrite(Relay_Heat, LOW); // включаем подогрев дня digitalWrite(Relay_Fan, LOW); //включаем кулер myGLCD.setColor(VGA_RED); myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 167, 268); } else if (cur_h >= 7 && cur_h < 19 && airT > 25) { // если ночь похолодало digitalWrite(Relay_Heat, HIGH); // включаем подогрев ночи digitalWrite(Relay_Fan, HIGH); //включаем кулер myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 167, 268); } else { digitalWrite(Relay_Heat, HIGH); //выключаем реле подогрева digitalWrite(Relay_Fan, HIGH); //выключаем кулер myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 167, 268); }Вот как-то так? Не работает(((
else digitalWrite(Relay_Lamp, HIGH); //отключаем реле myGLCD.print("LAMP", 162, 55); } } // Управление подогревом if (cur_h >= 7 && cur_h < 19 && airT < 23) { digitalWrite(Relay_Heat, LOW); // включаем подогрев дня digitalWrite(Relay_Fan, LOW); //включаем кулер myGLCD.setColor(VGA_RED); myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 167, 268);Вижу что вы и по русски не понимаете.(
Понимаю конечно. Завис на каком-то моменте. Поэтому прошу помощи. Я так понимаю фигурные скобки в предыдущем цикле?
В предшествующем блоке. Циклов там нет.
Все, нашёл недостающую. Спасибо. Надо быть внимательнее