
Обоснование включения в класс конструкторов, деструктора.
Fraction()-конструктор без параметров задает NULL значение для указателя на строку, а также инициализирует числитель и знаменатель дроби.
fraction(int x, int y)-конструктор с параметрами задает NULL значение для указателя на строку, и инициализирует числитель и знаменатель х и у соответственно.
fraction(int x, int y, char *s)-конструктор с 3 параметрами инициализирует строку и числитель со знаменателем.
fraction(fraction &f)-конструктор копирования.
~fraction()-деструктор освобождает память занимаемую строкой.
Отображение иерархии классов в виде графа.
Текст программы с комментариями.
Base.h:
#include<string.h>
#include<iostream>
#include<fstream>
#include<stdio.h>
using namespace std;
class fraction{
private:
int numerator, denominator;
char *comment;
static int n;
public:
class division_by_zero{//класс для обработки исключения деления на 0;
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();
};
class result:public fraction{//класс наследник
private:
float f_result;
public:
result(){f_result=0;}
result(int x, int y):fraction(x, y){
f_result=(float)x/y;
}
void show();
void set_result();
};
class mixed_fraction:public fraction{//класс наследник
private:
int whole;
public:
mixed_fraction(){
whole=0;
}
mixed_fraction(int x, int y){
float n=(float)x/y;
whole=(int)n;
x-=whole*y;
num(x);
denom(y);
}
void show();
void set_mixed_fraction();
};
function.cpp:
#include "base.h"
#include <iostream>
#include<fstream>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
inline int least_common_multiple(int x, int y){
x=x<0? -x : x;
y=x<0? -y : y;
while(x!=y)
if(x>y) x-=y;
else y-=x;
return x;
}
inline int lowest_common_denominator(int x, int y){
x=x<0? -x : x;
y=x<0? -y : y;
int a=x, b=y;
while(x!=y)
if(x>y) x-=y;
else y-=x;
return a*b/x;
}
inline void reduction(int &a, int &b){
int lcm=least_common_multiple(a, b);
while(lcm!=1){
a/=lcm;
b/=lcm;
lcm=least_common_multiple(a, b);
}
fraction f(a,b);
}
void fraction::denom(int x){
if(!x)
throw division_by_zero();
denominator=x;}
void fraction::num(int x){numerator=x;}
fraction fraction::operator+(fraction f){
int lcd=lowest_common_denominator(this->denominator, f.denominator);
int n1=lcd/this->denominator, n2=lcd/f.denominator;
fraction f1;
f1.numerator=this->numerator*n1+f.numerator*n2;
f1.denominator=lcd;
reduction(f1.numerator, f1.denominator);
return f1;
}
fraction operator-(fraction f2, fraction f ){
int lcd=lowest_common_denominator(f2.denominator, f.denominator);
int n1=lcd/f2.denominator, n2=lcd/f.denominator;
fraction f1;
f1.numerator=f2.numerator*n1-f.numerator*n2;
f1.denominator=lcd;
reduction(f1.numerator, f1.denominator);
return f1;
}
void fraction::set_fraction(){cout<<"enter numerator and denominator";
cin>>numerator>>denominator;
if(!denominator)
throw division_by_zero();}
void fraction::rand_fraction(){srand(time(0)); numerator=rand()%10; denominator=rand()%10;
while(denominator==0) denominator=rand()%10;}
fraction fraction::operator*(fraction f){
fraction f1(f.numerator*numerator, f.denominator*denominator);
reduction(f1.numerator, f1.denominator);
return f1;
}
fraction fraction::operator/(fraction f){
fraction f1(numerator*f.denominator, denominator*f.numerator);
reduction(f1.numerator, f1.denominator);
return f1;
}
fraction fraction::operator+(int i){
fraction f1(numerator+i*denominator, denominator);
reduction(f1.numerator, f1.denominator);
return f1;
}
fraction fraction::operator-(int i){
fraction f1(numerator-i*denominator, denominator);
reduction(f1.numerator, f1.denominator);
return f1;
}
fraction fraction::operator*(int i){
fraction f1(numerator*i, denominator);
reduction(f1.numerator, f1.denominator);
return f1;
}
fraction fraction::operator/(int i){
fraction f1(numerator, denominator*i);
reduction(f1.numerator, f1.denominator);
return f1;
}
fraction fraction::operator++(){
numerator+=denominator;
reduction(numerator, denominator);
fraction f1(numerator, denominator); return f1;
}
fraction fraction::operator--(){
numerator-=denominator;
reduction(numerator, denominator);
fraction f1(numerator, denominator); return f1;
}
void fraction::view(){
cout<<numerator<<'/';
cout<<denominator<<'\n';
}
void fraction::show(){
cout<<numerator<<'/';
cout<<denominator<<'\n';
}
void fraction::add_comment(char *s){
if (comment!=NULL) delete comment;
comment=new char[strlen(s)+1];
strcpy(comment, s);
}
fraction fraction::operator++(int){
fraction f1(numerator, denominator);
numerator+=denominator;
reduction(numerator, denominator);
return f1;
}
fraction fraction::operator--(int){
fraction f1(numerator, denominator);
numerator-=denominator;
reduction(numerator, denominator);
return f1;
}
fraction fraction::operator+=(fraction f){
int lcd=lowest_common_denominator(denominator, f.denominator);
int n1=lcd/denominator, n2=lcd/f.denominator;
numerator=numerator*n1+f.numerator*n2;
denominator=lcd;
reduction(numerator, denominator);
fraction f1(numerator, denominator);return f1;
}
fraction fraction::operator-=(fraction f){
int lcd=lowest_common_denominator(denominator, f.denominator);
int n1=lcd/denominator, n2=lcd/f.denominator;
numerator=numerator*n1-f.numerator*n2;
denominator=lcd;
reduction(numerator, denominator);
fraction f1(numerator, denominator); return f1;
}
fraction fraction::operator*=(fraction f){
numerator*=f.numerator;
denominator*=f.denominator;
reduction(numerator, denominator);
fraction f1(numerator, denominator); return f1;
}
fraction fraction::operator/=(fraction f){
numerator*=f.denominator;
denominator*=f.numerator;
reduction(numerator, denominator);
fraction f1(numerator, denominator); return f1;
}
fraction::operator int(){return numerator/denominator;}
fraction::operator float(){return (float)numerator/denominator;}
istream& operator>>(istream &s, fraction &d){
s>>d.numerator; char t;
s>>t;
s>>d.denominator;
if(!d.denominator)
throw fraction::division_by_zero();
reduction(d.numerator, d.denominator);
return s;
}
ostream& operator<<(ostream &s, fraction &d){
s<<d.numerator<<'/'<<d.denominator;
//if(d.comment) s<<' '<<d.comment;
s<<'\n';
return s;
}
ifstream& operator>>(ifstream &s, fraction &d){
s>>d.numerator; char t;
s>>t;
s>>d.denominator;
if(!d.denominator)
throw fraction::division_by_zero();
reduction(d.numerator, d.denominator);
return s;
}
ofstream& operator<<(ofstream &s, fraction &d){
s<<d.numerator<<'/'<<d.denominator;
//if(d.comment) s<<' '<<d.comment;
//s<<'\n';
s<<d.comment;
return s;
}
void fraction::write(ofstream &s){
s.write((char*)&numerator, sizeof(int));
s.write((char*)&denominator, sizeof(int));
s.write(comment, strlen(comment));
}
void fraction::read(ifstream &s){
s.read((char*)&numerator, sizeof(int));
s.read((char*)&denominator, sizeof(int));
if(!denominator)
throw division_by_zero();
}
void mixed_fraction::show(){
cout<<whole<<' ';
view();
}
void result::show(){
cout<<f_result<<' ';
view();
}
int fraction::return_numerator(){return numerator;}
int fraction::return_denominator(){return denominator;}
void mixed_fraction::set_mixed_fraction(){
set_fraction();
int x=return_numerator();
int y=return_denominator();
whole=x/y;
x-=whole*y;
num(x);
}
void result::set_result(){
int x=return_numerator();
int y=return_denominator();
f_result=(float)x/y;
}
main.cpp:
#include"deq.h"
#include<fstream>
#include <iostream>
#include "template_class.h"
using namespace std;
int fraction::n=0;
elem* deq::left=NULL;
elem* deq::right=NULL;
int main(){try{
fraction f1(1,2);
fraction f2(3,4);
char c[]="comment";
fraction f4(1,4,c);
fraction f3;
fraction f5=f2;
f3=f1*f2;
cout<<f3;
cin>>f3;
ofstream f("file.bin");
f3.write(f);
f.close();
ifstream ff("file.bin");
f4.read(ff);
cout<<f4;
cout<<(float)f4;
}catch(fraction::division_by_zero k){k.show();}
catch(bad_alloc){cout<<"deficit of memory\n";}//обработка исключения нехватки памяти
system("pause");
}