Динамические структуры данных реферат

Обновлено: 30.06.2024

Стек создается как линейный список. Пусть Top - указатель на начало стека. Стек удобно строить в обратном порядке. Следующий фрагмент программы демострирует основные операции работы со стеком:

Type ukaz=stak, stak=record inf: integer, next: ukaz, end, Var Top,Tek: ukaz; value: integer Procedure DobavS;

Begin new (Tek) readln (Tek. inf) Tek. next: =Top Top: =Teк End Procedure UdalS Begin Top: =Top. next if Top=0 then writeln (‘нехватка элементов’) End

Для организация очереди можно использовать аналогичный ссылочный тип, при этом необходимо иметь указатели на начальный nach и конечный kon элементы. Очередь удобно строить в прямом порядке (рис.1).

Рис.1. Пример построения очереди в прямом порядке

Циклически связанный список (циклический список) - такой список, в котором связь от последнего узла идет к первому элементу списка. На рис.2 изображен односвязный циклический список. В нем можно получить доступ к любому элементу списка, отправляясь от любой точки.

Рис.2. Пример циклического списка

Наиболее важные операции для односвязных циклических списков:

1. включить элемент слева

2. включить элемент справа

3. исключить узел слева

Если nach1 и nach2 указывают на два разных списка L1 и L2 (см. рис.3), то можно включить справа в список L1 весь список L2, для чего нужно выполнить присваивания, используя промежуточную переменную PPтипа pointer:

Var PP: pointer <. >PP: =nach1. link nach1. link: =nach2. link nach2. link: = PP

Рис.3. Циклический список L1 + L2

Каждый элемент списка с двумя связями содержит два указателя: на соседние слева и справа элементы (см. рис.4). По такому списку удобно двигаться вперед и назад, так как он содержит два входа в список. Для создания двусвязного списка можно использовать следующий тип:

Type ptr=element element=record d: integer right,left: ptr end

Рис.4. Пример списка с двумя связями (двунаправленный список)

Важное преимущество двусвязного списка состоит в том, что для того чтобы удалить элемент tek, достаточно знать только адрес этого узла, так как адреса предыдущего и следующего элементов хранятся в tek. left и tek. right:

tek. left. right: =tek. right tek. right. left: =tek. left

Здесь вы можете проверить, как вы научились работать с двунаправленным списком.

Списки с полутора связями представляют собой чередование элементов с одной и двумя связями. Их преимущество: требуют меньше памяти, чем двусвязные, но ходить по списку можно вперед и назад.

Рис.5. Пример списка с полутора связями

Построение сложных структур в динамической памяти

С помощью указателей можно создавать самые разнообразные структуры, в том числе более сложные, чем простые линейные списки. Это обусловлено тем, что:

1) любой узел может быть началом другого списка;

2) один и тот же узел может быть включен в несколько различных списков.

Применение указателей придает памяти гибкость, необходимую для представления структур, при этом может понадобиться комбинация элементов с одной и двумя связями. На рис.1 можно видеть пример структуры, которая содержит чередование элементов с 1 и 2 связями.

Рис.1. Чередование элементов с 1 и 2 связями.

Для реализации сложной структуры следует описать два типа элементов:

Type ptr1=element1 element1=record info: string link: ptr1 end ptr2=element2 element2=record info: integer rlink,dlink: ptr2 end

Пусть имеются следующие описания:

Var E1: ptr1 E2: ptr2 p: pointer

Тогда чтобы присоединить элемент Е1 к элементу Е2, следует исполнить:

p: = E1 E2. dlink: =p

В частном случае, когда адресная часть элемента Е2 ссылается всегда только на адрес элемента одного и того же типа, можно пользоваться описанием:

Type ptr2=element2 element2=record info: integer rlink: ptr2 dlink: ptr1 end

и тогда можно выполнять присваивание: Е2. dlink: = E1.

Бинарные деревья

Деревья относятся к разряду структур, которые удобно строить в динамической памяти с использованием указателей. Наиболее важный тип деревьев - двоичные (бинарные) деревья, в которых каждый узел имеет самое большее два поддерева: левое и правое. Подробнее, если имеем дерево вида (рис.1a), то ему может соответствовать в динамической памяти структура (рис.1б).

Рис.1. Двоичное дерево и его представление с помощью списочных структур памяти а - двоичное дерево; б - представление дерева с помощью списков с использованием звеньев одинакового размера

