zoukankan      html  css  js  c++  java
  • Calculator

    1、代码链接:https://github.com/laixiaolian/object-oriented

    2、主要思路:

    首先,先建立一个.h文件,里面建立一个Scan类和Print类。在Scan类里定义一个bool ToStringQueue(string input)用于读取用户输入的四则运算表达式inupt,分解后转存到m_scanstring。在Print类里定义一个void PrintQueue(queue& tmpQueue)用于接受一个队列。

    之后,建立一个.cpp文件,在这个文件中,在Scan类里写一个函数:首先先判断是否为小数还是整数或者是字符。若判断出不是字符,则还要考虑到输入的数字是否超过了10位,若是小数要包括小数点的所占的一位。当读完连续的数字或者单个字符时,要将这些数字或者字符导入到队列中。在最后还需判断表达式最后是否为数字,若是数字则与刚开始时一样需要判断是小数还是整数,是否有超过10位。在Print类里写一个方法,用来输出所得到的队列。

    最后,建立Main.cpp文件,在其main里面获取键盘输入以及创建Scan对象和Print对象。

    3、过程中遇到的困难以及解决过程:

    • 处理实数的过程中,开始没有判断小数和整数,于是我在calculator.cpp中添加了判断条件。

              bool isDigit = false; 
              bool isdecimal = false; 
              for (size_t i = 0; i != input.size(); i++)
          {
      if (isdigit(input[i]) || input[i] == '.') //判断是否为数字,包括小数点
      {
      	if (input[i] == '.') 
      	{
      		isdecimal = true;	
      	}
      	
      	isDigit = true;
      	continue;
               }
      
    • 调试时发现没有输出。解决方法:没有考虑到表达式最后是数字还是字符,于是我在代码中加了这一段

              if (isDigit) //表示表达式最后为数字
              {
      string tmp = input.substr(markOfReadPos,input.size() - markOfReadPos); //i - markOfReadPos为要截取的字符串字符数
      
      
      //判断输入的数字是否超过10位
      
      if (isdecimal) 
      {	
      	if ((tmp.size() - 1) > 10) 
      	{	
      		return false;	
      	}	
      }
      
      
      else 
      {	
      	if (tmp.size() > 10) 
      	{	
      		return false;	
      	}
      }
      
      m_scanstring.push(tmp); //将markOfReadPos 到 i位置的数字 的string导入queue
              }
      
    • 可还是调试不出来,最后发现没有将string存入queue中,于是加了m_scanstring.push()将string存入到queue中。

    • 在Main.cpp中忘记了当数字超出10位时应该输出的语句,于是再加了一个if else语句。整个代码就完成了。

    4、主要代码:

    #include "Calculator.h"
    #include <iostream>
    bool Scan::ToStringQueue(string input)
    {
    size_t markOfReadPos = 0; //标识已经导入到input的第几位,初始0为input第一位
    bool isDigit = false; 
    bool isdecimal = false; 
    
    for (size_t i = 0; i != input.size(); i++)
    {
    	if (isdigit(input[i]) || input[i] == '.') //判断是否为数字,包括小数点
    	{
    		if (input[i] == '.') 
    		{
    			isdecimal = true;	
    		}
    		
    		isDigit = true;
    		continue;
    	}
    
    
    	else 
    	{
    		if (isDigit == true) //判断是否刚读完一串数字
    		{
    			isDigit = false;
    			string tmp = input.substr(markOfReadPos,i - markOfReadPos); //i - markOfReadPos为要截取的字符串字符数
    
    			//判断输入的数字是否超过10位
    
    			if (isdecimal) 
    			{
    				if ((tmp.size() - 1) > 10) 
    				{	
    					return false;	
    				}
    	    	}
    
    
    			else 
    			{
    				if (tmp.size() > 10) //整数部分超过10位
    				{	
    				  return false;	
    				}
    			}
    
    
    			m_scanstring.push(tmp); //将markOfReadPos 到 i位置的数字 的string导入queue
    			markOfReadPos = i;
    			isdecimal = false;
    		}
    
    
    		string sign;
    		sign.insert( sign.begin(), input[i] ); //把char转化成string
    		m_scanstring.push(sign);
    		markOfReadPos++;
    	}	
    }
    
    
    if (isDigit) //表示表达式最后为数字
    {
    	string tmp = input.substr(markOfReadPos,input.size() - markOfReadPos); //i - markOfReadPos为要截取的字符串字符数
    
    
    	//判断输入的数字是否超过10位
    
    	if (isdecimal) 
    	{	
    		if ((tmp.size() - 1) > 10) 
    		{	
    			return false;	
    		}	
    	}
    
    
    	else 
    	{	
        	if (tmp.size() > 10) 
    		{	
    			return false;	
    		}
    	}
    
    	m_scanstring.push(tmp); //将markOfReadPos 到 i位置的数字 的string导入queue
    }
    
    return true;	
    }
    
    
    void Print::PrintQueue(queue<string>& tmpQueue)
    {
    while(!tmpQueue.empty()) //此种遍历会清空queue
    {
    	cout<<tmpQueue.front()<<endl;
    	tmpQueue.pop();	
    }				
    }
    

    5、scan类

    class Scan
    {
    public:
    	Scan() {};
    	~Scan() {};
    	
    public:
    	bool ToStringQueue(string input); //读取用户输入的四则运算表达式inupt,分解后转存到m_scanstring
    	
    public:
    	queue<string> m_scanstring;	
     };
    

    6、 print类

    class Print
    {
    public:
    	Print() {};
    	~Print() {};
    	
    public:
    	void PrintQueue(queue<string>& tmpQueue); //接受一个队列
    };
    

    7、main函数

    #include "Calculator.h"
    #include <iostream>
    using namespace std;
    int main()
    {
    string input;
    Scan scanMachine;
    Print printMachine;
    
    cin>>input;
    
    if (scanMachine.ToStringQueue(input))
    {
    	printMachine.PrintQueue(scanMachine.m_scanstring);	
    }
    
    else
    {	
    	cout<<"包含位数超10位的数字,请重新输入!";
    }
    
    system("pause");
    }
  • 相关阅读:
    企业库应用实践系列五:创建模板引擎Library
    关于HtmlHelper:是MVC自作聪明,还是我不够明白?
    企业库应用实践系列二:对象创建原理详解
    企业库应用实践系列三:自定义构造函数
    专业导论 计算机科学概论
    企业短期项目,缺人手
    光脚丫学LINQ(040):引发未将对象引用设置到对象的实例的异常
    光脚丫学LINQ(045):如何表示计算所得列(LINQ to SQL)
    光脚丫学LINQ(042):如何将列表示为由数据库生成的列
    光脚丫学LINQ(043):为实体类的列成员指定在数据库中的数据类型
  • 原文地址:https://www.cnblogs.com/laixiaolian/p/5202081.html
Copyright © 2011-2022 走看看