- •Лекция 8. Алгоритм его свойства и формализация. Принципы разработки алгоритмов и программ для решения прикладных задач.
- •Структура программы на языке Pascal
- •Стандартные функции языка Pascal
- •Ввод - вывод данных
- •Условный оператор
- •Оператор выбора case..Of
- •Циклические конструкции
- •Массивы
- •Процедуры и функции
- •Описание, определение и вызов функций
- •Передача параметров в подпрограммы
- •Операции со строками
Структура программы на языке Pascal
Программа состоит из трёх блоков: заголовок программы, раздел описаний, тело программы. Если нет необходимости использовать какие-либо разделы описаний, то они опускаются, последовательность записи разделов описаний не обязательная, причём некоторые разделы могут повторяться.
Program MyProgram (Input, Output); {Заголовок программы}
Uses Crt, Graph; {Описание используемых модулей}
Label M1, M2, M3; {Описание меток}
Const {Описание констант}
A = 12; {целочисленная константа A}
B: Real = 23.05; {типизированная константа B}
S= ‘Строка’; {строковая константа}
Type {Описание типов}
Color = (Red, Green, Blue); {Перечисляемый тип}
Scale = 2 * (A - B).. (A + B); {Тип диапазон}
MassivReal=array[1..100] of Real; {Массив из ста элементов типа Real}
MassivChar=array[0..19] of Char; {Массив из 20 элементов типа Char}
Matr = array[1..10] of integer; {Mассив из 10 целых чисел }
LatLetter = ('А'..'z'); {Mножество букв латинского алфавита }
Days = 1..31; {Mножество целых чисел от 1 до 31}
Var {Описание переменных}
X,Y,Z: real; {переменные типа Real}
I,J,K: integer; {переменные типа Integer}
Digit: 0..9; {переменная перечисляемого типа}
C: Color; {переменная типа Color, который описан в разделе Type}
Done, Error: boolean; {переменные типа boolean }
Operator: (plus, minus, times); {переменная перечисляемого типа}
Matrix: array[1..10,1..10] of Real; {переменная - массив}
Procedure {Описание процедур}
Function {Описание функций}
Begin
Оператор 1;
Оператор 2; {Раздел операторов ... (тело программы)}
Оператор n
End.
Заголовок программы начинается служебным словом Program, за которым записывается идентификатор программы (имя). После имени программы иногда указывают в круглых скобках имена стандартных файлов ввода и вывода, связанных соответственно с клавиатурой и экраном монитора (Input, Output). Заканчивается описание заголовка символом ";".
После служебного слова uses через запятую перечисляются модули, процедуры и функции которые, используются в программе. В конце ставится " ; ". Это могут быть как стандартные модули Pascal - Crt, Graph, так и модули, разработанные пользователем.
За служебным словом Label следуют перечисленные через запятую идентификаторы меток, которые используются в программе. Метка - это идентификатор, заканчивающийся двоеточием " : ", помечающий место в программе, на которое передаётся управление при помощи оператора безусловного перехода goto.
Следом располагается раздел описаний констант, начинающийся служебным словом Const. Идентификатор константы отделяется от значения знаком "=". После каждой константы ставится " ; ". Константы - это данные, значения которых не могут изменяться в процессе выполнения программы. В языке Pascal используются константы трех видов: числовые, булевские и символьные. Числовые константы предназначены для представления числовых данных (целых и вещественных). Булевские константы используются для представления данных, имеющих смысл логических высказываний (истина-ложь). Символьные константы представляют данные, являющиеся последовательностями символов.
Типы данных, вводимые пользователем, описываются после служебного слова Type. Новый тип данных вводится своим идентификатором, за которым после знака равенства " = " следуют одно или несколько определений типов, разделенных точкой с запятой.
Стандартные типы не требуют описания в отличие от типов, образованных пользователем. Строго говоря, синтаксис языка Паскаль не требует обязательного определения идентификатора типа и в последнем случае, так как тип можно задать перечислением в разделе описания переменных. Выбор описания типа зависит, таким образом, только от программиста и специфики программы.
Раздел описания переменных начинается служебным словом Var. Значения переменных могут изменяться во время выполнения программы. Переменные идентифицируются по именам (идентификаторам), с каждой переменной программы связывается один тип данных. При описании они отделяются двоеточием " : ".
Если необходимо различным переменным назначить один тип данных, то они перечисляются через запятую, после последнего идентификатора ставится двоеточие, за которым указывается тип данных. Тип - это множество значений переменной вместе с множеством операций, которые можно выполнять над элементами этого множества. Заданием переменной некоторого типа, явно определяется множество значений, которые можно присваивать этой переменной, а также операции, с помощью которых можно манипулировать ее значениями. Число отдельных значений, принадлежащих некоторому типу, называется мощностью типа. Так, например, мощность типа Boolean - 2.
Следом идёт раздел описания процедур и функций. В этом разделе размещаются тела подпрограмм. Подпрограммой называется программная единица, имеющая имя, по которому она может быть вызвана из других частей программы. В языке Паскаль роль подпрограмм выполняют процедуры и функции. В общем случае подпрограмма имеет ту же структуру, что и программа. Для описания подпрограмм используются зарезервированные слова procedure и function, которые записываются в начале подпрограммы.
Формат процедуры:
procedure <имя процедуры> {<параметры>};
<разделы описаний>
<раздел операторов>
end;
Формат функции:
function <имя функции> {<параметры>} : <тип результата>;
<разделы описаний>
<раздел операторов>
end;
Процедуры и функции подразделяются на стандартные и определенные пользователем. Стандартные процедуры и функции являются частью языка и могут вызываться без предварительного описания. Описание процедур и функций пользователя обязательно.
Тело программы начинается служебным словом Begin, которое определяет точку начала выполнения программы. Затем следуют операторы, описывающие алгоритм решения задачи. Они отделяются друг от друга точкой с запятой " ; ". Завершается тело программы служебным словом End за которым ставится точка.
Например:
begin {Начало программы}
Write('Введите значение целого числа А >'); {Вывод запроса на экран}
Readln(A); {Ввод значения А с клавиатуры}
Write('Введите значение целого числа В >');
Readln(В);
Proizved := А * В; {Вычисление переменной Proizved}
Write('Произведение чисел ',А,' и ',В,' = ',Proizved); {Вывод ответа}
end. {Конец программы}
Операторы выполняются строго последовательно в том порядке, в котором они записаны в тексте программы в соответствии с синтаксисом и правилами пунктуации.
Слова begin и end являются аналогом открывающей и закрывающей скобки в обычных арифметических выражениях.
Для лучшего понимания программы в ней записывается пояснительный текст — комментарий. Комментарий можно записать в любом месте программы, где разрешен пробел. Текст комментария ограничен символами { } или (* *) и может содержать любые комбинации латинских и русских букв, цифр и других символов алфавита языка Паскаль. Ограничений на длину комментария нет, он может занимать несколько строк. Комментарий игнорируется компилятором и поэтому никакого влияния на программу не оказывает.
Примеры.
{Начало программы} или (*Начало программы*)
{Пример комментария, занимающего
несколько строк}
В ограничителях (* *) пробелы между скобкой и звездочкой запрещены. В тексте не должны находиться знаки ограничителей, с которых комментарий начинается.
Ограничители { } и (* *) удобно использовать при отладке программ. В процессе отладки часто требуется временно исключить выполнение какой-либо части программы. Конечно, этого можно добиться, уничтожив временно ненужные операторы или обойдя их с помощью оператора goto. Однако оба этих способа неприемлемы по ряду совершенно понятных причин: повторный набор вновь понадобившихся операторов, путаница с операторами goto и т.д. Гораздо удобнее просто заключить временно ненужную часть программы в {} или (* *), которая будет восприниматься компилятором как комментарий.
Рассмотрим структуру программы на примере программы решения задачи вычисления произведения двух целых чисел:
program Tutor3; {Заголовок программы}
var {Описание раздела переменных}
А,В, Proizved : integer; {Переменные A,B,Proizved - целые}
begin {Начало программы}
Write('Введите значение целого числа А >'); {Вывод запроса на экран} ,
Readln(A); {Ввод значения А с клавиатуры}
Write('Введите Значение целого числа В >');
Readln(В);
Proizved := А * В; {Вычисление переменной Proizved}
Write('Произведение чисел ',А,' и ',В,' = ',Proizved); {Вывод ответа)
end. {Конец программы}
В языке Pascal существует такое правило: тип явно задается в описании переменной или функции, которое предшествует их использованию. Концепция типа языка Pascal имеет следующие основные свойства:
любой тип данных определяет множество значений, к которому принадлежит константа, которые может принимать переменная или выражение, или вырабатывать операция или функция;
тип значения, задаваемого константой, переменной или выражением, можно определить по их виду или описанию;
каждая операция или функция требует аргументов фиксированного типа и выдает результат фиксированного типа.
В Pascal все типы данных разделятся на следующие группы:
скалярные (к скалярным относятся типы данных, значения которых не содержат составных частей, то есть простые типы: целочисленный, вещественный, логический, символьный, перечисляемый, интервальный (тип диапазон));
ссылочный (являются указателями на данные других типов);
структурированные (в своей основе имеет один или несколько скалярных типов данных: строковые, регулярные - массивы, множественные, комбинированные - записи, файловые);
процедурные и объектные (используются в объектно-ориентированном программировании).
В Turbo Pascal пять предопределенных целочисленных типов:
Byte. Диапазон: 0..255. Занимает 1 байт памяти. Беззнаковый.
Word. Диапазон: 0..65535. Занимает 2 байта памяти. Беззнаковый.
Shortint. Диапазон: -128…127. Занимает 1 байт памяти. Короткое целое.
Integer. Диапазон: -32768..32767. Занимает 2 байта памяти. Целое.
Longint. Диапазон: -2147483648…2147483647. Занимает 4 байта памяти. Длинное целое.
К данными целого типа применимы следующие операции:
сравнения ("=" равенство, "<>" неравенство, "<" меньше, "<=" меньше либо равно, ">" больше, ">=" больше либо равно);
сложение (+);
одноместный (унарный) плюс (+);
вычитание (-);
одноместный (унарный) минус (-);
умножение (*);
деление на цело (получение частного) (DIV);
получение остатка от деления на целое (для беззнаковых второй операнд должен быть положительным) (MOD);
логический сдвиг влево (ShL);
логический сдвиг вправо (ShR).
При логическом сдвиге биты, оказавшиеся за пределами разрядной сетки кода, отбрасываются, а вместо недостающих устанавливаются нули.
К вещественному типу относится подмножество вещественных чисел, которые могут быть представлены в формате с плавающей точкой с фиксированным числом цифр. Имеется пять видов вещественных типов:
Real - вещественное. Диапазон значений типа: 2.9E-39..1.7E+38 (здесь и далее значения приводятся по абсолютной величине). Данные типа Real имеют точность 11-12 значащих цифр после запятой. Занимают размер в памяти 6 байт.
Single - с одинарной точностью. Диапазон значений типа: 1.5E-45…3.4E+38 . Точность 7-8 значащих цифр после запятой. Занимают размер в памяти 4 байта.
Double - с двойной точностью. Диапазон значений типа: 5.0E-324...1.7E+308. Точность 15-16 значащих цифр после запятой. Занимают размер в памяти 8 байт.
Extended - с повышенной точностью. Диапазон значений типа: 3.4E-4932...1.1E+4932. Точность 15-16 значащих цифр после запятой. Занимают размер в памяти 10 байт.
Comp - сложное. Диапазон значений типа: -9.2E+18…9.2E+18. Это 64-битное целое число. Занимают размер в памяти 8 байт
Над данными вещественных типов допустимы следующие операции:
сложение (+);
одноместный (унарный) плюс (+);
вычитание (-);
одноместный (унарный) минус (-);
умножение (*);
деление (получение частного) (/);
Множеством значений типа данных Char являются символы, упорядоченные в соответствии с расширенным набором символов кода ASCII. При вызове функции Ord(Ch), где Ch - значение символьного типа, возвращается порядковый номер Ch. Строковая константа с длиной 1 может обозначать значение константы символьного типа. Любое значение символьного типа может быть получено с помощью стандартной функции Chr(N), где N - порядковый номер символа кода ASCII. Над данными типа Char допустимы операции сравнения (= , <>, <, <=, >, >=).
Данные типа Boolean могут принимать два значения: True (Истина) и False (Ложь). Над данными типа Boolean допустимы следующие операции:
сравнения (=, <>, <, <=, >, >=);
And (логическое И);
Or (логическое ИЛИ);
Xor (логическое исключающее ИЛИ);
Not (логическое отрицание).
Перечислимые типы определяют упорядоченные множества значений через перечисление идентификаторов, которые обозначают эти значения. Упорядочение множеств выполняется в соответствии с последовательностью, в которой перечисляются идентификаторы. При указании идентификатора в списке идентификаторов перечислимого типа он описывается как константа для блока, в котором указано описание перечислимого типа. Типом этой константы является описанный перечислимый тип. Порядковый номер перечислимой константы определяется её позицией в списке идентификаторов при описании. Перечислимый тип, в котором описывается константа, становится ее типом. Первая перечислимая константа в списке имеет порядковый номер 0. Пример перечислимого типа:
Type
Number=(one, two, three, four);
Согласно этим описаниям one является константой типа Number. При применении функции Ord к значению перечислимого типа Ord возвращает целое число, которое показывает, какое место по порядку занимает значение в отношении других значений этого перечислимого типа. Согласно предшествующим описаниям, Ord(one) возвращает 0, Ord(two) возвращает 1 и так далее.
Тип диапазон представляет собой совокупность значений из порядкового типа, называемого главным типом. Тип диапазон задаётся минимальной и максимальной константой порядкового типа. Обе константы должны иметь один и тот же порядковый тип. Например: a..b. При этом считают, что a меньше или равно b (0..99; -128..127). Переменная типа диапазон имеет все свойства переменных главного типа, однако ее значение на этапе выполнения должно принадлежать указанному интервалу. Разрешение использования выражений-констант там, где стандартный Pascal допускает только простые константы, приводит к некоторой синтаксической неоднозначности.
