Курс за второй семестр. Абстрактные типы данных
Вид материала | Задача |
- Программа дисциплины программирование на языке С++ для направления 080700. 62 «Бизнес-информатика», 131.2kb.
- Методические указания для студентов 1 курса факультета математики, механики и компьютерных, 439.36kb.
- Курс биологи,1 семестр ) фен 26 ч. ((1 курс химики, 2 семестр 2 курс биологи, 2 семестр, 45.56kb.
- Структура программы. Часть Структуры данных. 24. Классификация структур данных. Операции, 41.26kb.
- Курс лекций "Базы данных и субд" Ульянов В. С. Лекция Язык sql. Создание таблиц и ограничений, 146.46kb.
- Borland Turbo Pascal, знать простые основные алгоритмы работы с простыми типами данных, 316.19kb.
- Курс, 1 поток, 5-й семестр лекции (34 часа), экзамен, 52.85kb.
- Программа дисциплины Анализ данных средствами ms excel для направления 080102. 65 Мировая, 121.98kb.
- Крыштановский А. О. Анализ социологических данных, 34.07kb.
- Пояснительная записка, 258.04kb.
Программирование и алгоритмические языки.
Курс за второй семестр.
Абстрактные типы данных.
Приближённые к реальности, но отсутствующие в данном языке программирования типы данных, называются абстрактными.
«Программы = алгоритмы (процедуры) + структуры данных»
Н. Вирт
Идею нисходящего проектирования – многошаговый процесс создания (или выбора существующих) специализированных математических языков описания задач (подзадач) – мы ранее применяли к структурам управления. Применение к структурам данных – этот процесс был, как правило, одношаговый. При решении действительно сложных задач процесс нисходящего проектирования продолжается и на выбор промежуточных структур данных, то есть в целом на создание промежуточных абстрактных типов.
Тип
Задача раскраски.
Выяснить, можно ли данную карту правильно раскрасить данным количеством цветов. Если да, то предъявить все возможные раскраски. Раскраска правильная, если никакие две соседние страны не окрашены в один цвет.
Делаем первые выводы относительно определения типа данных.
Type tСтраны = 1..n; {Можно взять произвольный порядковый тип}
tКарта = array [tСтраны,tСтраны] of Boolean; {На этом типе обязана быть определена единственная функция}
var карта: tКарта;
m:cardinal;
Можно: boolean;
Раскраска: tРаскраска; {Определение типа откладываем до определения операций, которые нужны в алгоритме}
Function Правильная (раскраска: tРаскраска):boolean;
{правильная:=i,jtСтраны (соседи (i,j)(i
{Стрелка – логическая связь – «если, то»}
{правильная:= }
Begin
Result:=true;
i:=первая страна;
while (i<=последняя страна) and (Result) do
begin
j:=succ(i);
while (j<=последняя страна) and Result do
begin
if соседи (i,j) then if раскраска (i) = раскраска (j) then Result:=false;
else j:=succ(j);
end;
i:=succ(i);
end;
Begin
{Можно:= раскраска – tРаскраска - правильная}
можно:=false;
раскраска:=первая раскраска;
while not (конечная раскраска) do
Begin
If (правильная раскраска) then
Begin
Можно:=true;
Write (Правильная раскраска);
End;
Раскраска:=следующая раскраска;
End;
End.
Мы отождествляем тип tКарта с функцией “Соседи”, задавая её в виде булевского массива. Не забудь переименовать в алгоритме Соседи на Карта!
tРаскраска: tСтранаtЦвет
array[tСтрана] of tЦвет
Однако основной алгоритм требует, чтобы тип tРаскраска был порядковым. Нам необходима возможность перечислять раскраску.
Перечисление последовательностей фиксированной длины.
n циклов дали бы нужный порядок, но мы не можем выразить такой оператор синтаксически, однако это даёт идею того, в каком порядке можно перебирать последовательности (конечные функции) – в словарном (лексикографическом).
a=a1,…,an
b=b1,…,bn
ai0i0, где i0 – наименьший символ i такой, что aibi и i0 ai=bi
Procedure Следующая ({var Раскраска: tРаскраска;var Кончились:boolean});
{Выдаёт раскраску, следующую за данной, кладёт «Кончились» в true, если таковой нет}
{Стрелка – логическая связь – «если, то»}
{правильная:= }
Begin
Result:=true;
i:=первая страна;
while (i<=последняя страна) and (Result) do
begin
j:=succ(i);
while (j<=последняя страна) and Result do
begin
if соседи (i,j) then if раскраска (i) = раскраска (j) then Result:=false;
else j:=succ(j);
end;
i:=succ(i);
end;
Begin
{Можно:= раскраска – tРаскраска - правильная}
можно:=false;
раскраска:=первая раскраска;
while not (конечная раскраска) do
Begin
If (правильная раскраска) then
Begin
Можно:=true;
Write (Правильная раскраска);
End;
Раскраска:=следующая раскраска;
End;
End.
Мы отождествляем тип tКарта с функцией “Соседи”, задавая её в виде булевского массива. Не забудь переименовать в алгоритме Соседи на Карта!
tРаскраска: tСтранаtЦвет
array[tСтрана] of tЦвет
Однако основной алгоритм требует, чтобы тип tРаскраска был порядковым. Нам необходима возможность перечислять раскраску.
Перечисление последовательностей фиксированной длины.
n циклов дали бы нужный порядок, но мы не можем выразить такой оператор синтаксически, однако это даёт идею того, в каком порядке можно перебирать последовательности (конечные функции) – в словарном (лексикографическом).
a=a1,…,an
b=b1,…,bn
ai0i0, где i0 – наименьший символ i такой, что aibi и i0 ai=bi
Procedure Следующая ({var Раскраска: tРаскраска;var Кончились:boolean});
{Выдаёт раскраску, следующую за данной, кладёт «Кончились» в true, если таковой нет}