Отправляет email-рассылки с помощью сервиса Sendsay

C++ & C++Builder для начинающих

  Все выпуски  

C++ & C++Builder для начинающих (2) - Подпрограммы и параметры


Информационный Канал Subscribe.Ru

C++ & C++Builder для начинающих

(2) - Подпрограммы и параметры


Общее кол-во подписчиков - 97
Объём FAQ - 0 КБ
e-mail автора - sharky@kireev.tula.net
ICQ автора для срочных вопросов - 190-930-087
Архив рассылки - http://beg-prog.narod.ru/ras/ras.html

КЛУБ ПРОГРАММИСТОВ

..::Главная::....::FAQ::....::Исходники::..

ИЗ ПИСЕМ

Ленимся, друзья... Почему же по столь обширному материалу не поступило ни одного вопроса? Но ничего. Сегодня материала будет ещё больше. Так что, я думаю, число вопросов возрастёт.

ОТВЕТЫ НА ЗАДАНИЕ 1

Публиковать не буду, т.к. ни одного ответа мне не пришло. Что же вы, друзья, не присылаете мне ответы. Так вы ничему не научитесь. Это задания хотя и не по языку С++, но они развивают логические и творческие способности у человека. Их выполнение обязательно. Начиная с самого первого. Те люди, которые будут мне регулярно присылать ответы на вопросы, будут поощраться в тексте рассылки и приниматься в клуб программистоы. Ответ на задание 1 и 2 в следующем выпуске ( и то, если вы мне ответы на них пришлёте). Огромная просьба - подписываться настоящими именами. Неудобно как-то получается, как будто со зверями или роботами общаешься.
Итак, приступим к основной части нашей рассылки. Из прошлого выпуска вы узнали, что язык программирования состоит из трёх вещей: набора операторов, правил синтаксиса и компилятора. Первые два пункта относятся к идее языка, а третий - к реализации. Если бы не потребность в компиляторе, то не существовало бы этой рассылки, потому что языки программирования можно было не изучать, а изобретать. Сегодня в мире существует несколько тысяч языков программирования (не версий, а именно языков). Как выбрать тот, который наиболее подходит? Вот я уже отвечаю на вопрос из предыдущего выпуска, который я сам себе и задал. Прежде всего, люди изучают язык, для которого у них есть компилятор или когда они знают, где его достать. Без компилятора изучать язык программирования совершенно бесполезно. Можно хоть год просидеть с карандашом и бумажкой, а потом через неделю всё забудется. Это то же самое, что учиться плавать без воды.

Если с выбором компилятора проблем не возникло, то выбирают тот язык, который наилучшим образом подходит для решения той или иной задачи. Языки программирования, подготовленные для решения задач какого-то определённого типа, называют специальными. Инженеры часто выбирают язык ФОРТРАН (FORTRAN), банкиры - КОБОЛ (COBOL), военные - АДА (ADA), архитекторы - ЛИСП (LISP), учёные - ПРОЛОГ (PROLOG), программисты, пишущие программы для Интернета - JAVA и т.д. Обычно все вышеперечисленные языки изучают после устройства на работу. Изучать их "заранее" не имеет смысла.

Кроме специальных есть ещё универсальные языки программирования. С их помощью можно решать почти любые задачи: и управлять птицефермой, и создавать компьютерные игры. Такие языки можно изучать "заранее" - их знание пригодится всегда. Сегодня наиболее универсальными стали три языка программирования: Бейсик (Basic), Паскаль (Pascal), Си++ (C++). За долгое время развития эти три языка стали не просто языками программирования, а целыми системами программирования. Система отличается от языка тем, что она не только имеет встроенный компилятор, но и содержит ещё несколько дополнительных программ для упрощения программирования. С её помощью можно не просто писать программы, а собирать их из готовых кусочков. Так, Basic превратился в систему Visual Basic. Язык Паскаль реализовался в систему Delphi, а С++ реализован сразу в нескольких системах, например Borland C++ Builder (которому, собственно, и посвящена наша рассылка) и Microsoft Visual C++.

Пришло время раскрыть основную тему выпуска. Так что же такое подпрограмма? Программисты не любят писать большие программы за один приём от начала и до конца. Когда в программе появляется несколько десятков операторов, за ними становится трудно следить, а когда их число возрастает до нескольких сотен, досадные ошибки становятся неминуемыми. Современные игровые программы содержат миллионы строк программного кода - их вообще невозможно составлять, если не поделить программу на отдельные подпрограммы. Одна программа отвечает за то, как герой ходит, другая - за то, как он прыгает, третья - за то, как он стреляет. Одна игра (не очень большая) состоит из десятков тысяч сравнительно небольших подпрограмм. Все они находятся в памяти и ждут, когда их вызовут. В тот момент, когда игрок нажимает кнопку "Огонь!", запускаются подпрограммы, обрабатывающие режим стрельбы. Надеюсь, что такое подпрограмма теперь понятно.

