Найдите серию положительных элементов заданной длины 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.