• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Перегрузка операций

  • Автор темы Mcicool
  • Дата начала
M

Mcicool

У меня есть решение, только хотелось бы какое нибудь другое (на то есть причины).

Условие:
В физике, химии, астрономии и других науках для записи значений
очень больших и очень малых величин применяют научную нотацию -
обозначения с указанием мантиссы (m) и характеристики (h).
Например, радиус электрона в сантиметрах равен 2.817 (мантисса)
умноженное на 10 в степени -13 (характеристика).
Объем Земли в куб. км. выразится значениями: m=1.08 и h=12.
Определить класс real для представления вещественного
числа в виде мантиссы (double) и характеристики (int) - закрытые
поля данных. Распространить все арифметические операции на объекты
класса real. Перегрузить операции ввода (>>) и вывода
(<<). Предусмотреть конструкторы, чтобы была возможность
использовать в арифметических выражениях с объектами
класса real операнды всех базовых арифметических типов.
В основной программе продемонстрировать выражения с
объектами класса real и данными встроенных типов. Для этого
в цикле вводить значения операндов и знак операции, выводить
результат как значение объекта типа real. (В выражениях хотя бы
один операнд - объект типа real.) Окончание работы - ввод
неизвестного знака операции.

Мое решение: Сразу говорю, на вот это ggggggggggggggg не обращайте внимания :)
Код:
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

class real
{
private:
double m; 
int h;

public:

real()	{m=0;h=0;}
real(int i)	{m=i;h=0;}
real(long i)	{m=i;h=0;}
real(float d)	{m=d;h=0;}
real(double d)	{m=d;h=0;}
real(double d, int i)	{m=d;h=i;}
real(const real&r)	{m=r.m;h=r.h;}

void correct();

friend real operator+(real a, real b);
friend real operator-(real a, real b);
friend real operator*(real a, real b);
friend real operator/(real a, real b);
friend ostream& operator<<(ostream&o, real a);
friend istream& operator>>(istream&i, real&a);
};

void real::correct()
{
while (m>=10.0) {m=m/10.0;h++;}
while (m<=1.0) {m=m*10.0;h--;}
}

real operator+(real a, real b)
{
int maxh;
if (a.h>b.h)
{
a.m*=pow(10,a.h-b.h);
a.h=b.h;
}
if (a.h<b.h)
{
b.m*=pow(10,b.h-a.h);
b.h=a.h;
}

a.m+=b.m;
a.correct();

return a;
}

real operator-(real a, real b)
{
int maxh;
if (a.h>b.h)
{
a.m*=pow(10,a.h-b.h);
a.h=b.h;
}
if (a.h<b.h)
{
b.m*=pow(10,b.h-a.h);
b.h=a.h;
}

a.m-=b.m;
a.correct();
return a;
}

real operator*(real a, real b)
{
a.m*=b.m;
a.h+=b.h;
a.correct();
return a;
}

real operator/(real a, real b)
{
a.m/=b.m;
a.h-=b.h;
a.correct();
return a;
}

ostream& operator<<(ostream&o, real a)
{
o<<a.m<<"*10^"<<a.h;
return o;
}

istream& operator>>(istream&i, real&a)
{
i>>a.m>>a.h;
return i;
}



int main()
{
bool exit=false;
do{
real a;
double b;
char c;
cout<<"\n‚ggggggggggggggggg(real m h):";
cin>>a;
cout<<"‚gggggggggggggggggggggg (double):";
cin>>b;
cout<<"‚ggggggggggggggg:";
cin>>c;
switch(c){
case '+': cout<<a+b;break;
case '-': cout<<a-b;break;
case '*': cout<<a*b;break;
case '/': cout<<a/b;break;
default: exit=true;
}
}while(!exit);
cin.get();
return 0;
}
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
не совсем понятно, что требуется другого решения.

в твоем решение при конструировании, отсутсвует приведение к нормальному виду. void correct() имхо должна быть приватным членом. не переопределены операторы сравнения
 
M

Mcicool

Да не, просто хочется увидеть другое решение этой же задачи, или мое улучшенное.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!