Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Объектно-ориентированная модель



1. Основные принципы объектно-ориентированного программирования (4 часа).

1.1. Эволюция методологий программирования.

1.1.1. Начало начал, или первое поколение языков программирования.

1.1.2. Развитие алгоритмических абстракций, или второе поколение языков программирования.

1.1.3. Модуль как единица построения программных систем, третье поколение языков программирования.

1.1.4. Зарождение объектной модели, четвертое поколение языков программирования.

1.1.5. Объектные языки программирования, объектно-ориентированные языки программирования, объектно-ориентированный анализ, дизайн и проектирование.

1.1.6. Парадигмы программирования.

1.2. Составные части объектного подход.

1.2.1. Абстрагирование.

1.2.2. Инкапсуляция.

1.2.3. Модульность.

1.2.4. Иерархия.

1.2.5. Типизация.

1.2.6. Параллелизм.

1.2.7. Сохраняемость.

 

2. Объектно-ориентированная модель (2 часа).

2.1. Понятие объекта.

2.1.1. Свойства, присущие объектам.

2.1.2. Состояние.

2.1.3. Поведение.

2.1.4. Идентичность.

2.2. Отношения между объектами.

2.2.1. Типы отношений.

2.2.2. Связь (ассоциация).

2.2.3. Агрегация.

 

3. Классы (2 часа).

3.1. Природа классов.

3.2. UML – унифицированный язык моделирования. Четырехуровневая метамодель MOF.

3.3. Отношения между классами.

3.3.1. Типы отношений.

3.3.2. Ассоциация.

3.3.3. Агрегация, композиция.

3.3.4. Использование.

3.3.5. Наследование.

3.3.6. Инстанцирование.

3.4. Отношения между классами и объектами.

 

Инструментальные средства ООП языка программирования C++

4. Основные алгоритмические отличия C++ от C (2 часа).

4.1. Использование ссылок. Передача аргументов функции по ссылке.

4.2. Использование констант.

4.3. Логические тип и перечисления.

4.4. Операторы управления динамической памятью, инициализация массивов.

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

4.6. Функциональный полиморфизм.

4.7. Пространства имен и исключения (краткий обзор).

4.8. Библиотека ввода вывода (краткий обзор iostream).

 


5. Средства объектного программирования языка C++ (6 часов).

5.1. Представление объектов и классов.

5.1.1. Реализация поведения объектов на примере добавления функций-членов в структуры. Структура как вырожденный класс.

5.1.2. Структура объявления класса.

5.1.3. Доступ к членам класса.

5.1.4. Поля данных класса как механизм реализации состояния объекта.

5.1.5. Функции члены класса как механизм реализации поведения объекта.

5.1.6. Спецификаторы доступа для обеспечения инкапсуляции.

5.1.7. Средства управления жизнью объекта. Конструирование и уничтожение объектов и массивов объектов.

5.1.8. Особенности использования конструктора копии, конструктора по умолчанию, оператора присваивания.

5.1.9. Описание селекторов и модификаторов.

5.1.10. Перегрузка операторов C++ как реализация поведения с предопределенным смыслом.

5.1.11. Дружественность как механизм нарушения инкапсуляции. Достоинства и недостатки механизма дружественности.

5.1.12. Статические поля и методы классов. Инициализация статических полей.

5.2. Реализация отношений между объектами и классами.

5.2.1. Ассоциация и агрегация объектов и классов. Зависимость по времени жизни.

5.2.2. Использование и зависимость от интерфейсов.

5.2.3. Объекты при передаче параметров и возврате из методов.

5.2.4. Варианты реализации отношения клиент-сервер.

5.2.5. Внутренние классы.

 

6. Средства объектно-ориентированного программирования С++ (7 часов).

6.1. Наследование как средство организации иерархий классов. Принцип замещения Лисковой.

6.2. Одиночное наследование.

6.2.1. Понятие производного класса.

6.2.2. Управление доступом в производных классах.

6.2.3. Конструкторы и деструкторы, совмещение имен методов при наследовании, иерархии.

6.2.4. Абстрактные классы и виртуальные функции.

6.2.5. Виртуальный полиморфизм.

6.2.6. Информация о типе на этапе выполнения. RTTI.

6.3. Множественное наследование.

6.3.1. Проблема множественного наследования. Виртуальное наследование как средство разрешения коллизий.

