Курсовая по ООП2 / КУРСОВАЯ РАБОТА
.doc
Южно-Уральский государственный университет
Факультет экономики и управления
Кафедра информатики
Отчет о выполнении задания по
Высокоуровневым методам информатики и прграммирования
Выполнил: Маклаков А.В., гр. ЗЭиУ-118В
Проверила: Конова Е. А.
Челябинск 2007г.
Задание 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); // Обращение к элементу по индексу
};