Пусть наша программа получает на вход числовую последовательность: конечный ряд действительных чисел. Количество элементов в последовательности неизвестно и может быть очень велико, поэтому сохранение всей последовательности в памяти недопустимо. Программа должна считывать входную последовательность со стандарного ввода до появления признака конца файла, обрабатывать ее и выводить информацию на стандартный вывод.
#include<iostream> using namespace std; int main() { double x; double sum=0; while (cin>>x) sum+=x; cout<<"Sum: "<<sum<<endl; return 0; }
В этом примере в переменную sum
осуществляется суммирование всех считанных чисел, а очередное число
считывается в переменную x
. Программа содержит цикл while (cin>>x)
, который будет выполняться,
пока считывание переменной будет успешным.
Для удобства считывания последовательности строк из файла существует модуль fileinput
.
Соответствующая программа будет выглядеть следующим образом:
import fileinput sum=0 for line in fileinput.input(): x=float(line) sum=sum+x print "Sum: ",sum
В этом примере сначала подключается модуль fileinput
, затем организовывается
цикл, в котором переменная line
пробегает по всем элементам списка, создаваемого функцией
fileinput.input()
. Эта функция генерирует список, элементами которого являются строки
входного файла. Затем мы в цикле увеличиваем величину переменной sum
на величину line
,
преобразованную к действительному числу при помощи функции float
.
Запущенная таким образом программа будет считывать числа со стандартного входа, пока стандартный вход не завершится. Для завершения ввода данных необходимо сгенерировать признак конца файла необходимо нажать клавиши <Ctrl>+<D> (в системе Linux), <Ctrl>+<Z> (в системе Windows). Если программа написана на Питоне, то эту клавишу необходимо нажать два раза подряд.
При необходимости можно перенаправить стандартный ввод, читая данные не с клавиатуры, а из файла , например,
следующим образом (из файла inputdata
):
$ ./a.out < inputdata $ python myprog < inputdata
Функция f, определенная на множестве конечных числовых последовательностей, называется индуктивной, если ее значение на последовательности x1, ..., xn можно восстановить по значению функции f на последовательности x1, ..., xn-1 и по величине xn . Примеры индуктивных функций: сумма всех элементов последовательности, количество элементов в последовательности. А среднее арифметическое всех элементов последовательности не является индуктивной функцией: если мы знаем последний элемент последовательности и среднее арифметическое всех элементов кроме последнего, то вычислить среднее значение исходной последовательности невозможно, поскольку неизвестно общее число элементов в последовательности.
Индуктивные функции можно вычислить за один просмотр массива, сохраняя значение функции в одной переменной
(в рассмотренном примере это переменная sum
) и вычисляя новое значение функции, используя ее старое
значение и считанный элемент последовательности (sum=sum+x
).
К сожалению, полезных индуктивных функций не очень много. Но для неиндуктивной функции иногда можно найти ее индуктивное расширение: набор функций, каждую из которых можно вычислить, зная последний элемент последовательности и значение индуктивного расширения на всей последовательности без последнего элемента. Например, для среднего значения всех элементов последовательности индуктивным расширением является сумма всех элементов и их количество.
Для приведенных ниже функций покажите, что они являются индуктивными или имеют индуктивное расширение. Для функций, допускающих это расширение, явно выпишите это расширение на бумаге, задав индуктивное расширение в виде формул. Напишите программы, которые вычисляют заданную функцию за однократное считывание последовательности с конечной памятью.