- •Алгоритмы
- •Свойства алгоритма
- •Способы описания алгоритмов
- •Язык программирования
- •Способы описания синтаксиса языка программирования
- •1. Бнф (Бэкуса-Наура форма)
- •Компиляторы и интерпретаторы
- •Обзор языков программирования высокого уровня (таблица)
- •Язык программирования Паскаль Первая программа на языке программирования Паскаль
- •Типы, переменные и константы
- •Основные типы данных языка Pascal
- •Операторы ввода/вывода
- •Форматы вывода
- •Выражения и операции Выражения
- •Операции
- •Операции div и mod для целых
- •Операции shl и shr для целых
- •Логические операции
- •Часто используемые правила математической логики
- •Стандартные процедуры и функции Стандартные функции
- •Стандартные функции в Dephi
- •Стандартные процедуры для целых
- •Явление переполнения
- •Погрешность округления и вычислительная погрешность
- •Примеры на суммирование рядов
- •Процедуры break и continue
- •Оператор безусловного перехода goto
- •Подпрограммы. Процедуры и функции
- •Процедуры
- •Синтаксис описания процедуры
- •Оператор вызова процедуры
- •Функции
- •Переменная Result
- •Способы передачи параметров Передача по значению. Параметры-значения
- •Передача по ссылке. Параметры-переменные (с ключевым словом var)
- •Семантика вызова подпрограммы
- •Алгоритм вызова подпрограммы
- •Статическая и автоматическая память
- •Локальные и глобальные переменные
- •Обращение к глобальным переменным и побочный эффект
- •Область видимости и время жизни объекта
- •Статическая локальная переменная
- •Перегрузка имен подпрограмм
- •Структура модуля
- •Перечислимый и диапазонный типы Перечислимый тип
- •Записи с вариантами
- •Как записи с вариантами хранятся в памяти
- •Сортировка массивов записей
- •Индексная сортировка
- •Множества
- •Стандартные подпрограммы для работы с символами
- •Виды строк в Delphi
- •Cтроки shortstring
- •Основные подпрограммы для работы со строками
- •Основные подпрограммы для работы со строками (Delphi)
- •Алгоритмы на строках
- •Использование Split
Структура модуля
Модуль имеет два больших раздела - раздел интерфейса и раздел реализации.
unit имя; // имя модуля должно совпадать с именем файла interface uses список модулей раздел объявлений модуля // описываются лишь заголовки подпрограмм implemetation uses список модулей раздел реализации модуля // описывается реализация подпрограмм [begin операторы] // инициализация модуля end.
Раздел инициализации модуля вызывается до начала работы основной программы. В разделе интерфейса описываются все экспортируемые модулем объекты (подпрограммы, типы, переменные, константы).
Пример.
Модуль
unit MyUtils;
interface
const Author = 'Иванов';
var n: integer;
procedure MinMax(a,b: integer; var mn,mx: integer); function IsPrime (x: integer): boolean;
implementation
uses Math;
procedure MinMax(a,b: integer; var mn,mx: integer); begin mn := min (a,b); mx := max(a,b) end;
function IsPrime(x: integer): boolean; begin ... end;
initialization n:=100; end.
Основная программа
uses MyUtils; begin writeln(IsPrime(15)); end.
Схема компиляции программ с модулями
С точки зрения этой схемы модуль является единицей компиляции.
Модули должны находиться либо в текущей папке программы, либо в специальных папках, задаваемых в опциях настройки проекта (в Delphi файл .dof). Если имеются откомпилированные версии модулей (.dcu или .obj), дата которых более поздняя или такая же по сравнению с датой соответствующего .pas-модуля, то перекомпиляции не происходит. В частности, .pas-модуль при этом может отсутствовать.
Obj-модуль может быть создан компиляторами многих языков программирования (с некоторыми ограничениями).
Замечание. Все стандартные имена (Pi, sin) считаются принадлежащими модулю System, который неявно подключается к любой программе.
Пример.
var sin: real; begin sin:=System.sin(1); end.
Перечислимый и диапазонный типы Перечислимый тип
Перечислимый тип задается списком значений, представляющих собой имена.
var d: (Mon,Tue,Wed,Thu,Fri,Sat,Sun); ... d:=Mon; d:=Succ(d); // d=Tue Inc(d,2); // d=Thi writeln(Ord(d)); // 3 // Ord - функция преобразования в число, нумерация с нуля d:=Pred(d); Dec(d)
Succ для последнего и Pred для первого элементов не определены. Функции Succ, Pred и Ord применяются не только к перечислимому типу, но и к любому порядковому (целый, символьный, перечислимый)/
Пример.
type DayOfWeek = (Mon,Tue,Wed,Thu,Fri,Sat,Sun);
var d1,d2: DayOfWeek;
function ToString(d: DayOfWeek): string; begin case d of Mon: Result:='Понедельник'; Tue: ... ... end; end;
Перечислимый тип может использоваться в качестве переключателя в операторе case, а также параметр цикла for может иметь перечислимый тип:
for d:=Mon to Fri do
Диапазонный тип
type WorkDay = Mon..Fri; Digits = '0'..'9'; Days = 1..31;
Диапазонный тип совместим по присваиванию только с типом, на базе которого он построен (перечислимый, целый, символьный)
Массивы
Структурированный тип данных объединяет совокупность значений в единое целое. К структурированному типу данных в Pascal относятся: массив, запись, множество, строка, файл.
Массив - совокупность элементов одного типа, каждый из которых имеет номер, называемый индексом (индексов может быть несколько).
Описание массивов
var A: array [1..100] of real; // [1..100] - диапазон изменения индекса, real - тип элементов B: array ['a'..'z'] of integer; // тип индекса - char type DayOfWeek=(Mon,Tue,Wed,Thi,Fri,Sat,Sun); var C: array [DayOfWeek] of integer; D: array [Mon..Fri] of integer; AA: array [1..3,1..4] of real; // двумерный массив - матрица
Обращение к элементам массива
A[i] - переменная с индексами B['q']:=B['a']+1; C[Mon]:=5; AA[2,4]:=2.2;
Присваивание массивов
Массивы одного типа можно присваивать друг другу и использовать при передаче параметров.
var A,B: array [1..10] of integer; ... A:=B; //!
Однако,
var A: array [1..10] of integer; B: array [1..10] of integer; ... A:=B; // ошибка: типы считаются различными
Структурная и именная эквивалентность типов
Причина последней ошибки - именная эквивалентность типов в языке Паскаль. Решение проблемы - определить тип массива.
type IArr = array [1..10] of integer; var A: IArr; B: IArr; ... A:=B; // верно!!!
В Паскале имеет место именная эквивалентность типов, а не структурная. Это позволяет быстрее проверять соответствие типов на этапе компиляции.
В предпоследнем примере типы у A и В совпадают структурно, но они не эквивалентны, поэтому присваивать нельзя. По этой причине при передаче массива в качестве параметра необходимо давать имя типу массива
procedure WriteArr(A: IArr; n: integer); // n - размер массива
Недостаток передачи по значению: копируется большой объем памяти. Выход - передача по ссылке:
procedure WriteArr(var A: IArr; n: integer);
Проблема: можно подумать, что А внутри меняется. Решение:
procedure WriteArr(const A: IArr; n: integer);
Const-параметры: простые передаются по значению, структурированные по ссылке. Их нельзя изменять внутри подпрограммы.
Инициализация массивов
var A: IArr = (2,1,3,7,4,8,...); // нельзя для локальных переменных const B: IArr = ( ... ) // можно для локальных переменных var AA: array [1..3,1..4] of integer = ((1,2,3,4),(5,6,7,8),(9,10,11,12));
Замечание. Элементами массива могут быть другие массивы:
var AA1: array [1..3] of integer; AA1[3][4]:=5; // ~ AA[3,4]:=5
Хранение массивов в памяти
!!!Не сделано!!!
Открытые массивы
Используются в качестве параметров (Delphi, Free Pascal)
procedure WriteArr (A: array of integer); var i: integer; begin for i:=Low(A) to High(A) do write(A[i]:4); end;
Для открытые массивов них недопустимы присваивания массивов, индексом всегда служит целое
Динамические массивы
(Delphi, Free Pascal);
var A: array of integer; // всегда индексируется с 0 begin SetLength(A,10); // Length(A) A[0]:=1;
Контроль выхода за границы диапазона - {$R±} (Range Check)
Записи
Запись - множество значений разных типов, объединенных в единое целое. Каждое значение имеет имя и называется полем записи.
Описание
record список имен полей : тип; ... end;
Пример.
type Student = record name: string; course, group: integer; end;
Обращение к полям записи
var s1,s2,s3: Student; name: string; begin s1.name:='Иванов'; s1.course:=1; s1.group:=11; s2:=s1; s2.name:='Петров'; with s3 do begin name:='Сидоров'; course:=4; group:=2 end; end.
with - оператор присоединения with a,b,c do ~ with a do with b do with c do
Инициализаторы записей
var s: Student = {name: 'Иванов'; course: 5; group: 2};
Записи как средство упаковки параметров
type TPoint = record x,y: integer; end; TRect = record x1,y1,x2,y2: integer; end; TTriangle = record v1,v2,v3: TPoint; end; procedure DrawRect(x1,y1,x2,y2: integer); procedure DrawRect(ln,rd: TPoint); procedure DrawRect(const r: TRect); function Square (const t: TTriangle); type IArrN = record data: IArr; n: integer; end; procedure wrikArr(const a: IArrN); begin for i:=1 to a.n do write(a.data[i],'_'); end;