Calculator
2016-02-19 20:16
357 查看
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"); }
相关文章推荐
- leetcode:Rotate List
- Linux 源码安装Python
- 新手必备的常用代码片段整理(一)
- [Locked] Number of Connected Components in an Undirected Graph
- jsp 界面注册、登录按钮的实现
- IOS 文件系统
- 安卓 自动弹出键盘
- hrbust 1176 小陈老师、雪人【map+优先队列】
- 部署Apache网站服务
- 安卓 单例设计模式 查看方法
- HDU 4602 Partition
- CTeX终于要更新了
- BadUSB的防范研究
- php5.6 源码安装过程
- python 编码问题
- 金额转换,阿拉伯数字转换成中国传统形式。例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
- 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出, 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
- markdown学习2:Markdown编辑器之比较
- Java中print、printf、println的区别
- poj 3126 Prime Path