Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовая по ООП2 / КУРСОВАЯ РАБОТА

.doc
Скачиваний:
113
Добавлен:
01.05.2014
Размер:
52.22 Кб
Скачать

Южно-Уральский государственный университет

Факультет экономики и управления

Кафедра информатики

Отчет о выполнении задания по

Высокоуровневым методам информатики и прграммирования

Выполнил: Маклаков А.В., гр. ЗЭиУ-118В

Проверила: Конова Е. А.

Челябинск 2007г.

Задание 1. Тема: инкапсуляция, перегрузка операции как пример полиморфизма, наследование

1.1. Создать класс «Точка» на координатной плоскости. Данные класса - координаты точки по осям. Конст­рукторы класса: конструктор по умолчанию (начало координат), конструктор точки, лежащей на оси Ох, и конструктор произвольной точки. Методы класса: ввод точки, вывод на экран, определение радиус-вектора точки и определение угла наклона к оси Ох. Проверять особые точки. Написать клиентскую программу, которая создаст некоторое число статических и динамических объектов это­го типа, и обратится к его методам.

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

  1. Наследуемым классом для точки объявить класс «Траектория», имеющий метод «Draw», описывающий движение точки по прямой между точкой начала и конца траектории. Определить конструктор траектории. Вывести данные на экран с использованием метода базового класса.

class Point

{

private:

double x, y;

public:

double angle();

double radius();

// Конструкторы

Point();

Point (double, double);

Point (double);

// Виртуальный деструктор

virtual ~Point();

// Определяем оператор как friend,

//чтоб он имел доступ к закрытым членам класса

// Перегруженный оператор декримента как дружественная функция

friend Point operator-- (Point&);// Префиксная форма

friend Point operator-- (Point&, int); // Постфиксная форма

// Перегруженный оператор вычитания

friend Point operator- (const Point&, const Point&);

// Методы для вывода точки на экран и ввода с клавиатуры

void read();

void write();

// Перегруженный оператор инкремента как элеимент класса

Point operator++(); // Префиксная форма

Point operator++(int); // Постфиксная форма

// Перегруженный оператор сложения как элеимент класса

Point operator+ (const Point&);

};

Задание 2. Тема: перегруженные операции для классов

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

"+" - сложение дробей,

"-" - вычитание дробей,

"*" - умножение дробей,

"/" - деление дробей,

"=" - присваивание дробей,

"= =" - проверка равенства,

"++" - выделение целой части.

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

class Fraction

{

private:

int integral, numerator, denominator; // Целая часть, числитель, знаменатель

void normalize();

void denormalize();

public:

friend Fraction operator* (const Fraction& a, const Fraction& b);

friend Fraction operator/ (const Fraction& a, const Fraction& b);

friend bool operator == (const Fraction& a, const Fraction& b);

Fraction(int);

Fraction operator- (const Fraction& b);

Fraction operator+(const Fraction& b);

void write();

Fraction(int, int, int);

Fraction(int, int);

Fraction();

virtual ~Fraction();

Fraction operator =(const Fraction&);

Fraction operator ++();

Fraction operator ++(int);

};

Задание 3. Тема: Множественное наследование. Иерархия и контейнерные классы. Виртуальные базо­вые классы

Часть 1. Создать иерархию типов файл для чтения, файл для записи и файл для чтения и записи. Классы долж­ны иметь конструкторы с параметрами и перегруженные функции вывода в поток и ввода из потока.

Часть 2. Создать иерархию типов, описывающую файл, файл для чтения, файл для записи и файл для чтения и записи. Использовать виртуальный базовый класс.

// Файл для чтения данных

class IFile : protected virtual File // virtual позволяет при множественном наследовании

// наследовать поля класса File только один раз

{

protected:

IFile(); // Конструктор по умолчанию. Используется в IOFile,

// так как есть конструктор с параметром, автоматически не создается

public:

double read(double&);

char read(char&);

int read(int&);

// Конструктор с параметром ИмяФайла

IFile(char *fName);

// Деструктор наследуется из File

};

class OFile : virtual protected File // virtual позволяет при множественном наследовании

// наследовать поля класса File только один раз

{

protected:

OFile(); // Конструктор по умолчанию. Используется в IOFile,

// так как есть конструктор с параметром, автоматически не создается

public:

void write(double d); // Записывает double

void write (char c); // Записывает char

void write(int i); // Записывает int

// Конструктор с параметром ИмяФайла

OFile(char *fName);

// Деструктор наследуется из File

};

class IOFile: public IFile, public OFile

// Так как в IFile и OFile используется виртуальное наследование,

// fstream *fs в IOFile только один

{

public:

IOFile(char *fName); // Конструктор с параметром - именем файла

};

Задание 4. Тема: Виртуальные функции

Создать абстрактный класс "кривые" для вычисления координаты у(х). Создать производные классы: прямая, эллипс, гипербола со своими функциями вычисления у в зависимости от входного параметра х. Уравнение прямой: у=а*х+Ь , эллипса: х2/а2+у2/Ь2= 1, гиперболы: х2/а2-у2/Ь2= 1

Класс кривая:

class Curve

{

protected:

Curve(double, double); // Делаем конструктор protected - объекты этого класса создавать не планируется

double a, b;

public:

virtual double get(double x) = 0; // Абстрактная функция;

};

Производные классы:

class Ellipse : public Curve // Эллипс

{

public:

Ellipse(double, double);

virtual double get(double x); // Переопределяем виртуальную функцию

};

class Hyperbola : public Curve // Гипербола

{

public:

Hyperbola(double, double);

virtual double get(double x); // Переопределяем виртуальную функцию

};

class Line : public Curve // Прямая

{

public:

Line(double, double);

virtual double get(double x); // Переопределяем виртуальную функцию

};

Задание 5. Тема: Шаблоны классов

Разработать и иллюстрировать применение шаблона класса «Массив из N элементов» для целого, веществен­ного и символьного типов данных, использующего следующие методы:Ввод значений, Печать значений, Упорядочение элементов массива, Вставка элемента в массив с сохранением упорядоченности. Выполнять контроль выхода индекса за границы массива.

template<class T> class Array

{

private:

T *elements; // Элементы массива

int size; // Размер массива

public:

Array(int = 10); // Размер по умолчанию = 10

~Array();

void insertSorted(T); // Вставка элемента в массив с сохранением его упорядоченности. Самый большой элемент теряется

void sort(); // Сортировка массива

void readElements(); // Ввести элементы массива с клавиатуры

void writeElements(); // Вывести элементы массива на экран

T& operator [](int index); // Обращение к элементу по индексу

};