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

  1. Первая функция 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, если больше нет серий.
  2. Вторая функция main является точкой входа в программу и содержит код для тестирования первой функции.
    • Переменные i, p и e инициализируются нулевыми значениями.
    • Массив a и его размер n инициализируются значениями из примера.
    • Переменная K инициализируется значением 3.
    • p и e инициализируются нулевыми значениями.
    • В цикле while происходит поиск серий положительных чисел. Если найдена новая серия, то она выводится на экран.
    • Если в цикле не было найдено ни одной серии, выводится сообщение no solution.
    • В конце программа ожидает нажатия клавиши для выхода.
  3. Функция сравнения compare принимает число n и возвращает 1, если число положительное, и 0 в противном случае. Эта функция используется в качестве аргумента для функции find_n.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы