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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Mcicool, 10 ноя 2006.

  1. Mcicool

    Mcicool Гость

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

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

    Мое решение: Сразу говорю, на вот это ggggggggggggggg не обращайте внимания :)
    Код (Text):
    #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;
    }
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    не совсем понятно, что требуется другого решения.

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

    Mcicool Гость

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

Поделиться этой страницей