6.3.2. Порядок вызовов конструкторов и деструкторов при множественном наследовании.

6.3.3. Чистые виртуальные классы, понятие интерфейса.

6.3.4. Принципы дизайна иерархий классов. OCP, DIP, ISP.

6.4. Пространства имен.

6.4.1. Пространства имен как средство реализации модульности.

6.4.2. Поиск имен и разрешение конфликтов.

6.4.3. Объединение пространств имен.

6.4.4. Принципы дизайна пакетов.

6.5. Обработка исключений.

6.5.1. Обработка ошибок.

6.5.2. Группировка и перехват исключений.

6.5.3. Управление ресурсами.

6.5.4. Исключения и эффективность.

6.5.5. Альтернативные методы обработки ошибок.

6.5.6. Стандартные исключения.

 

7. Обобщенное программирование (3 часа).

7.1. Шаблоны классов.

7.1.1. Определение шаблона.

7.1.2. Инстанцирование.

7.1.3. Параметры шаблонов и проверка типов.

7.2. Шаблоны функций.

7.3. Специализация.

7.4. Наследование и шаблоны.

 

8. Стандартная библиотека С++ (6 часов).

8.1. Библиотека стандартных шаблонов.

8.1.1. Общие сведения (понятия контейнеров, итераторов и объектов-функций).

8.1.2. Контейнеры (виды контейнеров, последовательные и ассоциативные контейнеры, адаптеры).

8.1.3. Итераторы (итератор как обобщение указателя, классы итераторов).

8.1.4. Алгоритмы (примеры алгоритмов с использованием итераторов: алгоритмы сортировки, алгоритмы, не изменяющие содержание контейнера, алгоритмы, изменяющие содержание контейнера).

8.2. Библиотека ввода-вывода.

8.2.1. Потоки вывода. Вывод типов определяемых пользователем.

8.2.2. Потоки ввода. Ввод типов определяемых пользователем.

8.2.3. Форматирование в потоках ввода-вывода.

8.2.4. Буферизация.

 

Программа практических занятий (36 ч.)

Ассистент Антон Валентинович Адаманский

 

1. Повторение С.

· Средства поддержки модульного программирования С: раздельная компиляция, директивы препроцессора (include, ifdef, ifndef), библиотеки.

· Контейнеры: списки, динамический массив, ассоциативный массив

2. Отличие программ С++ от С.

· Ссылки

3. Классы. Инкапсуляция.

· Конструкторы и деструкторы

· Модификаторы доступа

4. Классы. Инкапсуляция (продолжение).

· Вложенные классы

· Переопределение операций


5. Классы. Расширения.

· delete[]

· Статические члены

· Код, генерирующийся по умолчанию: конструктор по умолчанию, конструктор копирования и оператор присваивания

· Операторы преобразования

· Операторы > > и < <

· Explicit конструкторы

6. Наследование и полиморфизм.

7. Исключения.

8. Потоки ввода/вывода.

9. Шаблоны.

10. Стандартная библиотека шаблонов (STL).

 

Курсовые работы

 

Задание № 1. Понятия класса и объекта. Механизм переопределения операций на примере классов Vector и Matrix

 

1) Определить класс Vector, представляющий собой вектор в трехмерном пространстве, с началом в точке (0, 0, 0) и концом в точке (x, y, z). Использовать float переменные для представления координат вектора. Vector должен хранить указатель на массив float. Массив создается динамически в конструкторе через оператор new. В массиве хранятся координаты конца вектора.

 

Определить в классе Vector следующие операции (функции):

  • конструктор копирования
  • оператор присваивания
  • деструктор
  • +, -, =, +=, -=, * (друг с другом)
  • *, /, *=, /= (со скалярным аргументам)
  • [] (взятие координаты вектора, например: v[0], v[1])
  • конструктор копирования
  • операторы > > и < < для ввода/вывода вектора через cin/cout
  • invert() // поворот вектора на 180 градусов

 

Определить операцию умножения на скаляр, указанного в качестве первого аргумента (например v1=3*v2) как внешнюю функцию (не функцию-член класса Vector).

 

Написать тестовую глобальную функцию, показывающую работу каждого оператора.

 

Защитить состояние объекта от некорректного доступа. Везде, где возможно, использовать в качестве аргументов константные ссылки, возвращать ссылки и использовать модификатор const для функций/операторов. Например:

 

