Преобразование десятичного числа в строковом формате в двойной с использованием стеков - PullRequest
0 голосов
/ 01 апреля 2019

этот проект в настоящее время должен быть завершен сегодня вечером, и я старался изо всех сил на нем до сих пор.Если бы я мог получить какое-либо руководство о том, как я должен продолжать работать над этим, я был бы очень признателен.У меня есть тема, которую я рассматриваю для проекта: «Напишите программу, которая читает строку, состоящую из положительного целого числа или положительного десятичного числа, и преобразует число в числовой формат. Если строка состоит из десятичного числа, программа должнаиспользуйте стек, чтобы преобразовать десятичное число в числовой формат. "

Меня, во-первых, смущает вопрос о том, как стек может помочь преобразовать десятичное число в строковом формате в десятичное в числовом формате.Как это будет работать внутри программы?Во-вторых, мой код, который я создал, по какой-то причине не работает, и я не знаю, почему.

Я пытался найти вопросы, которые задавались о переполнении стека и других веб-сайтах, но ничто не могло ответить на мой вопрос.


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


using namespace std;


template <class Type>
class stackADT
{
public:
    virtual void initializeStack() = 0;
    virtual bool isEmptyStack() const = 0;
    virtual bool isFullStack() const = 0;
    virtual void push(const Type& newItem) = 0;
    virtual Type top() const = 0;
    virtual void pop() = 0;
};

template <class Type>
class stackType: public stackADT<Type>
{
private:
    int maxStackSize;
    int stackTop;

public:
    Type *list;
    void initializeStack()
    {
        stackTop = 0;
        cout << "stackTop " << stackTop << endl;
    }

    void print()
    {
        for(int i=0; i<stackTop; i++)
        {
            cout << list[i] << endl;
        }
    }

    bool isEmptyStack() const
    {
        return(stackTop == 0);
    }

    bool isFullStack() const
    {
        return(stackTop == maxStackSize);
    }

    void push(const Type& newItem)
    {
        if (!isFullStack())
        {
            list[stackTop] = newItem;
            stackTop++;
        }
        else
        {
            cout << "Cannot add to a full stack." << endl;
        }
        cout << "stacktop: " << stackTop << endl;

        system("pause");
    }

    Type top() const
    {
        assert(stackTop != 0); //if stack is empty, terminate the program.
        return list[stackTop - 1];
    }

    Type getList() const
    {
        assert(stackTop != 0); //if stack is empty, terminate the program.
        return *list;
    }

    void pop()
    {
        if (!isEmptyStack())
            stackTop--;
        else
            cout << "Cannot remove from an empty stack." << endl;

        cout << "pop: " << stackTop << endl;
    }

    stackType(int stackSize = 100)
    {
        if (stackSize <= 0)
        {
            cout << "Size of the array to hold the stack must be positive." << endl;
            cout << "Creating an array of size 100." << endl;
            maxStackSize = 100;
        }
        else
        {
            maxStackSize = stackSize;
            // cout << "maxStackSize "  << maxStackSize << endl;
        }

        stackTop = 0;
        list = new Type[maxStackSize];
    }

    stackType(const stackType<Type>& otherStack)
    {
        list = NULL;
        copyStack(otherStack);
    }

    ~stackType()
    {
        delete [] list;
    }

    const stackType<Type>& operator=(const stackType<Type>& otherStack)
    {
        if (this != &otherStack)
        {
            copyStack(otherStack);
        }
        return *this;
    }

    bool operator==(const stackType<Type>& otherStack) const
    {
        if (this == &otherStack)
        {
            return true;
        }
        else
        {
            if (stackTop != otherStack.stackTop)
            {
                return false;
            }
            else
            {
                for (int i = 0; i < stackTop; i++)
                {
                    if (list[i] != otherStack.list[i])
                    {
                        return false;
                    }
                    return true;
                }
            }
        }
    }

    void copyStack(const stackType<Type>& otherStack)
    {
        delete [] list;
        maxStackSize = otherStack.maxStackSize;
        stackTop = otherStack.stackTop;

        list = new Type[maxStackSize];

        //copy otherStack into this stack.
        for (int j = 0; j < stackTop; j++)
        {
            list[j] = otherStack.list[j];
        }
    }
};

