# 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; } } ```