Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет1-5.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
80.38 Кб
Скачать

Обоснование включения в класс конструкторов, деструктора.

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");

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]