Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел 3_2.pdf
Скачиваний:
23
Добавлен:
11.02.2016
Размер:
1.22 Mб
Скачать

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

Y =

 

a

b

 

c

 

 

 

d

e

 

 

 

f h

 

 

 

необходимо записать следующее выражение y:= a/(b*c/(d*e/(f*h)));

Операторы

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

Операторы ввода и вывода также являются простыми, но из-за их специфического назначения их обычно рассматривают отдельно.

Другую группу образуют операторы, в состав которых входят другие операторы. Такие операторы называют структурными. К этой группе относятся составной оператор, условные операторы и операторы цикла.

Операторы в программе завершаются символом точка с запятой и обычно (кроме особых случаев) выполняются в порядке их размещения (записи) в тексте программы. Таким образом, преемником каждого очередного выполняемого в данный момент оператора обычно является следующий за ним оператор (ему передается управление). Этот

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

Каждый оператор в программе может быть помечен. В качестве метки используется или идентификатор (набор символов) или целое число в диапазоне от 0 до 9999 (например, m1, lab12, 1, 12). Метка записывается слева от помеченного оператора и отделяется от него двоеточием. Все используемые в программе метки должны быть заранее описаны в разделе Label. В теле программы метки не могут повторяться.

Простые операторы

Оператор присваивания. Оператор присваивания имеет формат

Имя_переменной := выражение;

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

Например:

45

A := 10;

I := I + 2;

X := (-b + sqrt(sqr(b) - 4*a*c))/(2*a); S := 'Модель N';

CanExit := X >= Xmax;

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

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

Формат оператора Goto:

Goto метка;

Например:

Label 20,30; begin

20: Goto 30;

30: Goto 20; end.

Label nl,nm; begin

nl: Goto nm; nm: Goto nl;

end.

Такой фрагмент программы образует цикл, когда два оператора Goto будут бесконечно, последовательно передавать управление друг другу (если не предусмотреть между ними средства выхода за пределы области их действия).

Операторы ввода и вывода.

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

Read(элемент, элемент,...); {ввод из текущей строки, по окончании ввода курсор остается в строке ввода}

Readln(элeмeнт, элeмeнт,...); {ввод из текущей строки,

по окончании ввода курсор переходит в начало следующей строки}

Readln; {переход к началу следующей строки экрана}

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

46

сколько элементов списка в операторах ввода, лучше использовать для ввода каждой переменной свой отдельный оператор.

Примеры операторов ввода:

Read(i,x); или Read(i); Read(x); Readln(i,x); или Read(i); Readln(x);

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

var

i,j : integer; a,b : real;

и с помощью клавиатуры на экран дисплея введена строка значений

12 536.5 63.3 5

Тогда в результате выполнения оператора Read(I,A,B,J); в полях памяти с именами переменных, перечисленных в списке оператора ввода, будут размещены (соответственно)

12 I 536.5 A 63.3 B 5 J

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

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

Write(элемент, элемент,....); {вывод в текущей строке} Writeln(элемент, элемент,....); {вывод в текущей строке и

переход к очередной строке}

Writeln; {переход к очередной строке, вывода нет}

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

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

Write.

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

Такое разделение потока символов на смысловые группы достигается путем включения в соответствующих местах списка вывода необходимого числа пробелов, заключенных в кавычки:

Writeln(элемент,' ', элемент,' ', ....);

либо

47

Writeln(элемент,' ':n, элемент,' ':n1, ....);

где n, n1 - целые константы, указывающее количество пробелов, которые следует

вставить в соответствующие места текста. Рассмотрим пример:

 

Текст фрагмента программы

Форма вывода

 

А:=1; В:=2; С:=3;

 

 

 

Name := 'Лена';

 

 

123

Writeln(А,В,С);

 

на экране -

Writeln(A,' ',B,' ',C);

 

на экране -

1 2 3

Writeln('Привет',Name);

 

на экране -

ПриветЛена

Writeln('Привет, ',Name,'!');

на экране -

Привет, Лена!

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

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

Writeln(элемент:ширина_ поля, ...);

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

программу и текст, выводимый ею на экран:

 

Текст фрагмента программы

Форма вывода

А:=10; В:=2; С:=100;

102100

Writeln(A,B,C);

Writeln(A:2,B:2,C:2);

10 2100

Writeln(A:3,B:3,C:3);

_10__2100

Writeln(A,B:2,C:4);

10_2_100

Как видно из примера, символы, составляющие значение элемента дополняются начальными пробелами (в примере эти пробелы показаны с помощью символа "_") слева с учетом различия между объявленной и фактической "длиной" выводимого значения, а при размещении самого значения оно выравнивается по правой границе отведенного поля. Если размер отведенного поля меньше, чем необходимо, то ширина поля автоматически увеличивается (чтобы избежать усечения). Так, например, во втором операторе Writeln приведенного фрагмента программы для С=100 отведено только две позиции вместо необходимых трех, однако значение выведено полностью.

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

Х := 421.53;

Writeln (X); --> 4.2153000000Е+02 <--16 позиций Writeln (X:8); --> 4.21Е+02 <-- 8 позиций

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

48