Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmy.doc
Скачиваний:
3
Добавлен:
27.04.2019
Размер:
550.91 Кб
Скачать

Записи с вариантами

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]