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++中的类和对象,这对我完成作业有很大的帮助。

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

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. const double pi=3.14;
  5. class shape
  6. {
  7. public:
  8. virtual double com_area() =0;
  9. virtual double com_volume() =0;
  10. virtual void show() =0;
  11. };
  12. class cube:public shape
  13. {
  14. private:
  15. double length;
  16. public:
  17. double com_area()
  18. {
  19. double area;
  20. area=6*pow(length,2);
  21. return area;
  22. }
  23. double com_volume()
  24. {
  25. double volume;
  26. volume=pow(length,3);
  27. return volume;
  28. }
  29. void show()
  30. {
  31. cout << "length=" << length << endl;
  32. }
  33. cube(double l=1):length(l)
  34. {}
  35. ~cube()
  36. {}
  37. };
  38. class cylinder:public shape
  39. {
  40. private:
  41. double rad;
  42. double height;
  43. public:
  44. double com_area()
  45. {
  46. double area;
  47. area=2*pi*pow(rad,2)+2*pi*rad*height;
  48. return area;
  49. }
  50. double com_volume()
  51. {
  52. double volume;
  53. volume=pi*pow(rad,2)*height;
  54. return volume;
  55. }
  56. void show()
  57. {
  58. cout << "rad=" << rad << "," <<"height=" << height << endl;
  59. }
  60. cylinder(double r=1,double h=1):rad(r),height(h)
  61. {}
  62. ~cylinder()
  63. {}
  64. };
  65. class ball:public shape
  66. {
  67. private:
  68. double rad;
  69. public:
  70. double com_area()
  71. {
  72. double area;
  73. area=4*pi*pow(rad,2);
  74. return area;
  75. }
  76. double com_volume()
  77. {
  78. double volume;
  79. volume = 4*pi*pow(rad,3)/3;
  80. return volume;
  81. }
  82. void show()
  83. {
  84. cout << "rad = " << rad << endl;
  85. }
  86. ball(double r=1):rad(r)
  87. {}
  88. ~ball()
  89. {}
  90. };
  91. int main()
  92. {
  93. shape *a;
  94. cube b(5);
  95. a=&b;
  96. cout << "cube: " ;
  97. a->show();
  98. cout << "area=" << a->com_area() << " " << "volume=" << a->com_volume() << endl;
  99. cylinder c(5,2);
  100. a=&c;
  101. cout << "cylinder: ";
  102. a->show();
  103. cout << "area=" << a->com_area() << " " << "volume=" << a->com_volume() << endl;
  104. ball d(5);
  105. a=&d;
  106. cout << "ball: ";
  107. a->show();
  108. cout << "area=" << a->com_area() << " " << "volume=" << a->com_volume() << endl;
  109. return 0;
  110. }

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

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

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

一、第一次简单的尝试

action1 .cpp

  1. #include<iostream>
  2. #include<string>
  3. #include<queue>
  4. using namespace std;
  5. queue<string>key;
  6. void ToStringQueue(string input)//将输入的字符串拆分并存在queue里
  7. {
  8. int l = input.length();
  9. for(int i = 0 ; i < l;)
  10. {
  11. string tmp="";
  12. //先判断是否是数字 并一起存在tmp中
  13. while(i<l&&input[i]>='0'&&input[i]<='9')
  14. tmp+=input[i++];
  15. //将tmp所存数字存入到queue中
  16. if(tmp!="")
  17. key.push(tmp);
  18. //
  19. while(i<l&&(input[i]<'0'||input[i]>'9'))
  20. {
  21. tmp="";
  22. tmp+=input[i++];
  23. key.push(tmp);
  24. tmp="";
  25. }
  26. }
  27. }
  28. //打印queue里所存的数据
  29. void PirntStringQueue()
  30. {
  31. while(!key.empty())
  32. {
  33. cout<<key.front()<<endl;
  34. key.pop();
  35. }
  36. }
  37. //main函数 处理输入的字符串
  38. int main()
  39. {
  40. string input;
  41. cin>>input;
  42. ToStringQueue(input);
  43. PirntStringQueue();
  44. return 0;
  45. }

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

如图:

二、使用类来处理

