Чем заменить кучу операторов 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, чтобы упростить его! Заранее спасибо!
bool compareArrays(int a[], int b[]) { for(int i = 0; i < 4; i++) { if (a[i] != b[i]) return false; } return true; }memcmp((uint8_t*) pass, (uint8_t*) in, sizeof(pass))
#2 лучше
а если использовать не FOR а например WHILE, то получается так
bool compareArrays(int a[], int b[]) { int i = 0; while( i < 4) // если в массиве 4 элемента { if (a[i] != b[i]) return false; // нет совпадения, вернуть false и выйти i++; // а иначе перейти к следующему сравнению } return true; }Посмотрите пожалуйста, правильно ли я написал!
Да, правильно. Но лучше используйте сравнение памяти из #2.
#include <string.h> if ( memcmp((uint8_t*) pass, (uint8_t*) in, sizeof(pass)) == 0 ) { // pass = in, do something }