《面向对象程序设计》 三 Calculator 计算器初步
纸上得来终觉浅,绝知此事要躬行。
学习了一些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 计算器初步的更多相关文章
- C++面向对象程序设计之C++的初步知识
本节内容为学习谭浩强老师编写的<C++面向对象程序设计>的第1章 C++的初步知识 后的个人总结. 在正文开始之前,首先声明,我是Python程序员. 1.2.最简单的C++程序 例1 ...
- PTA面向对象程序设计6-3 面积计算器(函数重载)
实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int z); 第一个函数计算长方形的 ...
- PTA 面向对象程序设计 6-3 面积计算器(函数重载)
6-3 面积计算器(函数重载) 实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int ...
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 20162311 实验二 Java面向对象程序设计 实验报告
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 20162321王彪-实验二-Java面向对象程序设计
实验二Java面向对象程序设计 实验内容一 初步掌握单元测试和TDD 什么是单元测试:单元测试时开发者编写的一小段代码,用于检测被测代码的一个很小的,很明确的功能是否正确.执行单元测试,是为了证明某段 ...
- 实验二Java面向对象程序设计实验报告(2)
实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...
- 实验二 Java面向对象程序设计实验报告
实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...
- 实验二 Java面向对象程序设计 20175301李锦然实验报告
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
随机推荐
- composer如何自动验证并获取gitlab的私有库?
近期购买了Laravel的nova以后,需要对它的核心代码做一些修改,为方便与团队其他成员分享,以及在nova官方库更新后方便对差异管理.便将nova库挂在自己的gitlab,通过compos ...
- C# 获取config文件 实体转换
随着项目的扩展,单独的key,value配置文件已经不能满足需求了 这里需要自定义配置节点,例如 <!--自定义 具体实体类配置问节点信息--> <School Name=" ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- thinkphp 查询单个“年-月-日” FROM_UNIXTIME
*时间格式转换,使datetimepicker.js 能够搜索 查询 单个 年月日而不需是区间 查询. //另起一行看转换结果 select *,FROM_UNIXTIME(CreateTime,'% ...
- yum 安装php7.1
yum install http://rpms.remirepo.net/enterprise/remi-release-6.rpm yum -y install php71-php.x86_64 p ...
- spring Controller 层注解获取 properties 里面的值
前言:最近在做一个项目,想要在 controller 层直接通过注解 @Value("")来获取 properties 里面配置的属性. 这个其实和 springmvc.sprin ...
- canvas框架::createjs入门
createjs是一个轻量级的框架,稍微有点时间和耐心,就可以把全部源代码都看一遍,毕竟只有三十几个js文件.地址:http://www.createjs.com/ 开发createjs的动画或游戏, ...
- js-权威指南学习笔记10
第十章 正则表达式的模式匹配 1.正则表达式是一个描述字符模式的对象. 2.可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多是通过一种特殊的直接量语法来创建. 3.程序 ...
- vue-cli脚手架的安装
https://github.com/vuejs/vue-cli 官网 使用官方推荐的webpack 条件:node在4.以上,npm在3以上,查看版本号打开cmd输入,node -v npm ...
- 【c++错误】类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)
今天编写类的程序的时候不小心把类后的分号忘写了,就出现上面的错误提示. 顺便复习下类的正确格式: class 类名 { public: //习惯上将公有类型放在前面,便于阅读 ……(外部接口) pro ...