[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 * 项目实现: * 对四则运算表达式进行拆解 * 对拆解的表达式进行简单的错误判断 * ...
随机推荐
- Azure 基础:Blob Storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在前文中介绍了 Table Storage 的基本 ...
- Day1 - Python基础1 Python介绍、基本语法、流程控制习题集
1.打印Hello World! print("Hello World!") 或 name="你好,世界!" print(name) 2.声明变量:打印name ...
- redis五种数据类型
string Redis的字符串和其他编程语言或者其他键值存储提供的字符串非常相似. 命令 行为 GET 获取存储在给定键中的值 SET 设置存储在给定键中的值 DEL 删除存储在给定中的值(这个命令 ...
- STM8程序在IAR中报错 unable to allocate space for sections
Error[Lp011]: section placement failed: unable to allocate space for sections/blocks with a total es ...
- 【webpack整理】一、安装、配置、按需加载
如果你: 是前端热爱者 :) 有JavaScript/nodejs基础 会使用一些常用命令行,mkdir,cd,etc. 会使用npm 想对webpack有更深的认识,或许此时你恰好遇到关于webpa ...
- ionic 项目中创建侧边栏的具体流程分4步简单学会
这是在学习ionic时,当时遇到的一些问题,觉得很难,就记笔记下来了,现在觉得如果可以拿来分享,有可能会帮助到遇到同样问题的人 ionic slidemenu 项目流程: cd pretices(自己 ...
- 使用websocket-sharp来创建c#版本的websocket服务
当前有一个需求,需要网页端调用扫描仪,javascript不具备调用能力,因此需要在机器上提供一个ws服务给前端网页调用扫描仪.而扫描仪有一个c#版本的API,因此需要寻找一个c#的websocket ...
- 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)
容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...
- Ubuntu+OpenCV2.4.11+ CodeBlocks 配置
1.OpenCV 与 CodeBlocks 的安装都比较简单,好多教程. 参考http://www.cnblogs.com/lyutian/p/4425956.html 安装opencv. Codeb ...
- HTML5 Web SQL 数据库操作
Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 以下是规范中定义的三个核心方法: openDataba ...