Цикл с предусловием

Type

Ограниченный тип (диапазон)

Type

Color = (red, yellow, green, black);

Animals = (cat, dog, horse);

Days = (Monday, Sunday, Tuesday, Friday);

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

Любой перечисляемый тип упорядочен и имеет внутреннюю нумерацию: 1-й элемент имеет №0, 2-й - №1 и т.д. Номер каждого элемента можно получить функцией:ORD (x): longint.

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

Для переменных этого типа можно использовать функции SUCC(x) и PRED(x). Например: DEC (5) = 4; PRED (’b’) = ’a’. Не определены значения SUCC (последний элемент перечисления) и PRED (1-й элемент перечисления).

Содержит значения только из ограниченного поддиапазона некоторого базового типа (любой целочисленный тип, тип char, и любой из введенных программистом перечисляемых типов). Для задания этого типа надо указать границы, сначала меньшую, потом большую, между ними разделитель — 2 точки:

Digits = 1..8;

Symbols = ’b’..’m’.

Ограниченный тип наследует все свойства (допустимые операции) базового типа.

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

ОПИСАНИЕ ПЕРЕМЕННЫХ.

Переменные вводятся в программу для хранения и передачи данных внутри нее. Любая используемая переменная должна быть определена, причем ее описание должно предшествовать ее использованию. Описание начинается со служебного слова var. За ним следует список идентификаторов переменных с указанием их типов, разделенных двоеточием.

Пример: var

A:integer; {стандартный тип}

S:char; {стандартный тип }

Flag: boolean; {стандартный тип }

Sinus:real; {стандартный тип }

Index: 0..5; {тип диапазон}

Semafor: (red, green); {перечислением}

X,y,z: real; {неск. пер-х одного типа можно объединять}

2.ОПИСАНИЕ КОНСТАНТ.

Константы – это объекты, которые при выполнении программы не меняют своего значения. Описание начинается со служебного слова const, за которым следует список идентификаторов констант и их значений через знак равенства «=».

Пример:

Const

Min = 10;

Max = 1000;

Center = (max-min) div 2; {расширение ТП – можно использовать

константные выражения}

Message = ‘Out of memory’;

Тип не указывается. Он однозначно определяется по конкретному значению каждой константы.

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

Типизированные константы.

Занимают промежуточное положение между переменными и константами:

ü Типизированные константы описываются в разделе описаний констант вместе с обычными;

ü Как и обычные константы, они получают при описании начальное значение;

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

Т.о., название “константа” довольно условное.

Пример:

Const

Pi: real = 3.14;

Diapazon: 0..100 = 1;

Title: string = ‘Name’;

Нужно помнить, что типизированные константы не взаимозаменяемы с обычными константами. Их нельзя использовать в константных выражениях:

Const

Min: integer = 0;

Max: integer = 99;

Var

M: array[min..max] of byte; {некорректно!}

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

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

Type

Mas=array[1..5]of real;

Const

M:mas = (2.8, 3.2, 4.5, -3.4, -0.9);

1. ОСНОВНОЙ БЛОК ПРОГРАММЫ.

ВЫРАЖЕНИЯ.

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

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

Операнды – “элементарные” значения. Ими могут быть переменные, элементы массивов, поля записей и т.д.

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

Операции обозначаются:

- Специальными знаками, состоящими из одного или нескольких символов. (@, +, <=)

- С помощью служебных слов. (Div, mod.)

Операции бывают:

- Бинарные, т.е. определенные для двух операндов. Знак операции записывается между операндами (a+b, f1 div f2);

- Унарные, т.е. содержащие 1 операнд. Знак операции всегда предшествует операнду (@d, -a).

Арифметические операции – выполняют арифметические действия над значениями операндов целочисленных и вещественных типов:

- Бинарные +, -, *, /, div, mod

- Унарные - (отрицание знака), not (арифметическое отрицание)

