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

Реализовать длинные целые числа в виде класс - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ заменить все положительные элементы на противоположные http://www.cyberforum.ru/cpp-beginners/thread1030655.html
#include <iostream> #include <stdlib.h> #include <time.h> #include <cmath> using namespace std; void float1(double *mass, int const n); void float2(double *mass, int const n);
C++ Определить могут ли три значения представлять стороны треугольника. Привет всем:) В книге по С++, попалось вот такое задание( смотрите вложение ). Я в замешательстве :wall: Помогите сделать такую программу. Буду пытаться сам, но Заранее спасибо:) 4.32 Напишите программу, которая читает три ненулевых значения типа double, определяет и печатает, могут ли они представлять стороны треугольника. http://www.cyberforum.ru/cpp-beginners/thread1030642.html
Вычислить функции с использованием их разложения в степенной ряд. Функции и Перегрузка функций C++
Добрый день. Дана лабораторная работа, (см. ниже 2 скриншота) по заданию нужно вычислить функции с использованием их разложения в степенной ряд (функции с передачей параметров по значению). Я вроде бы выполнил условия, результаты видны, но не у верен в правильности, т.к. читал немного литературы и смотрел примеры. Результат - мой код внизу. А главное, не пойму как внедрить перегрузку...
построить на экране Колобка C++
4. построить на экране Колобка
C++ построить на экране Дом http://www.cyberforum.ru/cpp-beginners/thread1030630.html
3. построить на экране Дом
C++ Деструктор класса Имеется собственный класс, возник вопрос, деструктор класса вызывается не явно ? если так, то в какой момент он вызывается ? подробнее

Показать сообщение отдельно
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
20.12.2013, 18:21  [ТС]     Реализовать длинные целые числа в виде класс
помогите пожалуйста доделать задачу,если знаки чисел разные...
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#include <iostream>
#include <cstring>
#include <conio.h>
using namespace std;
 
#define     DEFAULT_LEN     32
 
class CLongInt
{
    char * m_Digit;     // последовательность цифр в формате little-endian (по младшему адресу - младший байт)
    int m_Len;          // длина числа в байтах
    int m_Sign;         // знак числа (0 = полож. число, -1 = отриц. число)
 
public:
    CLongInt();
    CLongInt(int _len);
    CLongInt(const char *_digit);
    ~CLongInt();
    CLongInt::CLongInt(const CLongInt &_src);
    CLongInt operator+(const CLongInt &_b);
    friend ostream &operator<<(ostream &_stream, const CLongInt &_a);
 
    int g_Len() const { return m_Len; };
};
 
 
//
//  Дефолтный конструктор
//
CLongInt::CLongInt()
{
    m_Len = DEFAULT_LEN;                // дефолтная длина длинного числа
    m_Digit = new char[DEFAULT_LEN];    // память для хранения числа
    m_Sign = 0;                         // знак числа по умолчанию
}
CLongInt::CLongInt(const CLongInt &_src)
{
    m_Len = _src.m_Len;
    m_Digit = new char[m_Len];
    strncpy(m_Digit, _src.m_Digit, m_Len);
    m_Sign = _src.m_Sign;
}
 
 
//
//  Конструктор для выделения памяти без инициализации
//
CLongInt::CLongInt(int _len)
{
    m_Len = _len;
    m_Digit = new char[_len];
    m_Sign = 0;
}
 
 
//
//  Основной конструктор
//
//  _digit - строковое представление длинного целого (со знаком или без)
//
CLongInt::CLongInt(const char *_digit)
{
    // индекс старшей цифры в переданном аргументе
    int src_index = 0;  // предполагаемое значение (если не указан знак)
 
    // проверим, указан ли знак числа в начале строки
    if (_digit[0] == '-')
    {
        m_Sign = -1;
        src_index = 1;
    }
    else
    {
        m_Sign = 0;
        if (_digit[0] == '+')
        {
            src_index = 1;
        }
    }
 
    m_Len = strlen(_digit) - src_index; // получаем длину числа в байтах
    m_Digit = new char[m_Len];          // резервируем память для хранения числа
 
 
    // индекс старшей цифры получаемого числа
    int dest_index = m_Len - 1;
 
    // преобразуем переданную строку в выбранный формат хранения длинного целого числа
    while (_digit[src_index] != 0)
    {
        m_Digit[dest_index] = _digit[src_index] - '0';  // преобразование типа '0' -> 0, '1' -> 1 и т.д.
 
        src_index++;
        dest_index--;
    }
 
}
 
//
//  Деструктор
//
CLongInt::~CLongInt()
{
    delete m_Digit;
}
 
 
//
//  Вывод длинного целого числа в поток
//
ostream &
operator<<(ostream &_stream, const CLongInt &_a)
{
    if (_a.m_Sign == -1)
        _stream << '-';
 
    for(int i = _a.m_Len - 1; i >= 0; i--)
    {
        _stream << (char)(_a.m_Digit[i] + '0');
    }
    return _stream;
}
 
 
 
CLongInt
CLongInt::operator+(const CLongInt &_b)
{
    // длина самого длинного из двух чисел
    int max_len = ((m_Len > _b.m_Len) ? m_Len : _b.m_Len);
 
    // реальная длина результата
    int res_len;
 
    // знак результата
    int res_sign;
 
    // создаем буфер
    char *buff = new char[max_len + 1];
 
    // если знаки чисел одинаковы
    if (m_Sign == _b.m_Sign)
    {
        // просто складываем числа
        int i = 0;      // индекс текущей складываемой цифры
        int carry = 0;  // признак переноса в старший разряд
        int a, b, c;
        do
        {
            // текущая цифра первого слагаемого
            if (i < m_Len)
                a = m_Digit[i];
            else
                a = 0;
 
            // текущая цифра второго слагаемого
            if (i < _b.m_Len)
                b = _b.m_Digit[i];
            else
                b = 0;
 
            // складываем с учетом возможного переноса ранее
            c = a + b + carry;
 
            // результат превышает максим. значение одной цифры
            if (c > 9)
            {
                c = c - 10;
                carry = 1;
            }
            else
            {
                carry = 0;
            }
 
            // сохраняем в буфере полученную цифру
            buff[i] = c;
 
            i++;
        }
        while(i < max_len);
 
        if (carry)
        {
            buff[i] = 1;
            res_len = max_len + 1;
        }
        else
        {
            res_len = max_len;
        }
 
        res_sign = m_Sign;
    }
    else
    {
        // будем вычитать
    }
 
    CLongInt a(res_len);
    for(int i = 0; i < res_len; i++)
        a.m_Digit[i] = buff[i];
 
    a.m_Sign = res_sign;
    delete buff;
    return a;
}
 
 
int main()
{
    CLongInt a("555");
    cout << a << " " << a.g_Len() << endl;
 
    CLongInt b("222");
    cout << b << " " << b.g_Len() << endl;
 
    cout << (a+b) << endl;
    getch();
    return 0;
}
 
Текущее время: 22:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru