Проверка нескольких условий

funakoshi
Offline
Зарегистрирован: 13.03.2015

Всем привет.

Вопрос такой: при совпадении 3х условий необходимо выполнить функцию 1. Как будет правильно организовать проверку? В одном цикле if  (A && B && C), или тоже через if, но на каждую проверку свой цикл? Или с точки зрения программы это одно и тоже?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
if (A==10 && B==12 && C=25) funk1();

 

funakoshi
Offline
Зарегистрирован: 13.03.2015

Т.е. "религиозно" правильно будет проверять одним циклом?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

лучше так

Datak
Offline
Зарегистрирован: 09.10.2014

Да, так. Только почему вы называете эту фиговину "циклом"? :)

funakoshi
Offline
Зарегистрирован: 13.03.2015

:) потому что пишу по if, а думаю по for. Спасибо за замечание.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

funakoshi пишет:

Т.е. "религиозно" правильно будет проверять одним циклом?


Религиозно правильно так, как требует ситуация. Каких то правил на эту тему нет.
Есть рекомендации при сравнении с константами - указывать сначала константу. Типа if (25==C), тогда меньше шансов написать некорректно, типа как в сообщении #1, if (C = 25) - это ошибка.
Я бы ещё порекомендовал пользоваться скобками, чтобы не нарываться на проблему с приоритетами, но это не обязательно.

unisonic
Offline
Зарегистрирован: 09.01.2018

Не могу найти в гугле свою ситуацию.

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

Такая конструкция 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
{...}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

unisonic пишет:

Такая конструкция if будет работать? А можно как-то проще? Может без скобок?

нормальная конструкция. работать будет.  Скобки лучше оставить, с ними нагляднее. 

Можно ли проще? - а зачем?

 

Единственное  замечание- в вашем случае логичнее переписать условия так: (currentflow > flow + tolerance)

unisonic
Offline
Зарегистрирован: 09.01.2018

Меня интересует как будет выполняться вот такое условие
if(a < b || a >b & & a == c)
И вот такое
if(a < b & & a == c || a >b )
Второе будет звучать как "если а меньше б и а равно с ИЛИ а больше б"?

unisonic
Offline
Зарегистрирован: 09.01.2018

Ну то есть у математических операций есть приоритеты, а у логических?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

https://www.viva64.com/ru/t/0064/   Сначало выполняется && а потом ||

b707
Offline
Зарегистрирован: 26.05.2017

unisonic пишет:
Ну то есть у математических операций есть приоритеты, а у логических?

у логических тоже. Можно посмотреть по ссылке в сообщении выше.

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

plants34
Offline
Зарегистрирован: 19.09.2019

Добрый вечер, друзья. Подскажите пожалуйста. В данном куске кода выдает следующую ошибку: 

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);
}

 

Green
Offline
Зарегистрирован: 01.10.2015

before 'if' - переведите!

plants34
Offline
Зарегистрирован: 19.09.2019

ожидается безусловный-ID В 'если'

ну так яндекс переводчик пишет)

Green
Offline
Зарегистрирован: 01.10.2015

)) ДО if. Считайте фигурные скобки.

plants34
Offline
Зарегистрирован: 19.09.2019
#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);
}

 

plants34
Offline
Зарегистрирован: 19.09.2019

Вот как-то так? Не работает(((

 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);

 

Green
Offline
Зарегистрирован: 01.10.2015

Вижу что вы и по русски не понимаете.(

plants34
Offline
Зарегистрирован: 19.09.2019

Понимаю конечно. Завис на каком-то моменте. Поэтому прошу помощи. Я так понимаю фигурные скобки в предыдущем цикле?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

В предшествующем блоке. Циклов там нет.

plants34
Offline
Зарегистрирован: 19.09.2019

Все, нашёл недостающую. Спасибо. Надо быть внимательнее