Найдите серию положительных элементов заданной длины K - C (СИ)
Формулировка задачи:
Дан массив A(M). Найдите серию положительных элементов заданной длины K, (серий может быть несколько).
Формат входных данных. [K][M] [1-й элемент массива A] [2-й элемент массива A] и т.д. Элементы массива – целые числа в диапазоне ±1000. M - целое число в диапазоне [2, 20], K - целое число в диапазоне [1, длина массива].
Формат выходных данных. [индекс элемента массива A из первой серии элементов] [пробел] [индекс элемента массива A из первой серии элементов] и т.д. [перевод строки] [индекс элемента массива A из второй серии элементов] [пробел] [индекс элемента массива A из второй серии элементов] и т.д. Если нет ни одной серии, то напечатать no solution.
Рекомендуемое кол-во циклических операторов (без ввода данных): 2 (3?)
Решение задачи: «Найдите серию положительных элементов заданной длины K»
textual
Листинг программы
#include <stdio.h> int find_n(const int* a, int n, int p, int* e, int K, int (*cmp)(int)){ int i = p; while(i < n){ while((i < n) && !(*cmp)(a[i])) ++i; p = i; while((p < n) && (*cmp)(a[p])) ++p; if((i < p) && ((p - i) == K)){ *e = p; return i; } i = p; } return n; } static int compare(int n) { return (n > 0); } int main(void){ int i, p, e; int a[] = { 1, 2, 3, -1, 2, -4, -5, 9, 1, 1, -4, 6, -7, 9, 9, 8 }; int n = sizeof(a)/sizeof(a[0]); int K = 3; p = e = 0; while((p = find_n(a, n, p, &e, K, &compare)) != n){ printf("first: %d last: %d [ ", p, e - 1); for(i = p; i < e; ++i) printf("%d ", a[i]); puts("] "); p = e; } if(!e) puts("no solution"); getchar(); return 0; }
Объяснение кода листинга программы
Этот код на языке C решает задачу поиска серии положительных чисел заданной длины K в массиве целых чисел.
- Первая функция
find_n
принимает входные параметры:a
- указатель на начало массиваn
- размер массиваp
- индекс начального элемента серии (входит в серию)e
- указатель на переменную, в которую будет записан индекс последнего элемента серииK
- длина серииcmp
- функция сравнения, в данном случаеcompare
, которая принимает число и возвращает1
, если число положительное, и0
в противном случае Функция работает следующим образом:- Переменная
i
инициализируется значениемp
. - В цикле
while
происходит поиск первого элемента серии. Цикл выполняется до тех пор, пока не будет найден элемент, для которогоcmp
возвращает1
. При этомi
увеличивается на единицу. - Затем начинается поиск последнего элемента серии. Цикл выполняется до тех пор, пока не будет найден элемент, для которого
cmp
возвращает1
, или пока не будет достигнут конец массива. При этомp
увеличивается на единицу. - Если длина серии
K
равна расстоянию междуi
иp
, то есть серия, и в этом случаеe
присваивается значениеp
, аi
увеличивается на единицу. - В конце функция возвращает
i
, который является индексом первого элемента следующей серии, илиn
, если больше нет серий.
- Вторая функция
main
является точкой входа в программу и содержит код для тестирования первой функции.- Переменные
i
,p
иe
инициализируются нулевыми значениями. - Массив
a
и его размерn
инициализируются значениями из примера. - Переменная
K
инициализируется значением3
. p
иe
инициализируются нулевыми значениями.- В цикле
while
происходит поиск серий положительных чисел. Если найдена новая серия, то она выводится на экран. - Если в цикле не было найдено ни одной серии, выводится сообщение
no solution
. - В конце программа ожидает нажатия клавиши для выхода.
- Переменные
- Функция сравнения
compare
принимает числоn
и возвращает1
, если число положительное, и0
в противном случае. Эта функция используется в качестве аргумента для функцииfind_n
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д