Для построения такого бинарного дерева используется следующий ссылочный тип:

Type Ptr=Node Node=record Info=Char Llink,Rlink=Ptr End

Для работы с деревьями имеется множество алгоритмов. К наиболее важным относятся задачи построения и обхода деревьев. Пусть в программе дано описание переменных:

var t: ptr; s: integer; c: char; b: boolean;

Тогда двоичное дерево можно построить с помощью следующей рекурсивной процедуры:

procedure V (var t: ptr) var st: string begin readln (st) if st<>'. 'then begin new (t) t. info: =st V (t. Llink) V (t. Rlink) end else t: =nil end

Структура дерева отражается во входном потоке данных: каждой вводимой пустой связи соответствует условный символ (в данном случае точка). Для примера на рис.1 входной поток имеет вид:

A B D. G. C E. F H. J.

Существует три основных способа обхода деревьев [1]: в прямом порядке, обратном и концевом. Обход дерева может быть выполнен рекурсивной процедурой и процедурой без рекурсии (стековый обход). В приведенной ниже рекурсивной процедуре выполняется обход дерева в обратном порядке.

Рrocedure PR (t: ptr) begin if t<>nil then begin PR (t. Llink) writeln (t. info) PR (t. Rlink) end end

Нерекурсивный алгоритм обхода дерева в прямом порядке:

Пусть T - указатель на бинарное дерево; А - стек, в который заносятся адреса еще не пройденных вершин; TOP - вершина стека; P - рабочая переменная.

1. Начальная установка: TOP: =0; P: =T.

2. Если P=nil, то перейти на 4.

3. Вывести P. info. Вершину заносим в стек: TOP: =TOP+1; A [TOP]: =P; шаг по левой ветви: P: =P. llink; перейти на 2.

4. Если TOP=0, то КОНЕЦ.

5. Достаем вершину из стека: P: =A [TOP]; TOP: =TOP-1;

Шаг по правой связи: P: =P. rlink; перейти на 2.

2. Условия задачи

17.16. Деревом поиска, или таблицей в виде дерева, называется двоичное дерево в котором слева от любой вершины находятся вершины с элементами, меньшими элемента из этой вершины, а справа - с большими элементами (предполагается, что все элементы дерева попарно различны и что их тип (ТЭД) допускает применение операций сравнения); пример такого дерева показан на рис.21.

Считая описанными тип дерево (см. выше) и тип файл type файл=file of ТЭД; определить функцию или процедуру, которая:

а) проверяет, входит ли элемент Е в дерево поиска Т;

б) записывает в файл f элементы дерева поиска Т в порядке их возрастания;

в) добавляет к дереву поиска Т новый элемент Е, если его не было в T;

Разработка алгоритмов на динамических структурах данных. Описание структуры данных "стек". Процедуры добавления и удаления элемента, очистки памяти. Код распечатки содержимого всего стека. Инструкция пользователя, код программы, контрольный пример.

МИНИСТЕРСТВО НАУКИ И ОБРАЗОВАНИЯ УКРАИНЫ

Одесский национальный политехнический университет

Институт компьютерных систем

Кафедра "Компьютерные интеллектуальные системы и сети"

Динамические структуры данных

Аннотация

Целью данной работы служит разработка эффективных алгоритмов на динамических структурах данных.

Главной особенностью динамических структур является возможность изменения их структуры и размера в процессе работы программы. Это существенно повышает гибкость программы, размер структуры ограничивается только размером памяти машины. При этом такая гибкость обходится несколько большими затратами памяти на хранение самой структуры и её обработку, поскольку дополнительную память требуют указатели.

Алгоритмы работы с этими структурами очень сильно зависят от вида самой структуры.

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

Содержание

  • 1. Теоретические сведения
  • 1.1 Описание структуры данных "стек"
  • 2. Разработка
  • 2.1 Процедура добавления элемента
  • 2.2 Процедура удаления элемента
  • 2.3 Процедура очистки памяти
  • 2.4 Распечатка содержимого
  • 3. Инструкция пользователя
  • 4. Код программы
  • 5. Контрольный пример
  • Заключение
  • Перечень используемой литературы
  • Приложения

В этом разделе мы ознакомимся с динамическими структурами данных и собственно стеком.

Достоинства динамических структур данных

