Типы данных.ppt
- Количество слайдов: 128
Типы данных Данные статической структуры Данные динамической структуры
Типы данных – это множество величин, определяемых совокупностью допустимых операций. Читать далее… Операция – действие вырабатывающее некоторое значение величины, которая называется ее результатом. Исходными данными для операции являются операнды назад
Данные статической структуры Простые (скалярные) Составные (агрегативные) назад
Простые (скалярные) 1. Стандартных (базовых) типов 1. 1. арифметических типов 1. 1. 1. натуральных чисел 1. 1. 2. целых чисел 1. 1. 3. вещественных чисел 1. 1. 3. 1. с фиксированной точкой 1. 1. 3. 2. с плавающей точкой 1. 1. 4. комплексных чисел 1. 1. 4. 1. действительная и мнимая часть натуральные числа 1. 1. 4. 2. действительная и мнимая часть целые числа 1. 1. 4. 3. действительная и мнимая часть вещественные числа 1. 2. символьного типа 1. 3. булевского (логического) типа 1. 4. указательного (ссылочного) типа 2. данные типов, определенных программистом назад
Простые данные Арифметический тип Арифметические операции, функции, выражения: 1) стандартные арифметические операции (сложение, вычитание, умножение, деление); Читать далее… 2) стандартные математические функции: Abs(х) {возвращает абсолютное значение x} Ехр(x) {возвращает экспоненту х} Sqr(x) {возвращает x в квадрате} Sqrt(x) {возвращает квадратный корень x} Sin(x) {возвращает синус x} Cos(x) {возвращает косинус x} Ln(x) {возвращает натуральный логарифм x} Pi {возвращает значение числа Pi = 3. 141592653} назад
Вещественные числа Плавающая точка Формат с плавающей точкой предполагает представление числа R в виде произведения мантиссы m на основание системы счисления n в некоторой целой степени, которая называется порядком р: Читать далее… Порядок указывает, на какое количество позиций и в каком направлении должна сместиться ("поплыть") точка в мантиссе. Представление числа неоднозначно. Стандарт IEEE 754 определяет нормализованную мантиссу, удовлетворяющую условию: , то есть, нормализованная мантисса — правильная дробь и ее старшая цифра не нуль. назад
Вещественные числа Фиксированная точка Формат это схема числа, показывающая его составные части. Читать далее… Точка это десятичная запятая, т. е. знак, отделяющий целую часть числа от дробной. Читать далее… Формат с фиксированной точкой используется для внутреннего представления целых чисел. Фиксированная точка положение точки не изменяется при использовании числа в процессе вычислений. назад
Простые данные Натуральные числа Описание с помощью: диаграммы Никлауса Вирта: Читать далее… формы Бекуса Наура: <целое без знака> : : = <последовательность цифр> : : = <цифра> {<цифра>} <цифра>: : =0|1|2|3|4|5|6|7|8|9 назад
Составные (агрегативные) 2. однородные 2. 1. массивы 2. 1. 1. одномерные (векторы) 2. 1. 2. двухмерные (матрицы) 2. 1. 3. многомерные 2. 1. 4. однородных структур данных 2. 1. 5. неоднородных структур данных 2. 1. 6. файлов 2. 2. строки 2. 3. множества 3. неоднородные 3. 1. простые записи 3. 2. вариантные записи 3. 3. объединения 3. 4. объекты назад
Составные данные Объекты Объект – осязаемая сущность, которая четко проявляет свое поведение. Объектно ориентированное программирование – методология программирования, которая основана на представлении программ в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида). Классы образуют иерархию на принципах наследования. Читать далее… Инкапсуляция – объединение в одном объекте каких то свойств, значений допустимых для объекта. В иерархии отражается наследование свойств вышележащих (родительских) типов объектов нижележащими (дочерними). Читать далее… Полиморфизм – свойство объектов выполнять одно и то же разными методами. Пример
Пример Заполнение двумерного массива с помощью объектно ориентированного программирования program obj; type mas=array[0. . 99] of integer; massiv=object a: mas; n: integer; procedure vvod_sl; {метод ввода элементов массива} procedure print; {метод вывода элементов} end; dvummas=object(massiv) {создаем объектный тип для двумерного типа на основе одномерного} b: array[0. . 99] of mas; m: integer; procedure vvod_sl; procedure print; end; procedure massiv. vvod_sl; procedure massiv. print; procedure dvummas. vvod_sl; procedure dvummas. print; var mas 1: massiv; dvummas 1: dvummas; n: integer; begin write('количество элементов? '); readln(n); dvummas. vvod_sl; dvummas. print; end. назад
procedure dvummas. print; var i: integer; begin for i: =1 to n do begin a: =b[i]; massiv. print; end; назад
procedure massiv. print; var i: integer; begin for i: =1 to n do Write(a[i], ‘_'); writeln; end; назад
procedure dvummas. vvod_sl; var i: integer; begin write('количество n '); readln(n); write('количество m '); readln(m); for i: =1 to n do begin massiv. vvod_sl; b[i]: =a; end; назад
procedure massiv. vvod_sl; var i: integer; begin for i: =1 to n do a[i]: =random(10)-1; end; назад
procedure massiv. print; var i: integer; begin for i: =1 to n do Write(a[i], ‘_'); writeln; end; назад
procedure massiv. vvod_sl; var i: integer; begin for i: =1 to n do a[i]: =random(10)-1; end; назад
Данные динамической структуры Файлы Несвязанные динамические данные назад Связанные динамические данные
Файлы 1. 1. типизированные 1. 2. текстовые 1. 3. нетипизированные назад
Файл В паскале понятие Файла употребляется в двух смыслах: как поименованная информация на внешнем устройстве (внешний файл); как переменная файлового типа в Паскаль программе (внутренний файл). С элементами файла можно выполнять только две операции: читать из файла; Читать далее… записывать в файл. Файловый тип данных – структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее не определено. Читать далее… Описание с помощью формы Бекуса Наура: <файловый тип>: : =<имя> file of <базовый тип> Набор процедур на Паскале Читать далее… назад
Набор процедур Assign (f, File. Name) {связывает файловую переменную f с физическим файлом} Reset (f) {открывает для чтения файл, с которым связана файловая переменная f} Rewrite (f) {открывает для записи файл, с которым связана файловая переменная f} Close (f) {закрывает открытый до этого файл с файловой переменной f} EOF(f): boolean {возвращает значение true, когда при чтении достигнут конец файла} назад
Несвязанные динамические данные классифицируются аналогично данным статической структуры назад
Связанные динамические данные 1. линейной структуры 1. 1. односвязные 1. 1. 1. список 1. 1. 2. очередь 1. 1. 3. стек 1. 1. 4. дек 1. 2. многосвязные 1. 2. 1. многосвязный линейный список 2. кольцевой структуры 2. 1. односвязный кольцевой список 2. 2. многосвязный кольцевой список 3. разветвленной структуры 3. 1. деревья 3. 1. 1. бинарные (двоичные) 3. 1. 2. разветвленные 3. 2. графы назад
Связанные данные Кольцевая структура Koльцо это вид связанного списка, в котором указатель последнего элемента ссылается на первый элемент. Пример описания на Паскале Процедура формирования кольца Процедура обхода кольца назад
Процедура обхода кольца Procedure walk. K(u : Type. Circle); var x : Type. Circle; begin x : = u; repeat write(x^. Data, ' '); x : = x^. Next; until x = u; end; назад
Процедура формирования кольца Procedure Fofm. K(Var u : Type. Circle); Var x, y : Type. Circle; i, N, d : integer; begin write('Введите количество звеньев кольца: '); readln(N); for i : = 1 to N do begin new(x); {выделяем память для хранения нового элемента кольца} write('Введите данные в звено: '); readln(d); x^. Data : = d; {заносим информацию в поле данных} if u=nil {если кольцо еще не создано} then u : = x {то указатель первого элемента ставим на новый элемент} else y^. Next : = x; {присоединяем новый элемент к последнему элементу} y : = x; {переносим указатель у на последний элемент} end; x^. Next : = u; {преобразуем получившийся список в кольцо} end; назад
Пример описания на Паскале Type. Circle = ^K; k = record data : integer; next : Type. Circle; end; var Circle 1 : Type. Circle; назад
Связанные данные Деревья Дерево – это граф, между двумя любыми вершинами которого, существует единственный путь, следовательно дерево – это связанный граф, в котором всегда n вершин и n 1 ребро. назад
Бинарные деревья Корневое дерево – ориентированное дерево, в котором явно выделены вершины трёх типов: 1) корень; 2) листья; Читать далее… 3) терминалы. Должны выполняться два обязательных условия: в корень не входит ни одна дуга, из листьев не выходит ни одна дуга. Традиционно дерево изображают вверх корнем. Высота дерева – максимальное количество дуг, отделяющих листья от корня. Предок текущей вершины – вершина из которой исходит дуга. Потомок – вершина, в которую входит дуга из выше растущей вершины. У корня нет предков, а у листьев нет потомков. Описание дерева Подсчёт количества вершин Уничтожение дерева Вставка элемента в дерево Поиск значения Сравнение деревьев Типы обхода Слияние деревьев Удаление вершины дерева назад
Удаление вершины дерева procedure Delete (var root: refnode; x: integer); var q: refnode; procedure del (var r: refnode); begin if r^. right <> nil then del(r^. right) else begin q^. inf: =r^. inf; q: =r; r: =r^. left end; begin if root = nil then write( 'такой вершины нет в дереве') else if x
Слияние деревьев procedure Merger_M( var rootl: refnode; root 2: . refnode); { слияние деревьев переносом вершин второго дерева в первое } var I, r: refnode; procedure Insert( var root: refnode; elem: refnode ); {включение элемента elem в дерево с корнем rootl} begin if root = nil {в дереве Т 1 найдено вакантное место для ссылки} then begin {устанавливаем ссылку в дереве Т 1} {на включаемый элемент дерева Т 2 и разрываем} {связи элемента с деревом Т 2} root: = elem; elem^. left : = nil; elem^. right : = nil; end else with root^ do {ищем место для включения элемента} if elem^. inf < inf then Insert(left, elem) else if elem^. inf> inf then Insert(right, elem) else dispose(elem) уничтожаем элемент, т. к. такое значение уже есть} { end; begin if root 2 <> nil then begin 1: =root^. left; { сохраним ссылку на левое поддерево } r: =root^2. right; { сохраним ссылку на правое поддерево } Insert( root 1 , root 2 ); { отдали вершину root 2 в дерево Т 1} Merger_M( root 1, 1); { слияние левого поддерева с Т 1} Merger_M( root 1, r); { слияние правого поддерева с Т 1} end; назад
Сравнение деревьев function Equal( root 1, root 2: refnode ): Boolean; begin if root 1 <> nil and root 2 <> nil then Equal : = (root 1^. inf = root 2^. inf) and Equal(rootl^. left, root 2^. left) and Equal(rootl ^. right, root 2^. right) else if root 1 = nil and root 2 = nil then Equal : = true else Equal : = false end; назад
Поиск значения function Find (root: refnode; x: integer): refnode; begin if root = nil then Find : = nil else with root^ do if x< inf then Find : = Find(left, x) else if x> inf then Find : = Find(right, x) else Find : = root end;
Уничтожение дерева procedure Destroy_l (root: refnode); var I, r: refnode; begin if root <> nil then begin l : = root^. left; {сохраним ссылку на левое поддерево} r : = root^. right; {сохраним ссылку на правое поддерево} dispose(root); Destroy_l(l); {уничтожим левое поддерево} Destroy_l (r); {уничтожим правое поддерево} end; назад
Подсчёт количества вершин Function counter(root: refnode): integer; Begin if root=nil then counter: =0 else counter: =1+counter(root^. left)+counter(root^. right); End; назад
Типы обхода Прямой Обратный Концевой назад
Прямой обход Procedure br_1(root: refnode); Begin if root<>nil then begin write(root^. inf); br_1(root^. left); br_1(root^. right); end; End; назад
Обратный обход Procedure br_2(root: refnode); Begin if root<>nil then begin br_2(root^. left); write(root^. inf); br_2(root^. right); end; End; назад
Концевой обход Procedure br_3(root: refnode); Begin if root<>nil then begin br_3(root^. left); br_3(root^. right); write(root^. inf); end; End; назад
Вставка элемента в дерево procedure ins_tree(var t: pt; var x: integer); {вставка элемента в дерево} begin if t=nil then {если дерево не существует} begin new(t); {процедура отводит место для хранения динамической переменной t^ и присваивает ее адрес ссылке t} with t^ do {обращение к полям записи} begin left: =nil; {слева пусто} right: =nil; {справа пусто} data: =x; {корнем становится x} end; end else if x<=t^. data {если значение вставляемого элемента меньше значения вузле} then ins_tree(t^. left, x) {то элемент вставляется в левую ветвь} else ins_tree(t^. right, x); {иначе элемент вставляется в правую ветвь} end; назад
Описание program derevo; type pt=^node; {тип pt – список} node=record data: integer; {поле данных data типа integer} left, right: pt; {поля left, right типа pt – список} end; {конец описания записи} Var root: pt; {переменная root типа pt, описанного выше} a, n, m, k: integer; {переменные a, n, m, k целого типа} назад
Изображение дерева назад
Связанные данные Очередь Пример описания на Паскале Над очередью определены две операции: занесение элемента в очередь; выбор элемента из очереди. Создание очереди Удаление очереди Назад
Пример описания очереди на Паскале type ptr = ^elеm; elem = record inf: real; link: ptr; end; назад
Процедура создания очереди procedure Add. El (Val : Real); var p : ptr; begin new(p); p^. inf: = val; p^. link: =nil; if end. Q = nil {если значение указателя на конец очереди NIL} then beg. Q : = p {то создаем первый элемент очереди} else end. Q^. ink: = p; {иначе создаем очередной элемент очереди} end. Q : = p end; назад
Процедура удаления очереди procedure del. El( var val : real); var p : ptr; begin val : = beg. Q^. inf; p: =beg. Q; beg. Q : = p^. link; if beg. Q = nil {если значение указателя на начало очереди NIL} then end. Q : = nil; {то удаляем последний элемент очереди} dispose (p) end; назад
Связанные данные Графы Граф – двойка
Улитка – мягкотелое беспозвоночное животное с мускулистым наростом. Это улиткина нога. Мягкое тело улитки прикреплено к раковине. Улитка может получать из воды известь и откладывать её крошечными частичками с наружной и внутренней сторон раковины. Так улитка непрерывно ремонтирует и достраивает свой дом. Понятия: улитка нога тело раковина известь назад
Взвешенный граф Это граф, некоторым элементам которого сопоставлены числа. Например Интернет, где вес ребра можно определить как стоимость соединения. назад
Неориентированный граф Две вершины, связанные одним ребром равноправны. Петля – ребро, соединяющее вершину саму с собой. Читать далее… Ребро и вершина инцидентные другу, если вершина служит одним из концов ребра. Количество рёбер инцидентных вершине – степень вершины. Читать далее… Путь – последовательность вершин без повторений в которой любые две соединённые вершины смежны. Читать далее… Длинна пути – количество рёбер, из которых состоит путь.
Ориентированный граф Орграф – все рёбра имеют направление. Рёбра – дуги. Дуга соединяет две неравноправные вершины, одна из которых – начало, а другая – конец. Читать далее… Степень вершины в орграфе – пара чисел: количество исходящих дуг, количество входящих дуг. Читать далее… Путь – последовательность вершин без повторений, в которой любые соединённые вершины смежны. Каждая вершина одновременно начало одной дуги и конец другой.
Связанные данные Дек – двухконцевая очередь, то есть доступны как первый, так и последний элементы. назад
Связанные данные Стек — динамическая структура данных, представляющая из себя упорядоченный набор элементов, в которой добавление новых элементов и удаление существующих производится с одного конца, называемого вершиной стека. По определению, элементы извлекаются из стека в порядке, обратном их добавлению в эту структуру, т. е. действует принцип "последний пришёл — первый ушёл". Пример описания на Паскале Набор процедур и функций на Паскале Добавление элемента в стек Удаление элемента из стека назад
Процедура удаления элемента из стека Procedure read. Stack(Var u : pt; Var dig : integer); Var x : pt; Begin dig : = u^. Data; {считываем значение поля данных в переменную} x : = u; {запоминаем адрес вершины стека} u : = u^. Next; {переносим вершину стека на следующий элемент} dispose(x); {освобождаем память, занятую уже ненужным элементом стека} end; назад
Процедура добавления элемента в стек Procedure Write. Stack(Var u: pt; dig: integer); Var x: pt; Begin new(x); x^. data: =dig; x^. next: =u; u: =x; End; назад
Пример описания на Паскале Type EXST = ^ST; ST = record Data : integer; Next : EXST; end; Var Stack : EXST; назад
Процедуры и функции Init. Stack {инициализация стека} Push(d: t. Data) {положить элемент в стек} Pop(var d: t. Data) {извлечь элемент с вершины стека} Not. Empty: boolean {проверка стека на пустоту} назад
Связанные данные Список представляет собой совокупность линейно связанных между собой однородных элементов. Структура списка: каждый элемент списка должен состоять из двух полей; второй элемент должен содержать указатель на следующий элемент списка. Читать далее… Пример описания на Паскале Для того, чтобы хранить данные обо всём списке, достаточно одной переменной – указателя на первый элемент списка. С указателями никаких операций выполнять нельзя. Для работы со списком нужно завести вспомогательный указатель. Просмотр элементов Обращение к элементам Удаление элементов назад
Пример описания списка Type Pointer = ^elem; elem = record inf : real; link : pointer; end; назад
Просмотр элементов Создаём список с конца: Var head, p : ukaz; f : text; Begin … Head: =nil; While not eof(f) do begin new(p); {выделение памяти} read(f, p^. inf); {чтение первого элемента из файла} p^. next: =head; head: =p; end; … назад
Обращение к элементам P: =head; While p<>nil do begin writeln(p^. inf); p: =p^. link; {переход к следующему элементу списка} end; назад
Удаление элементов p: =head; while p^. link^. inf<>x do p: =p^. link; q: =p^. link; {указывает на удаляемый элемент} p^. link: =q^. link; dispose(q); назад
Составные данные Массивы это структура данных. Данные, входящие в состав массива, называются его элементами. Массив имеет имя. Каждый элемент наследует это имя и тип. Читать далее… Значения массива – это набор значений его элементов. Читать далее… Индекс элемента – это порядковый номер элемента в массиве. Читать далее… Количество индексов определяет размерность массива. Обратиться к элементу массива означает указать имя элемента массива.
Составные данные Строки Описание с помощью: диаграммы Никлауса Вирта: формы Бекуса Наура Читать далее… var <имя_строки>: string[(<длина_строки>)]; языка Паскаль: Var s 2: string; {описана строка длиной 225 символов} Набор процедур и функций на Паскале назад Читать далее…
Процедуры и функции назад
Массивы Одномерный массив Описание с помощью: диаграммы Никлауса Вирта: языка Паскаль: var A: array[1. . 5] of real; Читать далее… Классы задач по обработке массива назад
Массивы Двумерный массив Описание с помощью языка Паскаль: Type Vector=array[1. . 3] of real; Type Matrix=array[1. . 3] of array [1. . 3] of real; Matrix=array[1. . 3, 1. . 3] of real; Упорядочивание данных назад
БНФ <термин> описание : : = (нетерминальный символ) терминальные слова: I – или { } – вхождение может быть использовано в БНФ [ ] – элемент присутствует в БНФ диаграммы Никлауса Вирта назад
БНФ пример: <двоичная цифра>: : =0 I 1 {двоичное число}: : = двоичная цифра I двоичное число назад
Диаграммы Никлауса Вирта Пример: цифра назад
Запись в языках программирования это агрегат, составляющие которого могут иметь различные атрибуты и содержать идентификатор. (в некоторых ЯП названы структурами). Для определения формальных языков используются метаязыки: форма Бекуса Наура (БНФ) и диаграммы Никлауса Вирта. Описание на БНФ <тип записи>: : =record <список полей>end; Описание диаграммами Вирта Опишем комплексное число как запись: type complex=record re: real; im: real; end; var a: complex Обращение к полю записи: a. re: =1; a. im: =-3 назад
назад
Составные данные Простая запись Информационная модель объекта «Анкета» на языке Паскаль: type anketa =record; {описание записи Анкета} fio: string[50]; pol: char; {поля записи} data= record {описание записи Дата} god: integer; {поле записи} mes: string[9]; {поле записи} end; address =record; {описание записи Адрес} gorod: string[40]; street: string[50]; end; var student: array[1. . 1000] of anketa; {создаёт анкету с записями на 1000 человек} student[435]. address. gorod; {заполнение поля город для 435 -го человека} for i: =1 to 1000 do with student[i] do {для каждого человека из анкеты} begin write (‘ФИО ’); read (fio); {выводит Фамилию Имя Отчество} end; назад
Упорядочивание данных 1. 2. 3. 4. По возрастанию По не убыванию По не возрастанию Методы сортировки назад
Методы сортировки 1. внешние (сортировка файлов) 2. внутренние (в оперативной памяти)
Методы сортировки • Простые (относят методы, сложность которых пропорциональна квадрату разности входных данных) • Улучшенные назад
Простые сортировки назад методы эффективность процедура По сравнению N^2 Описание Простой выбор По пересылкам N Простые вставки и вставки с N^2 бартером Описание Бинарные вставки N* (по пересылкам N^2) Описание Простой обмен N* Описание Шейкерная N^2 Описание
Улучшенные сортировки методы эффективность процедура Быстрая N* Описание Пирамидальная N* сортировка Шелла Описание N^(3/2) N* Слияниями 5 элементов за 5* 7 сравнений Описание назад
Классы задач по обработке массива 1. Однотипная обработка всех или указанных элементов массива. Пример. 2. Задачи, в результате решений которых, изменится порядок следования элементов массива. Пример. 3. Обработка нескольких массивов одновременно. Пример. 4. Поиск какого то значения среди элементов массива. Пример. назад
Даны массива, которые содержат координаты векторов в n-мерном пространстве. Найти координаты суммы векторов. Program ex 3; const n=200; var a, b, c : array[1. . n] of real; i: integer; begin for i: =1 to n do c[i]: =a[i]+b[i]; end. назад
Переставить элементы массива таким образом, чтобы они шли в обратном порядке. Program ex 2; const n=200; var a: array[1. . n] of real; i, b: integer; begin for i: =1 to n div 2 do begin b: =a[i]; a[i]: =a[n+1 -i]; a[n+1 -i]: =b; end; end. назад
Найти сумму и произведение всех элементов массива. Program ex 1; const n=200; var a: array[1. . n] of real; s, p: real; i: integer; begin s: =0; p: =1; for i: =1 to n do begin s: =s+a[i]; p: =p*a[i]; end; end. назад
Примеры задач на поиск линейный поиск с барьером дихотомический поиск (метод половинного деления). назад
Линейный поиск Рассматриваются все элементы массива. Определяется нет ли совпадения с искомым элементом. Результат: индекс элемента в массиве или сообщение, что такого элемента нет. const n=4 ; type a=array[1. . n] of integer ; var h, i: integer; x: a; procedure Lin. Poisk (var h: integer); var i: integer ; begin i: =1; while x[i]<>5 do begin i: =i+1; if x[i]=5 then h: =i; end; назад
Поиск с барьером Искомое значение записывается как дополнительный элемент массива - барьер. Размерность массива увеличивается на 1. Просматриваются по порядку все элементы массива. Const n=200; Type m=array[1. . n+1] of real; function s 2(a, m, x: real): integer; var i: integer; begin i: =1; a[n+1]: =x; while a[i]<> x do i: =i+1; if i: =n+1 then s 2: =-1; else s 2: =i; end; назад
Бинарный поиск Можно осуществлять только в упорядоченном массиве. Искомое значение сравнивается со средним элементом массива. Если совпадает, то элемент найден. В противном случае, если искомое значение меньше, то поиск осуществляется только в левой части массива, иначе только в правой части. Реализация алгоритма на языке Паскаль назад
Нажимайте на слайд, чтобы просмотреть схему целиком… назад
Простой выбор На каждом шаге (всего шагов(n 1)): 1. Находится наименьший среди всех элементов. 2. Упорядочивается с первым не отсортированным элементом Реализация алгоритма на языке Паскаль назад
Простые вставки и вставки с барьером На i м шаге считается, что часть массива, с первыми i 1 элементами, уже упорядочена, то есть А[1]<=А[2]<=. . . <=A[i l]. Далее берется i тый элемент, и для него подбирается место в отсортированной части массива, такое, что после его вставки упорядоченность не нарушается, то есть требуется найти такое j (0 < j < i 1), что A[j] <=A[i]
Бинарные вставки Этот алгоритм представляет из себя оптимизированную версию сортировки вставками. Отличие заключается в том, что при поиске места, на которое надо вставить элемент ai в уже упорядоченную совокупность a 0 , . . . , ai-1 , определяется алгоритмом деления пополам (отсюда и название алгоритма "бинарные вставки" здесь понимаем как "вставка делением пополам"). назад
Простой обмен Procedure Sort(N: Integer, -Var A: My. Array); var k, i, w: Integer; {k — номер просмотра, изменяется от 1 до n-1; i — номер первого элемента рассматриваемой пары; w — рабочая переменная для перестановки местами элементов массива} begin for k: =1 to n-1 dо {Цикл по номеру просмотра} for i: =1 to n-k do if a[i]>a[i+1] then begin w: =a[i]; a[i]: =a[i+1]; a[i+1]: =w; end; назад
Шейкерная procedure Shaker(a: array[1. . n] of integer); var i, k, x, j, d : integer; begin d: =1; i: =0; for k: =n-1 downto 1 do { k - количество сравниваемых пар } begin i: =i+d; for j: =1 to k do begin if (a[i]-a[i+d])*d>0 then begin x: =A[i]; a[i]: =a[i+d]; a[i+d]: =x; end; {меняем местами соседние элементы} i: =i+d; end; d: =-d; {меняем направление движения на противоположное} end; назад
Быстрая сортировка В массиве выбирается средний элемент и копируется во временную переменную. Затем элементы массива поочередно просматриваются слева направо и справа налево. При просмотре слева направо, отыскиваются элементы, которые не меньше вспомогательной переменной. Его позиция запоминается. При просмотре справа налево, отыскиваются элементы, значения которых не больше вспомогательной переменной. Их индекс запоминается. Найденные элементы обмениваются местами и продолжается поиск до тех пор, пока i тый (слева направо) элемент и j тый (справа налево) элемент не пересекутся. Левая и правая часть разбиваются. Реализация алгоритма на языке Паскаль назад
Пирамидальная сортировка Элементы массива А образуют пирамиду, если для всех значений i выполняются условия: A[i] <А[2*i] и A[i]
Процедура сортировки Procedure Sort; var t, w, i: Integer; begin t: =n div 2+1; {Эта часть массива является пирамидой} for i: =t-l downto 1 do Pr(i, n); {Строим пирамиду только один раз} for i: =n downto 2 do begin w: =a[1]; a[1]: =a[i]; a[i]: =w; {Меняем местами 1 -й и i-й элементы} Pr(1, i-1); {Проталкиваем 1 -й элемент} end; назад
Процедура «проталкивания» элемента Procedure Pr (r, q: Integer); Var r, i, j, v: Integer; pp: boolean; begin i: =r; v: =a[i]; {Индекс рассматриваемого элемента и сам элемент} j: =2*I; {Индекс элемента, с которым происходит сравнение} pp: =False; {Считаем, что для элемента не найдено место в пирамиде} while (j<=q) and not pp do begin if ja[j+l] then inc (j); {Сравниваем с меньшим элементом} if v<=a[j] then pp: =true {Элемент находится на своем месте} else begin a[i]: =a[j]; i: =j; j: =2*i; end; {Переставляем элемент и идем дальше по пирамиде} end; a[i] : =v; end; назад
Сортировка Шелла Недостаток метода сортировки "пузырьком" – работа с рядом стоящими элементами. В результате, элементы, которым надо "добраться" с одного конца массива до другого, делают это крайне долго. Метод Шелла аналогичен методу сортировки "пузырьком", однако работает с далеко отстоящими друг от друга элементами массива. Реализация алгоритма на Паскале назад
Сортировка Шелла Procedure Shell(var a: myarray); var n, d, I, c: integer; p: boolean; begin d: =N div 2; {Расстояние между обрабатываемыми элементами массива, на каждом этапе алгоритма уменьшается в 2 раза вплоть до 0, когда происходит останов алгоритма} while d>0 do begin for j: =1 to N-d do {Перебор всех пар элементов массива, расстояние между которыми равно d} begin i: =j {запоминаем индекс текущего элемента} repeat p: =false; if a[i]
Сортировка слияниями Procedure Sort (i, j: Integer); var t: Integer; begin if i
5 элементов за 7 сравнений Рассмотрим массив А из пяти эле ментов. С помощью процедуры Swap по значению индексов i, j переставляются два элемента. Сравниваем попарно первые четыре элемента и сравниваем максимальные элементы пар. А[1] < А[2] <А[4] и А[3] < А[4]. Далее нужно вставить А[5] в отсортированный массив из трех элементов, а затем вставить А[3] в отсортированный массив из четырех элементов с учетом установленного факта А[3] < А[4]. На то и другое действие отводится по два сравнения. В некоторых случаях, например, если А[5] <А[4], перестановка элементов массива не выполняется. Реализация алгоритма на языке Паскаль назад
begin . . . if a[1]>a[2] then Swap (1, 2); if a[3]>a[4] then Swap (3, 4); if a[2]>a[4] then begin Swap(2, 4); Swap(1, 3); end; if a[5]A[4] then Swap(3, 4); end; назад
Procedure Swap (i, j: Integer); var t: Integer; begin t: =a[i]; a[i]: =a[j]; a[j]: =t end; назад
Простые данные Целые числа Описание с помощью: диаграммы Никлауса Вирта: формы Бекуса Наура: <целое число > : : = [<знак>] I {<цифра>} <знак>: : = + I – <цифра>: : =0|1|2|3|4|5|6|7|8|9 Диапазон значений -32768. . . 32767 Набор операций на Паскале Примеры назад Читать далее…
Набор операций на Паскале Вводятся: операции div (целая часть от деления) и mod (остаток от деления). Приоритеты операций: 1. div и mod; 2. * и / ; 3. + и –. функции и процедуры: Читать далее… inc(x) {получает переменную и увеличивает на 1} dec(x) {получает переменную и уменьшает на 1} pred(x) {возвращает предыдущее значение от х} succ(x) {возвращает следующее значение от х} odd(x) {возвращает значение true, если х- нечетное и false, если х- четное } назад
Примеры 1. Пример использования арифметических операций +, , *, /: (3*b-1)>(2*k/c-3) Читать далее… 2. Пример использования операций div и mod: 3*7 div 2 mod 3/7+3=3*((7 div 2) mod 3)/7+3= =3*(3 mod 3)/7+3=3*0/7+3=0+3=3 Читать далее… 3. Пример использования функций: succ(3)+pred(5)=4+4=8
Простые данные Вещественные числа Описание с помощью: диаграммы Никлауса Вирта: Читать далее… формы Бекуса Наура: <вещественное число> : : =<знак><целое без знака>. <последовательность цифр> | <целое без знака>. <последовательность цифр>E<порядок>|<целое без знака> E <порядок> : : = <целое без знака>|<знак> <целое без знака> <знак> : : = + | Набор операций на Паскале Примеры назад
Набор операций на Паскале Вводятся функции и процедуры: frac(x) {возвращает дробную часть от х} int(x) {возвращает целую часть от х} round(x) {округление х до ближайшего целого} trunc(x) {округление до ближайшего целого, не превышающего х по модулю} назад
Примеры Пример использования функций: round(3. 7) = 4; trunc(6. 2)=6; frac(1. 512)=0. 512; int(7. 6)=7 назад
Простые данные Символьный тип это конечное упорядоченное множество символов. Множество символов берется из таблицы символов, используемой ЭВМ. Кодировка символов ЭВМ – множество символов, которое может обрабатываться данной машиной. Любая кодировка символов отвечает условию: каждый символ имеет свой код. Описание Функции на Паскале: succ (‘a’)=‘b’{возвращает следующий символ} pred(‘d’)=‘c’{возвращает предыдущий символ} chr(32)=‘_‘ { возвращает изображение символа по коду} ord(‘_‘)=32 {возвращает код по изображению символа} назад
Описание диаграмма Никлауса Вирта: Читать далее… форма Бекуса Наура: <символьный тип>: : = var <идентификатор> : char; назад
Простые данные Логический тип Логически тип служит для записи и проверки логических условий. Описание с помощью: диаграммы Никлауса Вирта: Читать далее… формы Бекуса Наура: <логический тип>: : = var <идентификатор> : boolean; Набор операций на Паскале Примеры назад
Набор операций на Паскале 1) операции сравнения (<, >, <=, >=, =, <>); Читать далее… 2) функция odd(x) – {возвращает значение true, если х – нечётное и false в противном случае} Читать далее… 3) not – отрицание and – логическое умножение or – логическое сложение xor – исключающая или
Примеры Var b: boolean; b: =true; {b=true} b: = odd(5); {b=true} b: = not(5=6); {(5=6)= false; not false=true; b=true} b: =(5<6) and (5>=6); {(5<6)=true; (5>=6)=false; (true and false) = f alse; b=false} b: =(5=6) or (7<=8); {(5=6)=false; (7<=8)=true (true or false)=true; b=true} назад
Быстрая сортировка Procedure Quicksort (m, t: Integer); Var i, j, x, w: Integer; begin i: =m; j: =t; x: =A[(m+t) Div 2] ; repeat while f[i]
Sl Procedure SI(k, m, q: Integer; Var a: My. Array); var i, j, t: Integer; d: My. Array; begin i: =k; j: =m +l; t: =l; while (i<=m) and (j<=q) do begin If a[i]<=a[j] then begin d[t]: =a[i]; Inc(i); end else begin d[t]: =a[j]; inc(j); end; inc(t); end; while i<=m do begin d[t]: =a[i]; inc(i); inc(t); end; while j<=q do begin d[t]: =a[j]; inc(j); inc(t) end; for i: =1 to t-1 do a[k+i-1] : =d[i] ; end; назад
Procedure Sort (N: Integer; Var A: My. Array); var i, j, k: Integer; m: Integer; {3 начение максимального элемента рассматриваемой части массива} begin for i: =N down to 2 do begin {Цикл по длине рассматриваемой части массива. Поиск максимального элемента и его номера в текущей части массива} k: =i; m: =A[i]; {Начальные значения максимального элемента и его индекса в рассматриваемой части массива} for j : =1 to i-1 do if a[j]>m then begin k: =j; m: =A[j] end; else if k<>i then begin {Перестановка элементов} a[k]: =a[i]; a[i]: =m; end; назад
Бинарный поиск Type mas = array [1. . n] of integer; var a: mas; x, i, k: integer; p: boolean; procedure search; var i, j, m: integer; p: boolean; begin i: =1; j: =n; m: =0; p: =false; while (i<=j) and not p do begin m: =(i+j) div 2; if a[m]=x then begin p: =true; writeln (‘элемент найден '); end else if a[m]<=x then i: =m+1 else j: =m-1; end; назад
Простые вставки и вставки с барьером Procedure sort(n: Integer; var a: My. Array); var i, j, w: integer; begin for i: =2 to n do begin w: =a[i]; j: =i - 1; while (j>0) and (w
Простые данные Указательный тип Описание с помощью: диаграммы Вирта: формы Бекуса Наура: Читать далее… типизированный указатель: var<имя_указателя>: ^<тип_адресуемой_переменной>; не типизированный указатель: var <имя_указателя>: pointer; Набор операций на Паскале назад
Набор операций на Паскале 1. Определение адреса переменной @ <имя_переменной> Читать далее… 2. Разыменование <имя_указателя>: ^ Читать далее… 3. Присваивание p: = ^integer; q: =^byte; t: =pointer; p: =t; q: =t; 4. Сравнение = < > Читать далее…
Составные данные Вариантная запись Описание с помощью формы Бекуса Наура: <имя записи>: record <поле_1>: <тип_1>; <поле_N><тип_N>; <поле_переключатель> тип of <вариант_1>: (<поле_p>: <тип_p>; …); …. <вариант_N>: (<поле_q>: <тип_q>; …) Пример описания на Паскале назад
Пример описания на Паскале Type bill=record name, publisher : string[20]; case item : char of ‘a’: (author : string[20]; year: 0. . 2008); ‘b’: (data : data); ‘c’: (year: 1900. . 2008; month: 1. . 12; number: integer); end; назад
Файлы Типизированные Типизированный файл это последовательность компонент любого заданного типа (кроме типа "файл"). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту. Читать далее… Описание с помощью формы Бекуса Наура: <типизированный файл>: : =var<имя>: file of<базовый тип> Набор процедур на Паскале назад
Набор процедур Запись в файл: Write(f, список переменных); Чтение из файла: Read(f, список переменных); Смещение указателя файла: Seek(f, n); {Процедура смещает указатель файла f на n-ную позицию. Нумерация в файле начинается с 0} Определение количества компонент: File. Size(f): longint; . Определение позиции указателя: File. Pos(f): longint; Отсечение последних компонент файла: Truncate(f); назад
Файлы Текстовые Текстовый файл – наиболее часто употребляемая разновидность файлов. Текстовый файл представляет собой символьную последовательность, разделённую на строки. Каждая строка заканчивается специальным кодом – маркером конца строки. Весь файл заканчивается маркером конца файла. В текстовый файл можно записать и из него можно прочитать информацию любого типа. Читать далее… Описание с помощью формы Бекуса Наура: <текстовый файл>: : =var<идентификатор>: text Набор процедур на Паскале назад
Набор процедур Чтение из текстового файла: Read(f, список переменных); Read. Ln(f, список переменных); назад
Файлы Нетипизированные файлы это последовательность компонент произвольного типа. Читать далее… Описание с помощью формы Букуса Наура: <нетипизированный файл>: : =var<имя>: file Набор процедур на Паскале назад
Набор процедур Открытие нетипизированного файла: Reset(f, Buf. Size) Rewrite(f, Buf. Size) {Параметр Buf. Size задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение Buf. Size - 1 байт, максимальное - 64 К байт. Если Buf. Size не указан, то по умолчанию он принимается равным 128} Читать далее… Чтение данных из нетипизированного файла: Block. Read(f, X, Count, Quant. Block); {Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 К байтов} Читать далее… Запись данных в нетипизированный файл: Block. Write(f, X, Count, Quant. Block); назад