Почему число, которое я передаю при инициализации класса, исчезает?

Как задание, мне поручено написать класс, который будет реализовывать длинные числа, а также несколько функций для их обработки. Могу я поделиться своей реализацией? Вот она: <pre><code class="cpp">#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;vector&gt;


int int_len(int c){
    int len = 1;
    while (c &gt; 9){
        c /= 10;
        len ++;
    }
    return len;
}


int get_two_last(int &amp; num){
    int c = num%100;
    num /= 100;
    return c;
}


class BigInteger{
public:
    int *arr;
    int sign;
    int len;

    void change_sign(){
        sign = -sign;
    }

    BigInteger(){
        arr = (int*)calloc(1, sizeof(int));
        arr[0] = 0;
        sign = 1;
        len = 1;
    }

    BigInteger(int num): BigInteger(){
        len = int_len(num);
        sign = num &gt;= 0 ? 1 : -1;
        arr = (int*)realloc(arr, (len/2 + 1) * sizeof(int));
        for (size_t i = len/2; i &gt;= 0; i--){
            arr[i] = get_two_last(num);
        }
    }
    
    ~BigInteger(){
        delete(arr);
    }
};


int get_num_from_BigInteger(BigInteger big_int){
    int len = big_int.len;
    int * arr = big_int.arr;
    int sign = big_int.sign;
    int num = 0;
    for(size_t i = 0; i &lt; len/2 + 1; i++){
        num *= 10;
        num += arr[i];
    }
    return num * sign;
}


BigInteger pluse(BigInteger &amp;big_int_1, BigInteger &amp;big_int_2){
    BigInteger big_int;
    std::vector&lt;int&gt; vect;
    int * array_1 = big_int_1.arr;
    int len_1 = big_int_1.len / 2 + 1;
    int * array_2 = big_int_2.arr / 2 + 1;
    int len_2 = big_int_2.len;
    int minn = len_2 &lt; len_1 ? len_2 : len_1;
    int mem = 0;
    int i;
    for (i = 1; i &lt;= minn; i++){
        int c = mem + array_1[len_1-i] + 
  • 16 января 2025 г. 19:14
Ответы на вопрос 2
Ваш код содержит несколько ошибок и недочетов, которые могут приводить к неправильному поведению. Давайте разберем основные проблемы и улучшим вашу реализацию.

1. **Использование `calloc` и `realloc`:** В вашем конструкторе вы используете `calloc` для начальной инициализации массива, а затем `realloc` - это может привести к потерям данных, если `realloc` не может уменьшить размер массива, и новый размер больше, чем старый. Лучше использовать стандартный контейнер, например, `std::vector`.

2. **Неправильный способ заполнения массива:** Ваша логика заполнения массива в конструкторе класса `BigInteger` некорректна. Функция `get_two_last(num)` не изменяет значение `num` таким образом, как вы ожидаете. В результате массив может содержать неправильные значения.

3. **Уничтожение массива в деструкторе:** Вместо `delete(arr)`, который вызывается для указателей, вам нужно использовать `free(arr)`, так как вы выделяли память с помощью `calloc` или `malloc`.

4. **Некорректные операции со знаками и длинный int:** Если переданное число слишком велико для типа `int`, это может привести к потере значений.

5. **Проблемы с доступом к элементам массива:** Использование неверного индекса для доступа к элементам массива может привести к ошибкам в расчете.

Вот исправленная версия вашего кода:

```cpp
#include <iostream>
#include <vector>

class BigInteger {
public:
    std::vector<int> arr; // Используем vector для удобства
    int sign;

    // Конструктор по умолчанию
    BigInteger() : arr(1, 0), sign(1) {}

    // Конструктор с параметром
    BigInteger(int num) : BigInteger() {
        if (num < 0) {
            sign = -1;
            num = -num; // Работаем с положительным числом
        } else {
            sign = 1;
        }
        
        while (num > 0) {
            arr.push_back(num % 100); // Храним по 2 цифры
            num /= 100;
        }
    }
    
    // Печать числа в удобном формате
    void print() const {
        if (sign == -1) std::cout << '-';
        for (size_t i = arr.size(); i > 0; --i) {
            std::cout << (arr[i-1] < 10 ? "0" : "") << arr[i-1]; // Форматируем вывод
        }
        if (arr.size() == 1 && arr[0] == 0) {
            std::cout << '0'; // Если число равно нулю
        }
        std::cout << std::endl;
    }
};

int main() {
    BigInteger bigInt(123456);
    bigInt.print(); // Ожидаемый вывод: 123456

    BigInteger bigIntNeg(-123456);
    bigIntNeg.print(); // Ожидаемый вывод: -123456

    return 0;
}
```

В данном примере:
- Мы используем `std::vector`, чтобы управлять массивом чисел.
- Переписываем логику инициализации, так что все числа, включая отрицательные, обрабатываются корректно.
- Реализуем вспомогательную функцию `print` для представления числа в читаемом виде.

Постарайтесь следовать этим рекомендациям и использовать возможности стандартной библиотеки C++ для упрощения кода и управления памятью.
Здравствуйте. У вас множество логических ошибок, рекомендую запустить под отладчиком и идти по шагам, разбираясь, что идёт не так. Без этого такой код Вы, боюсь, не запустите. Первое место, где выполнение идёт не так - в функции int_len(), которая для вычисления количества цифр проверяет текущее значение на '>9', хотя оно изначально отрицательно. Скорее всего, сюда уже модуль числа должен приходить. Дальше тоже есть ошибки, которые нужно исправлять по одной. 

Ещё очень резануло глаз, что у Вас класс работает с динамической памятью, но не имеет копирующих/перемещающих конструкторов и операторов ++ (почитайте). В таком виде это нормально работать не будет - либо добавьте нужные конструкторы/операторы, либо не используйте вручную динамическую память (заверните в vector).
Похожие вопросы