---
# System prepended metadata

title: Lab 3

---

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


```