Проектирование и реализация абстракций типов данных
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
Содержание
Введение
Текст программы
Результаты выполнения программы
Описание программы
Заключение
Список использованных источников
Введение
Денис Ричи разработал и первым реализовал язык программирования C на DEC PDP-11 с операционной системой UNIX. Язык является результатом разработки старого языка BCPL. Мартин Ричард разработал BCPL под влиянием созданного Кеном Томсоном языка B, который привел к разработке C в 1980 году.
В течение многих лет стандартом C де-факто была версия, поставляемая для операционной системы UNIX System V. Растущая популярность компьютеров привела к созданию множества приложений для C.
C часто называют языком среднего уровня. Это определение означает, что он объединяет элементы языков высокого уровня с функциональностью ассемблера.
Известно, какое значение приобретает сегодня объектно-ориентированное программирование, учитывая возрастающие требования к качеству, надежности и пользовательскому интерфейсу приложений. Сложность и объем программ все время растут. В свете этого объектно-ориентированные языки, и прежде всего C++, становятся едва ли не единственным средством решения встающих перед программистом задач.
Наиболее важным понятием в объектно-ориентированном программировании является понятие объекта. Объект-это логическая единица, которая содержит данные и правила (методы) обработки этих данных. В языке С++ в качестве таких правил обработки выступают функции.
Чтобы определить объект в С++ , надо сначала определить его форму с помощью ключевого слова class.
Описание класса производится следующим образом:
сlass:
{
[]
…
};
Спецификатор видимости определяет степень доступности членов класса и может принимать значения:(закрытый) - доступный только внутри методов и друзей этого класса;(защищенный) - доступный только внутри методов, друзей этого класса и производных от него классов;(открытый) - доступный из произвольной программной среды.
Членами класса могут быть:
?Информационные поля ,которые определяются как поля структуры;
?Операции- функции члена класса, которые определяются как прототипы функций.
Очевидно, что функции члены класса должны компилироваться всегда, когда вносится какое-либо изменение в описание класса. В идеале такое изменение никак не должно отражаться на пользователях класса. К сожалению, это не так. Для размещения переменной классового типа компилятор должен знать размер объекта класса. Если размер этих объектов меняется, то файлы, в которых класс используется, нужно компилировать заново.
Этой сложности можно избежать, представив каждый объект класса как указатель на настоящий объект. Так как все эти указатели будут иметь одинаковый размер, а размещение настоящих объектов можно определить в файле, где доступна закрытая часть, то это может решить проблему. Однако решение подразумевает дополнительные ссылки по памяти при обращении к членам класса, (т.е включает по меньшей мере один вызов программ выделения и освобождения свободной памяти).
Но почему же пользователям класса не разрешается обращаться к закрытым членам, почему их описания должны приводиться в заголовочных файлах, которые, как предполагается, пользователь читает? Ответ - эффективность. Во многих системах и процесс компиляции, и последовательность операций, реализующих вызов функции, проще, когда размер автоматических объектов известен во время компиляции.
Подобно функциям, классы также могут быть параметризованы одним или несколькими типами. Типичным примером такой возможности могут служить классы с неизвестными заранее типами элементов, которые реализуются с помощью шаблонов классов. В качестве примера рассмотрим шаблон класса, реализующий очередь.
Файл UnQLimSz.h
Содержит стандартные и пользовательские включаемые файлы и определение шаблонного класса для работы с универсальной очередью ограниченного размера на базе массива. В шаблоне классов реализованы следующие операции с очередью:
* инициализация очереди (конструктор);
* разрушение очереди с освобождением занятой динамической памяти (деструктор);
* занесение элемента с левого конца;
* занесение элемента с правого конца;
* извлечение элемента с левого конца;
* извлечение элемента с правого конца;
* печать состояния очереди с использованием указателя на левый конец очереди;
* печать состояния очереди с использованием указателя на правый конец очереди.
Добавление элемента в правый конец очереди :: AddRight(
// false - элемент не добавленT
&add ) // Данное для добавляемог элемента
{
// Очередь заполнена?( Size>=MaxSize )
{false;
}
// Добавляем элемент в очередь= ( Right+1 ) % MaxSize; pQueue[ Right ] = add;++;true;
}
// Добавление элемента в левый конец очереди :: AddLeft(
// false - элемент не добавленT
&add ) // Данное для добавляемого элемента
{
// Очередь заполнена?( Size>=MaxSize )
{false;
}
// Добавляем элемент в очередь[ Left ] = add;= ( Left+MaxSize-1 ) % MaxSize; Size++;true;
}
// Извлечение элемента из левого конца очереди :: OutLeft(
// false - извлечение не выполнено&out ) // Значение, которое извлекли
{
// Очередь пуста?( Size==0 )
{false;
}
// Извлекаем элемент из очереди= ( Left+1 ) % MaxSize; out = pQueue[ Left ];-;true;
}
// Извлечение элемента из правого конца очереди :: OutRight(