# Lab 3
Вначале программы я:
1. задаю входную последовательность
2. вызываю основную функцию вычисления
3. вывожу результат в порт D
Основная функция вычисляет количество элементов последовательности меньше всех последующих элементов
В ней я:
### Вычисляю длину последовательности.
Инициализирую переменную `n` – длину последовательности – нулём. Затем иду по последовательности используя указатели пока не наткнусь на `0` - признак окончания последовательности, при этом увеличивая `n` на `1` при каждой итерации
### Если последовательность длины ноль
Если последовательность длины ноль, то очевидно, что количество элементов меньше следующих - ноль
### Основной цикл
Вычисляю количество элементов меньше следующих проходя элементы в обратном порядке и используя минимальное найденное значение.
У последнего элемента нет последующих, считаю его подходящим под условие.
Для того чтобы проверять действительно ли элемент последовательности меньше я сравниваю его с минимумом всех последующих элементов, который обновляю на каждой итерации цикла.
Минимум инициализирую последним элементом
Проходя по элементам последовательности в обратном порядке (от предпоследнего до первого) я сравниваю текущий элемент с текущим минимумом. Если элемент меньше текущего минимума то я увеличиваю счётчик элементов меньше последующих (`res`) и обновляю текущий минимум.
### Вывожу ответ
Собственно вывожу.
## Код программы с комментариями
Почти идентичен тексту сверху
```c
#include <avr/io.h>
// функция вычисляет количество элементов последовательности
// меньше всех последующих элементов
uint8_t less_than_next(uint8_t *ptr) {
// вычисляю длину последовательности
// инициализирую переменную n – длину последовательности – нулём
uint8_t n = 0;
// иду по последовательности используя указатели
// пока не наткнусь на 0 - признак окончания последовательности
for(uint8_t *ptr_i = ptr; *ptr_i != 0; ptr_i++) {
// увеличиваю n на 1
n++;
}
// в итоге получается длина последовательности
// если последовательность длины ноль,
// то очевидно, что количество элементов меньше следующих - ноль
if (n == 0) {
return 0;
}
// вычисляю количество элементов меньше следующих
// проходя элементы в обратном порядке
// и используя значение текущего минимума
// у последнего элемента нет последующих, считаю его подходящим под условие
uint8_t res = 1;
// инициализирую текущий минимум последним элементом
uint8_t min = ptr[n-1];
// прохожу все элементы в оратном порядке - от первого до предпоследнего
for(uint8_t i = 1; i < n; i++) {
if (ptr[(n-1) - i] < min) { // если элемент меньше текущий минимума
res++; // значит он меньше всех последующих (меньше минимального из последующих)
min = ptr[(n-1) - i]; // обновляю текущий минимум
}
}
// отдаю ответ
return res;
}
int main(void)
{
// задаю входную последовательность
uint8_t data[] = {1, 2, 5, 2, 3, 255, 0};
// вызываю основную функцию вычисления
uint8_t res = less_than_next(data);
while (1)
{
// вывожу результат в порт D
PORTD = res;
}
}
```