Операции отношения – выполняют сравнение двух операндов и определяют истинно значение выражения или ложно. Результат имеет булевский тип (true или false): <, >, <=, >=, <>, =, in. Сравнивать можно совместимые простые значения, указатели, символы, строки. Замечание: формально х º 2.23 * х / 2.23, но из-за ошибок округления в вещественном типе левая и правая части будут отличаться; т.е. при сравнении вещественных значений нельзя быть уверенным в его корректности.

Логические операции – результат true или false: not, or, and, xor. ТП поддерживает 2 различные модели генерации кода для операций and и or: полное вычисление и вычисление по короткой схеме (частичное). Полное – каждый член логического выражения, построенного с помощью операций and и or, всегда будет вычисляться, даже если результат всего выражения уже известен. Частичное – вычисление прекращается, как только результат всего выражения становится очевиден. Во многих случаях эта модель удобна, т.к. обеспечивает минимальное время выполнения и, как правило, минимальный объем кода. Такое вычисление делает возможными такие конструкции, которые в противном случае были бы недопустимыми. Пример: if (x<>0) and (2/x >N) then… Здесь: если результат первого вычисления будет false, то вычисление второго выражения не выполняется (а если бы попыталось выполниться, то возникла бы ошибка). Полная схема необходима лишь тогда, когда один или более операндов в выражении – логические функции с побочными эффектами, которые изменяют смысл программы. Схема вычисления задается с помощью ключа компилятора $B в меню Option/Compiler. {$B+} – полная схема, {$B-} – короткая схема.

Задачи: установить, истинны или ложны следующие условия:

Not ((6<4) and (4>8)) {true}

(a<=a+1) or (12-3>0) {true}

((2<=2) and (3>=3)) or (15>25) {true}

Операция взятия адреса @ - унарная операция, создает указатель на переменную.

Выполнение операций происходит с учетом их приоритетов. Чем выше приоритет, тем раньше выполняется операция:

- 1-й приоритет (высший) – унарные операции @, not

- 2-й – операции типа умножения: *, /, div, mod, and

- 3-й - операции типа сложения: +, -, or, xor

- 4-й - операции отношения: =, <, >, in и т.д.

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

В выражениях можно использовать готовые функции и процедуры ТП:

1) функции

Вызов функции Тип аргумента Тип значения Назначение функции
Abs(x) Целый/веществен. Как у аргумента Абсолютное знач. х
Pi - Вещественный p. Генерирует число p с точностью, зависящей от наличия сопроцессора и содержит 10-14 знаков после «,». Может использоваться в вычислениях как константа, но не может быть подставлена в вычислимые константы раздела Const
Sin(x) Вещественный Вещественный Sin x радиан
Cos(x) Вещественный Вещественный Cos x радиан
Arctan(x) Вещественный Вещественный Arctg x радиан. Возвращает главное значение (от до )
Sqrt(x) Целый/веществен. Вещественный , х>0
Sqr(x) Целый/веществен. Как у аргумента X2
Exp(x) Вещественный Вещественный ex
Ln(x) Вещественный Вещественный Ln x, x>0
Trunc(x) Вещественный Longint Целая часть х
Frac(x) Вещественный Вещественный Дробная часть х
Int(x) Вещественный Вещественный Целая часть значения х. Записывает целое число в вещественном формате (для совместимости в операторах присваивания) (после «.» - нули)
Round(x) Вещественный Longint Округление х до ближайшего целого
Odd(x) Целый Логический True – если х нечетное
Random - Вещественный Случайное число (0..1)
Random(x) Word Word Случайное число (0..х)

Остальные математические функции надо выражать через стандартные (используя справочник по математике).

logab=® ln(b)/ln(a)

Задача: записать выражение по правилам ТП:

2) процедуры

inc(var x: целое) – увеличивает значение х на 1

dec(var x: целое) – уменьшает значение х на 1

inc(var x: целое; N: целое) – увеличивает значение х на N

dec(var x: целое; N: целое) – уменьшает значение х на N

