Потоковая обработка

Приматы хорошо умеют работать с потоками

Приматы хорошо умеют работать с потоками

Так называют группу задач в которых производится циклическая обработка большого объёма данных следующих во входном потоке без их запоминания в программе. К таким задачам относится, например, суммирование всех чисел из входного потока. А также поиск максимума или минимума этих чисел. Существенным признаком таких задач является однократный просмотр каждого элемента данных без возможности вернуться к нему в последующем.
Для решения этих задач важно научиться читать входной поток до конца. Поскольку мы пока ещё не рассматривали объектно-ориентированные возможности языка, обойдёмся функцией scanf. Как Вы уже должны знать, эта функция возвращает значение соответствующее количеству полей данных, которые были успешно прочитаны и присвоены соответствующим переменным. Если чтение первого же поля было не успешным, то возвращается -1. Хотя проверять лучше на совпадение со специальной именованной константой EOF, которая задана в заголовочном файле как -1. Так будет легче читать программу.
Начинать решать задачу можно с такого кода:

Дальше будем рассматривать вариант с вводом через функцию scanf():

Выполнить код

Задача поиска максимума (минимума) чуть сложнее. Здесь не так просто присвоить начальное значение (см. строку 4). И еще нам понадобится условный оператор (строка 9).

Выполнить код

Если Вам кажется, что всё совсем просто, то проверьте себя.
Задача 1. Измените код последнего примера, таким образом, чтобы вычислялся и максимум, и минимум. Как правильно присвоить начальные значения переменным?

Выполнить код
Питон: А что будет если убрать слово else в 11-й строке?
Землеройка: Программа будет давать правильный ответ, но будет выполнять лишние проверки.
Питон: И много проверок экономит нам else?
Землеройка: Если последовательность строго возрастает, то экономия будет самой большой. Вместо проверки каждого введенного числа, не понадобится вообще ни одной. Т.е. 11-я строка никогда не будет выполняться.
Питон: Хм. А если последовательность будет строго убывающей, то никакой экономии?
Землеройка: Никакой. Даже если просто, наибольший элемент стоит первым, то экономии не будет.
Питон: Я вот подумал, что если последовательность строго убывает, то лучше сначала минимум проверять, а в else — максимум. Тогда снова большая экономия будет.
Землеройка: А как угадать?
Питон: Наверное, никак.

Если у Вас есть информация о каких-либо характеристиках входных данных на которых будет работать Ваша программа, постарайтесь это использовать для написания более эффективного кода.

Задача 2. Измените код последнего примера, таким образом, чтобы вычислялся и максимум, и минимум, и сумма всех чисел. Как правильно присвоить начальное значение сумматору?

Выполнить код

Задача 3 Решите предыдущую задачу с использованием цикла «for».

Выполнить код
Правда код мне не кажется красивым. Т.е. наглядная структура программы, свойственная оператору for, вроде проявляется, но как-то «кривовато».

Если со всем разобрались, то можно приступать к решению задач своего варианта. Или можно посмотреть как решали задачи другие студенты:

Решения задач

Мазурок Игорь Евгеньевич

Мазурок Игорь Евгеньевич

Разработчик программного и информационного обеспечения.
Доцент Одесского национального университета имени И.И.Мечникова
Учёный в области защиты и противодейтствия в интеллектуальных информационных системах
Мазурок Игорь Евгеньевич

Latest posts by Мазурок Игорь Евгеньевич (see all)

Добавить комментарий