Лекция Операторы языка Паскаль


7. Операторы языка Паскаль

7.1 концепция действия

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

 

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

 

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

 

7.2 Посещаемость присвоения.приведение типов

 

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

A = A + 1.

Присвоение является деструктивной операцией, потому что оно уничтожает предыдущее значение переменной. Знак оператора присваивания: = в Паскале не следует путать со знаком отношения = (равно).

 

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

 

Если выражение содержит несколько операций, то последовательность их выполнения при отсутствии скобок зависит от приоритета операций.Так при вычислении выражения A + B * C сначала будет выполнено умножение, а потом сложение. То есть приоритет умножения выше приоритета добавления. Порядок действий можно изменить только применением скобок (A + B) * C, причем действия в скобках всегда выполняются первыми. Если же все операции имеют одинаковый приоритет, то они выполняются последовательно: выражение A / B * C / D эквивалентен выражения ((A / B) * C) / D. Всегда, когда выражение записывается без скобок, обязательно надо устанавливать приоритеты операций.  Для этого можно пользоваться такой таблицей:

 

операция приоритет
not Самый высокий
* /, Div, mod, and Второй (мультипликативному операции)
+, -, or Третий (аддитивные операции)
=, <> <>, <=,> =,>, In Низкий (операции отношения)

 

Следует помнить, что тип результата при вычислении выражения обязательно должен совпадать с типом переменной, значение которой он изменяет. Компилятор отслеживает все невозможны присвоения и выдает сообщения об ошибках. Если переменная и выражение есть разного типа, но компилятор может превратить результат так, что присвоение становится возможным, говорится, что переменная и выражение совместимы по присвоением.Например, если A — real, а I — integer, то присвоение A = I возможно, наоборот — нет. это преобразования называют приведением типов

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

 

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

2.5 + Sin (X) — MyFun (X) тип функции MyFun (X) может быть real, или integer.

 

7.3 Операторы ввода / вывода

 

Рассмотрим стандартные процедуры Read, Write, как и используются для ввода / вывода данных на стандартные внешние устройства (клавиатура / дисплей).Оператор Write (А, В) означает команду «запиши значения переменных А, В в текстовый файл дисплея».Текстовый файл можно себе представить как лист тетради, с которого можно считывать и в который можно записывать текстовую информацию. Слова в текстовом файле, как и в обычных текстах, роздилюються крайней мере одним промежутком, или концом строки (символов переноса нет).

Читать  Алгоритмы и программы с циклами – Средства реализации базовой алгоритмической структуры повторения с предусловием

 

Длина строки текстовых файлов ограничено (в случае дисплея это 80 символов). Если при записи длина строки исчерпывается, то текст прерывается и происходит переход на новую строку, а в конец автоматически записывается специальный символ — признак конца строки. Перейти на новую строку можно и принудительно, вызвав процедуру Writeln, которая записывает в файл признак конца строки: Write (А, В); Writeln.

Поскольку такое приходится делать часто, то вывод признаки конца строки объединили с выводом информации, то есть Writeln (А, В) означает, что после вывода значений переменных А, В надо перейти на новую строку.Суффикс ln происходит от line — строка.Согласно Readln (А, В) означает, что после считывания информации происходит переход на следующую строку файла, независимо от того, остались в строке слова или нет.

 

7.3 Операторы процедур и функций

 

Операторы процедур и функций передают управления из основной программы к подпрограммам. Переход происходит всегда, когда в тексте встречается имя процедуры или функции: MyProc (X, Y, Z); Y = MyFun (X).В отличие от функции оператор процедуры не может использоваться в составе выражения, так же как и оператор функции вне его пределами.

 

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

Например, в момент вызова Р (А + 1,2 А) процедуры, описанной как Р (Х, У: real), прежде всего происходит вычисление значений фактических параметров; затем результаты вычислений копируются в отдельные ячейки, соответствующие формальным параметрам Х, У, которые и используются затем в середине процедуры.Изменение параметров-значений в процедуре никак не влияет на значение фактических параметров в основной программе. Для этой процедуры допустимы такие вызовы: Р (1,2), Р (Sin (X) * 2, Cos (X)), P (C, D).Если же имеем процедуру, описанную как Р (var Х, У: real), то копирования во время вызова не происходит и все операции в процедуре выполняются с ячейками именно с тех переменных, имена которых переданы в качестве

фактических параметров, то есть из всех вызовов предыдущего примера допустимым лишь последний: P (C, D).

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

Program P1;

{Примеры использования процедур и функций}

{—————————————-}

