作业题目:

C++计算器项目的初始部分

仓库

代码:###

Scan.h

#ifndef SCAN_H
#define SCAN_H
#include<string>
#include<iostream> using namespace std; class Scan
{
public:
void ToStringQueue(string input);
}; #endif

Scan.cpp

#include "Scan.h"
#include<string>
#include<queue>
#include<iostream> using namespace std;
queue <char> Que;
int j = 0; //定义全局变量,以便报错 void Scan::ToStringQueue(string input)
{
int i = 0, k=0, len = input.size();
for (i = 0; i < len; i++)
{
if (input[i] == '+' || input[i] == '-'
||input[i] == '*' || input[i] == '/'
||input[i] == '(' || input[i] == ')')
{
k = 0; // 计数清零
} else
{
if (input[i]!='.')
{
if (input[i] >= '0' && input[i] <= '9')
{
k++; //计数
} if (k>10)
{
j++; //用于报错
}
}
} Que.push(input[i]);
}
};

Print.h

    #ifndef PRINT_H
#define PRINT_H class Print
{
public:
void print_str();
} ; #endif

Print.cpp

#include "Print.h"
#include"Scan.h"
#include<string>
#include<queue>
#include<iostream> using namespace std;
extern int j;
extern queue <char> Que; void Print::print_str()
{
int T = 0; if(j != 0) // 判断是否报错。
{
cout << "Error!"<<endl;
} else
{
while (!Que.empty())
{
if (Que.front() == '+' || Que.front() == '-'
|| Que.front() == '*' || Que.front() == '/'
|| Que.front() == '(' || Que.front() == ')')
{
if (T)
{
cout << endl; // 保证数字完整输出后及时换行.
T = 0;
}
cout << Que.front() <<endl;
Que.pop(); // 输出后清除队列中第一个元素
} // 判断, 若不是运算符号或者括号,
//则不必输出 endl (\n), 保持数字及小数 (包括小数点)输出的完整性。 else
{
cout << Que.front();
Que.pop();
T = 1;
}
}
}
};

main.cpp

#include "Scan.h"
#include "Print.h"
#include<string>
#include<iostream> using namespace std; int main ()
{
Scan Calculator; // 对象实例化
Print Put;
string str; // 定义 str 用来存储键入的字符串。
cin >> str;
Calculator.ToStringQueue(str); //调用。
Put.print_str();
return 0;
}

一、解题思路:

过程主要采用<string><queue>. 相关用法可参考:string queue

步骤(主要说下Scan和Print部分):

