《面向对象程序设计》第三次作业 Calculator

c++第三次作业 Calculator

git上的作业展示点这里

ps:有一点不是很明确,作业要求:将数字和符号提取出来,得到一组string,然后才将这些string存入队列中。按我的理解是需要将每一个部分都先存在一个string数组里,这样显得很冗余也有点古怪,因此我直接讲string分出来后存在队列中。如果诸位大神有更新的见解,跪求指点。

Scan.hpp

#ifndef Scan_hpp
#define Scan_hpp

#include <iostream>
#include <queue>
#include <string>

using namespace std;

class Scan
{
private:
    //用于接收键盘输入的四则运算表达式
    string input;            
    string charString;

public:
    queue<string> ToStringQueue(string input);
    //判断数字是否过大用的标记
    bool tooBig;             
};

#endif

Scan.cpp

#include "Scan.hpp"

#include <iostream>
#include <queue>
#include <string>

using namespace std;

queue<string> Scan::ToStringQueue(string input){

    tooBig = false;
    //计算数字位数的字符串
    int count=0; 
    //用于组合数字或符号的字符串  
    string item = "";          
    std::queue<string> charQueue;

    for (int i=0; i<input.length(); i++)
    {
                               
        //是符号则先将组合好的数字压入队列然后才压入符号                                   
        if(input[i]=='+' || input[i]=='-'|| input[i]=='*' || input[i]=='/' || input[i]=='(' || input[i]==')' )
        {
            if(!item.empty()){
                charQueue.push(item);
            }
            item.clear();
            count = 0;
        
            item = input[i];
            charQueue.push(item);
            item.clear();
        }
   
        //组合数字的过程里计算位数,注意:小数点不要计入位数中!          
        else if((input[i] >= 48 && input[i] <=57) || input[i] == '.' )
        {
            item += input[i];
            if(input[i] != '.'){
                count++;
            }
            if (count >= 10) {
                tooBig = true;
            }
        
        }
    }
                                 
    //如果最后一个字符是数字则要记住将其压入
    if(!item.empty())
    {
        charQueue.push(item);
    }
    
    return charQueue;
}

Print.hpp

#ifndef Print_hpp
#define Print_hpp
#include <iostream>
#include <queue>
#include <string>

using namespace std;

class Print
{
public:
    void printString(queue<string> charQueue);
};

#endif

Print.cpp

#include "Print.hpp"

#include <iostream>
#include <queue>
#include <string>

void Print::printString(queue<string> charQueue)
{
    
    //从队列头输出字符串,然后取出已完成输出的字符串,直到结束
    while (!charQueue.empty()) {
        cout << charQueue.front() << endl;
        charQueue.pop();
    }
}

main.cpp

#include <iostream>
#include <queue>
#include <string>

#include "Print.hpp"
#include "Scan.hpp"

using namespace std;
int main() {

    string input;
    Scan m_scan;
    getline(cin,input);
    
    //先执行一次函数来计算布尔值决定下一步
    m_scan.ToStringQueue(input);
    
    //有出现大于10位数的数字则报错,没有就输出队列
    if(m_scan.tooBig)
    {
        cout << "Error!Number not conform to the requirement.";
    }
    else
    {
        class Print pr;
        pr.printString(m_scan.ToStringQueue(input));
    }

    return 0;
}

数据检测

ps:看视频比看书效率高、有意思,不要问我怎么知道的……

posted @ 2016-02-28 17:22  vayhang_E  阅读(191)  评论(2编辑  收藏  举报