используя tostring в классе.C ++ - PullRequest
0 голосов
/ 03 февраля 2019

с использованием tostring в классе.

#include <iostream>
#include <iomanip>
#include <string>
#include <cassert>

using namespace std;

Вот мой класс LargeInteger.Здесь все правильно, я совершенно уверен.

class LargeInteger {
private:
    int id;
    int numDigits; // number of digits in LargeInt / size of alloc array
    int* digits; // the digits of the LargeInt we are representing

public:
    LargeInteger(int value);
    ~LargeInteger();
    string tostring();
};

Конструктор для класса LargeInteger со значением параметра int.

LargeInteger::LargeInteger(int value)
{
    // set this instance id
    id = nextLargeIntegerId++;

    numDigits = (int)log10((double)value) + 1;

    // allocate an array of the right size
    digits = new int[numDigits];

    // iterate through the digits in value, putting them into our
    // array of digits.
    int digit;
    for (int digitIndex = 0; digitIndex < numDigits; digitIndex++) {
        // least significant digit
        digit = value % 10;
        digits[digitIndex] = digit;

        // integer division to chop of least significant digit
        value = value / 10;
    }
}

Destructor

LargeInteger::~LargeInteger()
{
    cout << " destructor entered, freeing my digits" << endl
         << " id = " << id << endl
         //<< " value=" << tostring() // uncomment this after you implement tostring()
         << endl;
    delete[] this->digits;
}

ЗдесьЯ не совсем понимаю.Что мне сюда поставить?Я пробовал это, но я не знаю, как установить intValue, чтобы получить желаемое значение.

string LargeInteger::tostring()
{
    string intValue;
    //intValue = ??
    return intValue;
}

Основная функция

int main(int argc, char** argv)
{
    // test constructors, destructors and tostring()
    cout << "Testing Constructors, tostring() and destructor:" << endl;
    cout << "-------------------------------------------------------------" << endl;
    LargeInteger li1(3483);
    cout << "li1 = " << li1.tostring() << endl;

    return 0
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вы сохранили массив цифр в обратном порядке целого числа.Теперь в toString просто преобразуйте каждую цифру в символ в обратном порядке и вставьте ее в строковый результат.Вот мое решение

string LargeInteger::tostring()
{
    string intValue;
    //intValue = ??

    for (int index = numDigits-1; index >= 0; index--)
    {
        intValue.push_back(digits[index]+'0');
    }
    return intValue;
}
0 голосов
/ 03 февраля 2019

Глядя на конструктор, выясняется, что массив цифр в вашей структуре данных представляет собой последовательность десятичных цифр, закодированных в двоичном виде (значение 0..9) в обратном порядке.

Таким образом, 1992 будет закодирован как 2,9,9,1.

Для того, чтобы сделать цифру пригодной для печати, вам нужно добавить к ней «0».Затем вам нужно выполнить итерацию от конца к началу и объединить версию для печати.Что-то вроде:

string LargeInteger::tostring()
{
    string intValue;
    for (int i=numDigits-1; i>=0; i--) 
        intValue +=  digits[i] + '0';
    return intValue;
}

Демонстрация в сети

Предложение 1

Вместо хранения цифр в виде массива целых чисел, вы можете очень хорошо использоватьстрока, так как строка может содержать любые двоичные данные, включая '\ 0'.Это позволит избежать проблем с выделением памяти.

Если вы пойдете по этому пути, вы также можете использовать итераторы и алгоритмы и написать ту же функцию, что и:

string LargeInteger::tostring()
{
    string intValue(digits.size(),' ');
    transform (digits.rbegin(), digits.rend(), intValue.begin(), 
                                             [](auto &x){ return x+'0'; }) ; 
    return intValue;
}

Демонстрационная версия

Предложение 2

Обратите внимание, что ваш конструктор не работает с отрицательным числом, поскольку отрицательный log10() вызывает исключение.

Это можно исправить с помощью абсолютного числа:

 numDigits = (int)log10(abs((double)value)) + 1;

Однако использование модуля по отрицательному числу дает отрицательную цифру.Это означает, что наш tostring() необходимо будет изменить, чтобы использовать абсолютное значение каждой цифры, и, если любая цифра является отрицательной, добавьте знак минус в начале числа (см. онлайн-демонстрация здесь ),

Более удобный подход состоял бы в том, чтобы на уровне класса был установлен флаг знака (чтобы сказать, является ли число в целом положительным или отрицательным), и измените конструктор так, чтобы цифры всегда были положительными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...