C++[C++ Calculator 项目] 初试

Calculator V1.0

流淌:这是一个C++计算器项目的初步部分。
盖功能简介:
  • 能输入一错数学表达式
  • 逐字符扫描,提取数字和标志得到平等组队列
  • 逐行输出提取的记号和数字
兑现代码如下:
  • scan.h

    #ifndef _SCAN_H_
    #define _SCAN_H_
    #include<string>
    #include<iostream>
    #include<queue>
    using std::string;
    using std::queue;
    class Scan{
    queue<string> expression;    //用于接收表达式
    bool isDigit(char c);       //判断是否是数字或'.'
    void numErr();              //当数值超过10位后报错
    public:
    Scan(){};                        //    ->暂无
    ~Scan(){};                       //    ->暂无
    queue<string> getExp(){return expression;}  //返回expression队列的内容
    queue<string> toStringQueue(string );  //toStringQueue将string的内容逐字符提取转换为string队列
    }; 
    #endif
    
  • print.h

    #ifndef _PRINT_H_
    #define _PRINT_H_
    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    class Print{
    // parameter 
    public:
    Print(){};    //暂无
    ~Print(){};     //暂无
    bool putq(queue<string> output); //逐行输出string队列
    };
    #endif
    
  • Calculator.cpp

    #include<iostream>
    #include<string>
    #include"scan.h"
    #include"print.h"
    int main()
    {
        using namespace std;
        string exp;         //exp用来接收键盘输入的表达式
        getline(cin,exp);
        Scan input;
        Print output;
        output.putq( input.toStringQueue(exp)); //调用input类的toStringQueue方法,返回一个<string>的队列,传入output的putq方法输出队列
        cin.get();  
        return 0;
    }
    
  • scan.cpp

    #include"scan.h"
    bool Scan::isDigit(char c)                                      //判断是否是数字或句点
    {
        if( (c<='9'&&c>='0')|| c=='.')return true;
    
        return false;
    }
    
    void Scan::numErr()
    {
        std::cout<<"numerical ERROR\n";
        std::cin.get();
        std::exit(-1);
    }
    
    queue<string> Scan::toStringQueue(string input)
    {
        int i=0,dlen=0;         //i用于循环,dlen用于表示数值长度
        int len=input.length(); //用input的长度len来作为循环条件
        string& c=input;    //用c来代替input不然打的太累了=。=
        string temp="";     //temp用来暂储input中的元素
        while( i<len){
            if(isDigit(c[i]) ){
                temp+=c[i];
                dlen++;
                if(dlen>10)numErr();        //判断数值是否超出范围
                if( (i+1)<len && isDigit(c[i+1]) && ++i ) continue; //判断是否还有下一个字符以及下一个字符是不是数字或句点,若是++i跳回循环开头,
                                            //    否则,将条件后的数个语句执行
            }
            else temp=c[i];
            dlen=0;                             /重置dlen
            expression.push(temp);          //将temp推入队列
            temp="";
            i++;
        }
        return expression;
    }
    
  • print.cpp

        #include"print.h"
        bool Print::putq(queue<string> output)
        {
            int count=0;     //count计数确保输出正确
            while( !output.empty() ){
                cout<<output.front()<<endl;
                output.pop();
                count++;
            }
            return count==output.size();  //返回输出个数是否正确的布尔值
        }
    

    自文件可以当github上下载


代码编写过程遇到的题目:

  这次的题材不是十分不便,尤其是事后题目一直以改变简单,所以代码写得乎于流利。
  不过本编写Print类时,根本未知底queue是什么数据类型,于是就去百度了森,不敢说还知晓了,但是起码会就此了。
  除了有的边边角角的问题他,在首先不成编写了toStringQueue方法后跻身了疯之调节状态,bug不停止的出现,原始代码如下

C++ 1

  当时之想法是逐字符提取,

  •  若是字符则直push(temp)
  •  若是数字temp+=c[i++],把数字接到temp上

    •  再判断下一个c[i] 是否也是数字

      • 大凡,就把生一个接到temp后面,dlen++
      • 否,就push(temp),重置temp和dlen

我的IDE是vs2010,编译过了,但是运行的时刻会弹出警告“ string subscript
out of range

string
下标越界,一开始百度并没了解是马上意思,一直在找是匪是投机哪里的指针或者什么的没初始化或者哪里进了死循环

C++ 2

新兴在DEBUG模式下才找到罪魁祸首,上面是讲话中,当i不小于len后先后向下运作

C++ 3

而是运行及箭头处经常,此时底c[i]都不止下标范围了,之后以同样赖i++了,

而以下面这步的轮回条件中之dlen++<=10起摩擦,这使得数值最充分而是及11员

C++ 4

率先蹩脚写的这个函数的逻辑有点乱,把点装有bug总结了平普后,开始大换血,重新勾了一个逻辑稍清晰的,正确运行。


最后……当然是总啦:

以一个请勿小心,耗费了祥和一下午日子来debug,简直血与泪水的代价啊,事实告诉自己下写序要要多思量一会,否则大把死把的年月就这样没有了,同时为劝自己之后要是多偏重程序的逻辑,这样才能够写有又强健的代码来。

用作高校在之首先单C++项目,肯定起那么些不足之处,欢迎看罢之各位给自身批评和建议,谢谢!