Оптимизируют операции сложения и вычитания. При компиляции inc(i) дает более эффективный код, чем традиционное i:=i+1 (выигрыш до 30%).

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

2. ОПЕРАТОРЫ.

Операторы – это синтаксические конструкции, предназначенные для записи алгоритмических действий по преобразованию данных, а также для задания порядка выполнения других действий.

В ТП есть:

ü Простые операторы – не содержащие в себе никаких других операторов

ü Структурные – в их состав могут входить другие операторы (а те, в свою очередь, тоже могут быть структурными; глубина вложенности не ограничивается).

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

¨ Присваивания «:=» - предписывает выполнить выражение, заданное в его правой части, и присвоить результат переменной, идентификатор которой расположен в левой части. Переменная и выражение должны быть совместимы по типу.

Пример: flag:= false;

Ch:=’h’;

Sum:= x+y;

R:= (x+z)/(2+z*10) – 0.5;

Задачи:

1) Поменять между собой значения двух переменных a и b, воспользовавшись 3-ей переменной для временного хранения значения. R:=a; a:=b; b:=R;

2) Поменять между собой значения трех переменных x, y, z по схеме x®y®z®x.

Temp:=x;

X:=z;

z:=y;

y:=temp;

3) Чему равно х в результате выполнения программы:

X:=2;

X:=x+x;

X:=x-1; {3}

4) Поменяйте между собой значения двух целых переменных, не используя третьей переменной.

A:=5; a:=a+b;

B:=3; b:=a-b;

a:=a-b;

¨ Безусловного перехода. Любой оператор в программе можно пометить меткой. Все метки должны быть описаны в разделе LABLE. Синтаксис оператора: goto имя метки;

Применяется в случаях, когда после выполнения некоторого оператора надо выполнить не следующий по порядку, а какой-либо другой, отмеченный меткой оператор. Метка может содержать как цифровые, так и буквенные символы: goto 99; goto EndBlock;

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

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

¨ Операторы простого ввода/вывода – read, readln, write, writeln.

Задачи:

1) На клавиатуре набраны 2 строки:

2 3 4 5

Какие значения придаст переменным х и у пара операторов:

Read(x); readln(x);

Read(y); read(y);

2) В результате вычислений получили, что х1=5, х2=3, х3=1, х4=0. Что будет выведено на экран операторами:

Write(x1,x2); writeln(x1);

Write(x3,x4); writeln(x2,x3);

Writeln(x4);

Можно использовать writeln без списка вывода – курсор переместится в начало следующей строки.

Составные операторы.-

Конструкции, построенные из других операторов по строго определенным правилам. Делятся на 3 группы: составные, условные, повтора.

¨ Составной оператор – задает последовательное выполнение операторов, входящих в него. Эти операторы заключены между служебными словами begin и end и отделяются друг от друга “;”

Пример: begin begin

A:=11; z:=x;

B:=a*a; x:=y;

Write(b); y:=z;

End; end;

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

¨ Условный оператор – для выбора к исполнению одного из двух возможных операторов в зависимости от некоторого условия. При этом один из операторов может быть пустым, т.е. отсутствовать.

If <условие> then <оператор 1>

Else <оператор 2>; (1)

If <условие> then <оператор>; (2)

Условие – это выражение булевского типа. Если значение выражения истинно, выполняется оператор 1, если ложно – оператор 2 (для (1)). Для (2): если условие истинно, то выполняется <оператор>, если ложно – оператор, следующий за оператором If.

Пример:

1) Из двух чисел определить большее.

If x>y then max:=x

Else max:=y;

2) Проверка кода – если не тот, то выйти из программы.

If x=100 then write(‘код правильный’)

Else

Begin

Write(‘ошибка в коде!’);

Halt(1);

End;

Допускается вложенность условных операторов.

Задачи:

1) Определить максимальное из трех чисел.

If a>b Then

If a>c then max:=a

Else max:=c

Else

If b>c then max:=b

Else max:=c;

