zoukankan      html  css  js  c++  java
  • Calculator项目的过程及感受

    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的一些基本操作。
    如图:

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

  • 相关阅读:
    hdoj1587
    欧拉定理及其应用
    hdoj1571
    hdoj1050
    POJ推荐50题
    poj2593
    hdoj1286
    hdoj1215七夕节
    我的Linux软件
    ACM题目推荐--《算法艺术与信息学竞赛》(转)
  • 原文地址:https://www.cnblogs.com/wpqf7630/p/5210830.html
Copyright © 2011-2022 走看看