- •Алгоритмы
- •Свойства алгоритма
- •Способы описания алгоритмов
- •Язык программирования
- •Способы описания синтаксиса языка программирования
- •1. Бнф (Бэкуса-Наура форма)
- •Компиляторы и интерпретаторы
- •Обзор языков программирования высокого уровня (таблица)
- •Язык программирования Паскаль Первая программа на языке программирования Паскаль
- •Типы, переменные и константы
- •Основные типы данных языка Pascal
- •Операторы ввода/вывода
- •Форматы вывода
- •Выражения и операции Выражения
- •Операции
- •Операции div и mod для целых
- •Операции shl и shr для целых
- •Логические операции
- •Часто используемые правила математической логики
- •Стандартные процедуры и функции Стандартные функции
- •Стандартные функции в Dephi
- •Стандартные процедуры для целых
- •Явление переполнения
- •Погрешность округления и вычислительная погрешность
- •Примеры на суммирование рядов
- •Процедуры break и continue
- •Оператор безусловного перехода goto
- •Подпрограммы. Процедуры и функции
- •Процедуры
- •Синтаксис описания процедуры
- •Оператор вызова процедуры
- •Функции
- •Переменная Result
- •Способы передачи параметров Передача по значению. Параметры-значения
- •Передача по ссылке. Параметры-переменные (с ключевым словом var)
- •Семантика вызова подпрограммы
- •Алгоритм вызова подпрограммы
- •Статическая и автоматическая память
- •Локальные и глобальные переменные
- •Обращение к глобальным переменным и побочный эффект
- •Область видимости и время жизни объекта
- •Статическая локальная переменная
- •Перегрузка имен подпрограмм
- •Структура модуля
- •Перечислимый и диапазонный типы Перечислимый тип
- •Записи с вариантами
- •Как записи с вариантами хранятся в памяти
- •Сортировка массивов записей
- •Индексная сортировка
- •Множества
- •Стандартные подпрограммы для работы с символами
- •Виды строк в Delphi
- •Cтроки shortstring
- •Основные подпрограммы для работы со строками
- •Основные подпрограммы для работы со строками (Delphi)
- •Алгоритмы на строках
- •Использование Split
Записи с вариантами
В конце записи может быть одна вариантная часть. В ней содержатся поля различных типов, для которых выделен один участок памяти.
record постоянная часть case имя : тип of // имя - переключатель; указывает, какой вариант рассматривается значение1 :(...); значение2 :(...); ... end
Пример. Заготовка для библиотеки графических фигур.
type FigureKind=(kPoint, kCircle, kRect, kLabel); Figure=record x,y:real; case kind: FigureKind of // запись "kind:" не является обязательной kPoint: (); kCircle: (r: real); kRect: (x1,y1: real); kLabel: (s: string); // ";" может не ставиться // у case нет end'а ! end;
Как записи с вариантами хранятся в памяти
var f:Figure;
Размер записи с вариантами рассчитывается по большему полю.
procedure DrawFigure (const f:Figure); begin case f.kind of kPoint: DrawPoint(f.x,f.y); kCircle: DrawCircle(f.x,f.y,f.r); kRect: Drawrectangle(f.x,f.y,f.w,f.h); kLabel: DrawText(f.x,f.y,f.s); end;
С оператором with:
begin with f do case kind of kPoint: DrawPoint(x,y); kCircle: DrawCircle((x,y,r); ...
Итак, записи с вариантами обеспечивают примитивный полиморфизм типов. Полиморфизмом мы называем изменчивость поведения в пределах одного типа.
Сортировка массивов записей
Для сортировки массива записей по различным критериям в процедуру сортировки передают функцию сравнения, которая является бинарным предикатом. Например, для сортировки массива студентов функция сравнения имеет следующий вид:
cmp(a[j+1],a[j])
Эта функция имеет смысл операции "меньше".
BubbleSortStudent(gr1_11,36,LessName);
Индексная сортировка
При сортировке массивов больших объектов эффективность теряется из-за многочисленных копирований больших объектов в памяти. Чтобы этого избежать, переставляют не сами объекты, а их индексы, для этого вводится специальный индексный массив, который отображает виртуальные индексы в реальные
i (виртуальный индекс) → Index[i] (реальный индекс) a[Index[i]]
В начальный момент времени виртуальный индекс совпадает с реальным, т.е. Index[i]=i. При сортировке мы сравниваем элементы массивов используются виртуальные индексы, а меняем местами элементы индексного массива.
procedure BubbleIndexStudentSort(var a: StArr; var Index: IArr; n: integer; cmp: cmpFunc); var i,j: integer; begin for i:=1 to n do Index[i]=i; for i:=n downto 2 do for j:=1 to i-1 do if cmp(a[Index[j+1]],a[Index[j]]) then Swap(Index[j+1],Index[j]); end;
Множества
Множества - совокупность элементов одного порядкового типа (целого, символьного, перечислимого или диапазонного). Во множество может входить несколько элементов одновременно, а может не входить ни одного, каждый элемент входит во множество не более 1 раза. Элементы во множестве не упорядочены. Тип множества описывается следующим образом: set of <базовый тип>
Примеры.
type ByteSet = set of Byte; CharSet = set of Char; DigitsSet = set of '0'..'9'; DaysSet = set of (Mon, Tue, Wen, Thr, Fri, Sat, Sun);
Замечания. Базовый тип множества должен иметь элементы с порядковыми номерами в диапазоне от 0 до 255.
Операции над множествами
var s1,s2: set of byte; s1+s2 - объединение множеств s1*s2 - пересечение множеств s1-s2 - разность множеств s1<=s2 - s1 вложено в s2 s1>=s2 - s1 содержит s2 i in s1 - принадлежность: true, если i принадлежит s1
Множества - константы
[1,3..5,8] [2..10,12,14..18] [ ] - пустое множество, совместно с любым типом множества ['a', 'e', 'i', 'o', 'u', 'y'] - множество гласных
Добавить элемент к множеству
s := s + [i];
или
Include(s,i) // если элемент во множестве есть, то ничего не произойдет
Удалить элемент из множества
s := s – [i]
или
Exclude(s,i)
Цикл по множеству
for i:=1 to 255 do // перебрать все возможные элементы if i in s then write(i,' ');
Пример. Вывод всех символов, встречающихся в массиве символов, в алфавитном порядке.
const sym: array [1..25] of char = 'Информационные технологии'; var s: set of char; ... s:=[ ]; for i:=1 to 25 do s:=s + [sym[i]]; // Include(s,sym[i]);
// Вывод
for i:=1 to 255 do if i in s then write(i,' ');
Пример. «Решето Эратосфера». Вывести все простые числа <= 255.
Алгоритм.
const n=255; var primes: set of byte; i,x,c: integer;
begin primes:=[2..n]; for i:=1 to round(sqrt(n)) do begin if not i in primes then continue; x:=2*i; while x<=n do begin primes:=primes-[x]; x:=x+i; end; end; for i:=0 to n do if i in primes then write(i,' '); end.
Представление множества в памяти
Переменная типа «множество» занимает в памяти 32 байта или 256 бит. Поэтому ее эффективнее передавать по ссылке.
Создание множества на базе массива
const n=1000; var s: array [1..n] of boolean;
s[i]=True – eсть элемент, False – нет элемента.
Такой способ хранения – в 8 раз менее компактный.
procedure Include(var s:MyIntSet; i: integer); begin s[i]:=True end;
function Intersection(const s1,s2: MyIntSet): MyIntSet; begin for i:=1 to n do Result[i]:=s1[i] and s2[i]; end;
Создание множества на базе битового массива.
type MyBitIntSet = array [0..n-1] of byte // n*8 элементов
Include(s,i)
1) найти нужный байт
2) установить в нем нужный бит:
by:=i div 8; bi:=i mod 8; s[by]:=s[by] or (1 shl bi)
Exclude(s,i)
s[by]:=s[by] and not (1 shl bi);
Пересечение
Побитовое or для всех элементов
Объединение
Побитовое and для всех элементов
Разность
Result[i]:=s1[i] and not s2[i]
Некоторые алгоритмы для двумерных массивов
const sz=10; type IMatrix=array [1..sz,1..sz] of integer; var A: IMatrix;
Заполнение матрицы случайными числами
read(m,n); fillRandom(a,m,n); // fillRandom написать самостоятельно
Вывод матрицы
for i:=1 to n do begin for j:=1 to m do write(A[i,j]:4); writeln; end;
Пример. Найти сумму элементов в каждом столбце матрицы A.
read(m,n); fillRandom(A,m,n); for j:=1 to n do begin s:=0; for i:=1 to m do s:s+A[i,j]; sum[j]:=s; end;
Пример. Найти минимальные элементы в столбцах матрицы A.
for j:=1 to n do begin mn:=A[i,j]; for i:=2 to m do if A[i,j]<mn then mn:=A[i,j]; min[j]:=mn; end;
Пример. Установить, есть ли в матрице элемент равный k.
label lbl; begin read(k); flag:=False; for i:=1 to n do if A[i,j]=k then begin flag:=true; goto lbl; end; lbl: ...
Использование goto оправдано - выход из двух вложенных циклов сразу.
Пример. Обнулить элементы матрицы ниже главной диагонали (сделав ее верхнетреугольной).
Алгоритм 1.
for i:=1 to n do for j:=1 to n do if i>j then A[i,j]:=0;
Алгоритм 2.
for i:=2 to n do for j:=1 to i-1 do A[i,j]:=0;
Пример. Обнулить элементы
Алгоритм 1 (по строкам).
for i:=1 to (n+1) div 2 do for j:=n-i+2 to n do A[i,j]:=0; for i:=(n+1) div 2+1 to n-1 do for j:=i+1 to n do A[i,j]:=0;
Алгоритм 2 (по столбцам).
for j:= n div 2+2 to n do for i:=n-j+2 to j-1 do A[i,j]:=0
Алгоритм умножения матриц
C=A*B
for i:=1 to m do for j:=1 to n do Begin s:=0; for k:=1 to n do s:=s+A[i,k]*B[k,j]; C[i,j]:=s; end;
Метод Гаусса
for k:=1 to m do begin akk:=A[k,k]; // если=0, то ошибка for j:=1 to m+1 do A[k,j]:=A[k,j]/akk; for i:=1 to m do // A[i]:=A[i]-A[k]*A[i,k] if i<>k then begin c:=A[i,k]; for j:=k+1 to m+1 do A[i,j]:=A[i,j]-A[k,j]*c; end; end; for i:=1 to m do write(A[i,m+1],' ');
Строки
Символы
Строки состоят из символов. Символы хранятся в памяти компьютера в виде кодов. Соответствие между символами и их кодами называется кодировкой, а таблица соответствия между символами и кодами - кодовой таблицей.
Для хранения символа используется 1 или 2 байта (соответствующие кодировки называются однобайтовыми или двухбайтовыми). Тип char занимает 1 байт, т.е. кодировка типа char - однобайтовая.
Кодовая таблица состоит из двух половин. В первой половине (коды 0..127) содержатся цифры, буквы латинского алфавита (большие и маленькие), знаки препинания и управляющие символы. Стандарт на первую половину кодовой таблицы называется ASCII (American Standard Code for Information Interchange – американский стандартный код для обмена информацией). Вторая половина с кодами от 128 до 255 содержит символы национального алфавита.
Символы с кодами от 0 до 31 считаются управляющими:
#10 - символ перехода на следующую строку #13 - символ возврата "каретки" #9 - символ табуляции
В России наиболее распространены следующие национальные (русские) кодировки:
Dos
Windows(CP-1251)
KOI-8R