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. 【easyui】Tab的tools按钮刷新当前tab

    点击刷新按钮,刷新当前Tab选项卡 /** * Name 选项卡初始化 */ $('#home-tabs').tabs({ tools: [{ iconCls: 'icon-reload', bord ...

  2. Node.js安装和配置

    今天有时间开始要研究Node.js了,项目的需要,先把环境正好,初次接触,把安装和配置过程记录下来,以备不时之需.言归正传. 1.打开NodeJS的官网,下载和自己系统相配的NodeJS的安装程序,包 ...

  3. node.js入门系列(一)--Node.js简介

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...

  4. bettercap实现内网Dns欺骗

    目的 让内网的所有计算机浏览网页的时候, 出现我的钓鱼页面 准备 kali系统 Bettercap dns文件 通过ifconfig查看当前计算机的ip, 我这边为, 192.168.1.150 创建 ...

  5. Github 开源:高效好用的对象间属性拷贝工具:升讯威 Mapper( Sheng.Mapper)

    Github 地址:https://github.com/iccb1013/Sheng.Mapper 对象属性值映射/拷贝工具.不需要创建映射规则,不要求对象类型一致,适用于简单直接的拷贝操作,可以全 ...

  6. mysqldump 用法总结

    mysqldump 备份 备份数据库 my_database $ mysqldump -uUSER -pPASSWD my_database > my_database.sql 备份数据库 my ...

  7. 为Windows资源管理器右键菜单添加菜单项

    为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...

  8. Iconfont 矢量图标库的应用

    前言: 在项目开发中,不免在标签栏,工具栏等应用各种各样的小图标. 然后老旧的做法就是要UI设计出各种图标并生成图片给到我们,但是这样就存在了一个问题,每次请求页面的时候就需要发送请求请求图片,这样不 ...

  9. 查看表结构命令(mysql和oracle)

    MySQL查看表结构SQL语句 = mysql查看表结构命令,如下: desc 表名; show columns from 表名; describe 表名; show create table 表名; ...

  10. C/C++中的volatile究竟是什么鬼?

    将变量或对象声明为volatile类型后,每次对变量的访问都是从其内存直接读取.那什么时候对变量的访问不是从其内存读取的呢?一种常见的情况就是编译器开启了优化选项,这时候对变量的访问有可能就是从寄存器 ...