Подсчет количества повторяющихся значений

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Добрый день. Новичок в теме, поэтому никак не могу найти ответа на вопрос:

для проверки и закрепления навыков пишу следующую программу:

на экран рандомно подаются значения переменной.

Вторая переменная должна считать,сколько раз выпадали:

Первый вариант задачи: одинаковые числа, велся их учёт и выводился там же

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

#include <LiquidCrystal.h>
#include <Time.h>

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup()
{
  lcd.begin(16,2);
  lcd.clear();
  randomSeed(analogRead(0));
}

void loop()
{
  int a = random(256);
  lcd.setCursor(0,0);
  lcd.print("Random N: ");
  lcd.print(a);
  if (a>200)
  {
    int b = 0;
    b++;
    lcd.setCursor(5,1);
    lcd.print("N>200: ");
    lcd.print(b);
  }
  delay(1000);
  
}

у меня же после нескольких итераций выскакивает во второй строке значение второй переменной = 1(стало быть, один раз число проскачило) и все,больше не меняется.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

the_matrix пишет:

Первый вариант задачи: одинаковые числа, велся их учёт и выводился там же

ЧТо такое одинаковые числа? Вы можете словами написать что под этим понимается?

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Конечно.

Допустим, за час на дисплее выпало 50 раз число 200.

во второй строке должно появиться именно это значение.(50 раз)

Или же,как во втором варианте, пример: количество значений, превысивших значение 200 должны отображаться на счётчике.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет так не пойдёт. Вы только 200 считаете? Об этом не было речи. А если 5 раз выпдет 200 и шесть раз 150, тогда как?

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Задаа в следующем:

в случайном порядке на экране появляются значения переменной а;

при наступлении определенного условия (значение а = 200; равно 900; больше 300) вторая переменная  b начинает отображать количество раз,когда это условие выполнилось.

Может,я как-то неверно объясняю?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

the_matrix пишет:

#include <LiquidCrystal.h>
#include <Time.h>

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup()
{
  lcd.begin(16,2);
  lcd.clear();
  randomSeed(analogRead(0));
}

void loop()
{
  int a = random(256);
  lcd.setCursor(0,0);
  lcd.print("Random N: ");
  lcd.print(a);
  if (a>200)
  {
    int b = 0;
    b++;
    lcd.setCursor(5,1);
    lcd.print("N>200: ");
    lcd.print(b);
  }
  delay(1000);
  
}

Я так понял, это вторая задача?

А теперь 

the_matrix пишет:

для проверки и закрепления навыков

Проштудируйте тему статические и глобальные переменные, выясните чем отличается автоматическая переменная от статической, посмотрите на свой код и исправьте ошибку.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

the_matrix пишет:

Может,я как-то неверно объясняю?

Да, Вы невнятно объясняли, теперь понятно. Ну, тогда у Вас не две задачи, а одна. т.к. в принципе пофиг, какое там условие.

Что касается Вашего кода, то на ошибку я Вам уже намекнул. Работайте.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Благодарю! Ушёл читать матчасть.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018
#include <LiquidCrystal.h>

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup()
{
  lcd.begin(16,2);
  lcd.clear();
  randomSeed(analogRead(0));
}

void loop()
{
  int a = random(256);
  lcd.setCursor(0,0);
  lcd.print("Random N: ");
  lcd.print(a);
  if (a >= 200)
  {
    static int b = 0;
    b++;
    lcd.setCursor(5,1);
    lcd.print("N>200: ");
    lcd.print(b);
  }
  delay(1000);
}

Ошибку нашёл, переменную вынес.

Теперь другой косяк: значения больше 200 он начал считать, но при рандоме свыше 256 (а он и 853 и 998 может выдать) он их не засчитывает. Что-то не уловил?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, зачем так жестоко. Если переменная нигде, кроме как в одной функции не используется, то делать её глобальной - любительство и говнокод. Оставляйте её внутри функции, просто сделайте статической.

the_matrix пишет:
а он и 853 и 998 может выдать

С какого это перепугу, если Вы в 16-ой строке явно написали 256? Он Вам вылаёт от 0 до 255 и ничего больше. Неужели Вам на экран что-то другое вылазит? Не может такого быть.

Другое дело, что Вы ещё сверху ограничили "a <= 999" непонятно зачем.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

 

 

 

 

 

 

 

 

 

 

 

Именно так и происходит - среди значений на дисплее пробегают и 500-е и 800-е значения. Именно после появления на дисплее таких значений и решил ограничить её сверху, но и это никак не изменило ситуацию.

 

Про переменную учёл, благодарю.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну правильно, Вы ж выводите поверх старых значений. Вот, например, было значение 108, следующее значение вышло 75 вот на экране и будет 758

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Так для того,чтобы избавиться от этого наложения и используется команда lcd.clear при начальных условиях скетча. Разве нет?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Нет, процедура setup выполняется один раз при старте контроллера. Вам надо либо форматировать вывод, например, всегда три цифры выводить, либо полностью очищать экран либо пробелами забивать место где будет вывод числа

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

the_matrix пишет:

для проверки и закрепления навыков ...

#include <LiquidCrystal.h>
#include <Time.h>


#define max_size 256
long mas[max_size];

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  randomSeed(analogRead(0));
  for (int i = 0; i < max_size; i++) mas[i] = 0;
}

void loop()
{

  int a = random(max_size);
  mas[a]++;
  lcd.setCursor(0, 0);
  lcd.print("Random N: ");
  lcd.print(a);
  lcd.print("   ");

  // а тут пробежавшийсь по масиву mas можно выяснить все что угодно
  long more200 = 0;

  for (int i = 0; i < max_size; i++) {
    // ну например кол-во выпавших чисел > 200
    if (i > 200) more200 += mas[i];
  }

  lcd.setCursor(0, 1);
  lcd.print("N>200: ");
  lcd.print(more200);
  lcd.print("   ");
  

  // или кол-во выпавших чисел = 200 и т.д.
/*
  lcd.setCursor(0, 1);
  lcd.print("N=200: ");
  lcd.print(mas[200]);
  lcd.print("  ");
*/
  delay(1000);
}