ОСНОВНЫЕ ПОНЯТИЯ, ТРЕБОВАНИЯ И ПРАВИЛА ПРОГРАММИРОВАНИЯ



ОСНОВНЫЕ ПОНЯТИЯ, ТРЕБОВАНИЯ И ПРАВИЛА ПРОГРАММИРОВАНИЯ.

Алгоритм – неформальное изложение способа решения какой-либо задачи.

Программа – алгоритм, записанный на языке, понятном определенному исполнителю.

Можно сказать, что написание программы разбивается на два этапа: первый – придумывание решения задачи, т.е. составление алгоритма, и второй – перевод его на нужный язык программирования. На начальном этапе развития программирования считалось, что, поскольку эти два этапа требуют различных знаний и навыков, необходимы две различные специальности: системные аналитики и кодировщики. Однако постепенно был найден ряд простых правил, пользуясь которыми удается формулировать алгоритмы так, что их перевод сводится к «подстрочнику», т.е. к механической замене одних слов на другие. Поэтому кодировщики стали не нужны.

Далее мы попробуем сформулировать эти правила. Для этого мы будем рассматривать примеры алгоритмов, и выявлять в них ошибки, мешающие их простому переводу на язык программирования. Из каждой ошибки мы будем выводить правило, позволяющее её избежать.

Действующие лица

Алгоритм для решения системы 2х линейных уравнений графически:

1) Написать программу, рисующую линию по коэффициентам уравнения.

2) Сообщить программе коэффициенты 1го уравнения.

3) Сообщить программе коэффициенты 2го уравнения.

4) Найти на экране точку пересечения и выдать ответ.

Обсуждение:Задумайтесь: кому (какому исполнителю) предназначены приказы в этом алгоритме? Кто должен выполнить написанное в п. 1? В пп. 2 и 3? В п. 4? Очевидно, что это – не одно и то же лицо. Следовательно, мы не сможем перевести такой «алгоритм» в программу, которая будет выполняться единственным исполнителем.

Ошибка:пункты «алгоритма» предназначены разным исполнителям.

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

NB!

В программировании участвуют 3(+1) действующее лицо:

1) Программист (пишет программу).

2) Исполнитель (исполняет ее). Его часто отождествляют с программой.

3) Пользователь (пользуется программой).

Правило общения:при разборе программы не употреблять местоимения. Называть действующие лица явно.

Еще одним важным действующим лицом является

4) Читатель

Кто это?

Это человек, читающий программу не с целью её исполнить, а с целью понять.

И кто же это?

Прежде всего – это ваш преподаватель.

Если же говорить о работе, а не об учебе – это тот программист, который пытается разобраться в том, что вы оставили, уйдя на больничный, в отпуск или, в конце концов, уволившись. Если вы думаете, что в этом случае вам уже все равно, то учтите, что ваш работодатель может быть существенно иного мнения. А если он увидит ваши программы («это я для себя написал...»), то «все равно» вам может стать даже слишком скоро.

Ну и еще это – самый дорогой вам человек. То есть – вы сами, но после хотя бы недельной паузы в написании программы. Обычно первая мысль после такой паузы: «Господи, кто это писал? Руки бы поотрывал...»

Так что: программа должна быть читабельной, т.е. понятной для читателя.

Читателю предназначены: комментарии, т.е. фрагменты текста программы, игнорируемые исполнителем, осмысленные названия переменных, подпрограмм и функций.

Еще читабельность программы означает, что после замены служебных слов языка программирования в ней на соответствующие русские слова должны получаться нормальные русские фразы.

Понятие оператора

Алгоритм:

1) Нарисовать две линии в произвольных местах экрана.

2) Линии не должны пересекаться.

3) Длина линий равняется трем сантиметрам.

Ошибка:второй и третий пункт не являются завершенными командами. Это – уточнения к первому пункту.

Требование:каждый пункт алгоритма должен содержать законченную команду, для выполнения которой не требуется «заглядывать вперед» по тексту.

Такие команды называютсяоператорами.

Алгоритм:

1) Нарисовать в центре экрана круг, диаметр равен трем сантиметрам.

2) Перед этим стереть все с экрана.

Ошибка:этот алгоритм нельзя выполнить последовательно, по мере чтения!

Требование:если действия выполняются последовательно, то они должны быть записаны в порядке выполнения.

Эта конструкция называетсяпоследовательность.

Цикл

