Git传送门

纸上得来终觉浅,绝知此事要躬行。

学习了一些c++的相应知识后,虽然了解写法,真正操作时还是出现小错误。要多操作,记住关键点,避免不该有的小错误。

写分文件类外定义时出现了问题。在Scan.cpp文件中定义方法时忘记在方法名前加上作用域Scan::导致错误。记住该关键点后写Print.cpp文件就很顺利.

在Print类中写的一个打印队列的for循环出现错误

for (int i = 0; i < inputQue.size(); i++)
{
cout << inputQue.front() << endl;
inputQue.pop(); }

在测试数据时发现输出不完全,队列后面的部分丢失。通过调试输出队列的大小意识到当让队列头部元素出列后队列的size发生变化,用变量记下接收到的队列大小解决问题。

int size = inputQue.size();
for (int i = 0; i < size; i++)
{
cout << inputQue.front() << endl;
inputQue.pop(); }

还有解决方案是利用while循环。

while (inputQue.size())
{
cout << inputQue.front() << endl;
inputQue.pop(); }

代码部分


Scan.h

#include<iostream>
#include<string>
#include<queue>
using namespace std; class Scan
{
public: /*接收一个四则运算表达式,将表达式对应拆分存入队列 */
void ToStringQueue(string input); /*获取表达式处理后的队列 */
queue<string> getQue(); private: bool isTrue = true; //判断输入是否正确(目前实现判断输入的数字是否超过十位 超过则为 false)
queue<string> inputQue; //存放表达式处理后的队列 };

Scan.cpp

#include"Scan.h"
using namespace std; void Scan::ToStringQueue(string input)
{
string sign = ""; //存放符号
string num = ""; //存放数字
int count = 0; //记忆数字位数 for (int i = 0; i < input.size(); i++)
{
/*当前位为符号*/
if (input[i] == '-' || input[i] == '(' || input[i] == ')' || input[i] == '+' || input[i] == '*' || input[i] == '/')
{
if (num!="")
{
inputQue.push(num);
num = "";
count = 0;
} inputQue.push(sign = input[i]); } /*当前位为数字*/
else if (input[i] >= 48 && input[i] <= 57 || input[i] == '.')
{
count++;
if (count > 10)
{
cout << "输入的数字超过十位(包括小数位)" << endl;
isTrue = false;
break;
} num += input[i];
} } /*最后一位为数字*/
if(num!="" && isTrue)
{
inputQue.push(num);
} /*输入不符(目前为输入的数字超过十位),清空队列*/
if (!isTrue)
{
int size = inputQue.size(); for (int j = 0; j < size; j++)
{
inputQue.pop();
}
}
} queue<string> Scan::getQue()
{
return inputQue;
}

Print.h

#include<iostream>
#include<queue>
using namespace std; class Print
{
public: /*打印接收的队列*/
void printQue(queue<string> que);
};

Print.cpp

#include"Print.h">
using namespace std; void Print::printQue(queue<string> que)
{
int size = que.size(); //存放队列的大小 /*当队列非空时打印队列,队列若为空则输入不符*/
if (!que.empty())
{
for (int i=0; i< size; i++)
{
cout << que.front() << endl;
que.pop();
}
}
}

main.cpp

#include"Scan.h"
#include"Print.h"
using namespace std; int main()
{
string input; //接收键盘输入的表达式
cin>>input; Scan sc;
sc.ToStringQueue(input) ;
queue<string> q = sc.getQue(); //存放获取的队列 Print pr;
pr.printQue(q); return 0;
}

写完代码看了一些同学的博客后发现自己还是有许多不足的地方,应该多加思考,深入思考。比如将数字存放入队列进行判断时我将数字与符号显性地分开存入num和sign字符串中,当时有这种想法是为了后续方便将字符串数字转变为实数,后来想了想queue存放的是同类型的数据,所以在拆分表达式放入队列时显性分开的意义不大,不过可能更好理解吧(...)。还有对于函数的写法可以多思考,有时候代码块位置的改变可能让代码的运行效率快上许多。

《面向对象程序设计》 三 Calculator 计算器初步的更多相关文章

  1. C++面向对象程序设计之C++的初步知识

    本节内容为学习谭浩强老师编写的<C++面向对象程序设计>的第1章  C++的初步知识  后的个人总结. 在正文开始之前,首先声明,我是Python程序员. 1.2.最简单的C++程序 例1 ...

  2. PTA面向对象程序设计6-3 面积计算器(函数重载)

    实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int z); 第一个函数计算长方形的 ...

  3. PTA 面向对象程序设计 6-3 面积计算器(函数重载)

    6-3 面积计算器(函数重载) 实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int ...

  4. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  5. 20162311 实验二 Java面向对象程序设计 实验报告

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  6. 20162321王彪-实验二-Java面向对象程序设计

    实验二Java面向对象程序设计 实验内容一 初步掌握单元测试和TDD 什么是单元测试:单元测试时开发者编写的一小段代码,用于检测被测代码的一个很小的,很明确的功能是否正确.执行单元测试,是为了证明某段 ...

  7. 实验二Java面向对象程序设计实验报告(2)

    实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...

  8. 实验二 Java面向对象程序设计实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  9. 实验二 Java面向对象程序设计 20175301李锦然实验报告

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

