Задать вопрос
@TyGGer4ik

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

Мне дали учебное задание написать класс, реализующий длинное число и пару функций для работы с ним. Вот моя реализация:
#include <iostream>
#include <cstdlib>
#include <vector>


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


int get_two_last(int & 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 >= 0 ? 1 : -1;
        arr = (int*)realloc(arr, (len/2 + 1) * sizeof(int));
        for (size_t i = len/2; i >= 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 < len/2 + 1; i++){
        num *= 10;
        num += arr[i];
    }
    return num * sign;
}


BigInteger pluse(BigInteger &big_int_1, BigInteger &big_int_2){
    BigInteger big_int;
    std::vector<int> 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 < len_1 ? len_2 : len_1;
    int mem = 0;
    int i;
    for (i = 1; i <= minn; i++){
        int c = mem + array_1[len_1-i] + array_2[len_2-i];
        if (c > 99){
            mem = c / 100;
            c %= 100;
        }
        else mem = 0;
        vect[i-1] = c;
    }
    vect[i-1] = mem;
    std::reverce(vect.begin(), vect.end());
    big_int.len = vect.size() * 2;
    big_int.arr = (int *)calloc(vect.size(), sizeof(int));
    for (int i = 0; i < vect.size(); i++){
        big_int.arr[i] = vect[i];
    }
    return big_int;
}


BigInteger minuse(BigInteger big_int_1, BigInteger big_int_2){
    big_int_2.change_sign();
    return pluse(big_int_1, big_int_2);
}


int main(){
    BigInteger my_int(-454);
    std::cout << get_num_from_BigInteger(my_int);
    return 0;
}


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

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

Войдите, чтобы написать ответ

Похожие вопросы