[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](https://github.com/F0UR3r/object-oriented/tree/master/Calculator)上下载
代码编写过程遇到的问题:
这次的题目不是很难,尤其是之后题目一直在改简单,所以代码写得也比较流畅。
不过原先编写Print类时,根本不知道queue是什么数据类型,于是就去百度了好多,不敢说都懂了,但是至少会用了。
除了一些边边角角的问题外,在第一次编写完toStringQueue方法后进入了疯狂的调试状态,bug不停的出现,原始代码如下
当时的想法是逐字符提取,
若是字符则直接push(temp)
若是数字temp+=c[i++],把数字接到temp上
再判断下一个c[i] 是否也是数字
- 是,就把下一个接到temp后面,dlen++
- 否,就push(temp),重置temp和dlen
我的IDE是vs2010,编译过了,但是运行的时候会弹出警告“ string subscript out of range ”
string 下标越界,一开始百度并没懂是这意思,一直在找是不是自己哪里的指针或者什么的没初始化或者哪里进入了死循环
后来在DEBUG模式下才找到罪魁祸首,上面这个语句中,当i不小于len后程序向下运行
但是运行到箭头处时,此时的c[i]已经超出下标范围了,之后又一次i++了,
而且在下面这步的循环条件中的dlen++<=10有错,这使得数值最大可达11位
第一次写的这个函数的逻辑有点乱,把上面所有bug总结了一遍后,开始大换血,重新写了一个逻辑稍清晰的,正确运行。
最后......当然是总结啦:
因为一个不小心,耗费了自己一下午时间来debug,简直血与泪的代价啊,事实告诉自己以后写程序还是要多想一会,否则大把大把的时间就这样没了,同时也告诫自己以后要多注重程序的逻辑,这样才能写出更健壮的代码来。
作为大学生活的第一个C++项目,肯定有许多不足之处,欢迎看过的各位给我批评与建议,谢谢!
[C++ Calculator 项目] 初试的更多相关文章
- Calculator项目的过程及感受
1.将Calculator项目传到Github上的链接地址:https://github.com/sonnypp/object-oriented/tree/master/Calculator 2.本次 ...
- 第三次作业之Calculator项目随笔
附:Github的链接:https://github.com/mingyueanyao/object-oriented/tree/master/Calculator 1.初见题目: 第一眼看到题目最大 ...
- [C++ Calculator 项目] 文件读入与可视化实现
Calculator V1.1 注:这是C++计算器项目第三.四部分-文件读写与可视化 [基于原代码重构而得] 源文件已上传至Github 文件读写 可视化 文件读写: Ⅰ.在原基础代码上增加了-f参 ...
- [C++ Calculator 项目] 基础运算实现
Calculator V1.1 注:这是C++计算器项目第二部分-运算 [基于初始部分增改而得] 源文件已上传至github 主要问题: Ⅰ.运算实现的问题在于( ) + - * /的优先级的处理,以 ...
- 关于第三次寒假作业之C++Calculator项目的情况:
一.仓库地址: object-oriented: 二.作业要求: Calculator: 三.完成本次作业的情况及感受: 刚接触到这个题目的时候,自己就是那丈二的和尚,摸不着头脑,由于自己视频找得比较 ...
- 学生信息的添加 Java web简单项目初试(修改)
错误原因: 1.Java web 的Servlet类没有配置好,并且缺少一个 Dao类(Date Access Object通常用于操作数据库的). 2.代码的某些名称错误,导致数据库数据存储错误. ...
- 学生信息的添加 Java web简单项目初试(失败)
题目要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单 ...
- [团队项目]----Math Calculator
团队项目 ----Math Calculator 任务: 1.每个团队从Github上fork这个项目的源代码 https://github.com/RABITBABY/We-have-bing 2. ...
- C++计算器项目的初始部分(第三次作业)
C++计算器项目的初始部分 项目源文件地址:calculator 项目信息: * 项目名称:Calculator * 项目实现: * 对四则运算表达式进行拆解 * 对拆解的表达式进行简单的错误判断 * ...
随机推荐
- CSS3学习系列之选择器(二)
first-child选择器和last-child选择器 first-child指定第一个元素.last-child指定最后一个子元素. 例如: <!DOCTYPE html> <h ...
- (转)关于 Java 对象序列化您不知道的 5 件事
关于 Java 对象序列化您不知道的 5 件事 转自:http://developer.51cto.com/art/201506/479979.htm 数年前,当和一个软件团队一起用 Java 语言编 ...
- 由 “无法使用从远程表选择的 lob 定位符” 错误而引导出来的一系列问题解决方案
周一上班遇到一个数据加工问题:无法使用从远程表选择的 lob 定位符,由于数据源表不是自己的,不能对源数据做修改,于是我打起了存储过程的主意 我们公司的存过是分三步走,第一层是同步源数据,第二层是对一 ...
- 安装python2.7
系统的yum程序使用的是python2.6,不能够卸载系统所带的python环境.python2.7的安装命令如下 tar vjxf Python-2.7.1.tar.bz2 cd Python-2. ...
- c++字符串的输入的思考
字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措. 与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲 ...
- python 标准库 -- threading
threading : 提高对网络端口的读写效率. threading.Thread.start() 执行线程操作 threading.Thread.run() 执行线程操作 threading.Th ...
- Linux网络服务12——NFS共享服务
Linux网络服务12--NFS共享服务 一.NFS简介 端口号:TCP.UDP 111端口 NFS(Network File System)网络文件系统,是一种基于TCP/IP传输的网络文件系统协议 ...
- SICP-2.2-数据的抽象
数据的抽象 生活中有许多的事物具有复合结构,例如地理位置所用的经纬度,便是通过一个复合结构来代表位置,在我们的程序当中,我们设法将经度纬度组合成一对,我们既可以把他们当做一个整体单元来进行操作,而且也 ...
- 【Python3之异常处理】
一.错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^ SyntaxError: inva ...
- 【原】无脑操作:eclipse + maven搭建SSM框架
网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...