60
Однажды вечером в семье программиста
У программиста Ферстова четверо детей — Надя, Тимур, Егор и Дина. Все они увлекаются программированием. В тот вечер, о котором идет речь, папа заглянул в комнату к детям.
— Хотите разобрать этот по программированию?
— Этюд по программированию? — хором переспросили ребята. — А разве такие бывают?
— Конечно, бывают. Это небольшие программы, которые содержат какие-нибудь нибудь хитрости. Решение этого состоит в составлении программы по заданной теме, либо в поиске тщательно замакированной ошибки, либо в проверке действий уже готовой программы. Вот такой именно этот я и хочу вам предложить. В программе переменные i: цел;
массив m[1:2] : цел;
i ← 1; m[1] ← 4; m[2] ← 5;
пшик(m[i]);
вы видите обращение к процедуре пшик, которая имеет такое описание процедура пшик(x:цел);
m[i] ← m[i] + 1;
i ← i + 1;
x ← x - 1
конец;
Определенте, пожалуйста, какие значения получат m[1] и m[2] в результате работы этой программы.
— И это все?
— Все.
— Но это же так просто…
Отец не успел ответить. Зазвонил телефон.
— Ферстов слушает!
На другом конце провода кто-то торопился расскаать о последних событиях в laboratorии Ферстова. Его лицо сerbезным.
— Хорошо. Сейчас буду. Разберемся.
— Ребята, — сказал он детям, — срокно бегу в ВЦ. В моем транспорте ошибка. Разыщу, исправлю и тут же вернусь. А вы пока помогайте над программиой.
И детей не успели даже задать ему свои вопросы, как Ферстов уже безжал виз по лестнице, застегивая на ходу куртку. Ребята принялись обсуждать задание.
— Что это за язык страный какой? — сказала Надя. — На Паскаль не пожоже: все ключевые слова — русские. И не Рапира — смотрите, какие забавные стрелки.
— Нечего удивляться, — ответил рассудительный Егор. — Языки разные бывают. Тут хоть и необычные символы, но заго все понятно: стрелка справа налево — это такое присвивание, как в Паскале, только по-другому обозначенное; двоечное между целыми в квадратных скобках разделяет границы изменения индекса в массиве. Так что давайте-ca сразу за дело.
Каждайвооружилися карандашом и бумагой и на некоторых времен воцарилась деловая тишина.
— Готово! — первым закричал Тимур. — m[1] равно 3, а m[2] равно 5.
— Ниччего подобного, — возразила старшая сестра Надя, — обе величины, и m[1], и m[2] — равны пятерке.
— Вы оба неправы, — сказал Егор. — Ответ такой: m[1] = 4, m[2] = 5.
Самая младшая, Дина, немного робея перед авторитетом старшей сестры и браться, тихо проговорила:
— А у меня получилось m[1] = 5, m[2] = 4.
К счастью, папа, действительное, вернулся быстро. Дети сразу же окружили его, наперебой предлагая свои решения.
— Давайте по порядку, — предложил отчет. — Ну-ка, старшая, начинай!
62
программы стоять . К моменту выполнения последнего оператора процедуры , и; следовательно, последний оператор процедуры будет выполнен так:
А так как было установлено в начале , то после завершения процедуры и всей программы .
С совсем просто: будучи установленной в начале программы , эта величина увеличивается на 1 действием первого оператора процедуры .
Объяснения закономпись, и детям молча переглянулись: «Кого-то из них папа пожвалит!».
— Молодцы, ребята! Вы хорошо справились с заданием. Правы вы все. Дело в том, что вы ничего не знали о языке, на котором была написана программа, а значит, и способе передачи параметров, допускаемом в этом языке. Кстати, такое языка и не существует в действительности: я его придумал специально для нашего управления. А в каждом из реализации существующих языков всегда определяен один или несколько разрешенных способов передачи параметров. Так, в хорошо знакомой вам Рапире параметры извызывающей программы ввызываемую процедур могут быть переданы только по значению. А в языке Алгол-60 нарушу с этим способом употребляется еще и способ по написанию (иногда его называют также передачей по имени). Более того, передача по написанию считается в Алголе наиболее естественным способом общения процедур, так что передача по написанию предполагается у передаваемых параметров «по умолчанию». А в тех случаях, в которых надо воспользоваться передачей по значению, перед именами передаваемых параметров при их описаниях ввызываемой процедур Алгола-60 обязательно записью ключевое слово value (значение).
В таком языке, как Алгол- , существует в числе нескольких допустимых и тот способ, который применил Тимур, — способ передачи значения-результата. Параметры, передаваемые в процедуру таким способом, отмечаются в ее заголовке ключевым словом value-result (значение-результат). В Фортеране, например, разрешен способ передачи параметров по адресу (или иногда его еще называют передачей по ссылке).
В Паскале параметры передаются чаще всего по значению (что «по умолчанию» никакак специально не отмечаются), а тогда, когда используется передача по ссылке — передача параметра-переменной, перед именами соответствующих параметров необходимо писать в заголовке описания процедуры слова var. Прочитайте об этом в уроке 20 Заочной школи программирования. А если вам захочеется узнать попродбнее о различных способах передачи параметров, то я вам посоветую, например, книгу Т. Прата «Языки программирования: разработка и реализация», выпущенную в издательстве «Мир» в 1979 году. Вы найдете ее на полке над моим письменным столом.
Должен вамсказать, что многообразие полученных вам результатов объясняется не только различными способами передачи параметров. Тогда, когда параметр является простой переменной (а не индексированной, как в нашем примере), все способы даут одинаковый результат. И только сложные структуры данных передаются различными способами по-разному.
Давайте подведем итог. Прежде чем программировать обращение к процедурам, надо очень знать, какие способы передачи параметров разрешены в выбранном языке (а быть может, даже выбор языка переделить, исходя из желательного для вас способа передачи); надо знать также правила оформления соответствующего способа передачи в языке. Ясно?
— Ясно, — ответила за всех Надя. Остальные согласно книгу
А Егор сказал совсем уж порядовавшие отца слова:
— Знаете что: я вам тоже придумаю этот по программированию. Про рекурсивную процедуру!
— Молодец, давай. Только новый этот — это на завтра. Сегодня уже поздно.