Г л а в а 2
ќператоры ¤зыка.
2.1 —оставной
оператор и пустой оператор
2.2 ”словный оператор
2.3 ќператоры
повторени¤
2.4 ќператор выбора
2.5 ћетоды и операторы
перехода
Для знакомства с языком Турбо Паскаля попробуем составить несложную программу, осуществляющую вывод какого-либо сообщения на экран ПК. Пусть это будет фраза ЂЯ программирую на Турбо Паскалеї, г возможный вариант такой программы:
Пример 1.
PROGRAM MyFirstProgran:
Const
Text-ТЯ программирую на Турбо Паскале';
BEGIN
writeln (text);
END.
Прежде всего, проанализируем форму представления текста. В программе шесть строк. Строки программы обычно выделяют некоторые смысловые фрагменты текста и могут не связываться с конкретными действиями в программе: расположение текста программы по строкам - дело вкуса программиста, а не требование синтаксиса языка. Ту же программу можно было бы написать, например, так:
PROGRAM MyFirstProgram;
Const text:='Я программирую на Турбо Паскале';
BEGIN
wrIteln{text);
END.
В отличие от Бейсика или Фортрана пробел в языке Турбо Паскаль используется как разделитель отдельных конструкций языка, поэтому программа
PROGRAM MyFirstProgram;
Const text:='Я программирую на Турбо ПаскалеТ ;
BEGIN
writeln( text ) ;
ЕND.
будет неверной.
В Турбо Паскале игнорируется различие в высоте букв (прописные или строчные), если только это не связано с текстовыми константами. Начало программы могло бы, например, выглядеть так:
Program MyFirstProgram; Теперь о смысле отдельных строк. Первая строка
PROGRAM MyFirstProgram;
начинается словом PROGRAM и содержит объявление имени программы. Слово PROGRAM зарезервировано в Турбо Паскале, т.е. не может использоваться ни в каких иных целях, кроме как для объявления имени программы. В Турбо Паскале имеется множество зарезервированных слов (см. гл.З). Любое из них нельзя использовать в качестве идентификатора (имени) какого-либо объекта программы - переменной, константы и т.д. Поскольку имя программы никак в дальнейшем не используется, требование его объявления кажется излишним. В Турбо Паскале можно екать объявление имени оператором PROGRAM без каких-либо происшествий для программы, и в дальнейшем мы так и будем делать, рассматриваемом примере имя MyFirstProgram есть не что иное, как английская фраза ЂМоя Первая Программаї, но только написанная пробелов - пробел является разделителем и не может использоваться произвольно.
Первая строка заканчивается особым разделителем - точкой с запятой. Этот разделитель в языке Турбо Паскаль отмечает конец оператор; или описания. Использование особого разделителя позволяет располагать несколько операторов на одной строке.
Вторая строка const
содержит единственное зарезервированное слово CONST , означающее, что далее будут описаны одна или несколько констант (CONSTants константы). Константами в языке считаются такие объекты программы, которые не могут изменять своего значения. В отличие от многих других языков программирования, константа в Турбо Паскале может иметь собственное имя, что соответствует принятой в научных и инженерных расчетах практике именования часто используемых констант. Например, cо школы мы помним о существовании константы П=3.14159265.При обработке программы имя константы будет заменяться компилятором на ее значение.
Описать константу в Турбо Паскале - значит указать ее имя и значение. Такое указание содержится в третьей строке
text-'Я программирую ив Турбо Паскале';
в которой константе с именем TEXT присваивается в качестве значения строка символов ЂЯ программирую на Турбо Паскалеї.
В Турбо Паскале могут использоваться константы разного типа целые или вещественные числа, символы, строки символов, массивы и т.п. Признаком того, что TEXT является константой типа строка символе служат два апострофа, обрамляющих строку, причем сами апостроф этой строке не принадлежат, а лишь указывают компилятору на то, что все заключенные в них символы следует рассматривать как единое целое
- текстовую константу: Если понадобится включить сам апостроф в текстовую константу, достаточно его написать дважды подряд. Например, описание
Text=ТТурбо''Паскаль';
создаст константу со значением
Турбо'Паскаль.
Все три первые строки не связаны с какими-либо конкретными действиями.
при работе программы: они сообщают компилятору некоторые сведения о самой программе и использующихся в ней объектах. Эта часть программы называется разделом описаний. Зарезервированное слово BEGIN в четвертой строке сигнализирует компилятору о начале другой части программы - раздела операторов. В нашем примере этот раздел содержит оператор
Wrlteln (text);
который, собственно, и выводит сообщение на экран компьютера.
Завершает всю программу зарезервированное слово END с точкой. Точка оповещает компилятор о конце текста программы.
Перед тем, как попробовать откомпилировать и исполнить нашу программу, обсудим ее единственный исполняемый оператор
wrlteln(text);
Любопытно, что в Паскале вообще и Турбо Паскале, в частности, нет специальных операторов ввода-вывода. Так как ввод и вывод данных есть неотъемлемое свойство любого языка программирования, такая особенность языка Паскаль кажется, по меньшей мере, странной: трудно придумать достойное применение программы, которая никогда не получает информацию извне и никогда не сообщает о своем функционировании. Даже пресловутые программные вирусы время от времени заявляют о своем существовании, и, очевидно, предвкушение этого сладостного момента и является той тайной пружиной, которая заставляет их авторов тратить силы и энергию на создание этих Ђшедевровї. Для обмена информацией с окружающим миром в программах, написанных на языке Турбо Паскаль, используются специальные стандартные процедуры. Таким образом, по своей сути оператор
Wrlteln (text);
является оператором обращения к встроенной процедуре вывода данных (свое название она получила от
WRITE LiNe - записать строку).
Понятие процедуры (см. гл.8) - одно из центральных понятий Турбо Паскаля. Ему в какой-то мере аналогично понятие подпрограммы в Фортране. Процедура - это некоторая последовательность операторов языка Турбо Паскаль, к которой (последовательности) можно обратиться по имени. Всякий раз, когда мы называем в операторе имя процедуры, инициируется последовательность запрограммированных в ней действий (в Фортране для вызова подпрограммы предусмотрен специальный оператор CALL).
Процедура WRITELN относится к стандартным или встроенным процедурам Турбо Паскаля. Стандартная процедура не нуждается в предварительном описании, она доступна любой программе, в которой содержится обращение к ней. Вот почему обращение к WRITELN напоминает оператор вывода данных WRITE языка Фортран. Разница между оператором, вывода и обращением к процедуре вывода состоит в том, что имя процедуры вывода, как и любой другой процедуры Турбо Паскаля, не является зарезервированным словом, а следовательно, пользователь может написать свою собственную процедуру с именем WRITELN. Впрочем, эта возможность для большинства пользователей остается лишь языковой тонкостью и очень редко используется на практике.
Процедура WR1TELN - одна из немногих процедур Турбо Паскаль; при обращении к которым допускается использование произвольного параметров. Параметры передаются процедуре в виде списка, латающегося в круглых скобках сразу за именем процедуры. На примере процедуре передается единственный параметр - константа TEXT. Как мы увидим дальше (см. гл.5), самым первым параметром в обращении к этой процедуре можно указать адрес приемника информации - устройство или дисковый файл, в который направляется BI Таким способом программист может легко переадресовать нужным образом вывод данных. Если, как это сделано в нашем примере, адрес вывода не указан, вывод направляется на экран дисплея.
Анализируя всю программу в целом, мы обнаружим, что четыре использовавшихся в ней слова (PROGRAM, CONST, BEGIN и являются зарезервированными. Слово WRITELN, как уже отмечалось, относится к зарезервированным, но вряд ли может возникнуть необходимость переопределить его, так как в этом случае программа лишится мощного и удобного средства вывода данных. Два слова MYFIRSTPROGRAM и TEXT служат идентификаторами (именами некоторых объектов программы. Программист может использовать в качестве идентификаторов любые последовательности символов, которые удовлетворяют следующим ограничениям:
Х идентификатор может состоять из букв латинского алфавита цифр, знака подчеркивания; никакие другие символы в идентификатору недопустимы;
Х идентификатор не может начинаться с цифры;
Х идентификатор не может совпадать ни с одним из зарезервированных слов;
Х длина идентификатора может быть произвольной, но значащими считаются первые 63 символа.
Как и всюду в программе, в идентификаторах игнорируется разница в высоте букв, поэтому, например, идентификаторы text и TEXT с точки зрения компилятора идентичны.
Теперь попробуйте выполнить программу. Для этого после ее ввод нажмите CtrlЧF9. Если Вы не ошиблись при вводе текста, то спустя несколько секунд заметите быструю смену изображений на экране: сразу после загрузки программы Турбо Паскаль очищает экран, предоставляв его в распоряжение работающей программы пользователя. Такой экран называется окном программы. После завершения прогона (работа программы часто называется ее прогоном) на экране вновь появится окна редактора с текстом программы. Если Вы не успели разглядеть изображение окна программы, нажмите ALTЧF5. После нажатия на любую клавишу среда вернет экран в режим воспроизведения окна редактора.
Перед тем, как двигаться дальше, полезно подробнее ознакомиться с некоторыми возможностями среды Турбо Паскаля. Нажмите клавиш F10, чтобы перейти к режиму выбора из главного меню, подведите указатель к опции WINDOW (окно) и нажмите клавишу УВводФ - на экран раскроется меню второго уровня, связанное с этой опцией. Новое Meню как бы УвыпалоФ из верхней строки, поэтому такое меню часто называют выпадающим (Pull-down). Отыщите в новом меню опцию OUTPUT (вывод программы), подведите к ней указатель и нажмите клавишу УВводФ еще раз. На экране вновь появится окно программы, но оно уже не будет исчезать после нажатия на любую клавишу - экран будет связан с этим окном постоянно. Теперь добьемся того, чтобы на экране демонстрировались два окна одновременно: вновь нажмите клавишу F10, выберите WINDOW, нажмите клавишу УВводФ, подведите указатель к опции TILE (черепица) и нажмите клавишу УВводФ еще раз. Если все сделано правильно, экран приобретет вид, показанный на рис.2.
2.2 ќѕ≈–ј“ќ–џ я«џ ј
2.2.1. —оставной оператор н пустой оператор
2.2.3. ќператоры повторений
¬ ¤зыке “урбо ѕаскаль имеютс¤ три
различных оператора, с помощью которых
можно запрограммировать повтор¤ющиес¤
фрагменты программ.
—четный оператор цикла FOR имеет
такую структуру:
FOR <пар_цик>.--<нач_знач> “ќ <кон_знач>
DO <onepamop>. «десь FOR, TO, DO -
зарезервированные слова (дл¤, до,
выполнить);
<пар_цик> - параметр цикла -
переменна¤ типа INTEGER (точи любого
пор¤дкового типа, см. гл.4);
<нач_знач> - начальное значение -
выражение того же типа;
<кон_знач> - конечное значение -
выражение того же типа;
<оператор> - произвольный оператор
“урбо ѕаскал¤.
ѕри выполнении оператора FOR
вначале вычисл¤етс¤ выражение <нач_знач>
и осуществл¤етс¤ присваивание <пар_цик>:=<нач_знач>.
1 этого циклически повтор¤етс¤:
Х ïðîâåðêà óñëîâèÿ <ïàð_öèê> <= <êîí_çíà÷>;
если условие не J полнено, оператор FOR
завершает свою работу;
Х âûïîëíåíèå îïåðàòîðà <îïåðàòîð>;
Х íàðàùèâàíèå ïåðåìåííîé <ïàð_öèê>
на единицу.
¬ качестве иллюстрации применени¤
оператора FOR рассмотрим программу,
осуществл¤ющую ввод с клавиатуры
произвольного целого числа N и вычисление
суммы всех целых чисел от 1 до N (пример 5).
ѕример 5.
{ ѕрограмма ходит целое положительное
число N и подсчитывает сумму всех целых
чисел от 1 до N}
var
I, n, s : Integer;
BEGIN
{¬вести N}
{Ќачальное значение суммы} {÷икл подсчета
суммы} {¬ывод результата}
write('N= '); readln(n);
s:=0;
for I:-1 to n do s:=s+i
wrlteln('—умма = ',$)
END.
ќтметим два обсто¤тельства. ¬о-первых,
в отличие от оператора (цикла DO в ‘ортране,
условие, управл¤ющее работой оператора FOR,
[провер¤етс¤ перед выполнением оператора
<оператор>: если условие не I
выполн¤етс¤ в самом начале работы
оператора FOR, исполн¤емый
îïåðàтор не будет выполнен
ни разу (в стандартном ‘ортране тело
цикла I выполн¤етс¤ хот¤ бы один раз).
ƒругое обсто¤тельство - шаг наращивани¤ I
параметра цикла строго посто¤нен и равен
(+1). —уществует друга¤ форма
оператора:
FOR <пар_цик>: - <нач_знач> DOWNTO <кон_знач>
DO <onepamop>
«амена зарезервированного слова
“ќ на DO WNTO означает, что шаг I наращивани¤
параметра цикла равен (-1), а управл¤ющее
условие при-I обретает вид <пар_цик> >=
<кон_знач>.
ѕример 5 можно модифицировать так, чтобы
сделать его пригодным I дл¤ подсчета
любых сумм - положительных и
отрицательных:
s := 0;
if n >= 0 then
for i:=1 to n do s:=s+i
else
for i:=-1 downto n do s:=s+i;
ƒва других оператора повторений
лишь провер¤ют условие выполнени¤ или
повторени¤ цикла, но не св¤заны с
изменением счетчика цикла.
ќператор цикла WHILE с пред
проверкой услови¤:
WHILE <условие> DO <onepamop>.
«десь WHILE, DO- зарезервированные
слова (пока [выполн¤етс¤ условие], делать);
<условие> - выражение логического типа;
<оператор> - произвольный оператор
“урбо ѕаскал¤.
≈сли выражение <условие> имеет
значение TRUE, то выполн¤етс¤ <оператор>,
после чего вычисление выражени¤ <условие>
и его проверка повтор¤ютс¤. ≈сли <условие>
имеет значение FALSE , оператор WHILE
прекращает свою работу.
–ассмотрим пример 6,
иллюстрирующий использование оператор
WHILE. Ќайдем так называемое Ђмашинное
эпсилонї - такое минимальное, не равное
нулю вещественное число, которое после
прибавлени¤ его к 1.0 еще дает результат,
отличный от 1.0. ѕример 6.
{ ѕрограмма вычисл¤ет и выводит на экран
çíà÷åíèå 'ìàøèííîãî ýïñèëîíТ }
var
epsiIon : real;
BEGIN
epsiIon := 1;
epsiIon := epsiIon/2;
writeln('ћашинное эпсилон = ',epsilon);
END.
” читател¤, привыкшего к
непрерывной вещественной арифметики
может вызвать недоумение утверждение о
том, что в дискретной машинной арифметике
всегда существуют такие числа 0<X<eps,
что 1.0+’=1.0 ƒело в том, что внутреннее
представление типа REAL может дать Ђлишьї
приблизительно 1014 возможных комбинаций
значащих разр¤дов в отведенных дл¤ него б
байтах. онечно же, это очень большое
число, но оно несопоставимо с бесконечным
множеством вещественных чисел.
јппроксимаци¤ бесконечного непрерывного
множества вещественных чисел конечным (пусть
даже и очень большим) множеством их
внутреннего машинного представлени¤ и
приводит к по¤влению Ђмашинногої.
ќбсуждение этой проблемы и много других
полезных сведений ¬ы найдЄте в
прекрасной книге [11].
ќператор цикла REPEAT...UNTIL с пост
проверкой услови¤:
2.2.4. ќператор выбора
ќператор выбора позвол¤ет выбрать
одно из нескольких возможных продолжений
программы. ѕараметром, по которому
осуществл¤етс¤ выбор, служит ключ выбора
- выражение любого пор¤дкового типа (любого
из рассмотренных, кроме типов REAL и STRING, см.
гл. 4).
—труктура оператора выбора такова:
2.2.5. ћетки и операторы перехода
ћожно теоретически показать, что
рассмотренных операторов не достаточно
дл¤ написани¤ программ любой сложности. ¬
этом отношении наличие в ¤зыке
операторов перехода кажетс¤ излишним.
Ѕолее современна¤ технологи¤
структурного программировани¤ основана
принципе Ђпрограммировать без GOTOї:
считаетс¤, что злоупотребление
операторами перехода затрудн¤ет
понимание программы, делает ее
запутанной и сложной в отладке (см.,
например, [7]).
“ем не менее, в некоторых случа¤х
использование операторов перехода может
упростить программу.
ќператор перехода имеет вид: