Найти общее количество элементов в постоянных участках последовательности - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Постоянным участком называется участок, состоящий по крайней мере из двух идущих подряд равных чисел. Пример: 3 2 5 5 6 7 1 2 1 1 1 1 5 6 9 2 2 Ответом будет 8. Пусть я сравниваю числа и нахожу кол-во равных друг другу чисел. То есть 5 на выше указанном примере. А что делать дальше я не совсем понимаю ? Последовательность считывается с файла, и все это нужно сделать за один проход по файлу, то есть за один цикл.

Решение задачи: «Найти общее количество элементов в постоянных участках последовательности»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
unsigned GetLengthConstRegions(FILE* stream)
{
    unsigned length = 0;
    int region = 0, equals = 0;
    int numbPrev, numbNext;
    if (fscanf(stream, "%d", &numbPrev) == 1)
    {
        while (fscanf(stream, "%d", &numbNext) == 1)
        {
            equals = (numbPrev == numbNext);
            length += (equals || region);
            region = equals;
            numbPrev = numbNext;
        }
        length += region;
    }
 
    return length;
}
 
int main(int argc, char* argv[])
{
    FILE* f = stdin;
 
    if ((argc > 1) && (f = fopen(argv[1], "r")) == NULL)
    {
        perror(argv[1]);
        f = stdin;
    }
 
    printf("%u\n", GetLengthConstRegions(f));
 
    return 0;
}

Объяснение кода листинга программы

В этом коде реализована функция GetLengthConstRegions, которая принимает на вход файловый поток и возвращает количество постоянных участков в числовой последовательности из этого файла. Алгоритм работы функции следующий:

  1. Сначала мы инициализируем переменные length (количество), region (регион) и equals (равно) со значениями 0.
  2. Затем мы читаем первый элемент из потока и сохраняем его в переменной numbPrev (предыдущее число).
  3. После этого мы входим в цикл, пока можем прочитать следующее число из потока и сохраняем его в переменной numbNext (следующее число).
  4. Мы проверяем, равны ли numbPrev и numbNext. Если да, то устанавливаем значение equals (равно) в 1.
  5. Мы добавляем equals к length (количество), а затем обновляем region (регион) значением equals.
  6. Мы обновляем numbPrev значением numbNext, чтобы подготовиться к следующей итерации.
  7. Мы повторяем шаги с 3 по 6 до тех пор, пока можем читать числа из потока.
  8. После выхода из цикла мы добавляем значение region к length (количество).
  9. Наконец, мы возвращаем length (количество) из функции. В функции main мы открываем файл для чтения из стандартного ввода (если аргумент не указан) или из файла, указанного в аргументе командной строки. Затем мы вызываем GetLengthConstRegions с этим файловым потоком и выводим результат на стандартный вывод.

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


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

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

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