Алгоритм приготовления яичницы-болтуньи (из 12 яиц):

  1. Поставь сковородку на огонь
  2. Разбей яйцо
  3. Вылей на сковородку
  4. Разбей яйцо
  5. Вылей на сковородку
  6. Разбей яйцо
  7. Вылей на сковородку
  8. Разбей яйцо
  9. Вылей на сковородку
  10. Разбей яйцо
  11. Вылей на сковородку
  12. Разбей яйцо
  13. Вылей на сковородку
  14. Разбей яйцо
  15. Вылей на сковородку
  16. Разбей яйцо
  17. Вылей на сковородку
  18. Разбей яйцо
  19. Вылей на сковородку
  20. Разбей яйцо
  21. Вылей на сковородку
  22. Разбей яйцо
  23. Вылей на сковородку
  24. Разбей яйцо
  25. Вылей на сковородку

Обсуждение:Неужели действительно надо писать так много? А если бы нам пришлось описывать алгоритм для забивания 1000 гвоздей?

Требование:если действие многократно повторяется, то используйте конструкцию «повторяй», которая называетсяциклом.

NB! Использование цикла – одно из проявлений «принципа обобщения»: программа (алгоритм) должна быть написана так, чтобы она использовалась в максимально широком диапазоне ситуаций, т.е. максимально обобщенно. Это же относится к ее частям.

В частности операторы, которые надовыполнить несколько раз, должны быть по возможностинаписаны один раз.

Другими словами, текст в программе не должен повторяться. Это плохо не тем, что приходится его писать много раз – редактор текста позволяет его повторить очень просто. Более важны три обстоятельства: во-первых, если мы захотим внести изменение в программу – мы должны вносить его во всех строках, что уже заметно сложнее. Кроме того есть риск забыть где-то его сделать. Во-вторых, таким способом невозможно описать действия, которые должны повториться неизвестное заранее число раз. И, в-третьих, такую программу неудобно читать и понимать.

Структурная запись программы и структурные отступы

Итак, получился следующий

Алгоритм:

1) Поставь сковородку на огонь

2) Повторяй 12 раз

3) Разбей яйцо

4) Вылей на сковородку

5) Взбалтывай до готовности

6) Подожди 3 минуты

7) Подай на стол

Ошибка:не ясно, что именно надо повторять 12 раз.

Представьте, что будет, если исполнитель 12 раз повторит только 3ю строку… 3,4 и 5ю… с 3й по 6-ю… с3й по 7ю…

Правило:некоторые строки в программе (алгоритме) не задают действие сами по себе, а являются заголовками к нескольким последующим строкам. Обязательно необходимо указывать конец области действия такого заголовка, т.е. к каким строчкам он относится.

NB! В алгоритмах мы будем отмечать такую область скобкой (). Верхняя сторона скобки заменяется самим заголовком (в нашем примере «повторяй …»). Для других конструкций будет заменяться нижняя часть скобки, а иногда – обе.

Чтобы вертикальная сторона скобки помещалась, весь текст внутри нее будем смещать вправо.

Чтобы такие «невидимые скобки» в программе было легче увидеть, надо заголовок и завершающее слово (если оно есть) писать точно друг под другом, а все, что «в скобке», – сдвигать вправо – делать дополнительный отступ.

NB! Такие отступы называютсяструктурными отступами. Этот стиль оформления программ и алгоритмов является общепринятым стандартом.

Исправленный алгоритм:

Поставь сковородку на огонь

Повторяй 12 раз

– заголовок

Разбей яйцо

– тело цикла

Вылей на сковородку

– конец действия заголовка

Взбалтывай до готовности

Подожди 3 минуты

Подай на стол

NB! Повторяемые циклом действия называютсятелом цикла.

Условный оператор

Алгоритм работы работа-официанта:

1) Подать меню

2) Подать икру

3) Подать шампанское

4) Взять деньги

Ошибка: подавать икру и шампанское надо не всегда.

Правило:если фрагмент программы должен выполняться не всегда, а только при определенном условии, надо использоватьконструкцию «если»или условный оператор.

Исправленный алгоритм:

Подать меню

Если икра заказана

Подать икру

Если шампанское заказано

Подать шампанское

Взять деньги

NB!Строка «Если…» – тоже заголовок и требует указания области действия.

Обратите внимание на слова, стоящие после слова «Если». Очевидно, они являются вопросом, который исполнитель должен задать клиенту. (Только знак вопроса не поставлен.) Скажите, любой ли вопрос можно использовать после слова «Если»? (Например, «если Который час…», «если Как вас зовут…») Чем отличаются вопросы, которые можно употребить после «если»?

NB!Условиемв программировании называется «вопрос» требующий ответа «да» или «нет».

Например:

Икра заказана?