随机推荐

  1. oracle 父子关系

    语句递归查找父子关系语句 表结构及数据 1.通过根节点遍历子节点 select t.*,LEVEL from Test2 t START WITH t.parentid=0 CONNECT BY PR ...

  2. 使用 RetroShare 分享资源

    本文告诉大家如何使用 RetroShare 来分享资源.因为 RetroShare 是一个 p2p 分享的工具,所以他比现在很多云盘都好用,在网上,很多大神说可以用来代替电驴.之所以推荐这个软件,因为 ...

  3. Struts初始

    1.首先我们先创建一个maven的简单工程, 如图 然后点击创建一个简单的工程,点击下一步, 然后, 再次输入工程的各项信息,1组织名,2.项目名称,版本名,一般为默认,3,jar包暂时默认,当前的j ...

  4. [javaSE] 并发编程(线程间通信)

    新建一个资源类Resource 定义成员变量String name 定义成员变量int age 新建一个输入类Input,实现Runnable接口 定义一个构造方法Input(),传入参数:Resou ...

  5. 关于伪分布zookeeper集群启动出错(Error contacting service. It is probably not running.)

    今天在配置zookeeper伪分布集群的时候,发现竟然出错了,以前我都是在多台电脑上搭建,大家可以参考我写的Hadoop HA搭建中的zookeeper如何搭建 现在就来说一下为何会出错. 出错的原因 ...

  6. ModelState.IsValid always returning true while mocking a request

    ASB.net  MVC 视图验证里有一个IValidatableObject接口.这里面有一个验证方法.通常我们表单提交的时候dto就是用一个实现IValidatableObject这个接口的实体. ...

  7. java基础之运算符与语句

    一.运算符 1.算数运算符 运算符 名称 举例 + 加法 A等于10,B等于3 则A+B=13 - 减法 A等于10,B等于3 则A-B=7 * 乘法 A等于10,B等于3 则A*B=30 / 除法 ...

  8. IDEA 中edit configurations加号找不到tomcat server

    前言:在本机 idea 中搭建 springMVC 项目,正准备配置 Tomcat 时,发现没有 tomcat server 选项,而我的 idea 是有这个插件的,所以解决问题的方案应该是另一个地方 ...

  9. 【学习笔记】--- 老男孩学Python,day7 python中is 和 == 的区别 encode decode

    is比较的是id(内存地址)是不是一样,==比较的是值是不是一样 Python中,万物皆对象!万物皆对象!万物皆对象!(很重要,重复3遍) 每个对象包含3个属性,id,type,value id就是对 ...

  10. 小tip: base64:URL背景图片与web页面性能优化——张鑫旭

    一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什 ...