Динамические структуры данных по определению характеризуются отсутствием физической смежности элементов структуры памяти непостоянством и непредсказуемостью размера (числа элементов4) структуры в процессе её обработки. В этом разделе рассмотрены особенности динамических структур, определяемые их первым характерным свойством.

Поскольку элементы динамической структуры располагаются по непредсказуемым адресам памяти, адрес элемента такой структуры не может быть вычислен из адреса начального или предыдущего элемента. Для установления связи между элементами динамической структуры используются указатели, через которые устанавливаются явные связи между элементами. Такое представление данных в памяти называется связным.

Элемент динамической структуры состоит из двух полей:

информационного поля или поля данных, в котором содержатся те данные, ради которых и создается структура; в общем случае информационное поле само является интегрированной структурой-вектором, массивом, записью и т.п.;

поле связок, в котором содержатся один или несколько указателей, связывающий данный элемент с другими элементами структуры.

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

Достоинства связного представления данных:

в возможности обеспечения значительной изменчивости структур;

размер структуры ограничивается только размером памяти машины;

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

При этом существуют и недостатки:

работа с указателями требует, как правило, более высокой квалификации от программиста;

на поля связок расходуется дополнительная память;

доступ к элементам связной структуры может быть менее эффективным по времени.

Применение динамических структур

Последний недостаток является в наибольшей мересерьёзным и именно им ограничивается применимость связного представления данных. Если в смежном представлении данных для вычисления адреса любого элемента нам во всех случаях достаточно было номера элемента или информации, содержащейся в дескрипторе структуры, то для связного представления адрес элемента не может быть вычислен из исходных данных.

Дескриптор связной структуры содержит один или несколько указателей, позволяющих войти в структуру, далее поиск и требуемого элемента выполняется следованием по цепочке указателей от элемента к элементу. Поэтому связное представление практически никогда не применяется в задачах, где логическая структура данных имеет вид вектора или массива - с доступом по номеру элемента, но часто применяется в задачах, где логическая структура требует другой исходной информации доступа (таблицы, стеки, списки, деревья и т.д.).

Задание курсового проекта

По списку номер 2, тогда имеем следующее задание.

Реализовать стек, содержащий 4-ре поля:

Имя функции, возвращаемое значение, количество параметром и сами параметры.

Реализовать для данного стека работу следующих операций:

очистка памяти от стека;

вывод на экран всех значений списка;

проверка о переполнении стек;

1.1 Описание структуры данных "стек"

Стеком называется динамическая структура данных, добавление компоненты в которую и исключение компоненты из которой производится из одного конца, называемого вершиной стека. Стек работает по принципу LIFO (Last-In, First-Out) - поступивший последним, обслуживается первым.

Обычно над стеками выполняется три операции:

начальное формирование стека (запись первой компоненты);

добавление компоненты в стек;

выборка компоненты (удаление).

Для формирования стека и работы с ним необходимо иметь две переменные типа указатель, первая из которых определяет вершину стека, а вторая - вспомогательная.

2. Разработка

Ниже приведена сама структура:

char strFName [255] ; // имя функции

char strRValue [6] ; // возвращаемое значение

int numPar; // количество введених параметров

char** pParams; // указатель на парамаетры

bool bFilled; // заполнен ли элемент

tStack* pNext; // указатель на следующий элемент

pNext = NULL; // задаём начальные параметры стека, что он пуст

void Add (char* strFName_, char* strRValue_, int numPar_, char** pParams_);

void Print (TMemo* memo);

strFName - поле, хранящее имя функции;

strRValue - поле, хранящее возвращаемое значение;

numParams - поле, хранящее количество параметров;

pRarams - поле указателя, хранящего адресс значений параметров;

Далее приведены описания процедур:

void Add (char* strFName_, char* strRValue_, int numPar_, char** pParams_);

void Print (TMemo* memo);

2.1 Процедура добавления элемента

Ниже приведен код процедуры добавления элемента в стек:

tStack* temp; // создаём указатель temp типа tStack

int num = 0; // количество элементов 0

int max_num = 1000; // максимальное количество элементов равно 1000

void tStack:: Add (char* strFName_, char* strRValue_, int numPar_, char** pParams_)

if (num == (max_num-1)) MessageBox ("Almost Overload", "Warning ", MB_OK); // если элементов на единицу меньше максимального количества элементов, программа предупредит диалоговым окном