2) Ввести число. Напечатать “1”, если число четное, и “0”, если нечетное.

If odd(x) then writeln(‘0’)

Else writeln(‘1’); или ((x mod 2) <> 0)

3) Ввести 2 числа. Напечатать сначала меньшее, потом большее.

Readln(a,b);

If a>b then write (b,’ ‘,a)

Else write (a,’ ‘,b);

4) Решить задачу 3), используя только один оператор вывода.

Readln(a,b);

If a>b then begin

Temp:=a;

A:=b;

B:=temp

End;

Writeln(a,’ ‘,b);

5) Даны 3 числа a, b, c <>0. Установить, имеет ли уравнение ax2+bx+c=0 действительные корни и, если имеет, то найти их.

Const a=3; b=5; c=-4;

Var d:real; x1,x2:real;

Begin

D:=sqr(b)-4*a*c;

If d>0 then

Begin

X1:=(-b+sqrt(d))/2*a;

X2:= (-b-sqrt(d))/2*a;

Writeln(‘x1=’, x1, ‘x2=’, x2);

End

Else writeln (‘нет действительных корней!’);

End.

6) Заданы площади круга R и квадрата S. Определить, поместится ли квадрат в круге при R=70, S=36.4; и круг в квадрате при R=3.2, S=3.5.

¨ Оператор выбора – позволяет сделать выбор из произвольного числа имеющихся вариантов.

Case <выражение-селектор> of

< набор значений 1>:<оператор 1>;

< набор значений 2>:<оператор 2>;

.....

< набор значений N>:< оператор N>

else < оператор >

end;

Пример:

Case Color of

Red: x:=y+2;

Yellow: x:=y-2;

Green: x:=y;

End;

Сначала вычисляется текущее значение переменной Color. Затем это значение сравнивается с константами, записанными перед операторами. При совпадении значения переменной и одной из констант выбора будет выполнен оператор, «помеченный» данной константой. Если значение переменной Color не совпадет ни с одной константой, то данный оператор не выполнит никаких действий.

Кроме одиночных констант могут использоваться списки или диапазоны значений: Пример: Case Sw of

1..3: proc1;

4,5,8: proc2;

6,9..12: proc3

else proc4

end;

Операторы безусловного выхода из программы.

ТП обладает средствами безусловного выхода из программных блоков. Это очень удобно, т.к. позволяет завершить программу или процедуру без предварительных переходов по меткам. К таким операторам завершения относятся вызовы системных процедур Halt и Exit.

Exit завершает работу своего программного блока. Вызов Exit в процедуре означает завершение ее работы и возврат в основную программу. Вызов в основной программе означает завершение программы.

Halt(n) – независимо от того, где она находится, ее выполнение завершает работу программы с кодом завершения n. Этот код впоследствии может быть проанализирован, в частности, командой If ErrorLevel… в среде MS DOS. Значение ErrorLevel после остановки программы будет равно значению n. N=0 соответствует нормальному коду завершения.


Лекция №3

Операторы цикла

Циклы – это повторяющееся выполнение одних и тех же операторов. Существует 3 стандартных способа организации циклических вычислений.

While <выражение> do <оператор>;

Перед каждым очередным выполнением оператора производится проверка значения булевского выражения, которое служит критерием повторения. Если это выражение имеет значение True – тело цикла выполняется. Затем снова вычисляется выражение условия. Если результат равен False – происходит выход из цикла и переход к первому после While оператору. Если выражение с самого начала было ложно, то цикл не выполнится ни разу.

Пример: 1) While E>0.05 do begin

S:=a*b;

E:=p-s;

A:=a+0.5;

B:=b+0.5;

End;

2) While m[i]<>0 do i:=i+1;

Следует помнить:

- Чтобы цикл имел шанс когда-нибудь завершиться, содержимое его тела должно обязательно влиять на условие цикла;

.....

a:=5;

While a>0 do x:=x+2*x;

.....

- Условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения цикла.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: