Найти общее количество элементов в постоянных участках последовательности - 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
, которая принимает на вход файловый поток и возвращает количество постоянных участков в числовой последовательности из этого файла.
Алгоритм работы функции следующий:
- Сначала мы инициализируем переменные
length
(количество),region
(регион) иequals
(равно) со значениями 0. - Затем мы читаем первый элемент из потока и сохраняем его в переменной
numbPrev
(предыдущее число). - После этого мы входим в цикл, пока можем прочитать следующее число из потока и сохраняем его в переменной
numbNext
(следующее число). - Мы проверяем, равны ли
numbPrev
иnumbNext
. Если да, то устанавливаем значениеequals
(равно) в 1. - Мы добавляем
equals
кlength
(количество), а затем обновляемregion
(регион) значениемequals
. - Мы обновляем
numbPrev
значениемnumbNext
, чтобы подготовиться к следующей итерации. - Мы повторяем шаги с 3 по 6 до тех пор, пока можем читать числа из потока.
- После выхода из цикла мы добавляем значение
region
кlength
(количество). - Наконец, мы возвращаем
length
(количество) из функции. В функцииmain
мы открываем файл для чтения из стандартного ввода (если аргумент не указан) или из файла, указанного в аргументе командной строки. Затем мы вызываемGetLengthConstRegions
с этим файловым потоком и выводим результат на стандартный вывод.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д