Форум программистов, компьютерный форум CyberForum.ru

Абстрактный класс чисел - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Рекурсия в различных компиляторах http://www.cyberforum.ru/cpp-beginners/thread336725.html
Доброго времени суток. Задача: дано целое число n, нужно получить его битовое представление, развернуть его, и то, что получилось перевести обратно в десятичную систему счисления. Пример:n = 4, ответ - 1 n = 6, ответ - 3. Решил ее через циклы, прошла все тесты, поэтому решение меня не интересует. Также написал красивую на мой взгляд рекурсию, которая отлично работает на gcc. #include...
C++ Ввод данных В общем есть переменная int year; Юзер должен ввести значение переменной, но мне нужно чтобы он мог ввести максимум четырехзначное число, тоесть как бы ограничить количество вводимых символов http://www.cyberforum.ru/cpp-beginners/thread336682.html
Графы C++
Прочитал про обход графа в глубину, посмотрел реализацию, и тут вопрос а как можно использовать этот обход в глубину?
Матрица Изменение C++
Здравствуйте! Просьба такая: "Приведите пожалуйста пример как можно расширять границы матрицы". Например из матрицы 3х3 сделать матрицу 3х4 и новый столбец добавленный сразуже обнулить. Я думаю что с помощью replace но опять такие нужен пример с хорошими пояснениями.
C++ взять адрес переменной http://www.cyberforum.ru/cpp-beginners/thread336660.html
если & стоит перед переменной, то это читается как - " взять адрес этой переменной" а если он стоит после ?
C++ Инжект кода Здраствуйте... Пишу простый инжектор кода в процесс(win32). Использую CreateRemoteThread. Внедряю код функции которая должна запустится в новом потоке удаленного процесса. Все вроде норм. но у меня траблы с WriteProcessMemory. вот кусок кода си++: int main (void) { подробнее

Показать сообщение отдельно
Ale-X91
2 / 2 / 0
Регистрация: 27.07.2011
Сообщений: 12

Абстрактный класс чисел - C++

27.07.2011, 22:32. Просмотров 1156. Ответов 13
Метки (Все метки)

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

Я написал решение этой задачи, но оно мне кажется. Скажите, есть ли другие способы и как можно было сделать это лучше.

Вот мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <string>
#include <math.h>
const double EPS = 1e-4;
using namespace std;
 
void divide(_int64 &a, _int64 &b){
    _int64 i = 2;
    do
        if(a%i == 0 && b%i == 0){
            a /= i;
            b /= i;
        }
        else
            i++;
    while(i <= a && i <= b);
};
 
class Number{
public:
    virtual ostream& print(ostream& st) const = 0;
    virtual void sum(Number& a) = 0;
};
 
class Fraction: public Number{
private:
    int chisl, znam;
public:
    Fraction(int a = 0, int b = 1);
    double get_value() {return 1.0*chisl/znam;};
    ostream& print(ostream& st) const ;
    void sum(Number& a);
};
Fraction::Fraction(int a, int b){
    _int64 a2 = a*abs(b)/b;
    _int64 b2 = abs(b);
 
    divide(a2, b2);
 
    chisl = a2;
    znam = b2;
};
ostream& Fraction::print(ostream &st) const {
    return (st << chisl << "/" << znam);
};
void Fraction::sum(Number& a){
    Fraction arg = (Fraction&) a;
    _int64 com_znam = znam * arg.znam;
    _int64 res_chisl = chisl*arg.znam + arg.chisl*znam;
 
    divide(res_chisl, com_znam);
    chisl = res_chisl;
    znam = com_znam;
};
 
class Complex: public Number{
private:
    double Re, Im;
public:
    Complex(double a = 0, double b = 0): Re(a), Im(b) {};
    double get_real() {return Re;};
    double get_im() {return Im;};
    ostream& print(ostream& st) const ;
    void sum(Number& a);
};
ostream& Complex::print(ostream &st) const {
    if(abs(Re) >= EPS){
        st << Re;
        double Im_abs = abs(Im);
        if(Im_abs >= EPS){
            if(Im > 0)
                st << "+";
            else
                st << "-";
            if(abs(Im_abs -1) >= EPS)
                st << Im_abs;
            st << "i";
        }
    }
    else
        st << Im << "i";
    return st;
};
 
void Complex::sum(Number& a){
    Re += ((Complex&) a).Re;
    Im += ((Complex&) a).Im;
}
 
inline ostream& operator << (ostream& st, Number& val){
    return val.print(st);
};
 
int main(){
    Number* ac = new Complex(-10, 2.5);
    Number* bc = new Complex(18, -6.5);
 
    ac->sum(*bc);
    cout << *ac << endl;
 
    Number* af = new Fraction(7, 30);
    Number* bf = new Fraction(3, 70);
 
    af->sum(*bf);
    cout << *af << endl;
 
    cin.get();
    return 0;
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru