• 面向对象练习


    定义Boat和Car两个类,两者都有私有成员weight属性,定义两者的一个友员函数totalweight(),计算两个类的对象的重量和。

    请根据给定的main函数和totalweight()函数的定义,完善Boat和Car两个类。

    友元函数的使用

     #include  <iostream> 
    using  namespace  std;  
    class Car;
    class Boat{
        friend int totalweight(Boat &b,Car &a);
        public:
            Boat(int w = 0){
                weight = w;
            };
        private:
            int weight;
            
    }; 
    class Car{
        friend int totalweight(Boat &b,Car &a);
        public:
            Car(int w = 0){
                weight = w;
            }
        private:
            int weight;
    };
    
    
     
    int  totalweight(Boat&  b,Car&  c) 
    { 
            return  b.weight+c.weight; 
    } 
    int  main() 
    { 
            Boat  b(100); 
            Car  c(200); 
            cout<<totalweight(  b,  c)<<endl; 
            return  0; 
    } 

    【问题描述】声明一个表示时间的类CTime,可以精确表示年、月、日、小时、分、秒,请计算两个日期对象之间相隔的天数。

    要求:

    1、包括私有成员年、月、日、小时、分、秒。

    2、请使用构造函数实现的类的初始化工作,并判断日期和时间的有效性。年月日时分秒应该在正确的范围内。考虑闰年时候二月份的情况。时间的格式是xx:xx:xx,小时不是超过23,分钟和秒不能超过59。

          1)如果日期无效,则输出 “date error! ”  并将年、月、日、小时、分、秒置为0。

          2)如果时间无效,则输出 “time error! ”  并将年、月、日、小时、分、秒置为0。

          3)如果日期和时间都有效,则根据传递的参数初始化年、月、日、小时、分、秒。

          4)构造函数的三个参数:小时、分、秒 设计为默认形成,其默认值为0。

          5)  输出"构造函数被调用"

    3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用”

    4、请设计一个析构函数,同时输出“析构函数被调用”

    5、设计一个成员函数  int dayDiff(CTime t) ,用于计算当前对象与形参t之间的相隔的天数,注意相隔天数为大于等于0的正整数。注意闰年的问题。

    6、设计一个成员函数 showTime(),用于显示日期,显示格式为:2020/3/12 11:50:20

    #include<iostream>
    using namespace std; 
    int isRuiYear(int y){
        if( y%4==0 ){
            if( y%100==0 && y%400!=0) return 0;
            else return 1;
        }
        return 0;
    }
    int Maxday(int y,int m){
        if( m == 2 ){
            if( isRuiYear(y) ) return 29; 
            return 28;
        }
        else if( m==1 ||m ==3 || m == 5 || m ==7 || m ==8 || m== 10 || m==12 ) return 31;
        return 30;
    }
    int DAYS(int y,int m,int d){
        int res = 0;
        res += ( y/4 )*1461;
        for(int i = y/4*4+1;i<=y;i++){
            if( isRuiYear(i) ) res += 366;
            else res += 365; 
        }
        for(int i=1;i<m;i++){
            res+=Maxday(y,i);
        }
        return res+d;
    }
    class CTime{
        public:
            ~CTime(){ 
                cout<<"析构函数被调用"<<endl;
            }
            bool isvalid(){
                return check(year,month,day,hour,minute,second)==0;
            }
            int check(int y,int m,int d,int h,int M,int s){
                if(  y<0  ||m<1 || d>Maxday(y,m) ||d<1 ) return 1;
                if( h<0 || M<0 || s<0 || h>23 || M>59 || s>59 ) return 2;
                return 0;
            }
            void Initial(int y,int m,int d,int h,int M,int s){
                year=y ,month=m ,day=d ,hour=h ,minute=M ,second=s ;
            }
            CTime(int y,int m,int d,int h=0,int M=0,int s=0){ 
                if( check( y, m, d, h, M, s)==1 ){
                    cout<<"date error!"<<endl;
                    Initial(0,0,0,0,0,0);
                }
                else if( check( y, m, d, h, M, s)==2 ){
                    cout<<"time error!"<<endl;
                    Initial(0,0,0,0,0,0);
                }
                else 
                    Initial(y,m,d,h,M,s);
                cout<<"构造函数被调用"<<endl;
            }
            CTime(const CTime &CT){
                cout<<"拷贝构造函数被调用"<<endl; 
                year=CT.year ,month=CT.month ,day=CT.day ,hour=CT.hour ,minute=CT.minute ,second=CT.second ;
            }
            void showTime(){
                cout<<year<<"/"<<month<<"/"<<day<<" "<<hour<<":"<<minute<<":"<<second<<endl;
            }
            int dayDiff(CTime t1); 
            
        private:
            int year,month,day,hour,minute,second;
    };
    int CTime :: dayDiff(CTime t1){
        int res =  DAYS( year,month,day) - DAYS(t1.year,t1.month,t1.day );//先不考虑时分秒
         
        int flag = 0,flag2 = 0;
        if( hour!=t1.hour && hour<t1.hour) flag= 1;
        else if( minute !=t1.minute&&minute < t1.minute ) flag = 1; 
        else if( second !=t1.second &&second < t1.second ) flag = 1; 
        
        if( hour!=t1.hour && hour>t1.hour) flag2= 1; 
        else if( minute !=t1.minute && minute > t1.minute  )  flag2 = 1; 
        else if( second !=t1.second &&second > t1.second)  flag2 = 1; 
        //flag 表示 t0 的时分秒小于 t1的时分秒  flag2 同理 
        if( res>0 && flag ) res--; 
        if( res<0 && flag2 ) res++;
        return res>0?res:-res;
    }
    
    int  main() 
    { 
            int  year,  month,  day,  hour,  minute,  second; 
            cin  >>  year  >>  month  >>  day  >>  hour  >>  minute  >>  second; 
            CTime  t1(year,  month,  day,  hour,  minute,  second); 
            t1.showTime(); 
            CTime  t2(2000,  1,  1);  //利用默认形参将时间初始化为00:00:00 
            if  (t1.isvalid())          //如果日期和时间合法,则计算天数 
            { 
                    int  days=0; 
                    days=t1.dayDiff(t2); 
                    cout  <<  "这两天之间相隔了"  <<  days  <<  ""  <<  endl; 
                    days=t2.dayDiff(t1); 
                    cout  <<  "这两天之间相隔了"  <<  days  <<  ""  <<  endl; 
            } 
    }
    
    
    /*
    
    【样例输入1】
    3 12 11 50 20
     
    【样例输出1】
    
    构造函数被调用
    
    2020/3/12 11:50:20
    
    构造函数被调用
    
    拷贝构造函数被调用
    
    析构函数被调用
    
    这两天之间相隔了7376天
    
    拷贝构造函数被调用
    
    析构函数被调用
    
    这两天之间相隔了7376天
    
    析构函数被调用
    
    析构函数被调用
    
    */

    【问题描述】设计一个CRectangle类,其中包括CPoint类的两个对象成员,表示左上角和右下角的两个点。要求求解矩形的面积。

    注意,每个类的构造函数、拷贝构造函数需要输出“*** is called”,具体的请根据输出进行分析。

    main函数已经给定如下:

    int main()

    {

        int a=1, b=1, c=6, d=11;

        cout<<"# Define p1 ######"<<endl;

        CPoint p1;

        cout<<"# Define p2 ######"<<endl;

        CPoint p2(10,20);

        cout<<"# Define rect1 ######"<<endl;

        CRectangle rect1;

        cout<<"# Define rect2 ######"<<endl;

        CRectangle rect2(p1, p2);

        cout<<"# Define rect3 ######"<<endl;

        CRectangle rect3(a, b, c, d);

        cout<<"# Define rect4 ######"<<endl;

        CRectangle rect4(rect2);

        cout<<"# Calculate area ######"<<endl;

        cout << "rect1面积为" << rect1.GetArea() << endl;

        cout << "rect2面积为" << rect2.GetArea() << endl;

        cout << "rect3面积为" << rect3.GetArea() << endl;

        cout << "rect4面积为" << rect4.GetArea() << endl;

        system("pause");

        return 0;

    }

    【样例输出】

    # Define p1 ######

    CPoint contstructor with default value(0,0) is called.

    # Define p2 ######

    CPoint contstructor with default value(0,0) is called.

    # Define rect1 ######

    CPoint contstructor with default value(0,0) is called.

    CPoint contstructor with default value(0,0) is called.

    CRectangle default contstructor is called.

    # Define rect2 ######

    CPoint copy contstructor is called.

    CPoint copy contstructor is called.

    CPoint copy contstructor is called.

    CPoint copy contstructor is called.

    CRectangle contstructor with (CPoint,CPoint) is called.

    # Define rect3 ######

    CPoint contstructor with default value(0,0) is called.

    CPoint contstructor with default value(0,0) is called.

    CRectangle contstructor with (int,int,int,int) is called.

    # Define rect4 ######

    CPoint copy contstructor is called.

    CPoint copy contstructor is called.

    CRectangle copy contstructor is called.

    # Calculate area ######

    rect1面积为0

    rect2面积为200

    rect3面积为50

    rect4面积为200

    #include<iostream>
    using namespace std;
    class CRectangle;
    class CPoint{
        friend CRectangle; 
        public:
            CPoint(int x=0,int y=0){
                cout<<"CPoint contstructor with default value(0,0) is called."<<endl;
                a = x,b = y;  
            }
            CPoint( const CPoint &P ){
                cout<<"CPoint copy contstructor is called."<<endl;
                a = P.a,b = P.b; 
            } 
        private:
            int a,b;
    };
    
    class CRectangle{
        public:
            CRectangle(int a=0,int b=0,int c=0,int d=0){
                if( a==b&&b==c&&c==d &&d==0 ){ 
                    cout<<"CRectangle default contstructor is called."<<endl;
                    A.a = 0,A.b = 0,B.a = 0,B.b = 0; 
                }
                else{ 
                    A.a = a, A.b = b,B.a = c,B.b = d;
                    cout<<"CRectangle contstructor with (int,int,int,int) is called."<<endl;                
                }
    
            }
            CRectangle(CPoint Pa,CPoint Pb): A(Pa),B(Pb){  
                cout<<"CRectangle contstructor with (CPoint,CPoint) is called."<<endl; 
            } 
            CRectangle(const CRectangle &rec):A(rec.A),B(rec.B){  
                cout<<"CRectangle copy contstructor is called."<<endl;
            }
            int GetArea(){
                return abs( (A.a-B.a)*(A.b-B.b) );
            }
        private: 
            CPoint A,B;
    };
    int  main() 
    { 
            int  a=1,  b=1,  c=6,  d=11; 
            cout<<"#  Define  p1  ######"<<endl; 
            CPoint  p1; 
            cout<<"#  Define  p2  ######"<<endl; 
            CPoint  p2(10,20); 
            cout<<"#  Define  rect1  ######"<<endl; 
            CRectangle  rect1; 
            cout<<"#  Define  rect2  ######"<<endl; 
            CRectangle  rect2(p1,  p2); 
            cout<<"#  Define  rect3  ######"<<endl; 
            CRectangle  rect3(a,  b,  c,  d); 
            cout<<"#  Define  rect4  ######"<<endl; 
            CRectangle  rect4(rect2); 
            cout<<"#  Calculate  area  ######"<<endl; 
            cout  <<  "rect1面积为"  <<  rect1.GetArea()  <<  endl; 
            cout  <<  "rect2面积为"  <<  rect2.GetArea()  <<  endl; 
            cout  <<  "rect3面积为"  <<  rect3.GetArea()  <<  endl; 
            cout  <<  "rect4面积为"  <<  rect4.GetArea()  <<  endl; 
            system("pause"); 
            return  0; 
    } 
  • 相关阅读:
    数组是个好东西
    排列(permutation) 用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。
    子序列的和
    韩信点兵
    水仙花数
    阶乘之和
    3n+1问题
    MongoDB 安装
    mysql中bigint在php中表示
    Android之NDK开发
  • 原文地址:https://www.cnblogs.com/SunChuangYu/p/12597338.html
Copyright © 2020-2023  润新知