Тема 7: Программа, печатающая собственный исходный текст
В философии интроспекция (или самонаблюдение) считается одним из важных элементов мышления. Все здравомыслящие люди должны внимательно отнестись к названию темы. Если человек может достичь самопознания, то почему этого не может сделать программа? Ну а чтобы познать себя, лучше всего написать автобиографию.
Тема. Напишите программу, печатающую копию собственного исходного текста. Вывод не должен содержать «управляющих» карт или другой информации, зависящей от системы. Печатается только то, что перфорируется для компилятора. Однако ваша программа ничего не должна вводить; ей не следует опираться на системные «штучки», например на знание того, что конкретный компилятор оставляет копию исходной программы в непомеченном COMMON-блоке. Проследите, чтобы программа давала одинаковый результат независимо от места и времени выполнения.
Указания исполнителю. Не поддавайтесь отчаянию и страху, даже если тринадцатая попытка оказалась неудачной! Подобные программы называются интроспективными, и существует теорема, в которой утверждается, что интроспективную программу можно написать на любом «достаточно мощном» языке. Все обычные языки программирования — достаточно мощные. Для решения требуется лишь взглянуть на язык под соответствующим углом зрения. Возможно придется сделать свой собственный редактор.
Тема 8: Расчет дохода от вложенного капитала
Самым разным людям — финансистам, биржевым дельцам, банкирам и даже обыкновенным труженикам, вроде казначея пенсионного фонда Тимстеров, — хотелось бы знать, какой доход принесут им вложенные средства. Если деньги лежат на срочном вкладе, то особых сложностей не возникает, ибо банки в каждом рекламном проспекте трубят о своих процентах. Даже если ваши средства вложены в облигации, по которым не только выплачиваются проценты, но которые можно впоследствии еще и с выгодой продать, то, чтобы определить свой доход, достаточно взять разницу курсовой стоимости облигаций, прибавить проценты, и вы получите сумму, которую должен выплатить банк. Результатом этих вычислений, если их выразить в процентах годовых, приносящих при условии непрерывного их начисления известную прибыль, является инвестиционный доход.
Ситуация, однако, не столь проста, если инвестиции связаны, скажем, с инвестиционным фондом, счетом капитала или небольшим собственным делом, когда имеют место нерегулярные поступления и платежи и текущие показатели меняются изо дня в день. Хорошим, в этом смысле, примером служит инвестиционный фонд. Действительно, новые акции могут приобретаться по рыночной стоимости в любой момент, а купленные ранее акции точно так же могут сбываться; в процессе функционирования фонда дивиденды все время меняются (и даже исчезают), однако, как правило, вкладываются в дополнительные акции; и наконец, стоимость акций фонда ежедневно меняется по мере того, как меняется курс лежащих в его основе ценных бумаг. Было бы, конечно, здорово сравнить доход, получаемый со срочного вклада, с той радужной перспективой, которую обещают проспекты инвестиционных фондов, не забывая, само собой, о том, что обычно доход пропорционален риску.
К счастью, для таких случаев имеется формула расчета дохода. Формула, к сожалению, не в замкнутом виде, а итерационная.
Предположим, что А — текущая величина инвестиций, что существует m операций с капиталом, причем i-я операция производилась на сумму Pi (отрицательные значения указывают на изъятие капитала) и имела место Ti лет назад, и пусть первоначальная оценка ожидаемого дохода Y0 полагается равной нулю. Итак, определим при j > 0 величины
и
Тогда наилучшая оценка дохода Yj дается формулой
Yj = Yj−1 + Cj/Dj
Как только разность
|Yj − Yj−1|
станет достаточно малой, величина дохода считается найденной.
Таблица 8.1. Запись реальных инвестиций. Даты представлены в виде: месяц/число/год.
Дата
|
Величина инвестиции
|
Сумма операции
|
3/11/71
|
$0.00
|
$68.26
|
5/ 4/71
|
73.75
|
50.00
|
6/ 4/71
|
114.82
|
75.00
|
8/ 9/71
|
170.66
|
50.00
|
9/ 7/71
|
229.41
|
54.00
|
10/ 4/71
|
282.97
|
50.00
|
10/ 8/71
|
326.02
|
4.31
|
12/ 8/71
|
328.11
|
50.00
|
1/ 1/72
|
391.65
|
0.00
|
21 4/72
|
413.42
|
50.00
|
8/ 1/72
|
471.35
|
0.00
|
10/ 5/72
|
440.83
|
7.72
|
10/ 5/72
|
448.55
|
4.14
|
10/ 2/73
|
398.36
|
4.80
|
1/ 2/74
|
330.74
|
0.00
|
6/ 7/74
|
360.97
|
-200.00
|
10/ 3/74
|
180.42
|
50.00
|
3/13/75
|
253.96
|
-200.00
|
При изучении табл. 8.1 обратите внимание, что величина А получается суммированием среднего и правого столбцов таблицы. Например, для третьей строки А = 189.82 долл., P1 = 68.26 долл., Р2 = 50.00 долл., Р3= 75.00 долл., a T1 ≃ 85/365, Т2 ≃ 31/365, Т3 = 0. Заметим также, что для каждой строки таблицы оценка Y0 считается равной нулю и что расчет дохода для любой текущей даты не зависит от величины доходов в предшествующие времена.
Тема. Напишите программу вычисления дохода от вложенного капитала. Исходные данные представляют собой записи о проведенных операциях, в каждой из которых указываются дата, сумма операции и величина инвестиции на день проведения операции без учета последней. Предполагается, что информация упорядочена по времени. Программа должна проверить, не нарушен ли хронологический порядок следования данных и нет ли где-нибудь изъятия средств, превышающего текущий счет. Программа должна отпечатать аккуратную таблицу платежных операций. При этом для каждой операции в выводимой строке должны быть указаны дата ее проведения, сумма инвестиций до операции, объем операции, сумма инвестиций после операции, доход на день проведения и сумма всех поступлений и платежей на текущий день. Каким именно образом обозначить конец вводимой информации — решать самому программисту, а вот равенство нулю суммы операции является удобным способом выяснения величины текущего дохода. Если у вас нет собственных инвестиций и вы не можете раздобыть Wall Street Journal, тогда исходными данными для программы, быть может не вполне удачными, зато реальными, может служить табл. 8.1.
Указания исполнителю. В рассматриваемой задаче существует интересный побочный вопрос. Даты проведения банковских операций задаются в обычном виде: месяц/число/год. А для решения задачи требуется иметь отрезки времени Ti, прошедшие после операции, выраженные в годах. У банкиров и юристов имеется несколько способов определения момента времени, когда прекращается начисление процентов на деньги (подозревают, что метод расчета зависит от того, кто кому должен). В программе достаточно вычислять годы в виде вещественных чисел с учетом високосных лет, предполагая, что все даты лежат в диапазоне от 1900 до 1999 включительно. Вообще говоря, перевод дат из одного календаря в другой может оказаться отнюдь не простым делом.
Достарыңызбен бөлісу: |