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 项目] 初试的更多相关文章

  1. Calculator项目的过程及感受

    1.将Calculator项目传到Github上的链接地址:https://github.com/sonnypp/object-oriented/tree/master/Calculator 2.本次 ...

  2. 第三次作业之Calculator项目随笔

    附:Github的链接:https://github.com/mingyueanyao/object-oriented/tree/master/Calculator 1.初见题目: 第一眼看到题目最大 ...

  3. [C++ Calculator 项目] 文件读入与可视化实现

    Calculator V1.1 注:这是C++计算器项目第三.四部分-文件读写与可视化 [基于原代码重构而得] 源文件已上传至Github 文件读写 可视化 文件读写: Ⅰ.在原基础代码上增加了-f参 ...

  4. [C++ Calculator 项目] 基础运算实现

    Calculator V1.1 注:这是C++计算器项目第二部分-运算 [基于初始部分增改而得] 源文件已上传至github 主要问题: Ⅰ.运算实现的问题在于( ) + - * /的优先级的处理,以 ...

  5. 关于第三次寒假作业之C++Calculator项目的情况:

    一.仓库地址: object-oriented: 二.作业要求: Calculator: 三.完成本次作业的情况及感受: 刚接触到这个题目的时候,自己就是那丈二的和尚,摸不着头脑,由于自己视频找得比较 ...

  6. 学生信息的添加 Java web简单项目初试(修改)

    错误原因: 1.Java web 的Servlet类没有配置好,并且缺少一个 Dao类(Date Access Object通常用于操作数据库的). 2.代码的某些名称错误,导致数据库数据存储错误. ...

  7. 学生信息的添加 Java web简单项目初试(失败)

    题目要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单 ...

  8. [团队项目]----Math Calculator

    团队项目 ----Math Calculator 任务: 1.每个团队从Github上fork这个项目的源代码 https://github.com/RABITBABY/We-have-bing 2. ...

  9. C++计算器项目的初始部分(第三次作业)

    C++计算器项目的初始部分 项目源文件地址:calculator 项目信息: * 项目名称:Calculator * 项目实现: * 对四则运算表达式进行拆解 * 对拆解的表达式进行简单的错误判断 * ...

随机推荐

  1. 禁止右键,禁止选中,禁止网页复制的Js代码

    document.oncontextmenu=new Function('event.returnValue=false;'); document.onselectstart=new Function ...

  2. 排序算法 - 插入排序(Insertion sort)

    插入排序对于少量元素的排序是很高效的,而且这个排序的手法在每个人生活中也是有的哦. 你可能没有意识到,当你打牌的时候,就是用的插入排序. 概念 从桌上的牌堆摸牌,牌堆内是杂乱无序的,但是我们摸上牌的时 ...

  3. oracle 体系结构简介

    1.1.SGA(system global area) SGA是oracle Instance的基本组成部分,在示例启动是分配.是一组包含一个oracle实例的数据和控制信息的共享内存结构.主要用于存 ...

  4. 初学unslider

    1.关于unslider下载 官方提供的下载页面是http://www.bootcss.com/p/unslider/,但总是进不了下载页面,所以我就查看主页的源码,找到unslider.min.js ...

  5. docker私有库搭建过程(Registry)

    实验环境: CentOS7 1611 Docker 1.12.6 registry   2.0 1.安装并运行registry 安装: [root@docker01 ~]# docker pull r ...

  6. 亲测可行,AndroidStudio 究竟如何配置gradle

    一.你不想看到的 Gradle Build Running 话说在天朝当程序员也是很不容易的,不管是查阅资料还是下载东西,很多时候你会发现自己上网姿势不对,当然对大多数程序员来说,这都不是事儿.这次重 ...

  7. 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

    简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA ...

  8. php产生随机字符串

    /** * 产生随机字符串 * * @param int $length 输出长度 * @param string $chars 可选的 ,默认为 0123456789 * @return strin ...

  9. 调用phprpc的时候出现Fatal error: Cannot redeclare gzdecode()

    出现这个问题的原因是:php在5.4版本后,已经自包含了gzdecode()函数,开发者自己定义的gzdecode()函数会与其冲突. 在 ....\phpRPC\compat.php文件的第72行( ...

  10. Generic(泛型)

    什么是泛型:"通过参数化类型来实现在同一份代码上操作多种数据类型.利用"参数化类型"将类型抽象化,从而实现灵活的复用". 简单来说泛型就是为了使一些代码能够重复 ...