1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

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

  1. Mcicool

    Mcicool Гость

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

    Условие:
    В физике, химии, астрономии и других науках для записи значений
    очень больших и очень малых величин применяют научную нотацию -
    обозначения с указанием мантиссы (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;
    }
     
  2. Kmet

    Kmet Well-Known Member
    Java Team

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

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

    Mcicool Гость

    Репутация:
    0
    Да не, просто хочется увидеть другое решение этой же задачи, или мое улучшенное.
     
Загрузка...
Похожие Темы - Перегрузка операций
  1. zuzuzuz
    Ответов:
    1
    Просмотров:
    1.868
  2. lisica198808
    Ответов:
    0
    Просмотров:
    1.084
  3. LetMeFun
    Ответов:
    1
    Просмотров:
    1.337
  4. MGeorge
    Ответов:
    0
    Просмотров:
    1.448
  5. sasha465
    Ответов:
    1
    Просмотров:
    1.534

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