var

X, Y, Z, Area: real;

function Geron1 (A, B, C: real): real; {<—— Функция с параметрами}

var

P: real;

begin

P = (A + B + C) / 2;

Geron1 = Sqrt (P * (PA) * (PB) * (PC))

end;

procedure Geron2 (A, B, C: real; var S: real) {<- процедура с парамет рамы}

var

P: real;

begin

P = (A + B + C) / 2;

S = Sqrt (P * (PA) * (PB) * (PC))

end;

function Geron3: real; {<——— Функция без параметров}

var {X, Y, Z — глобальные переменные} P: real;

begin

P = (X + Y + Z) / 2;

Geron3 = Sqrt (P * (PX) * (PY) * (PZ))

end; begin

Write ( ‘Введите длины сторон треугольника’); Read (X, Y, Z);

{1} Writeln ( ‘Площадь треугольника (1) =’, Geron1 (X, Y, Z))

{2} Geron2 (X, Y, Z, Area)

Writeln ( ‘Площадь треугольника (2) =’, Area)

{3} Writeln ( ‘Площадь треугольника (3) =’, Geron3)

Читать  Лекция Паскаль 4 – Delphi Отладка программы

end.

 

В случаях использования функций результат присваивается именам функций и сразу выводится на дисплей оператором Writeln.В случае процедуры результат возвращается через параметр переменную S. В случае функции без параметров Geron3 используются глобальные переменные.Так делать можно, но крайне не рекомендуется — это плохой стиль программирования.

 

7.4 Условные операторы if-then-else, if-then

 

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

 

if <булевский выражение> then

<Оператор1>

else

<Оператор2>

или такая: if <булевский выражение >

then

<Оператор>

 

Если булевский выражение имеет значение True, то выполняется оператор1, если False, то оператор2. Операторы 1 и 2 могут быть составными. Внимание! Перед словом else   разделитель (точка с запятой) не относится!

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

if (A + B> C) and (B + C> A) and (A + C> B) then begin

S = Geron1 (A, B, C)

writeln ( ‘S =’, S)

end else

writeln ( ‘Треугольник не существует!’)

 

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

 

если в операторе if-then-else <оператор1> является условным оператором if-then, то его обязательно надо писать в операторных скобках

if <булевский выражение> then begin

if <булевский выражение> then

<Оператор>

end else

<Оператор2>

 иначе <оператор2> с else части будет отнесен в ближайшее оператора if-then.

 Не следует использовать условный оператор для присвоения значения булевскими переменными. Например, для присвоения значения переменной Exist, которая имеет значение True, когда треугольник существует, и False если нет, достаточно написать

Exist = (A + B> C) and (B + C> A) and (A + C> B).

 

7.5 оператор выбора

 

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

case <выражение> of значение1 <оператор1>; Значение2 <оператор2>;

. . . . . . .

end

Выполненным будет только тот оператор, для которого константа с впереди записанного списка

«Значения» будет совпадать со значением, которое дает <выражение>. И константы, и выражение должны принадлежать одному или совместимым ординальное типам. Все константы должны быть разными.

 

case J of

1: Y = F (X);

2: Y = W (X);

3: Y = U (X);

4: Y = Z (X)

end

case Ch of

‘+’, ‘-‘: Writeln (Ch, «- аддитивная операция ‘);

‘*’, ‘/’: Writeln (Ch, «- мультипликат. опер. ‘);

‘а’, ‘в’, ‘в’: Writeln (Ch, «- громкая ‘);

«р», «с», «т»: Writeln (Ch, «- согласная ‘);

end

 

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

 

7.6 оператор безусловного перехода

 

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

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

if (условие) then goto 1;

goto 2;

1 <оператор 1>;

goto 3;

2 <оператор 2>;

3 :;

Именно в таком стиля происходило программирования на Фортране. Обратите внимание, что отметка 3 поставлена ​​перед точкой с запятой. Это означает, что метка поставлена на пустой оператор.Пустые операторы появятся в программе, если записать ;;;;;;;;. Пустые операторы не влияют на ход выполнения программы. Программисты всегда ставят пустой оператор перед операторной скобкой end, чтобы потом при дополнении программы не возникало ошибок связанных с отсутствием разделителя.

 

7.8 Оператор цикла с предусловием while-do

 

Для программирования циклов с предусловием используется оператор

while <булевский выражение> do <оператор>

 

Приведем пример использования оператора цикла с предусловием

N

для вычисления P = X .если

N = 0, то тело цикла не выполнится ни раз.

K: = 0; P: = 1;

