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. 使用wget下载JDK8

    每次去官网下载JDK有点烦 但是直接使用wget 又得同意协议所以 使用如下的wget就好了(注意是64位的哦) 先去官网看一下地址变化 没有如下 :修改后面的下载地址即可 注意哦~ 2.然后使用下面 ...

  2. 学习笔记TF022:产品环境模型部署、Docker镜像、Bazel工作区、导出模型、服务器、客户端

    产品环境模型部署,创建简单Web APP,用户上传图像,运行Inception模型,实现图像自动分类. 搭建TensorFlow服务开发环境.安装Docker,https://docs.docker. ...

  3. git 常用的命令符

    1. linux操作命令: touch Filename:创建一个文件: mkdir 文件夹名字:创建一个文件夹: cd pathname:切换磁盘: cd ..:返回上一级: rm Filename ...

  4. 什么是Web Worker?

    简单点说,Web Worker就是一个运行在后台的JavaScript线程,不会影响页面的响应. 我们知道,JavaScript是单线程的脚本语言,即同一时刻只能做一件事情,否则会带来极其复杂的同步问 ...

  5. SQL储存过程

    基本语法 创建存储过程 create procedure sp_name @[参数名] [类型],@[参数名] [类型] as begin ......... end 以上格式还可以简写成: crea ...

  6. 破解 Adobe 系列的最佳方法,手把手教

    此方法是个人认为最方便的而且最安全的方法(可以避免下载到可能捆绑病毒的破解版本) 1.首先到Adobe的官网上下载 Creative Cloud: 打开官网上creative cloud 的下载页面: ...

  7. PC版模块滚动不显示滚动条效果

    以前对某个模块增加无滚动条的滚动效果,还需要找个插件才能实现,现在发现个简单方法,用普通的CSS就可以实现. 此方法只适用于不显示滚动条的滚动效果,如果需要自定义滚动条样式,还是需要插件来实现. HT ...

  8. select change事件给其它元素赋值,本select的value或tex

    select change事件给其它元素赋值,本select的value或textonchange='$("#areaname").val($("option:selec ...

  9. php测试题

    1. LAMP具体结构不包含下面哪种(A) A:Windows系统 B:Apache服务器 C:MySQL数据库 D:PHP语言 2. 以下哪个SQL语句是正确的(D) A:insert into u ...

  10. Python系列教程(一):简介

    Python发展历史 起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受 ...