课后习题 3.12(改进) 双精度正数进制转换,输入数值和base,输出转换数据

原题是正整数的转换,只能练习到栈。但小数部分恰好是队列实现的,所以加上小数部分,可以一道题练习一整章的核心知识点

Stack.h

#pragma once
#include<iostream>
using namespace std;

class Stack {
public:
    int* elements;
    int maxSize;
    int top;

    Stack(int size = 20) {
        maxSize = size;
        elements = new int[maxSize];
        top = -1;
    }
    void  overflow() {
        int* arr;
        arr = new int[maxSize * 2];
        for (int i = 0; i <= top; i++) {
            arr[i] = elements[i];
        }
        int* p = elements;
        elements = arr;
        maxSize *= 2;
        delete[]p;
    }

    void push(int elem) {
        if (top == maxSize - 1) {
            overflow();
        }
        elements[++top] = elem;
    }

    bool pop(int& e) {
        bool res = true;
        if (top == -1) {
            res = false;
        }
        else {
            e = elements[top--];
        }
        return res;
    }
};

Queue.h

#pragma once
#include<iostream>
using namespace std;

class QNode {
public:
    int data;
    QNode* next;
};

class Queue {
public:
    QNode* front;
    QNode* rear;

    Queue() {
        front = nullptr;
        rear = nullptr;
    }

    void enqueue(int e) {
        QNode* s = new QNode();
        s->data = e;
        if (front == nullptr) {
            front = s;
            rear = s;
        }
        else {
            s->next = rear->next;
            rear->next = s;
            rear = s;
        }
    }
    bool dequeue(int& e) {
        bool res = true;
        if (front == nullptr) {
            res = false;
        }
        else {
            e = front->data;
            QNode* p;
            p = front;
            front = front->next;
            delete p;
        }
        return res;
    }

};

MyTool.h

#pragma once
#include"Queue.h"
#include"Stack.h"

class MyTool {
public:
    static void transform(double data,int base) {
        if (data <= 0) {
            cerr << "Please input a number greater than zero!" << endl;
            exit(1);
        }
        Stack s;   //stack处理整数部分 ,queue处理小数部分
        Queue que;
        int part_int;
        part_int = (int)data;
        double part_decimal;
        part_decimal = data - part_int;
        //先分离出整数部分,处理整数部分
        int elem;
        while (part_int != 0) {
            elem = part_int % base;
            s.push(elem);
            part_int /= base;
        }
        //接下来处理小数部分
        int index = 0;//记录数位,限制数位大小,避免无限小数导致异常
        while (part_decimal > 0 && index < 10) {
            //10位小数以内,不考虑浮点数下溢情况
            part_decimal *= base;
            elem = (int)part_decimal;
            que.enqueue(elem);
            part_decimal -= elem;
            index++;
        }
        //输出这个数
        //不用ABC这些字母了,所以中间空出一个,表示数位之间间隔
        while (s.pop(elem)) {
            cout << elem << " ";
        }
        cout << ".";
        while (que.dequeue(elem)) {
            cout << elem << " ";
        }
        cout << endl;
    }
};

main.cpp

#include"MyTool.h"

int main() {
    double a;
    int base;
    cout << "Input a double decimal:" << endl;
    cin >> a;
    cout << "Input a base:" << endl;
    cin >> base;
    MyTool::transform(a, base);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SlowIsFast/p/12636324.html