while K <N do begin

K = K + 1,

P = P * X

end

Цикл с предусловием выполняется до тех пор, пока булевский выражение имеет значение «истина».

 

7.7 Оператор цикла с постусловием repeat-until

Для программирования циклов с постусловием используется оператор

repeat <оператор> until <булевский выражение>

В отличие от цикла с предусловием цикл с постусловием выполняется до тех пор, булевский выражение не приобретет значение «истина».В случае составного оператора операторные скобки можно не употреблять — их роль выполняют зарезервированные слова repeat-until.

С помощью цикла с постусловием можно контролировать ввода данных:

 

repeat

Write ( ‘Введите число:’); Readln (X)

until (X> 0) and (X <1)

Приведенный фрагмент программы позволяет вводить числа только из интервала (0,1).

Напомним, что тело цикла с постусловием выполняется хотя бы один раз.

7.9 Оператор индексного цикла (цикла с параметром )

Опертор индексного цикла имеет следующий формат:

for <индекс> = <начальное значение> to <конечное значение> do <оператор>,

for <индекс> = <начальное значение> downto <конечное значение> do <оператор>,

например:

 

for I: = 1 to N + 10 do …… for Ch = ‘A’ to ‘Z’ do ….. for Seаson = Spring to Winter

do

for N = 1000 downto 0 do ….

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

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

Пример: найти сумму последовательности

S = 1 — 1/2 + 1/3 — 1/4 + ……- 1/100.

 

S: = 0;

Sign = — 1;

for I: = 1 to 100

do

begin

Sign = — Sign;

S = S + Sign / I

end

Sp = 0; Sn = 0;

for I: = 1 to 50

do

begin

Sp = 1 / (2 * I-1); Sn = 1 / (2 * I)

end;

S = Sp — Sn

S: = 0;

Sign: = 1;

for I: = 100 downto 1

do

begin

Sign = — Sign;

S = S + Sign / I

end

Приведенные выше три фрагмента решают задачу тремя различными способами. Интересно, что результаты вычислений вследствие приближенного представления вещественных чисел в памяти ЭВМ НЕ БУДУТ в точности одинаковыми.

 

Если начальное значение индекса инкрементного цикла больше конечного значения — оператор тела цикла не выполняется. Аналогичное правило можно сформулировать и для декрементного цикла. После окончания работы оператора индекс цикла становится неопределенным.

Тело цикла вновь может быть циклом. В таких случаях говорят о вложенных цикла:

for I: = 1 to 10 do

for J = 1 to 20 do <тело цикла>.

Тело цикла приведенного фрагмента исполнится 200 раз, то есть внутренний цикл 10 раз будет начинать свою работу сначала и выполняться соответственно 20 раз для каждого значения И. Пример использования вложенных циклов будет приведен ниже.

7.10 Работа с массивами

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

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

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

A: array [6..15] of integer

 

говорит о том, что адрес первого элемента связана с именем переменной А, что ординальное номер первого элемента — 6, а последнего — 15, что всего элементов 10, что элемент массива целого типа, то есть его запись в 16-разрядной машине отводится 2 байта, что всего в памяти надо отвести 20 байтов.Чтобы в программе доступ к элементу массива с индексом 9 достаточно написать А [9].В приведенном примере положение элемента определяется одним индексом поэтому такие массивы называют еще одномерными.Общий формат определения массива таков:

array [<тип индекса>] of <тип элемента>

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

 

Const

n = 10;

type

index = 0..n; letter = ‘a’ .. ‘z’;

vector = array [index] of real; table = array [1..100] of vector;

var

A, B: vector;

C: array [letter] of real; D: array [0..19] of char; E: array [0..4] of vector; F: array [1..30] of table; G : table;

H: array [1..3,1..3] of integer;

Обратим внимание, что в определении типа индекса можно употреблять только константы.                            Если значение ординальных номеров индексы не суть важны в задаче, то лучше всегда начинать их с нуля.Чтобы описания лучше было читать, знак «=» и знак «:» надо располагать на одной вертикали.

Переменная G типа table — это массив из 100 элементов, каждый из которых является массивом типа vector, то есть это массив массивов.Зрительные зал в кинотеатре тоже является массивом массивов. Чтобы найти нужный элемент этого массива, надо, указать два индекса, как в кинотеатре: сначала индекс ряда, а затем индекс места, например G [6] [10] означает: шестого вектора десятый элемент. Можно писать и так G [6,10]. Элемент массива можно рассматривать как обычную переменную, в имени которой присутствуют индексы. Индексы могут быть выражениями ординальное типа, например:

