
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
Новосибирский государственный технически университет
Факультет автоматики и вычислительной техники
Лабораторная работа 1-5
по дисциплине «Информатика»
Студент: Собянин М.Ю.
Группа: АВТ-115
Преподаватель: Новицкая Ю.В.
Новосибирск
Задание для лабораторной работы:
Постpоить класс для pаботы с рациональными дробями. Класс должен включать соответствующие поля: числитель, знаменатель. Класс должен обеспечивать набор методов для работы с данными. Создать пеpегpуженные констpуктоpы: констpуктоp копирования, констpуктоp по умолчанию. Реализовать указанные классы с динамическим выделением памяти для хранения некоторых полей. Создать деструктор для освобождения памяти. Посмотреть, как вызываются конструкторы и деструкторы. Обязательно добавить в класс статические члены.
Для класса реализовать набор операций для работы с объектами класса: сложение, вычитание, инкремент постфиксный и префиксный, преобразование к разным типам.
Для класса перегрузить операции ввода/вывода, позволяющие осуществлять ввод и вывод в удобной фоpме объектов классов:
ввод с клавиатуры и вывод на экран;
в текстовый файл и из текстового файла;
в двоичный файл и из двоичного файла.
Для класса реализовать иерархию, изменяя отдельные методы и добавляя члены-данные. В иерархию должно входить 2-3 производных класса. Создать наследников класса:
класс, в котором есть поле-результат вычисления дроби;
класс смешанная дробь.
Добавить в классы и демонстрационную программу обработку исключений при возникновении ошибок: недостатка памяти, выход за пределы диапазона допустимых значений и т.д.
В классе возможны ошибки деления на ноль- для этого разработан класс division_by_zero.
Также используется стандартный класс bad_alloc для исключения ошибок выделения памяти.
Определение класса
class fraction{
private:
int numerator, denominator;
char *comment;
static int n;
public:
class division_by_zero{
public:
void show(){ cout<<"division by zero\n";}
};
fraction(){ numerator=1; denominator=1; comment=NULL;n++; }
fraction(int x, int y){
if(!y)
throw division_by_zero();
numerator=x; denominator=y; comment=NULL; n++;}
fraction(int x, int y, char *s){
if(!y)
throw division_by_zero();
numerator=x; denominator=y;
comment=new char[strlen(s)+1]; strcpy(comment, s);n++; }
fraction(fraction &f){ numerator=f.numerator; denominator=f.denominator;
if(f.comment!=NULL){
comment=new char[strlen(f.comment)+1]; strcpy(comment, f.comment);
} else comment=NULL; n++;
}
~fraction(){ delete comment; n--;}
fraction operator+(fraction f);
friend fraction operator-(fraction f2,fraction f);
void set_fraction();
void rand_fraction();
virtual void show();
fraction operator*(fraction f);
fraction operator/(fraction f);
fraction operator+(int i);
fraction operator-(int i);
fraction operator*(int i);
fraction operator/(int i);
fraction operator++();
fraction operator--();
fraction operator++(int);
fraction operator--(int);
fraction operator+=(fraction );
fraction operator-=(fraction);
fraction operator*=(fraction);
fraction operator/=(fraction);
void denom(int);
void num(int);
void view();
void add_comment(char *s);
operator int();
operator float();
friend istream& operator>>(istream &s, fraction &d);
friend ostream& operator<<(ostream &s, fraction &d);
friend ifstream& operator>>(ifstream &s, fraction &d);
friend ofstream& operator<<(ofstream &s, fraction &d);
void write(ofstream &s);
void read(ifstream &s);
int return_numerator();
int return_denominator();
};