1. Scan:

  • 设置全局变量 j = 0.
  • 通过 len = input.size() (主要要加上头文件 #include<string> 才能使用) 得出 input 的长度。
  • 使用循环,从 0-len ,将 input 的元素依次 push 入队列 Que。
  • 在 push 的过程中,判断是否数字继而开始计数 (k),直至push入的字符不是数字为止且同时令k=0 (清零)。若输入的数字超过10位,则 j++ 进而可以用于 Print 处判断是否输出 Error 。

2. Print:

  • 通过 if(j != 0) 来决定输出 Error! 或者输出 队列 Que .
  • 若输出队列,则通过
      if (Que.front() == '+' || Que.front() == '-'
    || Que.front() == '*' || Que.front() == '/'
    || Que.front() == '(' || Que.front() == ')')
    {
    if (T)
    {
    cout << endl; // 保证数字完整输出后及时换行.
    T=0;
    }
    cout << Que.front() <<endl;
    Que.pop(); // 输出后清除队列中第一个元素
    }
    // 判断, 若不是运算符号或者括号,
    // 则不必输出 endl ( \n ), 保持数字及小数 (包括小数点)输出的完整性。
    else
    {
    cout << Que.front();
    Que.pop();
    T=1;
    }
    来输出数字及小数,并能够按要求进行换行,每输出一个元素,使用 Que.pop() 删除队列的第一个数据元素 .

二、过程的纠错:

    第一遍打完代码忘记将数字完整保留输出,于是在 Print 输出方面使用判断语句(判断是否连续是数字,
是则不输出 endl)解决. 紧接着我才发现题目要求当数字超出 10 位时报错(包括小数部分)。 对于这个问题,我想了下,便在Scan ToStringQueue()设置了 j,k(均为局部变量),通过计数,来判断
是否溢出。然后修改后的代码的运行结果并没有发生改变。于是我又重新查看了下代码才发现 j 应当设置成
全局变量才能在 print_str() 中使用。 刚开始的时候在 Scan ToStringQueue() 中我采用的是 if (input[i] >= '9' && input[i] <= '0') 条件成立时 k++计数。但是想了想发现作为一个计算器,
如果输入的字符与运算无关那是不是也应该报错呢。于是 便改成了 if (input[i] == '+'|| input[i] == '-'
|| input[i] == '*' || input[i] == '/'
||input[i] == '(' || input[i] == ')')
{
k = 0; // 计数清零 。
}
else // 计数.
{
if (input[i] != '.')
{
k++;
if (k > 10)
{
j++;
}
}
} 最终 大功告成!

三、小结:

从大年初一开始到前几天,一直都处于浪的状态 -.- !这次的作业也就刚出来那天看了下(然而并没有看懂,只知道要用到类的知识)。估计是知道要开学了,才会突然想起还有作业,从昨天早上开始,整整一天的时间,看了类那一章节,以及<string><queue>的用法。又花了今天一整天才搞定了这份作业。想想刚放假时的豪言壮语,再看看现在,感觉整个寒假终究是惰性占据了一切。还是开学的好,比较有激情去学习。

四、2.23修改总结:

  • 首先要说的是,关于多文件相互调用问题, 之前对于题目的理解有误,以为是建立一个 类 写俩个class (Scan和Print). 后来看了下才知道要建立俩个 类 。 对于俩个类之间变量值的调用我采用 extern 类型 变量名 ,前提是要加上头文件,比如我在Print类文件中要调用Scan类文件中的 整型 j 和 队列 Que , 就得在Print类头部加上 #include"Scan.h".

  • 接着,题目似乎要求的是将 字符串(string) push 入队列,虽然我使用的方法是将 字符(char) push 入队列。 但如果要使用前面那种方式的话,我的代码主要如下:

Scan.cpp :

queue<string>Que;
string s;
int j=0;//用于判断是否报错
void Scan::ToStringQueue(string input)
{
int i,k=0, n=input.size();
s=input[0];
for (i=0; i<n; i++)
{
if (input[i]=='+'||input[i]=='-'
||input[i]=='*'||input[i]=='/'
||input[i]=='('||input[i]==')')
{
Que.push(s); // 将字符串s push队列 (此时s要么是数字(包括小数),要么是单个字符)
s.clear(); //清空 字符串s
k=0; //计数清零
}
else
{
for (; i<n; i++)
{
if (input[i]=='+'||input[i]=='-'
||input[i]=='*'||input[i]=='/'
||input[i]=='('||input[i]==')')
{
break;
}
else
{
if(i!=0) s += input[i]; //将数字连接起来
if(input[i]>='0'&&input[i]<='9') k++;//计数
if (k>10) j++;//用于报错
}
Que.push(s); // 将字符串s push队列 (此时s要么是数字(包括小数),要么是单个字符)
s.clear(); //清空 字符串s
s=input[i];
i=i-1;
}
}
}

Print.cpp :

    extern int j;
extern queue <char> Que;
void Print::print_str()
{
if(j != 0) // 判断是否报错。
{
cout << "Error!"<<endl;
}
else
{
while (!Que.empty()) // 队列非空,则继续循环输出 (若队列为空, 则 Que.empty() 的返回值为true)。
{
cout << Que.font() <<endl;//输出一个一个的字符串(单个字符或者数字)
Que.pop();// 输出后清除队列中第一个元素
}
}

既然选择了远方,便只顾风雨兼程。

第三次作业— C++计算器项目的初始部分的更多相关文章

  1. 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分

    C++计算器项目初始部分 零.项目源文件地址 传送门:calculator 一.项目信息相关: 项目:Calculator 版本:1.0 日期:2016.2.16 实现: 基本的操作界面 对四则运算表 ...

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

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

  3. 《Coderxiaoban团队》第三次作业:团队项目的原型设计

    <XXX团队>第三次作业:团队项目的原型设计 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验七 团队作业3:团队项目原型设计与开发 团队名称 Coder ...

  4. 《ABCD组》第三次作业:团队项目的原型设计

    <ABCD组>第三次作业:团队项目的原型设计 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https:// ...

  5. 《AlwaysRun团队》第三次作业:团队项目的原型设计

    <AlwaysRun团队>第三次作业:团队项目的原型设计 项目 内容 这个作业属于哪个课程 [任课教师博客主页链接](https://home.cnblogs.com/u/nwnu-dai ...

  6. 程序设计第三次作业--C++计算器初始部分

    面向对象程序设计作业3--C++计算器初始部分 Github 链接:https://github.com/luojingzhao/object-oriented/tree/master/calcula ...

  7. 程序设计第三次作业---C++计算器雏形

    Github链接:https://github.com/Wasdns/object-oriented 题目:程序设计第三次作业 程序设计第三次作业附加 我的程序设计第三次作业附加 代码规范 更新时间: ...

  8. 面向对象课程 - 寒假第四次作业 - C++计算器项目计算部分

    C++计算器项目计算部分 零.项目源文件地址 地址:Calculator 2.0 一.项目信息相关 项 目 : Calculator 版 本 : 2 . 0 日 期 : 2016 . 4 . 14 实 ...

  9. 《Hello--world团队》第三次作业:团队项目的原型设计

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验七 团队作业3:团队项目原型设计与开发 团队名称 <hello--world团 ...

随机推荐

  1. linux查看日志文件内容命令(面试被常问到的问题)

    tail -f test.log 你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, linux 如何显示一个文件的某几行(中间几行) 从第3000行开始,显示1000行.即显示3 ...

  2. 【Mac 快捷键】 (不定时持续更新)

    显示/取消显示隐藏文件 command + shift + .

  3. 嵌入式C语言自我修养 02:Linux 内核驱动中的指定初始化

    2.1 什么是指定初始化 在标准 C 中,当我们定义并初始化一个数组时,常用方法如下: ] = {,,,,,,,,}; 按照这种固定的顺序,我们可以依次给 a[0] 和 a[8] 赋值.因为没有对 a ...

  4. 7款易上手C语言编程软件推荐

    C语言是一门历史很长的编程语言,其编译器和开发工具也多种多样,其开发工具包括编译器,现举几个开发工具供大家选择,当然也要根据自己的操作系统来选择适合自己的开发工具. 好多刚开始接触c语言的朋友都想知道 ...

  5. Bluebox Security最新提报Android漏洞的初步探讨(转)

    Bluebox Security在7月3号的时候,在官网上发布了一个据称99%  Android机器都有的一个漏洞.国内最早在4号开始有媒体报道,并持续升温.该漏洞可使攻击者在不更改Android应用 ...

  6. 《Java 程序设计》课堂实践项目-数据库

    <Java 程序设计>课堂实践项目数据库 课后学习总结 目录 数据库实验要求 课堂实践成果 课后思考 由于担心做的不好,找同学询问了数据库的问题,学习了数据库的连通,补写的这篇博客.这是补 ...

  7. win10操作系统vs2010编译osg3.4.0问题解决记录

    参考博客:OSG3.4.0+VS2010+WIN10编译及二次开发环境搭建 链接:https://blog.csdn.net/hsc1239653453/article/details/7827856 ...

  8. 学习和使用STL

    STL是一个标准规范,它只是为容器.迭代器和泛型算法等组件定义了一整套统一的上层访问接口及各种组件之间搭配运用的一般规则,而没有定义组件底层的具体实现方法. STL主要包括下面这些组件:I/O流,st ...

  9. 【转载】COM 组件设计与应用(十四)——事件和通知(vc.net)

    原文:http://vckbase.com/index.php/wv/1244.html 一.前言 我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者: 我的 COM 组件 ...

  10. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...