Чем заменить кучу операторов IF
- Войдите на сайт для отправки комментариев
Пт, 06/03/2020 - 20:37
Есть два массива
int pass[4] = {3, 6, 1, 8}; // заданный заранее
int in[4]; // считанный с клавы
Считывается он простейшим способом,
in[0] = KB.getNum;
...
...
in[3] = KB.getNum;
сравнение массивов тоже идет без цикла
if (in[0] == pass[0]) { if (in[1] == pass[1]) { if (in[2] == pass[2]) { if (in[3] == pass[3]) { /* выполняющийся код */ } } } }
Хорошо, что там только 4 элемента, а если бы 10 или 20. Поэтому и задумался, как написать покороче.
for(int i=0; i < sizeof(in)/sizeof int; i++) { in[i] = KB.getNum; }
А вот как заменить эту кучу IF, пока не разобрался. Можно ли тоже использовать цикл например FOR или WHILE? Например так
for(int i=0; i < sizeof(in)/sizeof(in[0]); i++){ if (!(in[i] == pass[i])) return; // если нет совпадения, выйти из цикла! }
Скетч, который я нашел здесь Код полностью:
#include <iarduino_KB.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <Servo.h> iarduino_KB KB(9, 8, 7, 6, 5, 4, 3, 2); LiquidCrystal_I2C lcd(0x27, 16, 2); Servo servo; int pass[4] = {3, 6, 1, 8}; int in[4]; int r = 11; int g = 12; void setup() { KB.begin(KB1); pinMode(r, OUTPUT); pinMode(g, OUTPUT); lcd.init(); lcd.backlight(); digitalWrite(g, LOW); digitalWrite(r, HIGH); servo.attach(10); servo.write(0); lcd.setCursor(0, 0); } void loop() { lcd.clear(); lcd.print("Enter code."); while (!KB.check(KEY_DOWN)) { delay(1); } in[0] = KB.getNum; lcd.clear(); lcd.setCursor(0, 0); lcd.print('*'); while (!KB.check(KEY_DOWN)) { delay(1); } in[1] = KB.getNum; lcd.print('*'); while (!KB.check(KEY_DOWN)) { delay(1); } in[2] = KB.getNum; lcd.print('*'); while (!KB.check(KEY_DOWN)) { delay(1); } in[3] = KB.getNum; lcd.print('*'); if (in[0] == pass[0]) { if (in[1] == pass[1]) { if (in[2] == pass[2]) { if (in[3] == pass[3]) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Open."); tone(13, 400, 750); servo.write(180); digitalWrite(r, LOW); digitalWrite(g, HIGH); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Close."); tone(13, 300, 700); servo.write(0); digitalWrite(g, LOW); digitalWrite(r, HIGH); delay(1000); } } } } }
Помогите пожалуйста разобраться с кучей IF, чтобы упростить его! Заранее спасибо!
memcmp((uint8_t*) pass, (uint8_t*) in, sizeof(pass))
#2 лучше
а если использовать не FOR а например WHILE, то получается так
Посмотрите пожалуйста, правильно ли я написал!
Да, правильно. Но лучше используйте сравнение памяти из #2.