
информатика_книги / Информатика. Теория и практика_Острейковский В.А, Полякова И.В_2008 -608с
.pdfнаправлению к лучшим решениям. Когда алгоритм достигает точки, из которой больше невозможно двигаться «вверх», он останавливается.
Программирование с отходом назад. Основой программ искусственного интеллекта (независимо от того, к чему он прилагается — к программированию игр, выбору решений, распознаванию образов и т. п.) является программирование перебора вариантов. Это сложная задача, так как алгоритмы перебора ищут решения не по заданным правилам вычислений, а путем проб и ошибок, и схема не укладывается в схемы циклов, имеющихся в языках программирования. Ситуация зачастую осложняется тем, что прямыми методами перебор всех возможных вариантов невозможно осуществить èç-çà их огромного коли- чества.
Метод программирования с отходом назад позволяет осуществить организованный исчерпывающий поиск требуемого решения задачи. При этом часто удается избежать перебора всех возможных вариантов.
Алгоритмы ветвей и границ. Такие алгоритмы, как и большинство описанных выше, применяются для решения переборных задач. Как и алгоритм с отходом назад, они исследуют древовидную модель пространства решений и ориентированы на поиск в некотором смысле оптимального решения (из конечного множества возможных решений-вариантов).
КОНТРОЛЬНЫЕ ВОПРОСЫ К РАЗДЕЛУ 6
1. Дайте определение термина «алгоритм». 2. Что такое алгоритмический процесс?
3. Какими свойствами должен обладать любой алгоритм? 4. Расскажите о способах записи алгоритма.
5. Перечислите основные типы алгоритмов.
6. В чем отличие линейного алгоритма от разветвляющегося?
7. Раскройте особенности циклического и рекурсивного алгоритмов. 8. Какие вы знаете методы разработки алгоритма?
9. Сформулируйте метод частных целей разработки алгоритма.
10. Что такое программирование методом подъема и с отходом назад?
11. В чем преимущества метода ветвей и границ как метода разработки алгоритма?
461
Раздел 7
ПРОГРАММИРОВАНИЕ
В результате изучения материала седьмого раздела студент должен:
знать:
—основные типы данных и формы их представления для обработки на компьютере;
—операторы ввода, вывода, присваивания, условные и циклические операторы языка программирования;
уметь:
—упорядочивать массив;
—искать минимальный и максимальный элементы массива с указанием местоположения;
—определять количество одинаковых и разных букв в тексте, количество слов в тексте;
—создавать движущиеся объекты на экране дисплея; производить численные расчеты на компьютере с использованием стандартных функций;
—использовать стандартные алгоритмы для решения учебных задач;
—записывать на языке программирования алгоритм решения учебной задачи и отлаживать его;
иметь представление:
—о современных языках и средствах программирования;
—о жизненном цикле программного обеспечения.
Ì å ò î ä è ÷ å ñ ê è å ó ê à ç à í è ÿ
Студент должен уметь составлять «протоколы» выполнения разветвляющихся и циклических алгоритмов, мысленно совершая действия алгоритма и комментируя их; записывать разветв-
462
ляющиеся и циклические алгоритмы, не допуская двусмысленности записи (из записи алгоритма должно быть понятно, где начинаются и где кончаются ветвление и цикл); изменять ветвления и циклы при решении задач (при переходе от модели к алгоритму); использовать простейшие приемы отладки разветвляющихся и циклических программ; проводить вычислительные эксперименты по программам, написанным на языке программирования.
В результате изучения языка Паскаль (или Бейсик) студент должен уяснить, что язык программирования — это одно из средств общения с ЭВМ; знать правила перевода алгоритмов на язык программирования и перевода программ с одного языка на другой; усвоить понятия «слово», «символьная переменная», «кодирование и декодирование текстов»; освоить основные действия со словами; получить четкое представление о том, что:
—изучить язык программирования — значит знать, как
âнем называются те или иные допустимые действия;
—при решении задач на ЭВМ можно пользоваться разными методами;
—одни методы могут быть эффективнее других (например, метод деления пополам обычно эффективнее метода простого перебора);
—алфавит — это произвольный набор символов, а слово — это любая последовательность символов некоторого алфавита;
—существуют различные способы кодирования текстов.
Òåìà 7.1
ЗНАКОМСТВО С ЯЗЫКОМ ПРОГРАММИРОВАНИЯ ПАСКАЛЬ
7.1.1. Введение в язык программирования Паскаль
В данном учебном пособии для изучения программирования выбран язык Паскаль. Он разработан известным швейцарским ученым Никлаусом Виртом в конце 1960-х гг. и назван в честь знаменитого французского физика Блеза Паскаля (1623— 1662). Первоначально задуманный как структурный язык для обучения программированию, он быстро перерос в очень мощный, универсальный язык программирования высокого уровня,
463
процедурно-ориентированный. Язык Паскаль предназначен для решения широкого класса задач. Существует много версий этого языка, последние из них представляют объектно-ориенти- рованные версии в среде Windows.
Рассмотрим основные базовые понятия, которые будут использоваться в дальнейшем изложении.
После описания, чтобы реализовать алгоритм, необходимо его представить в виде последовательности команд, которые могут быть выполнены на некоторой ЭВМ. Алгоритм, выраженный в терминах команд, называется программой. Таким образом, любое применение ЭВМ предполагает ее комплектацию определенным набором программ.
Программа должна описывать некоторый процесс, состоящий в считывании исходных данных, реализации набора действий по преобразованию информации (состав и порядок этих действий определяется исходными данными) и получении некоторого результата. Процесс, реализуемый с помощью программы, может быть достаточно сложным, поэтому должен быть описан с максимальной точностью. Для однозначного описания алгоритма перед реализацией его на ЭВМ используется система правил и обозначений, которая называется алгоритми- ческим языком èëè языком программирования.
Машинный язык описывает возможности, предоставляемые аппаратурой ЭВМ; как правило, это ограниченный набор команд и обрабатываемых структур данных. Основными компонентами ЭВМ являются процессорное устройство и память. Память представляет собой массив адресуемых двоичных данных. Работа процессорного устройства заключается в выборке данных из памяти, модификации их и записи обратно в память. Программирование на машинном языке требует точного знания того, как те или иные данные представлены в виде последовательности бит и какие машинные команды должны применяться для реализации требуемых операций. Язык большинства ЭВМ достаточно беден и состоит из небольшого набора командуказаний типа «сложить числа», «прочитать число, размещенное в определенном месте памяти», «запомнить число в определенном месте памяти», «перейти к команде, расположенной в определенном месте» и т. д. Чем проще машинные команды и чем меньше предусматривается команд, тем более эффектив-
464
но они могут быть реализованы аппаратурой. Синтаксически машинные команды — не более чем последовательности дво- ичных цифр, плохо запоминаемые человеком.
В то же время желательно, чтобы используемый разработ- чиком программы язык максимально отражал его потребности, давал возможность реализовывать средства управления и работы со структурами данных, максимально соответствующие решаемой задаче. Такой язык программирования носит название языка высокого уровня. Ссылка на объекты в языке высокого уровня производится с помощью определенных пользователем имен, а не адресов памяти. Объекты данных связаны с типом, определяющим множество значений, которые могут приниматься объектами этого типа, и множеством операций, которые могут применяться к объектам этого типа. Для манипуляции данными используется множество синтаксических конструкций, называемых операторами. Можно привести следующие примеры операторов таких языков:
—операторы присваивания — по сути, это формулы, значе- ния которых запоминаются в выделенных для этой цели переменных;
—операторы цикла — обеспечивают многократное повторение групп операторов;
—условные операторы — управляют изменением порядка вычислений в зависимости от значений данных;
—операторы ввода-вывода — необходимы для организации обмена программы с внешним миром;
—более или менее мощные операторы описания данных, обрабатываемых программой.
Чем разнообразнее конструкции, которые можно определить с помощью языка программирования, тем более сложная задача может быть реализована на данном языке.
Для перевода программы, написанной на языке высокого уровня, в машинную программу, используется программа, или система, называемая компилятором. Чтобы получить возможность выполнить программу, написанную на языке высокого уровня, ее необходимо откомпилировать. Процесс создания программы заключается в разработке алгоритма, его записи на некотором языке программирования и компиляции подготовленного таким образом текста для получения работающей ма-
465
шинной программы. Кроме того, производятся проверка правильности составленного алгоритма и его реализации в виде программы, соответствия получаемых с помощью программы результатов изначально поставленной задаче, а также поиск и исправление выявленных ошибок, т. е. тестирование è отладка программы.
Основные понятия и определения. Рассмотрим процесс чтения и восприятия человеком обычного текста, например книги. При чтении человек сканирует последовательность символов, с помощью которых кодируется текст; выделяет в тексте слова и знаки препинания; составляет из них отдельные предложения, интерпретируя таким образом смысл текста. Каждое предложение состоит из подлежащего, сказуемого и других членов предложения. Возможная структура предложений и правила связывания слов в предложения определяются грамматикой данного языка.
Программа на языке программирования есть не что иное, как текст, т. е. набор символов. Множество символов, используемых в языке программирования, называется алфавитом языка. Группы символов текста программы составляют лексемы — отдельные смысловые единицы текста. Можно выделить следующие классы лексем: идентификаторы, константы, операции, разделители, комментарии. Лексемы, в свою очередь, объединяются в предложения, называемые операторами языка. Язык программирования предоставляет набор правил, которые описывают способы комбинирования отдельных лексем для получения правильных операторов языка. Правила формирования работающих программ из набора существующих символов называются синтаксисом языка.
Программа на процедурно-ориентированном языке программирования содержит выполняемые и невыполняемые (описательные) операторы. Выполняемые операторы описывают некоторые действия по преобразованию данных или определяют порядок выполнения других исполняемых операторов. Невыполняемые операторы, или директивы, служат для описательных целей, используются для обозначения программных объектов, описания типов, переменных или констант, способов взаимодействия с другими программами, управления распределением памяти, ходом трансляции программы и др.
466
Идентификатор представляет собой строку символов, предназначенную для идентификации (или наименования) некоторого элемента программы. Идентификатор, или имя, обозна- чает объект независимо от его физического месторасположения или адреса и в языке программирования обычно представляет собой последовательность букв и цифр, начинающуюся с буквы. Состав букв может различаться, чаще всего допустимо использовать только буквы латинского алфавита. Идентификатор может содержать некоторые специальные символы, например, символ «_» (подчеркивание), причем он считается буквой. Пробелы и другие символы, не являющиеся буквенноцифровыми, внутри идентификаторов недопустимы. Так, являются допустимыми следующие идентификаторы:
J7; Fanta; Program; Znachenie_Sinusa_Pi_Popolam. Примеры неправильных идентификаторов:
7Up |
(*начинается с цифры*); |
Mild Seven |
(*содержит внутри пробел*); |
Bus_¹_6 |
(*включает недопустимые символы*); |
High-Level |
(*содержит дефис*). |
Синтаксис идентификатора в различных языках программирования имеет незначительные отличия: могут существовать ограничения на допустимую длину идентификатора, на коли- чество символов, являющихся значимыми. В языке Паскаль допустимая длина идентификаторов не ограничена, но только первые 255 символов идентификатора считаются значимыми.
Чтобы однозначно именовать объекты, все идентификаторы должны быть уникальны в пределах одного программного контекста. Иногда одинаковые идентификаторы могут быть объявлены в составе различных структур, модулей или объектов в программе. Такие идентификаторы требуют уточнения (квалификации) с помощью другого идентификатора — имени структуры, модуля или объекта, в котором они объявлены. Пример общего вида квалифицированного идентификатора: Identifierl. Identifier2; здесь Identifierl квалифицирует (уточняет) Identifier2.
Вид элемента, именуемого с помощью идентификатора, зависит от языка программирования; в качестве таких элементов могут выступать переменная, структура данных, тип, процедура,
467
оператор или сама программа. Идентификаторы делятся на
служебные (или зарезервированные) слова è определяемые пользователем.
Набор служебных (зарезервированных) слов служит для организации программы и отдельных операторов; например, идентификатор Program в языке Паскаль служит для обозначе- ния программы, идентификатор Function — для обозначения функции.
Константы могут быть численными, символьными и строч- ными. Численные константы служат для описания целых и дробных чисел. Значение константы, описывающей целое число, может быть представлено цифрами от 0 до 9; кроме того, в ней может содержаться знак «+» или «–».
Примеры целочисленных констант:
–1524; 10; 1; 1234567890 (*целые числа*).
Константы с плавающей точкой дополнительно могут вклю- чать в себя точку, отделяющую целую и дробную часть числа, и знак порядка. Любой из этих элементов — но не оба сразу! — может отсутствовать.
Примеры численных констант, описывающих дробные числа:
–3.1415; 2.718281828459045; 1.0Å-3 = 0.001; 1.5ÅÇ = 1500; 1Å6 = 1000000;
1234Å5 = 123400000.
Символьные константы представляют собой литеры, заклю- ченные в одинарные кавычки (апострофы), например: ‘х’ или ‘?’. Значением символьной константы является код символа в машинном наборе символов (алфавите).
Строковые константы представляют собой произвольную последовательность литер, заключенную в одинарные кавычки.
Примеры строк в языке Паскаль:
‘String constant’
‘Пример строковой константы в языке Паскаль’
Константы называются самоопределенными, поскольку их значение полностью определяется их описанием.
468
Операции, предусмотренные в языке программирования, обычно делятся на бинарные, в результате которых из двух входных переменных (операндов) формируется одна выходная переменная (результат), и унарные, служащие для преобразования одной переменной. В большинстве языков предусмотрен базовый набор арифметических операций (сложение, вычитание, умножение, деление), логических операций (И, ИЛИ, НЕ), операций сравнения («>», «<», «=») и сдвига.
Для обозначения операций могут использоваться специальные литеры или служебные (зарезервированные) слова. Зарезервированные слова, используемые для обозначения операций, не могут использоваться в качестве идентификаторов.
Примеры использования специальных литер для обозначения операций:
Литера |
Операция |
|
|
+ |
Сложение |
|
|
* |
Умножение |
|
|
:= |
Присваивание в языке Паскаль |
|
|
— |
Вычитание |
|
|
/ |
Деление |
|
|
| |
Побитовое ИЛИ |
|
|
Примеры использования служебных идентификаторов для обозначения операций:
Литера |
Операция |
|
|
SHR |
Сдвиг вправо |
|
|
AND |
Логическая операция И |
|
|
MOD |
Взятие остатка от деления |
|
|
Разделители служат для отделения лексем, знаков операций и операторов языка друг от друга. В качестве разделителей в большинстве языков используются пробел, символ табуляции, символ перехода на новую строку (фактически в конце строки стоят два символа — «перевод строки» и «возврат каретки»). Несколько пробелов, табуляций или символов перевода строки, идущих
469
подряд, трактуются как один разделитель. Символы-разделители обязательны в тех случаях, когда их отсутствие приведет к слиянию двух стоящих рядом лексем в одну; например, в строке
if ó = z then
обязательны пробелы перед y и после z, а пробелы вокруг знака равенства необязательны — они служат только для удобочитаемости и могут быть опущены.
В качестве разделителя элементов различных списков чаще всего используется запятая. Алголоподобные языки отделяют отдельные операторы друг от друга с помощью знака «;» (точка с запятой).
Комментарий представляет собой часть текста программы, которая облегчает чтение программы человеком. Компилятором комментарии игнорируются. В каждом языке имеется свой собственный синтаксис комментариев. Обычно комментарии заключаются в скобки, например:
{комментарий} или (*комментарий*) в языке Паскаль. Текст программы на языке Паскаль должен содержаться
в дисковом файле стандартной для MS-DOS структуры. Он может быть сформирован любым текстовым редактором, работающим с ASCII-кодами, и представляет собой последовательность предложений, состоящих из символов, образующих алфавит языка. Максимальная длина предложения — 126 символов, рекомендуемая длина — 70 символов.
Алфавит языка Паскаль включает следующие символы:
—латинские прописные и строчные буквы (A — Z; a — z)
èсимвол «подчерк» (код ASCII 95) — для формирования идентификаторов и служебных слов;
—арабские цифры (0—9) — для записи чисел и идентификаторов;
—22 специальных символа:
математические: + | – | * | / | = | > | < |(|)|, пунктуации: | . | — в конце программы; | , | : | ; | — после каж-
дого оператора, прочие: | [] | — квадратные скобки для обозначения масси-
вов и множеств; | { } | или (* *) — комментарии; | ' ' | — для записи констант символьного и текстового типов; | $ | — для записи шестнадцатеричного числа и записи директив компилятору; | # | — для записи символа, не имеющего графического пред-
470