Алгоритмические языки высокого уровня. Курс лекций
.pdf
2.Если результат FALSE, то выполнение оператора цикла пре- кращается (выполняется следующий оператор, стоящий за операто- ром цикла while).
3.Выполняется тело цикла (оператор, стоящий за символом DO).
4.Осуществляется переход к пункту 1.
Пример программы
Описание: программа выводит на экран результат вычисления 'машинного эпсилон' (машинным эпсилон называется минимальное положительное число, которое при сложении с числом 1.0 дает ре- зультат, больший чем 1.0).
Program While_Test; uses crt;
var eprs: real; begin
clrscr;
eprs:=1;
while eprs/2+1>1 do eprs:=eprs/2; gotoxy(1,2);
write(‘Результат: eprs = ’, eprs); while not keypressed do
end.
Оператор цикла с постусловием – соответствует структуре цик-
ла с постусловием: «повторять выполнение действий до выполнения условия выхода из цикла».
|
вход |
|
Серия команд |
|
Условие |
|
повторения |
|
цикла |
|
нет |
REPEAT |
оператор |
Тело цикла
да
выход
UNTIL Логическое выражение.
Синтаксис: Repeat <оператор> Until <условие>
Название этого оператора определяется тем, что условие распо- ложено в конце структуры.
41
Порядок выполнения оператора цикла с постусловием
1. Выполняется тело цикла (операторы, расположенные между
REPEAT и UNTIL).
2.Вычисляется логическое выражение, являющееся условием окончания цикла.
3.Если результат FALSE, то осуществляется переход к пункту 1.
4.Если результат TRUE, то оператор цикла прекращается (выпол- няется следующий оператор, стоящий за оператором цикла).
Отличия операторов цикла с пред- и постусловием.
1.Условие повторения цикла является взаимно противоположным условию окончания цикла, т.е. одно условие является отрицанием другого (можно для получения другого условия из исходного ис- пользовать операцию отрицания NOT).
2.Может быть ситуация, когда тело оператора цикла с предусловием не выполнится ни разу (при первом вычислении условия повторения цикла получено значение FALSE). В этой же ситуации тело оператора
цикла с постусловием выполнится один раз (так как вычисление усло- вия окончания цикла производится после выполнения действий).
3.Тело цикла оператора с предусловием состоит из одного любо- го оператора, тело цикла оператора с предусловием может состоять из любого количества любых операторов.
4.До использования операторов цикла должны быть определены все переменные, входящие в условие повторения циклов.
5.В теле цикла любого из этих операторов должно быть хотя бы одно действие, приводящее к изменению хотя бы одной переменной, входящей в условие окончания или продолжения цикла.
Пример программы
Описание: программа выводит на экран, в зависимости от выбора пользователя, код символа (при вводе символа) или символ (при вво- де кода).
Program Repeat_test; uses crt;
const CR=13;
var n,cod: integer; ch: char; Stop: boolean;
begin
Stop:=false; repeat
clrscr;
gotoxy(1,1);
42
write(‘Введите действие 0-Stop,1-код,2- символ…’);readln(n);
if (n=1) then begin
gotoxy(1,2);write(‘Введите код’);read(cod); gotoxy(1,3);
write(‘Код-’, cod,’соответствует символу:’, chr(cod));
end;
if (n=2) then begin
gotoxy(1,2);write(‘Введите символ: ’); read(ch); gotoxy(1,3);write(‘Символ-’,ch, ‘имеет код’,ord(ch)); if ord(ch)=CR then
Stop:= true; end;
if n=0 then begin
gotoxy(1,2);write(‘Stop’);
Stop:=true;
end;
gotoxy(1,5);write(‘Press any key…’); while not keypressed do
until Stop end.
Операторы завершения цикла. Для всех операторов цикла выход из цикла осуществляется как вследствие естественного окончания опе- ратора цикла, так и с помощью операторов перехода и выхода. В стан- дартной версии Pascal определены процедуры Break и Continue. Процедура Break выполняет безусловный выход из цикла. Процедура Continue обеспечивает переход к началу новой итерации цикла.
3.4. Операторы перехода и выхода
Оператор перехода предназначен для реализации устаревшего стиля программирования с использованием меток и переходов к этим меткам.
GOTO Метка
Синтаксис: Goto V1, где V1 - метка
При выполнении оператора осуществляется переход к выполнению оператора, помеченного меткой. Переход извне внутрь структурного оператора (структурный оператор – оператор, внутрь которого вложен другой оператор или операторы) может вызвать непредсказуемые эф- фекты (компилятор при этом не выдает сообщение об ошибке).
43
ВНИМАНИЕ! Хорошо структурированные программы не
должны содержать меток.
Метки и команды перехода применяются: при досрочном выходе из циклов и анализе корректности вводимых значений; при отладке сложных программ.
Пример программы
Описание: программа демонстрирует использование меток и ко- манд перехода.
program gotoj_ Var
a:integer; label
L1,L2; begin
read(a);
if a=1 then goto L1
else begin
a:=a+1; goto L2; end;
L1:a:=100; L2: write(a); end.
Операторы выхода. Для завершения работы программ, процедур и функций без предварительного перехода по меткам в Pascal введе- ны процедуры: Exit и Halt.
Вызов процедуры Exit завершает работу программного блока, в котором она была вызвана и передает управление вызывающей про- грамме. Если процедура Exit выполняется в подпрограмме, то вы- полнение этой подпрограммы прекратится, и далее будет выполняться следующий за вызовом этой подпрограммы оператор. Если процедура Exit выполняется в основной программе, выход из нее будет эквива- лентен ее нормальному завершению основной программы. Вызов про- цедуры Halt, где бы она не находилась, завершает работу программы и передает управление операционной системе. Процедура Halt имеет структуру Halt (n), где n – код возврата, который может быть про- анализирован операционной системой с помощью команды IF ERRORLEVEL. Значение n=0 соответствует нормальному завершению работы программы. Вызов процедуры Halt без параметра эквивален- тен вызову Halt (0).
44
4. ТИПЫ ДАННЫХ
Любая константа, переменная, значение функции характеризуется своим типом данных. Тип определяет множество допустимых значе- ний, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему. Тип определяет и формат внутреннего представления данных в памяти ПК. Пользова- тель может создавать свои типы данных на основании стандартных типов.
|
|
|
|
|
|
|
|
Порядковые |
|
|
Целые |
|
Типы |
|
|
Простые |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вещественные |
|
|
Логический |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Структурированные |
|
|
|
Массивы |
|
|
|
|||
|
|
|
|
|
|
|
Символьный |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
Ссылочный (указатель) |
|
|
|
Записи |
|
|
Перечислимый |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
Процедурный |
|
|
|
Множества |
|
|
Тип-диапазон |
||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Объекты |
|
|
|
Файлы |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Строковый
В математике принято классифицировать переменные в соответ- ствии с некоторыми важными характеристиками. Производится строгое разграничение между вещественными, комплексными и ло- гическими переменными, между переменными, представляющими отдельные значения и множество значений и так далее.
При обработке данных на ПК такая классификация еще более важна. В любом алгоритмическом языке каждая константа, перемен- ная, выражение или функция бывают определенного типа. В языке Pascal существует правило: тип явно задается в описании перемен- ной или функции, которое предшествует их использованию.
45
Концепция типа языка Pascal имеет следующие основные свойства:
•любой тип данных определяет множество значений, которые может принимать константа, переменная, выражение, операция или функция;
•тип значения, задаваемого константой, переменной или выраже- нием, можно определить по их виду (или описанию);
•каждая операция или функция требует аргументов определенно- го типа и возвращает результат определенного типа. Поэтому транс- лятор может использовать информацию о типах данных для провер- ки вычислений и правильности различных конструкций.
Тип определяет:
1)возможные значения переменных, констант, функций, выраже- ний, принадлежащих к данному типу;
2)внутреннюю форму представления данных в ПК;
3)операции и функции, которые могут выполняться над величи- нами, принадлежащими к данному типу.
Обязательное описание типа приводит к избыточности в тексте программ, но такая избыточность является важным вспомогательным средством разработки программ и рассматривается как необходимое свойство современных алгоритмических языков высокого уровня.
В языке Pascal есть понятия эквивалентности и совместимости
типов.
Два типа Т1 и Т2 являются эквивалентными (идентичными), ес- ли выполняется одно из двух условий:
1)Т1 и Т2 представляют собой один тип;
2)тип Т2 описан с использованием Т1 с помощью равенства (или последовательности равенств).
Пример: Type T1 = Integer; T2 = T1; T3 = T2;
Менее строгие ограничения определены для совместимости ти- пов.
Типы являются совместимыми, если:
1)они эквивалентны;
2)являются оба либо целыми, либо действительными;
3)один тип – тип (диапазон), другой – его базовый;
4)оба типы (диапазоны) с общим базовым;
5)один тип – строковый, другой – символьный.
46
4.1.Простые типы данных
Кпростым типам относятся порядковые и вещественные типы. По- рядковые типы отличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упо- рядочить (отсюда – название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число – порядковый номер значения.
|
|
|
|
Таблица 4.1 |
|
Процедуры и функции, применимые к простым типам |
|||
|
|
|
|
|
Функция |
|
Тип |
Тип |
Действие (результат) |
|
аргумента |
результата |
||
|
|
|
||
|
|
|
|
|
|
|
INTEGER |
INTEGER |
X+1 символ после X в |
SUCC(X) |
|
упорядоченном множест- |
||
|
CHAR |
CHAR |
||
|
|
ве символов |
||
|
|
|
|
|
|
|
|
|
|
|
|
INTEGER |
INTEGER |
X-1 символ перед X в |
PRED(X) |
|
упорядоченном множест- |
||
|
CHAR |
CHAR |
||
|
|
ве символов |
||
|
|
|
|
|
|
|
|
|
Порядковый номер сим- |
ORD(S) |
|
CHAR |
INTEGER |
вола S в упорядоченном |
|
|
|
|
множестве |
|
|
|
|
Символ, стоящий под |
CHR(I) |
|
INTEGER |
CHAR |
номером I в упорядо- |
|
ченном множестве сим- |
|||
|
|
|
|
|
|
|
|
|
волов |
|
|
|
|
|
|
|
|
|
TRUE, если x – нечет- |
ODD(X) |
|
INTEGER |
BOOLEAN |
ное, FALSE, если х - |
|
|
|
|
четное |
DEC |
|
|
|
Уменьшает значение x |
|
INTEGER |
INTEGER |
на i, а при отсутствии |
|
(x[, i]) |
|
|||
|
|
|
i - на 1 |
|
|
|
|
|
|
INC |
|
|
|
Увеличивает значение x |
|
INTEGER |
INTEGER |
на i, а при отсутствии |
|
(x[, i]) |
|
|||
|
|
|
i - на 1 |
|
|
|
|
|
|
HI(x) |
|
WORD |
BYTE |
Возвращает старший |
|
байт аргумента |
|||
|
|
|
|
|
LO(x) |
|
WORD |
BYTE |
Возвращает младший |
|
байт аргумента |
|||
|
|
|
|
|
SWAP(x) |
|
INTEGER |
INTEGER |
Меняет местами байты в |
|
слове |
|||
|
|
|
|
|
ABS(x) |
|
REAL |
REAL |
Вычисление абсолютного |
|
INTEGER |
INTEGER |
значения х – X |
|
|
|
|||
FRAC(x) |
|
REAL |
INTEGER |
Дробная часть числа |
INT(x) |
|
REAL |
INTEGER |
Целая часть числа |
SIN(x) |
|
REAL |
REAL REAL |
Вычисление синуса х |
|
INTEGER |
|||
|
|
|
|
|
47
|
|
|
Окончание табл. 4.1 |
|
|
|
|
|
|
COS(x) |
REAL |
REAL REAL |
Вычисление косинуса х |
|
INTEGER |
||||
|
|
|
||
ARCTAN(x) |
REAL |
REAL REAL |
Вычисление арктангенса |
|
INTEGER |
х |
|||
|
|
|||
|
|
|
Вычисление экспоненты |
|
EXP(x) |
REAL |
REAL REAL |
- Ex (E~2.7183) |
|
INTEGER |
E x p ( B * L n |
|||
|
|
|||
|
|
|
( A ) ) = AB |
|
LN(x) |
REAL |
REAL REAL |
Ln x – натуральный ло- |
|
INTEGER |
гарифм |
|||
|
|
|||
LOG(x) |
REAL |
REAL REAL |
log x |
|
INTEGER |
||||
|
|
|
||
SQRT(x) |
REAL |
REAL REAL |
Вычисление квадратного |
|
INTEGER |
корня из х |
|||
|
|
|||
SQR(x) |
REAL |
REAL |
Вычисление квадрата |
|
INTEGER |
INTEGER |
х - X2 |
||
|
|
|
Определение целой час- |
|
|
|
|
ти от х (выделяет це- |
|
TRUNC(x) |
REAL |
INTEGER |
лую часть действитель- |
|
INTEGER |
INTEGER |
ного аргумента путем |
||
|
||||
|
|
|
отсечения дробной час- |
|
|
|
|
ти) |
|
|
|
|
Округление х в сторону |
|
ROUND(x) |
REAL |
NTEGER |
ближайшего целого (ок- |
|
INTEGER |
INTEGER |
ругляет аргумент до |
||
|
||||
|
|
|
ближайшего целого) |
|
|
|
|
Возвращает псевдослу- |
|
Random |
INTEGER |
INTEGER |
чайное число, равно- |
|
(x) |
мерно распределенное в |
|||
|
|
|||
|
|
|
диапазоне 0...(X-1) |
|
|
|
|
Инициализация генера- |
|
Randomize |
|
|
тора случайных чисел в |
|
|
|
|
исходное состояние |
4.1.1.Порядковые типы
Кпорядковым типам относятся целый, логический, символьный, перечисляемый и тип-диапазон. К любому из них применима функ- ция ORD(X), которая возвращает порядковый номер значения выра-
жения X. Для целых типов функция ORD(X) возвращает само значе- ние X, т.е. ORD(X) = X. Применение ORD(X) к логическому, сим- вольному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 255 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свой-
48
ства базового порядкового типа, поэтому результат применения к нему функции ORD(X) зависит от свойств этого типа.
К порядковым типам можно применять функции:
PRED(X) – возвращает предыдущее значение порядкового типа, которое соответствует порядковому номеру ORD(X)- 1, т.е.
ORD(PRED(X))=ORD(X)- 1;
SUCC(X) – возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ORD(X) + 1, т.е.
ORD(SUCC(X)) = ORD(X) + 1.
Если представить себе любой порядковый тип как упорядоченное множество значений, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция PRED(X) не определе- на для левого, a SUCC(X) – для правого конца этого отрезка. К лю- бому порядковому типу могут быть применены стандартные функ- ции LOW(X) и HIGTH(X), которые возвращают наименьшее и наи- большее значения величин данного типа.
Целый тип. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта.
Таблица 4.2
Целые типы данных и диапозон значений
Целые типы
Название |
Длина, байт |
Диапазон значений |
Byte |
1 |
0...255 |
ShortInt |
1 |
-128...+127 |
Word |
2 |
0...65535 |
Integer |
2 |
-32768...+32767 |
LongInt |
4 |
-2 147 483 648... +2 147 483 647 |
Примеры описания: Var a:word; b:integer;
При использовании процедур и функций с целочисленными пара- метрами следует руководствоваться «вложенностью типов» – везде, где может использоваться WORD, допускается использование BYTE. LONGINT включает INTEGER (который включает в себя SHORTINT).
При действиях с целыми числами тип результата будет соответст- вовать типу операндов (если операнды относятся к различным целым типам – типу того операнда, который имеет максимальную мощ- ность – максимальный диапазон значений).
49
Пример программы
Описание: программа проверки правильности ввода целого числа.
Program int; Var
s: string;
n, error: integer; flag: boolean;
begin
flag:= true; writeln(‘Введите целое число’); while flag do
begin readln(s);
val(s, n, error);
if (error = 0) then flag:= false
else writeln(‘Неверный формат. Повторите ввод!’); end;
writeln(‘Вы ввели число ’, n); readln;
end.
Логический тип (boolean). Переменные логического типа могут принимать одно из двух значений: TRUE или FALSE. Внутреннее представление – 1 байт.
Описание: Var a:boolean;
Над переменными логического типа определены три логические операции: AND (конъюнкция), OR (дизъюнкция), NOT (отрицание). Логический тип определен так, что FALSE<TRUE. Это означает, что операции отношения могут быть применены не только к данным це- лого, вещественного и символьного типов, но и к данным логическо- го типа. Значение FALSE и TRUE можно рассматривать как упорядо- ченное множество, состоящее из двух элементов. При этом:
ORD(FALSE)=0; ORD(TRUE)=1; SUCC(FALSE)=TRUE; PRED(TRUE)=FALSE.
Символьный тип (char). Внутреннее представление – 1 байт.
Описание: Var a:boolean;
Значениями символьного типа являются элементы множества символов, имеющихся на клавиатуре. Каждому символу ставится в соответствие некоторый код, который представляет собой целое чис- ло. Символ, заключенный в апострофы, обозначает константу сим- вольного типа, например: ‘x’,’5’,’=’.
ORD(S) дает порядковый номер символа S в упорядоченном мно-
жестве символов. ORD(‘:’)=58, ORD(‘5’)=53
50
