Общее понятие алгоритма. Управляющие конструкции алгоритмического языка. Понятие переменной
Управляющие конструкции алгоритмического языка
Большинство алгоритмических языков относится к так называемым процедурным языкам, в которых основной единицей является оператор. Оператор представляет собой команду на выполнение некоторого действия. Язык, таким образом, состоит в основном из фраз в повелительном наклонении. Альтернативой операторам являются описания, определяющие объекты или типы объектов и их взаимосвязи. Считается, что чем больший процент составляют описания, тем более совершенным является язык. Существуют алгоритмические языки, состоящие в основном из описаний (функциональные языки), однако данный курс ограничивается процедурными языками.
Всякий алгоритм предназначен исполнителю, который однозначно понимает команды алгоритма. Пример: опишем алгоритм проезда от Аэровокзала в Москве до аэропорта Домодедово.
алгоритм Проезд от Аэровокзала до Домодедово через МКАД | Дано: находимся у Аэровокзала | Надо: оказаться в аэропорту Домодедово начало алгоритма | повернуть направо на центральный проезд | Ленинградского проспекта в сторону центра; | проехать до второго светофора; | выполнить разворот на перекрестке | проехать по Ленинградскому проспекту из центра | до пересечения с Московской кольцевой дорогой; | переехать мост над кольцевой дорогой и | повернуть направо на внешнюю часть кольцевой дороги; | двигаться по кольцевой дороге в направлении против | часовой стрелки до Каширского шоссе; | повернуть направо на Каширское шоссе в сторону из города; | двигаться, никуда не сворачивая, до | аэропорта Домодедово; конец алгоритма
Строки алгоритма представляют собой фразы в повелительном наклонении, которые предназначены исполнителю алгоритма, т.е. любому водителю, который может отличить внешнюю сторону кольцевой дороги от внутренней. Строки алгоритма выполняются последовательно; считается, что исполнитель алгоритма способен, не задумываясь, выполнить каждую его команду.
Большинство алгоритмов не сводится к последовательному выполнению команд, в них присутствуют ветвления и циклы. При ветвлении в зависимости от условия выполняется одна из двух ветвей программы; для этого используется оператор " если ... то ... иначе ... конец если ". Например, можно модифицировать приведенный выше алгоритм, используя выбор одного из двух альтернативных путей, в зависимости от наличия транспортной пробки.
алгоритм Оптимальный путь от Аэровокзала до Домодедово | Дано: находимся у Аэровокзала | Надо: оказаться в аэропорту Домодедово начало алгоритма | если нет пробки на Ленинградском проспекте | | в направлении из центра | | то | | // ...выполняем предыдущий алгоритм... | | Проезд от Аэровокзала до Домодедово через МКАД | | иначе | | повернуть направо на боковой проезд | | Ленинградского проспекта в сторону центра; | | доехать до пересечения с Беговой улицей; | | повернуть направо на Третье транспортное кольцо; | | ехать по Третьему транспортному кольцу против | | часовой стрелки до пересечения с Варшавским шоссе; | | повернуть направо на Варшавское шоссе | | в сторону из центра; | | ехать прямо до развилки с Каширским шоссе; | | на развилке с Каширским шоссе проехать прямо в сторону | | Каширского шоссе; // Варшавское уходит направо | | двигаться, никуда не сворачивая, до | | аэропорта Домодедово; | конец если конец алгоритма
Здесь исполнитель алгоритма сначала должен проверить условие
нет пробки на Ленинградском проспекте в направлении из центра
Если это условие истинно, то выполняется первый алгоритм "Проезд от Аэровокзала до Домодедово через МКАД"; если ложно - часть алгоритма между строками " иначе " и " конец если ". Следует отметить, что
- здесь выполняется алгоритм "Проезд от Аэровокзала до Домодедово через МКАД", описанный ранее. Возможность использования (вызова) описанных ранее алгоритмов является важной чертой любого алгоритмического языка, позволяющей строить более сложные алгоритмы из имеющихся заготовок;
- дважды был использован символ комментария //. Текст, расположенный справа от этого символа, игнорируется исполнителем алгоритма, он нужен лишь составителю алгоритма или тому, кто затем будет его исправлять или модифицировать. Комментарии являются важнейшей составной частью любых программ, это способ общения программистов друг с другом (или даже с самим собой, что нужно при разработке больших программ, которая занимает длительное время). Комментарии объясняют, что составитель алгоритма имел в виду в случаях, когда идея алгоритма не очевидна с первого взгляда.
Второй важнейшей конструкцией алгоритмического языка является конструкция " цикл пока ". Заголовок цикла состоит из ключевых слов " цикл пока ", за которыми следует некоторое условие. Дальше записывается тело цикла, завершаемое строкой " конец цикла ". При выполнении цикла исполнитель сначала проверяет условие в заголовке тела цикла. Если условие истинно, то выполняется тело цикла. Затем вновь проверяется условие в заголовке цикла, опять выполняется тело цикла, если условие истинно, и так до бесконечности. Если же условие ложно с самого начала или становится ложным в результате предыдущего выполнения тела цикла, то тело цикла не выполняется и цикл завершается. Таким образом, по выходу из цикла условие, записанное в его заголовке, всегда ложно. Если условие ложно перед началом цикла, то цикл не выполняется ни разу! Программисты иногда называют " цикл пока " циклом с предусловием, поскольку условие продолжения цикла проверяется перед выполнением тела цикла, а не после него. Иногда используют циклы с постусловием ( do... while ), когда тело цикла всегда выполняется хотя бы один раз, а условие продолжения проверяется после каждой итерации. Всегда предпочтительнее использовать цикл с предусловием, это помогает избежать многих ошибок.
Для иллюстрации конструкции " цикл пока " можно привести следующую модификацию алгоритма проезда.
алгоритм Добраться из Аэровокзала до Домодедово | Дано: находимся у Аэровокзала | Надо: оказаться в аэропорту Домодедово начало алгоритма | | цикл пока пробка на Ленинградском проспекте | | выпить чашку кофе в кафе Аэровокзала | | ждать полчаса | конец цикла | | Проезд от аэровокзала до Домодедово через МКАД конец алгоритма
Здесь снова использован определенный ранее алгоритм "Проезд от аэровокзала до Домодедово". Условие продолжения цикла проверяется перед выполнением тела цикла, но не в процессе его выполнения! Так, если пробка рассосалась после чашки кофе, то все равно нужно ждать полчаса.
Теперь можно подвести итоги.
Запись алгоритма на неформальном языке представляет собой последовательность команд исполнителю алгоритма. Запись может также включать управляющие конструкции: ветвление, или условный оператор, и цикл " пока ". Условный оператор выглядит следующим образом:
если условие | то | последовательность действий 1 | иначе | последовательность действий 2 конец если
Последовательность действий 1 выполняется, когда условие истинно; в противном случае выполняется последовательность действий 2. Ключевое слово "иначе" и последовательность действий 2 могут отсутствовать; в этом случае, когда условие ложно, исполнитель ничего не делает.
Цикл " пока ", или цикл с предусловием, выглядит следующим образом:
цикл пока условие | последовательность действий конец цикла
Сначала проверяется условие в заголовке цикла. Если оно истинно, то выполняется последовательность действий, составляющая тело цикла. Это повторяется неограниченное число раз, пока условие истинно. Цикл заканчивается, когда условие при очередной проверке оказывается ложным. Важно отметить, что условие проверяется перед каждым выполнением тела цикла, но не в процессе его выполнения.
Помимо элементарных действий, в записи алгоритма можно использовать другие алгоритмы. Для вызова другого алгоритма нужно просто указать его название. (В некоторых языках, например, в Фортране, для вызова алгоритма используется ключевое слово CALL.) Также в записи алгоритма могут присутствовать комментарии, которые игнорируются исполнителем алгоритма. Для отделения комментария будут использоваться знаки // (двойная косая черта) в соответствии с синтаксисом языка C++.