X>0?

Когда ответ – «да», говорят, что условие истинно.

Когда ответ – «нет» – ложно.

Условие в программе записывается без вопросительного знака.

NB! Условный оператор тоже нужен для обобщения программы: чтобы одна и та же программа могла использоваться в разных ситуациях: в случае истинности и в случае ложности условия.

Пожалуйста, не путайте «условие» и «условный оператор»! Условие являетсячастью условного оператора.

Алгоритм для рекламного автомата Гербалайф:

Если вес клиента > 60 кг

вручи пакет Гербалайф

Если вес клиента <= 60 кг

вручи приз-шоколадку

Ошибка: Что делает исполнитель в строчках 1 и 3? Фактически клиент взвешивается дважды.

Исправленный алгоритм:

1)

Если вес клиента > 60 кг

2)

вручи пакет Гербалайф

3)

Иначе

4)

вручи приз-шоколадку

Правило:если в случае истинности и ложности условия нужно выполнять разные действия, то надо использовать конструкцию: «если …иначе». Она называется полной формой условного оператора.

NB! Обратите внимание на расположение слова «иначе». Оно, с одной стороны, показывает, где кончились строки, выполняемые при истинности условия, т.е. завершает область действия заголовка «если» (и поэтому находится строго под ним). С другой стороны, «иначе» является заголовком для строк, выполняемых при ложности условия (и, следовательно, требует скобки для ограничения ее области действия). Поэтому «иначе» пишется как бы в разрыве скобки.

Заменяется на «если вес>60»

вручи пакет Гербалайф

Делается при весе>60

Заменяется на «иначе»

вручи приз-шоколадку

Делается при весе<=60

Завершает строки «иначе»

Алгоритм (фрагмент):

Повторяй, покаяичница не готова

Перемешай

Подай на стол

В этом алгоритме нет ошибки, он приведен только для обсуждения, надеюсь, смысл его совершенно понятен.

Правило:если количество повторений неизвестно в момент начала цикла, то надо использоватьцикл с условием (повторяй, пока …)

NB! В строке 12) обязательно будет выполнено условие «яичница готова» (потому, что в противном случае цикл бы продолжился).  Это условие называетсяусловием завершения цикла. Для читателя очень удобно, если вы запишите это условие в виде комментария там, где оно достигается – после цикла.

NB! Программист пишет команды, исходя из своего представления о ситуации в каждый момент выполнения программы. Чтобы читателю было легче понять его решения, надо описывать это представление. В нашем примере пояснение «здесьяичница готова» обосновывает, почему её уже можно подавать на стол.

Повторяй, покаяичница не готова

Перемешай

здесьяичница готова

Подай на стол

Давайте теперь попробуем уточнить, откуда исполнитель узнает, что яичница готова – вставим в цикл команду «попробуй» (ведь она тоже должна повторяться многократно).

Повторяй, покаяичница не готова

Перемешай

Попробуй

здесьяичница готова

Подай на стол

Ошибка: в самый первый раз исполнителю неоткуда узнать, готова ли яичница.

Можно было бы вставить команду «Попробуй» перед циклом, но это глупо: яичницу-то при этом еще и не начинали жарить!

Правило:если условие невозможно проверить до выполнения тела цикла, надо использоватьцикл с проверкой в конце:

Повторяй

Перемешай

Попробуй

покаяичница не готова

здесьяичница готова

Подай на стол

Заметьте, что здесь у «скобки», в которую взяты повторяющиеся действия, заменены текстом и верхняя, и нижняя «полочки».

NB! Сейчас мы уже знаем, что условия в программе можно использовать для двух целей:

– для выбора одного из двух альтернативных действий – выполнить одно или другое. В этом случае условие используется в условном операторе (Если).

– чтобы решить, продолжать ли повторение или идти дальше по программе – В этом случае условие используется в цикле (Повторяй).

Понятие подпрограммы

Алгоритм для робота-разметчика лыжной трассы:

1) Шагни

2) Поставь флажок

3) Поверни вправо

4) Шагни

5) Поставь флажок

6) Поверни влево

7) Шагни

8) Поставь флажок

9) Поверни вправо

10) Шагни

11) Поставь флажок

Нарисуйте сами, какую конфигурацию флажков поставит этот робот.

Усложним задачу. Пусть на склоне могут встретиться препятствия (барьеры, забытые после летнего спортивного сезона).

Задумайтесь, что сделает такой фрагмент алгоритма:

Есливпереди барьер

повернивправо

шагни

повернивлево

шагни

повернивлево

шагни

повернивправо

иначе

шагни

Очевидно, что он позволяет пройти вперед на одну клетку вне зависимости от того, есть ли впереди барьер (т.е. как бы пройти барьер насквозь). Таким образом, чтобы исходный алгоритм работал, надо в нем заменить каждую команду "шагни" на приведенный выше фрагмент. Однако при этом такой фрагмент будет повторен в программе много раз. Можно ли сократить этот повторяющийся текст с помощью цикла? Нет, потому что повторения происходят не подряд, они перемежаются неповторяющимся текстом. Определим вместо этого новую команду для робота, которая будетобозначать (т.е. заменять в тексте) этот фрагмент.

     Заголовок подпрограммы

Имя подпрограммы

« Насквозь » – это значит:

Тело подпрограммы

Описание (определение) подпрограммы

 Если впереди барьер

повернивправо

шагни

повернивлево

шагни

повернивлево

шагни

повернивправо

Иначе

шагни

Заменим в исходной программе «Шагни» на «Насквозь». Программа осталась прежней длины, но теперь наш робот будет обходить барьеры! (Ну, конечно, к тексту добавилась еще подпрограмма «Насквозь» – но она все-таки написании только один раз!)

Правило:Пусть в тексте программы есть повторяющиеся фрагменты. Пусть также эти фрагменты не идут подряд (сразу друг за другом). Другими словами, они разделены неповторяющимися текстами. Тогда программу можно сократить с помощью подпрограммы. Для этого надо дать повторяющемуся фрагменту короткое наименование. Такая конструкция называетсяописанием подпрограммы. Причем короткое наименование называетсяименем подпрограммы, а повторяющийся фрагмент –телом подпрограммы.

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

Обратите внимание на термин «обозначить». Мы с вами будем всегда использовать его как синоним слова «заменить».

Рекурсия

Подумайте теперь, как сработает исправленная программа в такой ситуации:

Очевидно, робот натолкнется на барьер при выполнении подпрограммы. Как же быть? Но мы знаем, что для исправления такой ошибки надо в опасной ситуации заменить команду «шагни» на «насквозь».

Сделаем то же самое в подпрограмме: заменим «шагни» на «насквозь» везде, кроме последнего «шагни». (Подумайте: почему последнее «шагни» не надо заменять?) Естественный вопрос: а можно ли так делать? Ответ: можно.

NB! Ситуация, когда в теле подпрограммы вызывается сама эта подпрограмма, называетсярекурсивным вызовом илирекурсией.

Как же будет работать такая программа? Для понимания этого удобно представлять, что для выполнения подпрограммы всегда используется («вызывается») новый исполнитель, а старый «засыпает», пока вызванный «специалист» не сообщит ему, что все сделано, можно работать дальше.

NB!Рекурсия – это еще один (помимо цикла) способ организации повторяющихся действий.

Принцип черного ящика

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

Этот принцип так называется потому, что каждый такой фрагмент является как бы непрозрачным (черным) ящиком: рассматривая его снаружи (т.е. пытаясь понять, как работаетвся программа) читатель не заглядывает внутрь. Когда же читатель рассматривает его «внутренность» (т.е. пытается понять, как работает сам фрагмент), он не выглядывает наружу.

Благодаря этому читатель всегда разбирается с чем-то простым и небольшим.

NB! Программа, построенная по этому принципу называетсяструктурированной, а соответствующая методология написания программ называетсяметодологией структурного программирования илипрограммированием безGOTO.

Главная теорема структурного программирования гласит, что любую программу можно написать, используя только три конструкции:

– последовательность;

– цикл;

– условный оператор.

Подпрограммы очень удобно использовать вместе с принципом черного ящика: каждый «черный ящик» превращается в тело подпрограммы, а имя подпрограммы выбирается так, чтобы оно было коротким пояснением к черному ящику. Таким образом, главная программа будет состоять из одних вызовов этих подпрограмм (из «ярлыков к ящикам»).




Похожие работы, которые могут быть Вам интерестны.

1. Рассмотрение и обобщение библиографической записи, библиографии, а также общие требования и правила составления

2. Назначение и основные требования к резервуарному парку НПС

3. Основные требования к быстровозводимым строительным системам

4. Основные понятия сертификации

5. Основные принципы и правила организации горноспасательных работ

6. Реклама в СМИ. Особенности. Основные понятия

7. История токсикологии и ее основные понятия

8. ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ В АВТОМОБИЛЕСТРОЕНИИ

9. Основные требования, которые необходимо соблюдать при бетонирование конструкций

10. Основные проблемы уступки прав требования в современном гражданском праве