Автор работы: Пользователь скрыл имя, 20 Февраля 2011 в 19:37, лекция
Программа на языке Паскаль состоит из следующих частей:
Заголовок
Подключение модулей
Раздел описаний
Begin
Раздел операторов
1) Более короткая строка всегда меньше более длинной.
2) Если длины сравниваемых строк одинаковы, то строки сравниваются посимвольно с учётом внутренней кодировки символов.
Рассмотрим пример программы, которая должна сформировать строку из 26 заглавных символов от A до Z.
var st: string[26];
i: integer;
begin
st := ‘A’;
for i := 1 to 26 do
st := st + chr(ord(‘A’) + i – 1);
writeln(st);
end.
Функции для работы со строками:
Concat(s1, s2, …, sn) – склеивание перечисленных строк.
Copy(s: string, index: integer; count: integer): string – функция копирует из строки s count символов, начиная с символа с номером index.
Str(x: real; st: string) – преобразует число x в строку st.
Val(st, x, code) – процедура преобразует строку символов st во внутреннее представление целого или вещественного числа. Это число будет размещено в переменной x. Параметр code содержит 0, если преобразование произошло успешно. Если произошла ошибка, code содержит номер ошибочного символа.
Комбинированные типы (записи).
Запись – это структура данных, состоящая из фиксированного числа разнотипных элементов, называемых полями записи. Каждое поле записей имеет своё имя.
type <имя> = record
<список полей>
end;
Список полей – это список имён, разделяемых запятыми, с указанием типа.
Пример:
goods = record
name: string[10];
price: real;
number: integer;
end;
var tov: goods;
tov.price := 2.7;
Доступ к полям записи производится с помощью конструкции, называемой селектором записей. В общем виде он имеет вид: Q.Z, где Q – переменная комбинированного типа, а Z – имя поля. В качестве типа данных для полей записи может использоваться любой тип, кроме самой записи.
type birthday = record
day: 1..31;
month: 1..12;
year: word;
end;
person = record
name: string[20];
data: birthday;
end;
var sasha: person;
Обращение: sasha.data.day := 17;
При работе с комбинированными типами чтобы упростить доступ к полям записи, используют оператор присоединения.
with <имя переменной> do <оператор>;
with sasha.data do begin
day := 17;
month := 7;
year := 1997;
end;
Множественные типы.
Множество – это совокупность объектов.
type Digit = set of 1..5;
var s: Digit;
Значение множественного
типа может содержать любое
x: 1..3;
z: set of 1..3;
z может быть пустым множеством или иметь значения: 1; 2; 3; 1 и 2; 1 и 3; 2 и 3; 1, 2 и 3.
В качестве базового типа множества может использоваться любой порядковый тип, кроме типов Word, Integer и Longint. Множество не может содержать больше, чем 256 элементов. Переменная множественного типа занимает 32 байта. Множество – это бесповторная, неупорядоченная совокупность объектов.
type ElemColor = (red, yellow, green);
Color = set of ElemColor;
var mycolor: Color;
В Паскале для
изображения множества
mycolor := [] или mycolor := [red, green]
Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы, причём порядок следования элементов безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе.
Операции над множествами:
1) Пересечение (*). Результат операции – множество, содержащее элементы, общие для обоих множеств.
A = [0..3, 6]
B = [3..9]
C := A * B; C = [3, 6]
2) Объединение (+). Результат – множество, состоящее из элементов, принадлежащих и A, и B.
A + B = [0..9]
3) Вычитание (-). Результат – множество, состоящее из тех элементов первого множества, которые не входят во второе.
A – B = [0..2]
4) Операция проверки принадлежности элемента множеству.
<выражение> in <множество>
var st: string;
a: set of 0..9;
k, i: integer;
begin
readln(st);
k := length(st);
a := [0..9];
for i := 1 to k do
if st[i] in a then write(st[i]);
writeln;
for i := 1 to k do
if not (st[i] in a) then write(st[i]);
end.
Кроме рассмотренных операций, к множествам применимы операции отношения: =, <>, <=, >=.
В Паскале отсутствует механизм изъятия элемента из множества.
var s: set of char;
for i := 0 to 255 do
if chr(i) in s then inc(c);
Эквивалентность и совместимость типов.
В языке Паскаль
принят принцип именной
type A1 = array[1..10] of integer;
A2 = array[1..10] of integer;
Но типы A1 и A2 неэквивалентны.
V1, V2 = array[1..10] of integer;
V1 и V2 – эквивалентные типы.
Эквивалентность типов требуется при выполнении оператора присваивания над массивами, а также в случае передачи параметров при вызове процедур или функций (то есть типы фактических и формальных параметров должны быть эквивалентны).
Выполнение операций выражений и сравнения требует, чтобы операнды имели совместимые типы.
Два типа считаются совместимыми, если выполняется одно из следующих условий: 1) два типа эквивалентны; 2) оба типа являются целыми, либо оба – вещественными; 3) один тип является ограниченным типом, причём его базовым типом является другой тип; 4) оба типа являются ограниченными, причём их базовым типом является один и тот же тип; 5) оба типа являются множественными типами, причём их базовые типы совместимы; 6) оба типа строковые, либо один тип строковый, а другой – символьный; 7) оба типа ссылочные.
Оператор присваивания
считается корректным, если тип переменной
в левой части совместим с типом выражения
в правой части. Типы совместимы по присваиванию
при выполнении хотя бы одного из следующих
условий: 1) оба типа эквивалентны, и ни
один из них не является файловым или структурным
типом, содержащим поле с файловым типом;
2) оба типа являются совместимыми дискретными
типами, и значение типа в правой части
попадает в диапазон возможных значений
типа в левой части; 3) оба типа вещественные,
и значения из правой части попадают в
диапазон возможных значений из левой
части; 4) слева – переменная вещественного
типа, справа – выражение целого типа;
5) слева – строковый тип, справа – символьный,
либо строковый; 6) оба типа – совместимые
множественные типы; 7) оба типа являются
совместимыми ссылочными типами.
Преобразование типов.
В Паскале данные одного типа могут преобразовываться в данные другого типа. Такое преобразование может быть явным и неявным.
Неявное преобразование – возможно в присваивании. Например, когда вещественной переменной присваиваются целые значения. Кроме того, неявное присваивание встречается в выражениях с переменными смешанных типов.
При явном преобразовании типов используются вызовы специальных функций преобразования, аргументы которых принадлежат одному типу, а значения – другому. Например, функция Odd(i), функция Chr(j), функции Round(x), Trunc(x). Кроме того, в Паскале есть специальная конструкция явного преобразования типа. Называется она «приведение типа переменной». Тип (имя_перем).
si: 0..255;
char(si) := ‘z’;
Конструкция приведения типа переменной может находиться везде, где допускается вхождение переменной. Близкой по синтаксису является конструкция приведения типа значения, которая позволяет преобразовать тип произвольного выражения, записанного в круглых скобках, к типу перед скобками. Тип (выражение). Конструкция может встречаться везде, где допустимо выражение, например, справа от символа присваивания.
Li: Longint;
i: integer;
Li := 1234567;
i := integer(Li + 1);
Но такое преобразование
может привести к усечению типа значения.
Тип выражения в скобках и идентификатор
выражения перед скобками должны являться
оба дискретными типами. Если один дискретный
тип преобразуется к другому, то такое
преобразование может привести к усечению
или увеличению размера памяти по сравнению
с исходным. Если значение расширяется,
то его знак всегда сохраняется.
Файловые типы в Паскале и ввод-вывод.
Под файлом понимается именованная область внешней памяти ЭВМ или логическое устройство. В файл данные можно записать, либо извлечь. Эти действия имеют общее название «ввод-вывод». Для осуществления операции ввода-вывода с файлами, в программе необходимо определить переменные файловых типов, которые считаются представителями файлов в программе. Файл при этом рассматривается как бесконечный список значений. В Паскале существует три типа файловых переменных: типизированные файлы, текстовые и нетипизированные файлы.
var fp: file of <тип>;
fp: file of real; - типизированные файлы
fp1: text; - текстовые файлы
fp2: file; - нетипизированные файлы
С каждой переменной
файлового типа связано понятие
текущего указателя файла. Все элементы
файла считаются
Операции над файлами.
Input – файл для считывания данных с клавиатуры.
Output – файл для вывода данных на экран.
Для того чтобы работать с файлом на внешнем носителе, в программе необходимо: 1) описать файловую переменную; 2) связать файловую переменную с файлом на диске. Это осуществляется с помощью процедуры: Assign(fp, ‘<cтрока, задающая имя файла>’);
Assign(fp, ‘D:\MyDir\data.dat’);
3) открыть файл. В Паскале файл можно открыть только для чтения, только для записи. Типизированные файлы можно открыть и для чтения, и для записи одновременно. Для открытия файлов служат две процедуры: Reset(fp) – на чтение; Rewrite(fp) – на запись.
Под открытием файла понимается поиск файла на внешнем носителе, образование специальных буферных областей в памяти для работы с ним и установка текущего указателя на начало файла. Процедура Reset предполагает, что дисковый файл существует. Процедура Rewrite допускает, что указанный файл может не существовать. В этом случае процедура создаёт на диске файл с тем именем, которое указали в процедуре Assign. Для закрытия файлов существует процедура Close(fp); Она закрывает файл, однако связь с файловой переменной не разрывается.
Операции ввода-вывода.
Для осуществления ввода-вывода из файла существуют две процедуры: Read и Write.
Read([<ф.пер.>], список ввода);
Write([<ф.пер.>], список вывода);
<