if (num == max_num) // если элементов максимальное количество

MessageBox ("Overload", "", "Error", MB_OK); // диалоговое окно с ошибкой

return; // процедура добавления элемента останавливается

num++; // счетчик количества введенных элементов

if (pNext) // если есть ссылка на следующий элемент

pNext->Add (strFName_, strRValue_, numPar_, pParams_); // добавляем элемент с адресом pNext

if (! bFilled) // если элемент заполнен

strcpy (strFName, strFName_); // копируем значения строк из одной переменной в другую

strcpy (strRValue, strRValue_);

pParams = new char* [numPar] ;

for (int i = 0; i Add (strFName_, strRValue_, numPar_, pParams_); // добавляем элемент

В этой функции реализована и проверка на переполнение стека. Проверка переполнения выполняется по количеству введенных элементов int max_num = 1000; и счётчику текущего элемента num:

if (num == (max_num-1)) MessageBox ("Almost Overload", "Warning ", MB_OK); // если элементов на единицу меньше максимального количества элементов, программа предупредит диалоговым окном

if (num == max_num) // если элементов максимальное количество

MessageBox ("Overload", "", "Error", MB_OK); // диалоговое окно с ошибкой

return; // процедура добавления элемента останавливается

num++; // счетчик количества введенных элементов

Реализация ввода параметров (по определенному введенному количеству) выполнена через массив указателей.

2.2 Процедура удаления элемента

Ниже приведен код удаления элемента:

void tStack:: Delete ()

if (pNext) // если есть следующий элемент

if (pNext->pNext) // если есть более 1-го элемента

pNext->Delete (); // запускаем рекурсивно метод Delete () для следующего элемента

delete pNext; // удаляем в памяти адрес указанный pNext

pNext = NULL; // присваеваем значение указателя pNext равное нулю

По определению стека - удалять можно только последний элемент, не разрушая стека.

2.3 Процедура очистки памяти

Процедура очистки памяти от всего стека, код:

void tStack:: Free ()

if (temp) delete temp; // если есть временная переменная temp, то очистить от неё память

if (pNext) // если есть хотя бы один элемент

temp = this; // temp присваивается текущее значение

pNext->Free (); // запускаем метод Free () для следующего элемента

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

2.4 Распечатка содержимого

Ниже приведен код распечатки содержимого всего стека:

void tStack:: Print (TMemo* memo)

memo->Lines->Add ("* - -------------- - *"); // вывод на экран значений

memo->Lines->Add (IntToStr (numPar));

for (int i = 0; i Lines->Add (pParam [i]); // добавление указателя pParam [i]

if (pNext) // если есть следующий элемент

pNext->Print (memo); // рекурсивно запустить распечатку следующего элемента

3. Инструкция пользователя

В этом разделе будет описано как пользоваться разработанной программой.

Если нужно добавить элемента, то следуйте следующим пунктам:

введите в поле "Имя функции" имя вашей функции;

введите в поле "Возвращаемое значение" возвращаемое значение вашей функции;

введите в поле "Параметры" ваши параметры (максимум по6 символов, по условию) через знак "; " (точка с запятой);

нажмите кнопку добавить.

Если нужно удалить элемент, то нажмите кнопку "Удалить" и последний элемент стека очиститься из памяти.

Если нужно очистить память от всего стека сразу, то нажмите кнопку "Очистить".

Если нужно получить данные, введенные в стек, то нажмите кнопку "Распечатать" и программа в поле Edit выведет все элементы стека в порядке "снизу-вверх", т.е. сначала к концу.

До сих пор речь шла только об объектах данных, для которых компилятор C предоставляет память и ее количество и величина должны быть определены к началу перевода программы в машинные коды. Такие объекты называют статическими.

Работать с ними не всегда удобно, так как в процессе выполнения программы возникает необходимость увеличить размеры памяти, выделенной для этой структуры. Для борьбы с этим необходимо определять такие объекты с максимальной величиной.

Наиболее приемлемым решением здесь будет применение динамически распределяемой памяти, т.е. определять объекты во время действия, т.е. динамично. Это решение позволяет оперативно освобождать большое количество памяти и избегать ее переполнения или напрасного расходования при статическом распределении.

Динамические объекты определяются несколько по-другому. К ним обращаются не по имени, а только по их адресу. Эта адресация возникает при распределении памяти и назначается обычно с помощью переменных-указателей. Динамическое распределение памяти происходит посредством стандартных функций языка Cи:

· void *malloc (size_t size) – занимает определенную связную область памяти и поставляет из нее начальный адрес.

· void *calloc (size_t nobj, size_t size) – возвращает начальный адрес большой области; содержание этой области инициализируется значением 0.

· void * realloc (void *ptr, size_t size) - изменение величины размещения блока памяти.

· void free(void *) – используется для освобождения области памяти, которая больше не используется.

· size_t sizeof (something) – определяет длину аргумента.

При использовании указателей, которые служат в качестве значений, возвращаемых функцией, нужно следить, чтобы они не указывали на локальные объекты, которые исчезают после работы функции.

7.2 Динамические структуры данных

Динамические структуры данных, как поясняет Юрген Плате в следующих параграфах, изменяют свою структуру и занятое ими пространство памяти во время выполнения программы. Они формируются из отдельных элементов, так называемых 'узлов', между которыми существуют определенные взаимосвязи. Речь в основном при этом идет о структурах, которые обозначаются как 'списки' или 'деревья'.

· Линейные списки - простые цепочные списки, двойные цепочные списки, специальные формы, буфер(FIFO), стек(LIFO).

· Деревья - Бинарные деревья – 2 соседа, многодорожные деревья - больше чем 2 соседа.

Линейные списки используют элементы, в которых указаны связанные сведения в форме строки символов. Элементы списков можно представить наглядно следующим образом:

Информация элементов списка (строки символов, например, имя) Указатель на следующий элемент

При построении цепочного списка отдельные элементы списка выстраиваются в определенном порядке друг за другом:


где символ электрической массы в конце списка указывает на NULL-указатель, который показывает конец списка, а root - указатель, показывающий происхождение списка (как правило, глобальная переменная)

Еще одна важная динамическая структура, о которой рассказывает автор в этой главе – древовидная. Древовидные структуры играют очень важную роль в организации данных. Их используют в следующих случаях:

· при построении родословного дерева;

· как организационная структура предприятия

· при распределении текста по главам, разделам, абзацам и т.д.

Дерево определяется следующим образом:

· Древовидные структуры имеют разветвления, которые могут исходить из начального элемента структуры и из самих разветвлений до тех пор, пока конечных точек не достигнут.

· Элементы дерева называют узлами, причем начальный элемент называется корневым узлом, а конечные точки – листами.

· Линии соединения двух узлов называется ребрами. Последовательность ребер от корня до любого узла называется путем.

· Узлы, которые одинаково удалены от корня образуют уровень дерева. Общее число уровней указывает глубину дерева.

· Максимальное количество наследников, которые имеет узел, определяют степень дерева. Дерево степени 2 - это бинарное дерево, наиболее важный случай.

Древовидная структура имеет рекурсивную природу, так как наследники узла соответственно могут пониматься как корни деревьев. Бинарное дерево можно изобразить следующим образом:


Таким образом, динамические структуры данных, как показывает автор, являются наиболее эффективным способом распределения оперативной памяти и соответственно необходимо их использовать в программе, применяя указатели.

Раздел: Информатика, программирование
Количество знаков с пробелами: 61871
Количество таблиц: 4
Количество изображений: 0

Пример готовой курсовой работы по предмету: Программирование

Содержание

Глава 1. Динамические структуры данных 4

1.1 Общие понятия и определения динамических структур данных 4

1.2 Объявление динамических структур данных 10

2. Организация данных в списковые структуры 15

1. Однонаправленные (односвязные) списки 16

2. Двунаправленные (двусвязные) списки 25

СПИСОК ЛИТЕРАТУРЫ 38

Приложение 1 39

Выдержка из текста

Введение

Актуальность выбранной темы. Актуальность выбранной для исследования очевидна. В наше время, когда информация имеет огромное значение, научиться правильно с ней работать и использовать различные инструменты для этой работы становиться архиважным. Компьютер, сейчас является универсальным помощником человеку во всех сферах деятельности. Использование динамических величин предоставляет целый ряд возможностей. Привлечение динамической памяти позволяет увеличить объем обрабатываемых данных. Если потребность в каких-то данных отпала до окончания программы, то занятую ими память можно освободить для другой информации. Использование динамической памяти позволяет создавать структуры данных переменного размера.

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

Данные проблемы решает такой тип хранения данных как динамический список. Компоненты добавляются и удаляются во время выполнения программы, и их количество зависит исключительно от размера доступной памяти. Тем не менее, за это преимущество приходится расплачиваться недостатком — в один момент времени нам доступны максимум 3 компонента.

Память в программах где используются динамические структуры данных, следует распределять во время выполнения программы и по мере нужности отдельными блоками. Блоки нужно связывать друг с другом с помощью указателей. Динамическая структура данных это способ организации данных при котором структура данных размещается в динамической памяти и ее размер изменяется во время выполнения программы.

Теоретические основы организации динамических структур данных описаны в работах следующих авторов Кнут Д., Грисс Д., Танненбаум Э., Цикритзис Д., Бернстайн Ф., Bays С.А., Fenton I.S, Paim P.W., Campbell I.A., Shore J. и др.

Объектом исследования данной курсовой работы являются динамические структуры данных. Исследуются их виды, преимущества и недостатки.

Предметом исследования является организация данных в списковые структуры. Описываются способы объявления и алгоритмы создания при написании программ.

Цель курсовой работы: изучить понятия, классификацию, объявления и особенности доступа к данным в динамических структурах, работу с памятью при использовании структур в программе, а также понятия, классификацию и объявление списков, особенности доступа к данным и работу с памятью при использовании однонаправленных и двунаправленных списков, научиться решать задачи с использованием списков на языке C.

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

Понятие списка хорошо известно из жизненных примеров: список студентов учебной группы, список призёров олимпиады, список документов для представления в приёмную комиссию, список почтовой рассылки, список литературы для самостоятельного чтения и т.п.

Для того чтобы изучение данной темы было успешным и для закрепления полученных данных необходимо решить ряд задач: рассмотреть основные понятия и определения динамических структур данных, способы их объявления, инициализацию динамических структур, методы доступа к данным динамических структур, размещение их в памяти, преимущества и недостатки использования динамических структур в программах. Во второй главе курсовой работы мы ознакомимся с определениями и видами списков, структурой и способами объявления однонаправленных и двунаправленных списков, основными операциями над элементами списков.

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

Список использованной литературы

1. Айен Синклер "Большой толковый словарь компьютерных терминов", М.: 1998 г.

2. Архангельский А. Я. "Программирование в Delphi 4", М.: 1999 г.

3. Архангельский А. Я. "Программирование в C++", М.: 2000 г.

4. Бабушкина И.А., Бушмелева Н.А., Окулов С.М., Черных С.Ю. Конспекты по информатике. – Киров, 1997.

5. Вирт Н. "Алгоритмы и структуры данных", Москва Изд. Мир, 1989 г.

6. Вирт Н., Алгоритм + структура данных = программа.

7. Давыдов В.Г. Программирование и основы алгоритмизации.2-е изд., стер. — М.:Высш.шк.,2005.-447 с.: ил. ISDN 5-06-004432-7.

8. Грэхем Р., Кнут Д., Паташник О. Конкретная информатика. – М.: Мир, 1988.

9. Гудмэн Д. "Управление памятью для всех", Киев 1995 г.

10. Зубов В. С. "Справочник программиста", М.: 1999 г.

11. Информатика и образование, № 5 – 1999 г.

12. Кнут Д. "Искусство программирования для ЭВМ", т.1 Основные алгоритмы, Изд. Мир М.: 1976 г.

13. Кормен Т. и другие "Алгоритмы построения и анализ", М.: 2000 г.

14. Культин Н. Б. C++ Builder в задачах и примерах. Издательство Санкт-Петербург ХВ-Петербург. 2005 г.

15. Мюррей У., Паллас К. "VisualC++", М: BHV, 1996

16. Подласый И. П. Учебник для студентов высших педагогических учебных заведений, М.: Просвещение 1996 г.

17. Райнтли, Абстракция и структура данных.

18. Усова А. В. "Формирование у школьников понятий в процессе обучения", М.: Педагогика, 1986 г.

19. Уэйт М., Прата С. "Язык Си", М: МИР, 1988

20. Хабибуллин И.Ш. Программирование C++: Пер. с англ. — 3-е изд. — СПб.: БХВ-Петербург, 2006. — 512 с.

Читайте также: