1、将Calculator项目传到Github上的链接地址:https://github.com/sonnypp/object-oriented/tree/master/Calculator

2、本次作业的题目要求为:http://www.cnblogs.com/fzuoop/p/5187275.html

3、完成本次作业的过程及遇到的问题

1、当我看到这题题目的时候,以我本人当时对c++知识的理解,根本就不知道这是什么意思,比如什么类啊,queue的队列问题啊,我都不了解,无从下手。因此,作为一个初学者必须先去了解一些c++中的一些重要知识——类,我在慕课网上看了C++远征之离港篇 以及 C++远征之封装篇(上) 还有一个是C++远征之封装篇(下)等等,还有一些什么继承篇啊,多态篇啊,我也看了一些,初步了解了c++中的类和对象,这对我完成作业有很大的帮助。

在看这些视频,我也自己尝试去写了一些相关知识的代码:

#include<iostream>
#include<cmath>
using namespace std; const double pi=3.14;
class shape
{
public:
virtual double com_area() =0;
virtual double com_volume() =0;
virtual void show() =0;
};
class cube:public shape
{
private:
double length;
public:
double com_area()
{
double area;
area=6*pow(length,2);
return area;
}
double com_volume()
{
double volume;
volume=pow(length,3);
return volume;
} void show()
{
cout << "length=" << length << endl;
}
cube(double l=1):length(l)
{}
~cube()
{}
};
class cylinder:public shape
{
private:
double rad;
double height;
public:
double com_area()
{
double area;
area=2*pi*pow(rad,2)+2*pi*rad*height;
return area;
}
double com_volume()
{
double volume;
volume=pi*pow(rad,2)*height;
return volume;
}
void show()
{
cout << "rad=" << rad << "," <<"height=" << height << endl;
}
cylinder(double r=1,double h=1):rad(r),height(h)
{}
~cylinder()
{}
};
class ball:public shape
{
private:
double rad;
public:
double com_area()
{
double area;
area=4*pi*pow(rad,2);
return area;
}
double com_volume()
{
double volume;
volume = 4*pi*pow(rad,3)/3;
return volume;
}
void show()
{
cout << "rad = " << rad << endl;
}
ball(double r=1):rad(r)
{}
~ball()
{}
}; int main()
{
shape *a;
cube b(5);
a=&b;
cout << "cube: " ;
a->show();
cout << "area=" << a->com_area() << " " << "volume=" << a->com_volume() << endl;
cylinder c(5,2);
a=&c;
cout << "cylinder: ";
a->show();
cout << "area=" << a->com_area() << " " << "volume=" << a->com_volume() << endl;
ball d(5);
a=&d;
cout << "ball: ";
a->show();
cout << "area=" << a->com_area() << " " << "volume=" << a->com_volume() << endl;
return 0;
}

2、对类有了一定的了解后,我就开始去看了C++ STL中queue的相关内容介绍以及queue的使用方法,也大致明白了queue的使用方法和原理。

3、还有些不懂得问题,我请教了一些学长他们,他们都耐心的给我们讲解。

4、之后呢,就是一些我尝试写的代码及遇到的一些问题:

一、第一次简单的尝试

action1 .cpp

#include<iostream>
#include<string>
#include<queue>
using namespace std; queue<string>key; void ToStringQueue(string input)//将输入的字符串拆分并存在queue里
{
int l = input.length();
for(int i = 0 ; i < l;)
{
string tmp="";
//先判断是否是数字 并一起存在tmp中
while(i<l&&input[i]>='0'&&input[i]<='9')
tmp+=input[i++];
//将tmp所存数字存入到queue中
if(tmp!="")
key.push(tmp);
//
while(i<l&&(input[i]<'0'||input[i]>'9'))
{
tmp="";
tmp+=input[i++];
key.push(tmp);
tmp="";
}
}
} //打印queue里所存的数据
void PirntStringQueue()
{
while(!key.empty())
{
cout<<key.front()<<endl;
key.pop();
}
} //main函数 处理输入的字符串
int main()
{ string input;
cin>>input;
ToStringQueue(input);
PirntStringQueue();
return 0;
}

这是我第一次尝试,我只想对结果处理,那时还不是对类有很大的把握,就用了函数来处理,就写了以上的代码,发现这样运行时可以的。

如图:

二、使用类来处理

action2 .cpp

#include<iostream>
#include<string>
#include<queue>
using namespace std; queue<string>key;
//创建一个Scan类
class Scan
{
//在类中定义一个ToStringQueue的函数
public:
void ToStringQueue(string input);
}; void Scan::ToStringQueue(string input)//将输入的字符串拆分并存在queue里
{
int l = input.length();
for(int i = 0 ; i < l;)
{
string tmp="";
//先判断是否是数字 并一起存在tmp中
while(i<l&&input[i]>='0'&&input[i]<='9')
tmp+=input[i++];
//将tmp所存数字存入到queue中
if(tmp!="")
key.push(tmp);
// 将不是数字的字符分开并且存入到队列中
while(i<l&&(input[i]<'0'||input[i]>'9'))
{
tmp="";
tmp+=input[i++];
key.push(tmp);
tmp="";
}
}
} //创建一个Print的类
class Print
{
//在类中定义一个 PrintStringQueue的函数
public:
void PrintStringQueue()
{
while(!key.empty())//判断队列是否为空
{
cout<<key.front()<<endl;//输出队列的队员
key.pop();//删除刚输出队列的队员
}
}
}; //main函数
int main()
{
Scan a;
Print b;
string input;
cin>>input;
a.ToStringQueue(input);
b.PrintStringQueue();
return 0;
}

看起来就是比使用函数的时候多了class,这样也是可以的。

运行如下:

然后我就想,这样都可以了,我们就可以来创建一个工程,来完成这次作业了。之后我就想要怎么来实现呢?这是一个问题,然后我就去创建了一个Calculator的文件夹,里面包含了Scan类的.h文件夹、Print类的.h文件夹和一个calculator.cpp文件:

如图:

后来我发现这是错的,而是要去创建一个Calculator的项目。这是我第一次创建项目,我也很搞不懂这些的运行原理,所以很迷茫,最后,我问了同学如何去创建项目,最后,在同学的帮助下,我完成了项目的创建,并在该项目中添加了一个Class.h文件和 一个calculator.cpp文件

如图所示:

三、Calculator项目的创建

在该项目中,我写了一个.h文件,里面包含了Scan类和Print类,

代码如下:


#include<iostream>
#include<string>
#include<string>
#include<queue>
using namespace std; queue<string>key;
//创建一个Scan类
class Scan
{
// 在类中定义一个ToStringQueue的函数
public:
void ToStringQueue(string input);
}; // 将输入的字符串拆分并存在queue里
void Scan::ToStringQueue(string input)
{
int l = input.length(); //字符串的长度
for(int i = 0 ; i < l;)
{
string tmp="";
while(i<l&&input[i]>='0'&&input[i]<='9')
tmp+=input[i++]; //将数字存在一起
if(tmp!="")
key.push(tmp); //加入到队列
while(i<l&&(input[i]<'0'||input[i]>'9'))
{
tmp=""; //将tmp中原有的数据弄成空值
tmp+=input[i++];
key.push(tmp); //将不是数字的字符一个一个加入到队列
tmp="";
}
}
} //创建一个Print类
class Print:
{
//定义一个打印queue的函数
public:
void PirntStringQueue()
{ while(!key.empty())
{
cout<<key.front()<<endl; //输出队列。
key.pop();
}
}
};

写完.h文件后,我便在项目里添加了一个calculator.cpp文件,并创建一个Scan对象和一个Print对象,

#include<iostream>
#include<string>
#include "Class.h"
using namespace std; int main()
{ Scan a; //定义一个Scan类对象 a .
Print b; //定义一个Print类对象 b .
string input; //声明字符串
cin>>input; //输入字符串
a.ToStringQueue(input); //对字符串进行处理 并且存在queue的队列中
b.PirntStringQueue(); //打印队列
return 0;
}

最后编译完成后,运行结果如图:

四、遇到的问题:

我以为问题解决了,可是代码并没有那么完美,关键就是还没出来作业要求1,超过10位数的数值那也有以上的代码也是可以得,所以我就去找另一种方法来解决这个问题了。我就问了同学如何解决,他告诉我需要用一个数来计数,所以在他的帮助下,我完成了代码。

五、最终的代码实现

.h 文件

#include<iostream>
#include<string>
#include<queue>
using namespace std;
int t=0;//创建全局变量,来计算一个数的有几位数
queue<string>key;//设全局的队列queue //创建Scan的类
class Scan
{
//定义一个处理字符串的函数
public:
void ToStringQueue(string input);
}; //对函数进行封装
void Scan::ToStringQueue(string input)
{
int l=input.length(); //测出字符串的长度
string tmp="";
for(int i=0;i<l;i++)
{
if(t>10) //如果数字的位数超过10 就产生错误;
{
cout<<"Error"<<endl;
break;
}
if(input[i]=='-' || input[i]=='+' || input[i]=='(' || input[i]==')' || input[i]=='/' || input[i]=='*') //判断是否有字符
{
t=0;
if(tmp!="")
{
key.push(tmp);//将已有的数据存入队列
}
tmp=""; //置空
tmp+=input[i];
key.push(tmp);//讲一个一个不同于数字的运算符存入队列
tmp="";//再次置空
}
else if(input[i]>=0||input[i]<=9) //判断是数字
{
t++;//计算连续数字的个数
tmp+=input[i];//将连续数字存在一起
continue;
}
}
key.push(tmp);// 处理最后面的数字传入队列
tmp="";
} //创建一个Print的类
class Print
{
//在类中定义一个输出队列的函数
public:
void PrintStringQueue();
}; //对Print的类进行封装
void Print::PrintStringQueue()
{
if(t<=10)
{
while(!key.empty()) //判断key队列是否为空
{
cout<<key.front()<<endl; //一个一个的输出
key.pop();//删除最先那个;因为queue队列是front in front out。
}
}
}

还有.cpp文件

#include<iostream>
#include<string>
#include "calculator.h"
using namespace std; int main()
{
Scan a; //创建一个Scan类的对象 a;
Print b; //创建一个Print类的对象 b;
string input; //声明字符串 ;
cin >> input; // 输入字符串 ;
a.ToStringQueue(input); //处理字符串;
b.PrintStringQueue(); //输出队列;
return 0;
}

运行的结果:

如图:

如果超出10位数就报错的结果:

如图:

完成作业就像是雨后的彩虹,顿时有一种柳暗花明的感觉。

4、最后的小结以及完成作业后的感受:

这次完成作业,已经是接近寒假的尾声了,这次的作业付出了很多,也收获了很多。在这短短的十几天来完成这个作业的时间里,我花了不少的心思去完成作业,去看了视频,去请教了学长,同学,也去不断的尝试,虽然有过一些不成功,我也改了很久的代码,不过,这也是完成一项项目的必须经过的吧,吃的苦中苦,方为人上人嘛。我以前没有这种去做项目的经验,这次,也给了我不少的好处,我明白了开发一个项目,必须不怕苦,不怕累,百折不饶,持之以恒,在工作中学习,在学习中进步。

还有,我这在学习过程中也学会了使用github的一些基本操作。

如图:

最后呢,我想说的是学习就是一个过程,在这短短的寒假里,从老师给我们布置的任务中,让我们由浅到深的了解了面向对象程序设计这门课的意义所在,也让我们了解了很多这门课的知识,让我们早早接触到这门课程,是我们有了大致方面的理解,这使我们的好奇心不断地加强,才去不断的探索,才能在迷茫中不断的清晰,在黑暗中不断的见到了光明。在这几次作业里,我感受到了学习给我们带来的乐趣,那就是:没有什么是完成不了的,只要你有毅力,只要你有决心,认认真真,世上真没什么难事是解决不了的。所以,我想告诉大家,完成一件事就得坚持,在工作中学习,在学习中进步。

Calculator项目的过程及感受的更多相关文章

  1. C# 项目提交过程中感受

    C# 项目提交过程中感受 新到一家互联网公司,昨天第一次提交代码,遇到了不少问题,而且大多数是代码格式问题,特此将范的错误记录下来,自我警示. 1. 代码对齐,这个虽然一直也都在注意,不过还是有一行代 ...

  2. Maven学习总结(二)——Maven项目构建过程练习

    上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立M ...

  3. Maven学习总结(二)——Maven项目构建过程练习_转载

    上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立M ...

  4. 转】Maven学习总结(二)——Maven项目构建过程练习

    原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4051690.html 感谢! 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven ...

  5. 在linux下用tomcat部署java web项目的过程与注意事项

    在linux下用tomcat部署java web项目的过程与注意事项 一.安装JDK 到http://www.oracle.com/technetwork/java/javase/downloads/ ...

  6. 带你走进SAP项目实施过程——前言(0)

    欢迎关注博主的微信公众号,每天提供原创的SAP技术和项目管理新资讯! 一直很想写一些关于SAP项目管理以及实施过程的系列文章,讲述企业SAP项目从立项开始到启动,再到实施过程,直到最后的上线及总结.我 ...

  7. Maven学习(二)-- Maven项目构建过程练习

    摘自:http://www.cnblogs.com/xdp-gacl/p/4051690.html 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约 ...

  8. Maven项目构建过程练习

    转载于:http://www.cnblogs.com/xdp-gacl/p/4051690.html 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建 ...

  9. (转)Maven学习总结(二)——Maven项目构建过程练习

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项 ...

随机推荐

  1. 让你的QT显示一个窗口吧

    项目文件 01_QtTest.pro #------------------------------------------------- # # Project created by QtCreat ...

  2. CPP/类/成员函数访问权限2

    // main.cpp // OOL // Created by mac on 2019/4/4. // Copyright © 2019年 mac. All rights reserved. // ...

  3. redis 基本数据类型-字符串(String)

    不瘦原来对redis也是有个大概的了解(就你知道的多), 但是最近和大神聊天的过程中才明白自己知道的简直就是鸡毛蒜皮(让你得瑟),所以不瘦打算从头在捋一遍,顺便把过程也记录下来,如果能给大家在学习re ...

  4. 提高PHP开发效率, PhpStorm必装的几款插件

    1. Translation 最好用的翻译插件 对于我等英文不好的同学来说,简直是福音. 打开翻译对话框 : Ctrl + Shift + O(英文字母o) 鼠标取词并翻译 : Ctrl + Shif ...

  5. django的Session-10

    目录 配置储存引擎 存储在sql数据库 储存在缓存 储存在本地文件 储存在redis session操作 django需要使用一个中间价来实现 session功能, 一般情况下默认启用了该中间价 ,可 ...

  6. 查看git提交细节

    git log git show fdf39277f54dd0484a9fefc012463924544e07af

  7. Velocity学习3

    Velocity快速入门教程 Apache的速度是一个基于Java的的模板引擎(模板引擎),它允许任何人仅仅简单的使用模板语言(模板语言)来引用由java的代码定义的对象. 官网介绍如下: Veloc ...

  8. zabbix3.4 监控路由器报错No Such Instance currently exists at this OID

    zabbix 3.4 监控报错No Such Instance currently exists at this OID 1.首先查看监控的路由器的监控项是否报警 监控主机报错出现这个 No Such ...

  9. X5webview去掉分享功能和缓存功能

    x5webview比原生的webview适配更好,加载更快,对音视频的兼容性更好,具备独特的优势 1) 速度快:相比系统webview的网页打开速度有30+%的提升: 2) 省流量:使用云端优化技术使 ...

  10. pdo的用处,用法

    PDO主要是用来对数据库进行访问的.PDO扩展为PHP访问数据库定义了一个轻量级的一致接口,不同数据库在访问时,采用相同方法名称,解决了连接数据库不统一问题.PDO扩展自身并不能实现任何数据库功能,必 ...