Vector operator+(const Vector& v1, const Vector& v2);

Vector& operator+=(const Vector& v);

float operator[](int pos) const;

float& operator[](int pos);

void print() const;

 

2) Используя класс Vector, написать класс Matrix, представляющий матрицу 3*3 как массив из 3 объектов типа Vector. Массив создается динамически с использованием оператора new внутри конструктора (как и в случае с Vector).

 

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

  • конструктор копирования
  • оператор присваивания
  • деструктор
  • []
  • *, *=, /, /= (со скаляром)
  • * (c Vector)
  • операторы > > и < < для ввода/вывода матрицы через cin/cout
  • transposition() // транспонирование матрицы (вокруг главной диагонали)
  • det() //подсчет детерминанта матрицы.

 

Написать тестовую глобальную функцию, показывающую работу каждого оператора. Защитить состояние объекта от некорректного доступа. Везде, где возможно, использовать в качестве аргументов константные ссылки, возвращать ссылки и использовать модификатор const для функций/операторов.

 

3) Используя созданные классы Vector и Matrix, реализовать утилитный класс для решения уравнений методом Гаусса. Класс должен содержать публичную статическую функцию:

Vector gauss(const Matrix& variables, const Vector& values)

которая решает уравнение вида:

a1x+b1y+c1z=v1

a2x+b2y+c2z=v2

a3x+b3y+c3z=v3

методом исключения Гаусса.

 

Этот класс должен содержать два специальных статических поля типа Vector с публичным доступом. Первое поле должно быть проинициализировано объектом Vector(FLT_MAX, FLT_MAX, FLT_MAX) (надо подключить < float.h> ). Второе поле надо проинициализировать объектом Vector(FLT_MIN, FLT_MIN, FLT_MIN).

 

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

 

Vector v = … // вызов функции решения уравнения

if (v == …) { // сравниваем с первым статическим полем

cout < < “No Solution”;

} else if (v == …) { // сравниваем со вторым статическим полем

cout < < “Infinity Set of Solutions”;

} else {

cout < < “Solution: \n“ < < v.print();

}

 

4) Создать тестовую глобальную функцию, которая предоставляет консольный интерфейс для ввода параметров: a1-a3, b1-b3, c1-c3, v1-v3 и выдачи результата (используя утилитный класс).


Задание № 2. Наследование и полиморфизм. Простой командный процессор

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

 

Название Аргументы Описание Примеры
Print < строка> Распечатать на экране строку, заданную в аргументе print Hello World
Eval < expression> Вычислить простую арифметическую операцию (+, -, *, /). Результат вывести на экран. В случае некорректных аргументов вызывать исключение std:: invalid_argument eval 8 / 2
createfile < file> Создать файл c именем < file>. Если файл уже существует, то пересоздать. Запросить ввод данных от пользователя (одна строка), записать введенные данные в файл. createfile test.txt
Exec < command> Запустить командную строку, что записана в < command>. Используйте функцию system() из библиотеки " linesystem.h". exec notepad.exe test.txt copy test.txt test2.txt
increment < file> < file value> Прочитать содержимое файла < file> и проинтерпретировать его как int. Если в int не конвертируется вызывать исключение std:: invalid_argument. Иначе увеличить полученное число на заданное значение и перезаписать в файл. Если число не задано, увеличить на 1. increment test.txt increment test.txt 1
viewfile < file> Вывести содержимое файла c именем < file> на экран. Если файл не существует, вызывать исключение std:: invalid_argument viewfile test.txt

 

Пример исходного файла для командного процессора:

 

print Hello

print I know 2+2=

eval 2+2

print Please input your age:

createfile age.txt

increment age.txt

print It is your age in next year:

viewfile age.txt

print You could check it

exec notepad.exe age.txt

 

Каждая команда представляется в виде класса, отнаследованного от абстрактного класса Command:

 

class Command {

private:

string args;

public:

Command(const string& s = " " ): args(s){};

 

void setArgs(const string& s) {

args = s;

};

const string& getArgs() const {

return args;

};

friend istream& operator> > (istream& in, Command& c){

return in > > c.args;

};

friend ostream& operator< < (ostream& out,

const Command& c) {

return out < < c.getName() < < " " < < c.args < < endl;

};

 

virtual const string& getName() const = 0;

virtual void execute() const throw std:: invalid_argument)

