Вывод кода не соответствует ожидаемому

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <Keypad.h>

const byte ROWS = 4; //четыре строки
const byte COLS = 4; //три столбца
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'E'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
int count = 0; char num[4];
char key;
byte rowPins[ROWS] = {A0, A1, A2, A3}; //подключиться к выводам строки клавиатуры
byte colPins[COLS] = {6, 5, 4, 3}; //подключаемся к выводам столбцов клавиатуры

char adhaar[4][4] = {
  {'1', '0', '8', '3'},
  {'9', '1', '6', '0'},
  {'5', '7', '6', '1'},
  {'6', '7', '9', '3'}
};

char adhaar0[4] = {'1', '0', '8', '3'};
char adhaar1[4] = {'9', '1', '6', '0'};
char adhaar2[4] = {'5', '7', '6', '1'};
char adhaar3[4] = {'6', '7', '9', '3'};
boolean check, control, adhar, tag_status;
int i = 0, j, p, q;

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
  Serial.begin(9600);
  Serial.println(" enter your adhaar ");
}

void loop() {
  getkey();
  checkkey();
}

void getkey() {
  while (i < 4) {
    char key = keypad.getKey();
    if (key) {
      num[i] = key;
      Serial.print(num[i]);
      i++;
    }
  }
}


void checkkey() {
  if (i == 4) {
    control = true;
    for (p = 0; p < 4; p++) {
      for (q = 0; q < 4; q++) {
        if (adhaar[p][q] == num[q]) {
          check = true;
          Serial.println(num[q]);
        } else {
          check = false;
          Serial.println(" not eligile");
          break;
        }
      }
      if (check == true) {
        adhar = true;
        Serial.println(" cast your vote");
      }
    }
    i = 0;
  }
}

Моя проблема в том, что как только adhaar совпадает со значениями, инициализированными в имеющемся у меня массиве, он, как и ожидалось, «отдаст свой голос», но после этого снова выполняет «не подходит» 3 раза.

, 👍0

Обсуждение

Какой результат был получен? Чего вы ожидали? Пожалуйста, отредактируйте свой вопрос., @Craig

Проблема в том, что как только adhaar совпадет со значениями, инициализированными в полученном мной массиве, он, как и ожидалось, выдаст сообщение «отдайте свой голос», но после этого снова выдаст сообщение «не имеет права» 3 раза., @Renuka A Rajur

пожалуйста, кто-нибудь, помогите мне решить эту проблему...спасибо, @Renuka A Rajur

Не отвечайте в комментарии, **пожалуйста, отредактируйте свой вопрос**!, @Edgar Bonet

Также, пожалуйста, просто опубликуйте вывод, а не пытайтесь его объяснить., @Chad G

добавьте строку с return; после Serial.println(" cast your vote");, чтобы не проверять оставшиеся коды, @Juraj


1 ответ


2

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

Тогда причина наблюдаемого поведения заключается в том, что вы сравниваете Введенный код с 4 предустановленными кодами. Что бы ни ввел пользователь, будет по крайней мере 3 несовпадения, поэтому 3 раза программа выводит «не элигиле».

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

Во-первых, как определить, одинаковы ли два четырёхзначных кода? это:

// Совпадают ли коды a и b?
bool match(char a[4], char b[4]) {
    for (int i = 0; i < 4; i++) {
        if (a[i] != b[i])
            return false;
    }
    return true;
}

Затем, учитывая введенный пользователем код, определить, совпадает ли он adhaar[0] или adhaar[1] или... или ни один из них:

// Возвращает индекс adhaar, соответствующий заданному ключу,
// или -1, если совпадений нет.
int matching_idx(char key[4]) {
    for (int i = 0; i < 4; i++) {
        if (match(key, adhaar[i]))
            return i;
    }
    return -1;  // нет совпадения
}

Теперь вашу функцию checkkey() можно переписать следующим образом:

void checkkey() {
    if (i != 4) return;  // никогда не должно произойти
    if (matching_idx(num) == -1)
        Serial.println(" not eligile");
    else
        Serial.println(" cast your vote");
    i = 0;
}
,

когда я пробую это, получается бесконечный цикл... и он не переходит в следующий цикл, @Renuka A Rajur

@RenukaARajur: Он попадает в бесконечный цикл, потому что я забыл очистить глобальную переменную i в checkkey(). Исправлено в редактировании. Обратите внимание, что такой способ использования глобальной переменной i изначально очень неудачный: вместо этого должен быть локальный счётчик getkey(), как в for (int i = 0; i < 4; i++) ...., @Edgar Bonet