H [I + 1, 2 * J mod 3], F [ord (X) +1] [X div8] [J + KZ]

Массивы с двумя индексами называют двумерным.Учитывая это переменная F (массив таблиц) является трехмерным массивом.

Со сменными масивов типа можно выполнять только операцию присвоения, например, М1 = M2, когда одновременно всем элементам одного массива присваиваются соответствующие значения всех элементов второго массива.Оба массивы должны быть строго однотипными. Остальные действия выполняются только с элементами массива, соответственно их типа.

 

Пример программы ввода и вывода двумерного массива. В этой программе для обработки матрицы 5 3 используются вложенные циклы.

 

Program TwoD_arrays; type

matrix = array [0..4, 0..2] of integer; var

A: matrix; I, J: integer;

begin

Writeln ( ‘Вводим элементы матрицы столбец за столбцов’); for J = 0 to 2 do

for I: = 0 to 4 do Read (A [I, J])

Writeln ( ‘Печатаем матрицу строку за строкой) for I: = 0 to 4 do

begin

for J = 0 to 2 do Writeln (A [I, J])

Writeln; {<————- Переход на новую строку }

end end.

 

7.11 строчный тип

Переменная D на примере допустимых описаний типов является массивом из 20 символов.Массивы символов настолько широко употребляемых что в Паскаль был введен специальный строчный тип

string. С его использованием переменную D (строка символов) можно определить как D: string [20].

 

Хотя отдельный символа строки можно обращаться как к элементу массива (например, D [15] = ‘R’), но этот тип не совместим с типом массива.Элемент с индексом 0 переменной типа string содержит количество символов в строке, то есть длину строки.Поскольку переменная типа char

имеет длину один байт, то максимальное значение, которое можно записать в нулевую ячейку есть 255. Таким образом длина строки не может превышать 255 символов, в большинстве практических задач вполне достаточно. С строками можно выполнять операции присваивания и конкатенации (объединения) : если X = компьютерной, а Y = ‘технологии’, то конкатенация X + Y

= Компьютерные технологии «.

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

 

 

Контрольные вопросы и задания

1. Как называются языка концепции действия?

2. Характеризующий процедурную язык программирования?

3. Что такое выражение? наведите примеры.

4. Что определяет приоритет операций?

5. Найдите значение булевскими выражения not (2 <1) or (4 + 6) and (6> 5) and (4 <7) or (3> 0).

6. Сравните приоритеты важнейших операций.

7. Что такое совместимость типов по присвоением?

8. Что называют приведением типов данных?

9. Назовите операторы ввода / вывода Паскаля и их свойства.

10. В чем разница употребления процедур и функций Паскаля?

11. как происходит передача параметров-значений и параметров-переменных?

12. Приведите пример заголовка процедуры, которая вычисляет X, Y, Z целого типа.

13. Приведите пример условного оператора.

14. что будет напечатано:

 

иf (2> 0) then if (6> 4) then

writeln ( ‘A’) else

writeln ( ‘B’)

иf (2 = 0) then if (6> 4) then

writeln ( ‘A’) else

writeln ( ‘B’)

if (2> 0) then if (6 = 4) then

writeln ( ‘A’) else

writeln ( ‘B’)

if (2 = 0) then if (6 = 4) then

writeln ( ‘A’) else

writeln ( ‘B’)

a) b) c) d)

15. Приведите пример оператора выбора.

16. Приведите пример оператора перехода.

17. Что такое пустой оператор?

18. Приведите пример оператора цикла с предпосылкой.

19. Приведите пример оператора цикла с постусловием.

20. Приведите примеры оператора индексного цикла (две формы).

21. Когда декрементний цикл не выполнится ни раз?

22. Сколько раз выполнятся циклы

a) for I: = ‘F’ downto ‘A’ do …..

b) for I: = ‘A’ downto ‘G’ do …..

c) for I: = ‘K’ to ‘A’ do …..

23. Или можно использовать значение параметра цикла после выполнения цикла?

24. Что такое вложенные циклы?

25. Что такое массив и как он представляется в памяти компьютера?

26. Какие массивы называются двумерными, трехмерными?

27. Операции допустимые данным масивов типа?

28. Что определяет строчный тип, и чем он отличается от массива символов?

 

словарь

 

1. приведение типов Type conversion
2. приоритет операторов Precedence of operator
3. Типы совместимы по присвоением Assignment-compatible types
4. вложенные циклы Nested loops

 

[Всего голосов: 4    Средний: 5/5]