= 0;

};

 

Для инициализации и выполнения списка команд необходимо реализовать класс CommandList, который должен содержать следующие методы и операторы:

 

friend ostream& operator< < (ostream& out,

const CommandList& c) {

// Вывести на экран все команды

// Обход списка с помощью класса std: iterator

return out;

};

friend istream& operator> > (istream& in, CommandList& c) {

// Считать из потока.

// В случае консольного ввода

// выполнение прекращается если строка равна ^D

return in;

};

void init(const string& file) {

// Считать из файла, используя оператор > >

}

void execute() const throw (std:: invalid_argument) {

// Выполнить все команды.

// Обход списка с помощью класса std: iterator

}

 

Особенности реализации класса CommandList:

1. Файл считывается построчно с помощью класса для работы с потоками std:: ifstream.

2. Команды хранятся в защищенном поле класса типа std:: list.

3. Обход элементов списка осуществляется с помощью итератора std:: iterator.

 

Пример использования класса CommandList:

 

CommandList cl = CommandList();

 

// Чтение из файла:

cl.init(" commands.txt" );

cl.execute();

 

// Чтение с консоли:

cin > > cl;

cout < < cl;

cl.execute();


 

Задание № 3. Шаблоны

 

Переделайте классы Vector и Matrix из задания № 2 так, чтобы можно было создавать векторы и матрицы любых размеров и любых типов (тесты переделайте соответственно). Используйте шаблоны для описания таких векторов. Пример использования:

 

Vector< int, 5> v1(1, 1, 1, 1, 1);

v1[3] = 100;

std: cout< < v1;

Vector< Complex, 3> v2(0, 0, 0);

 

Переделайте функцию gauss(), чтобы она так же работала для разных размерностей и типов:

 

Matrix< double, 5> matrix = … // your initialization

Vector< double, 5> vector = … // your initialization

Vector< double, 5> answer = gauss< double, 5> (matrix, vector);

 

Вместо статических полей Vector(FLT_MIN, FLT_MIN, FLT_MIN) и Vector(FLT_MAX, FLT_MAX, FLT_MAX) используйте исключения.

 

Переделайте тестовую глобальную функцию, которая предоставляет консольный интерфейс для решения уравнения Гаусса. Пусть она запрашивает размерность (от 2 до 5) и решает уравнение для типа double.


 

Литература

 

1. В. В. Мухортов, В. Ю. Рылов. Объектно-ориентированное программирование, анализ и дизайн: Учебное пособие. Новосибирск: ИМ СО РАН, 2002.

2. Г. Буч. Объектно ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./ Пер. с англ. СПб.; М.: «Невский Диалект» – «Издательство БИНОМ», 1999.

3. Антон Элиенс. Принципы объектно-ориентированной разработки программ. 2-е изд. / Пер с англ. М.: Издательский дом «Вильямс», 2002.

4. Г. Буч, Д. Рамбо, А. Джекобсон. Язык UML: Руководство пользователя. / Пер. с англ. М.: ДМК, 2000.

5. Б. Страуструп. Язык программирования C++, 3-е изд. / Пер. с англ. СПб.; М.: «Невский Диалект» – «Издательство БИНОМ», 1999.

6. Б. Страуструп. Дизайн и эволюция языка С++. / Пер. с англ. М.: ДМК, 2000.

7. А. Голуб. Правила программирования C & C++. / Под редакцией Костенко В. М.: Восточная книжная компания, 1996.

8. С. Мейерс. Эффективное использование С++. 50 рекомендаций по улучшению ваших программ и проектов. / Пер. с англ. М.: ДМК, 2000.

9. С. Мейерс. Наиболее эффективное использование С++. 35 новых рекомендаций по улучшению ваших программ и проектов. / Пер. с англ. М.: ДМК, 2000.

10. Брюс Эйкель. Философия Java. СПб.: Питер, 2001.

11. П. Ноутон, Г. Шилдт. Java 2. Наиболее полное руководство. СПб.: BHV, 2001.


Обьектно‑ ориентированное программирование
(2-й курс, 4-й сем., 64 ч., диф. зачёт)


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-06-05; Просмотров: 455; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.094 с.)
Главная | Случайная страница | Обратная связь