int main()
{
    string s;
    char c;
    bool found;
    int b = 0;

    string j = "";
    stackType<double> stack;

    cout<<"Would you like to convert an integer(i) or a decimal(d)?"<<endl;
    cin>>c;

    switch (c) {
        case 'i' :
        case 'I' : {
            cout << "Please enter your integer in string format: ";
            cin >> s;

            b = atoi(s.c_str());
            break;
        }
        case 'd' :

        case 'D' : {

            cout << "Please enter your decimal in string format: ";
            cin >> s;

            found = false;

            int q = 0;

            while(found == false) {

                if(s[q] == '.') {
                    found = true;

                }
                else {
                    q++;
                }

            }


            for (int i = 0; i <q; i++) {
                char p = s[i];



                j += p;

                for (int m = 0; m<q-i; m++) {

                    j += '0';

                }
                double k = stof(j);
                stack.push(k);
                j.clear();

            }

            break;
        }
        default: {
            cout <<"Wrong input. Please enter i or d for integer or decimal: ";
             cin>>c;
            break;
        }
    }

    cout << "Here is your string in integer or decimal format: ";
    double t = 0;

    if(c == 'i') {

        cout << b;

    }
    else if(c == 'd') {

        for(int i = 0; i < stack.top(); i++){

            t += stack.list[i];

        }

        cout << t;



    }



    return 0;
}


Я ожидаю, что на выходе будет правильно напечатано число относительно того, когдаЯ ввел его, но вывод:

Хотите преобразовать целое число (i) или десятичное (d)?d Пожалуйста, введите десятичное число в строковом формате: 1025.56 стека: 1 sh: пауза: команда не найдена стека: 2 sh: пауза: команда не найдена стека: 3 sh: пауза: команда не найдена стека: 4 sh: пауза: команда не найденаВот ваша строка в целочисленном или десятичном формате: 9.74742e + 232Программа завершилась с кодом выхода: 0

1 Ответ

1 голос
/ 01 апреля 2019

Пусть входная строка будет 2345.6789. Поскольку это строка, ее отдельные символы хранятся в последовательных местах в памяти. Теперь давайте перейдем к ним последовательно и выполним следующий алгоритм.

Сначала оцените целую часть

int Acc = 0;
Loop 1: Repeat until Input == Decimal point

Input = '2'; Acc = 10 * Acc + (Input - '0') = 10 x 0 + 2 = 2
Input = '3'; Acc = 10 * Acc + (Input - '0') = 10 x 2 + 3 = 23
Input = '4'; Acc = 10 * Acc + (Input - '0') = 10 x 23 + 4 = 234
Input = '5'; Acc = 10 * Acc + (Input - '0') = 10 x 234 + 5 = 2345
Input = '.' (Decimal point); exit Loop1

Затем заполните стек цифрами в дробной части.

auto stack = std::stack<int>
Loop2: Repeat until Input == End of string

Input = '6'; stack.push (Input - '0');
Input = '7'; stack.push (Input - '0');
Input = '8'; stack.push (Input - '0');
Input = '9'; stack.push (Input - '0');
Input = End of string; exit Loop2

Затем извлеките цифры из стека и оцените дробную часть.

double Acc2 = 0;
Loop 3: repeat until stack.empty()

Acc2 = (Acc2 + stack.top()) / 10 = (0 + 9) / 10 = 0.9; stack.pop();
Acc2 = (Acc2 + stack.top()) / 10 = (0.9 + 8) / 10 = 0.89; stack.pop();
Acc2 = (Acc2 + stack.top()) / 10 = (0.89 + 7) / 10 = 0.789; stack.pop();
Acc2 = (Acc2 + stack.top()) / 10 = (0.789 + 6) / 10 = 0.6789; stack.pop();

Наконец, добавьте целую часть к дробной части.

Result = Acc + Acc2

Это чисто академическая проблема. Передайте привет моему учителю.

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