Давайте вернёмся к нашему гипотетическому языку программирования Attack. В нём, как вы, наверное, помните, нет оператора НАЗАД (BACKWARD или сокр. BWD). Мы уже обсуждали, что если использовать оператор FWD с отрицательным параметром, то это и будет движение назад. Однако это не совсем то, что нужно. При выполнении этой команды наш танк попятится назад, но не развернётся. Надо сделать так, чтобы он развернулся. Наверное, вы уже догадались, как это сделать на нашем языке: два раза повернуться в любую сторону (2 раза подряд в одну и ту же) и ехать вперёд:

LFT
LFT
FWD3
RHT
RHT
FWD3


Вы видите, как мы научились заменять инструкцию, оператора для которой нет в нашем языке. Этот приём называется эмуляцией. Наша подпрограмма из четырёх инструкций эмулирует действие недостающей инструкции. Эту малюсенькую подпрограмму можно назвать процедурой разворота. Вот сейчас постараюсь ввести ещё новые понятия. Вообще, программисты различают два вида подпрограмм: процедуры и функции. Это деление, конечно, очень условное, и не во всех языках существуют такие понятия, но разницу между ними надо чувствовать. Функция - это подпрограмма, которую вызывают, чтобы выполнить какие-то расчёты или проверки. Как только функция завершает работу, она передаёт управление главной программе и возвращает (то же самое, что и передаёт) ей результат расчёта или проверки.

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

Теперь после всего вышеказанного мы могли бы написать программу, по которой танк подъедет к орудию, возьмёт его и отбуксирет в другое место. Примерно, программа будет выглядеть так:

FWD3 //танк едет вперёд 3км
RHT //затем поворачивает направо
FWD3 //ещё 3км вперёд
LFT //поворачивает налево
FWD2 //едет 2км вперёд
BWD5 //едет назад 5 км
LFT //поворачивает налево
FWD3 //едет вперёд 3км
Вы наверное заметили, что я вставил в текст программы комментарии. В С++ эти комментарии должны начинаться со знака // Вот я уже познакомил с одним из правил синтаксиса языка С++! Но вернёмся к нашей программе. К сожалению, у нас ничего не получится. Когда мы будем компилировать нашу программу, компилятор выдаст ошибку на инструкции BWD 5, ведь оператора BWD у нас в языке нет. Мы-то с вами знаем, что BWD - это не какой не оператор, а наша процедура, но компилятору об этом никто ничего не сказал. Как же дать понять компилятору, что BWD - процедура. Описывать процедуры рекомендуется в начале программы, хотя современным языкам программирования уже всё равно, где вы описали процедуру, но придерживайтесь пока старых правил. Выглядеть это может, например, так:

PROCEDURE BWD
  RHT
  RHT
  FWD 5
END
Описание процедуры
FWD 3
RHT
FWD 3
LFT
FWD 2
BWD( )
LFT
FWD 3
Основная программа с вызовом процедуры


Мы заранее предупредили компилятор о том, что BWD - процедура. Здесь у нас появились 2 новых оператора: PROCEDURE и END. Без них не обойтись, ведь именно по ним компилятор смотрит, где начинается процедура, а где заканчивается. У нашей процедуры BWD есть один важный недостаток. Она позволяет развернуть танк и продвинуть его на 5км. А если надо на 2,4 или на 7, как быть? Писать каждый раз процедуру для отдельного случая? Это было бы неразумно. А нельзя ли сразу подготовить одну универсальную процедуру, которая будет продвигать танк на столько километров, на сколько потребуется, например, на n километров? Конечно, можно:

PROCEDURE BWD (n)
   RHT
   RHT
   FWD n
END

А откуда подпрограмма узнает, чему равно число n? Из основной программы. Если там будет записано BWD (3), то она возьмёт число в скобках (параметр) 3 и подставит его в подпрограмму вместо n. А если там будет записано BWD (5), то подставится число 5 и так далее. Как видите, этот параметр у нас стал передаваемым. При вызове подпрограммы мы указываем то значение параметра, которое нам нужно, - оно называется фактическим значением параметра. А при описании подпрограммы мы ещё не знаем, на сколько километров придётся двигать танк, и поэтому вместо числового значения мы используем буквенный параметр n. Такие значения параметров называют формальными. Формальные параметры используют при написании процедур и функций, а при вызове подпрограммы они должны быть заменены на фактические.
ЗАДАНИЕ 2
Задание такое. Есть река, через которую имеется мост. На одном берегу реки стоит 5 орудий, на другом - танк, но он равёрнут в противоположную сторону от реки. Написать программу (конечно же на нашем замечательном гипотетическом языке Attack 2.0), с помощью которой танк отбуксировал бы все орудия по очереди на свой берег реки. Ограничения- расстояние от танка до орудий - 400м, танк может прицеплять к себе орудия только задней частью)

Естественно, в задании нужно использовать процедуры. На этой неделе всё. Ждите следующего выпуска. Бреев Илья - ведущий рассылки.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cbeginner
Отписаться

В избранное