action2 .cpp

  1. #include<iostream>
  2. #include<string>
  3. #include<queue>
  4. using namespace std;
  5. queue<string>key;
  6. //创建一个Scan类
  7. class Scan
  8. {
  9. //在类中定义一个ToStringQueue的函数
  10. public:
  11. void ToStringQueue(string input);
  12. };
  13. void Scan::ToStringQueue(string input)//将输入的字符串拆分并存在queue里
  14. {
  15. int l = input.length();
  16. for(int i = 0 ; i < l;)
  17. {
  18. string tmp="";
  19. //先判断是否是数字 并一起存在tmp中
  20. while(i<l&&input[i]>='0'&&input[i]<='9')
  21. tmp+=input[i++];
  22. //将tmp所存数字存入到queue中
  23. if(tmp!="")
  24. key.push(tmp);
  25. // 将不是数字的字符分开并且存入到队列中
  26. while(i<l&&(input[i]<'0'||input[i]>'9'))
  27. {
  28. tmp="";
  29. tmp+=input[i++];
  30. key.push(tmp);
  31. tmp="";
  32. }
  33. }
  34. }
  35. //创建一个Print的类
  36. class Print
  37. {
  38. //在类中定义一个 PrintStringQueue的函数
  39. public:
  40. void PrintStringQueue()
  41. {
  42. while(!key.empty())//判断队列是否为空
  43. {
  44. cout<<key.front()<<endl;//输出队列的队员
  45. key.pop();//删除刚输出队列的队员
  46. }
  47. }
  48. };
  49. //main函数
  50. int main()
  51. {
  52. Scan a;
  53. Print b;
  54. string input;
  55. cin>>input;
  56. a.ToStringQueue(input);
  57. b.PrintStringQueue();
  58. return 0;
  59. }

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

运行如下:

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

如图:

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

如图所示:

三、Calculator项目的创建

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

代码如下:


  1. #include<iostream>
  2. #include<string>
  3. #include<string>
  4. #include<queue>
  5. using namespace std;
  6. queue<string>key;
  7. //创建一个Scan类
  8. class Scan
  9. {
  10. // 在类中定义一个ToStringQueue的函数
  11. public:
  12. void ToStringQueue(string input);
  13. };
  14. // 将输入的字符串拆分并存在queue里
  15. void Scan::ToStringQueue(string input)
  16. {
  17. int l = input.length(); //字符串的长度
  18. for(int i = 0 ; i < l;)
  19. {
  20. string tmp="";
  21. while(i<l&&input[i]>='0'&&input[i]<='9')
  22. tmp+=input[i++]; //将数字存在一起
  23. if(tmp!="")
  24. key.push(tmp); //加入到队列
  25. while(i<l&&(input[i]<'0'||input[i]>'9'))
  26. {
  27. tmp=""; //将tmp中原有的数据弄成空值
  28. tmp+=input[i++];
  29. key.push(tmp); //将不是数字的字符一个一个加入到队列
  30. tmp="";
  31. }
  32. }
  33. }
  34. //创建一个Print类
  35. class Print:
  36. {
  37. //定义一个打印queue的函数
  38. public:
  39. void PirntStringQueue()
  40. {
  41. while(!key.empty())
  42. {
  43. cout<<key.front()<<endl; //输出队列。
  44. key.pop();
  45. }
  46. }
  47. };

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

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

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

四、遇到的问题:

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

五、最终的代码实现

.h 文件

  1. #include<iostream>
  2. #include<string>
  3. #include<queue>
  4. using namespace std;
  5. int t=0;//创建全局变量,来计算一个数的有几位数
  6. queue<string>key;//设全局的队列queue
  7. //创建Scan的类
  8. class Scan
  9. {
  10. //定义一个处理字符串的函数
  11. public:
  12. void ToStringQueue(string input);
  13. };
  14. //对函数进行封装
  15. void Scan::ToStringQueue(string input)
  16. {
  17. int l=input.length(); //测出字符串的长度
  18. string tmp="";
  19. for(int i=0;i<l;i++)
  20. {
  21. if(t>10) //如果数字的位数超过10 就产生错误;
  22. {
  23. cout<<"Error"<<endl;
  24. break;
  25. }
  26. if(input[i]=='-' || input[i]=='+' || input[i]=='(' || input[i]==')' || input[i]=='/' || input[i]=='*') //判断是否有字符
  27. {
  28. t=0;
  29. if(tmp!="")
  30. {
  31. key.push(tmp);//将已有的数据存入队列
  32. }
  33. tmp=""; //置空
  34. tmp+=input[i];
  35. key.push(tmp);//讲一个一个不同于数字的运算符存入队列
  36. tmp="";//再次置空
  37. }
  38. else if(input[i]>=0||input[i]<=9) //判断是数字
  39. {
  40. t++;//计算连续数字的个数
  41. tmp+=input[i];//将连续数字存在一起
  42. continue;
  43. }
  44. }
  45. key.push(tmp);// 处理最后面的数字传入队列
  46. tmp="";
  47. }
  48. //创建一个Print的类
  49. class Print
  50. {
  51. //在类中定义一个输出队列的函数
  52. public:
  53. void PrintStringQueue();
  54. };
  55. //对Print的类进行封装
  56. void Print::PrintStringQueue()
  57. {
  58. if(t<=10)
  59. {
  60. while(!key.empty()) //判断key队列是否为空
  61. {
  62. cout<<key.front()<<endl; //一个一个的输出
  63. key.pop();//删除最先那个;因为queue队列是front in front out。
  64. }
  65. }
  66. }

还有.cpp文件

  1. #include<iostream>
  2. #include<string>
  3. #include "calculator.h"
  4. using namespace std;
  5. int main()
  6. {
  7. Scan a; //创建一个Scan类的对象 a;
  8. Print b; //创建一个Print类的对象 b;
  9. string input; //声明字符串 ;
  10. cin >> input; // 输入字符串 ;
  11. a.ToStringQueue(input); //处理字符串;
  12. b.PrintStringQueue(); //输出队列;
  13. return 0;
  14. }

运行的结果:

如图:

如果超出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. 基于Babylon.js编写简单的骨骼动画生成器

    使用骨骼动画技术可以将网格的顶点分配给若干骨头,通过给骨头设定关键帧和父子关系,可以赋予网格高度动态并具有传递性的变形 效果.这里结合之前的相关研究在网页端使用JavaScript实现了一个简单的骨骼 ...

  2. 达梦数据库DM7小结

    除了很多主流的数据库,我们很熟悉之外,越来越多的国产数据库也涌现出来. 这次就小结一些有关武汉的达梦数据库7这个开发版数据库的有别或者需要注意的地方进行一个简单备注吧. 1.第一件大事就是下载.数据库 ...

  3. docker 下 mysql 集群的搭建

    下载程序&&创建docker容器 从mysql官网https://dev.mysql.com/downloads/cluster/上下载mysql集群库mysql-cluster-gp ...

  4. JavaWeb总结(二)

    Web服务器的缺陷 Web服务器是被设计用来向客户端提供HTTP服务的,它只能向客户端提供静态网页内容.静态页面是原封不动的待在Web服务器目录中,服务器找到静态网页,并把它原样传回到客户端.每个客户 ...

  5. 对Dataguard的三种模式的理解

    模式1:最大可保护模式: 必须同步. 模式2:最大可用性模式: 能同步就同步,不能同步就不同步. 模式3:最大性能模式: 异步模式.

  6. c++ 动态数组,指针与动态内存分配

    教学内容: 内存的使用 动态内存分配malloc函数 分配内存时使用sizeof运算符 用指针访问内存 以数组的形式访问内存 一.内存的使用 堆(heap) 在程序执行期间分配内存时,内存区域中的这个 ...

  7. 18-[模块]-random&os&sys

    1.random模块 程序中有很多地方需要用到随机字符,比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串 # randrange #返回1-3之间的一个随机数,不包含3 # ra ...

  8. JAVAWEB eclipse开启服务器时,filter出现找不到的问题时

    这个时候重启eclipse再开启服务器即可.

  9. jQuery js 格式化数字

    写程序与的时候,有些地方需要js或者jQuery取值,然后将50000000.00格式化成50,000,000.00这种形式: 首先创建formatCurrency.js,代码如下: function ...

  10. jquery 直接访问图片路径

    jQuery("#img").attr("src",function(){return this.src+"?"});