面向对象小练习

来源:岁月联盟 编辑:exp 时间:2012-02-17

晚上写日记,发现已经好几十篇都没写了
因为日记是按天数排列的,为了保证排列不断开
就要手动把日期天气星期篇数神马的一一加上
编了一个小程序
顺便实践一下面向对象的编程思想
实现了年月日按日递增的功能(闰年已考虑在内)

[cpp]
#define LOCAL 
#include<iostream> 
 
class YEAR//year类  

public: 
       YEAR():year(0),leap(false){} 
       void setyear(int y){year=y;leap=leaptest(y);} 
       int getyear(){return year;} 
       bool isleap(){return leap;} 
       void add(bool b){if(b){++year;leap=leaptest(year);}} 
private: 
       bool leaptest(int y) 
       {return ((y%400==0)||(y%100!=0&&y%4==0));} 
       int year; 
       bool leap; 
}; 
 
class MONTH//month类  

public: 
       MONTH():month(0) 
       { 
             int t[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
             for(int i=0;i<12;i++) 
                monthBox[i]=t[i];                  
       } 
       void setmonth(int m){month=m;} 
       int getmonth(){return month;} 
       bool add(bool b){if(b){month%=12;++month;return month==1;}return false;} 
       int contain(bool leap) 
       { 
           if(leap&&month==2) 
                    return 29; 
           else 
                    return monthBox[month-1];        
       } 
private: 
        int monthBox[12]; 
        int month; 
}; 
 
class DAY//day类  

public: 
       DAY():day(0){} 
       void setday(int d){day=d;} 
       int getday(){return day;} 
       bool add(int contain){day%=contain;++day;return day==1;} 
private: 
        int day; 
}; 
 
class WEEK//week类  

public: 
       WEEK():week(0) 
       { 
              std::string t[7]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; 
              for(int i=0;i<7;i++) 
                   weekBox[i]=t[i]; 
                              
       } 
       void setweek(int w){week=w;week--;} 
       std::string getweek(){return weekBox[week];} 
       void add(){(++week)%=7;} 
private: 
        std::string weekBox[7]; 
        int week;   
}; 
 
class DATE//date类  

public: 
       DATE():cnt(0){} 
       void setdate(int y,int m,int d,int w,int c) 
       { 
            year.setyear(y); 
            month.setmonth(m); 
            day.setday(d); 
            week.setweek(w); 
            cnt=c;    
       } 
       void add() 
       { 
            year.add(month.add(day.add(month.contain(year.isleap())))); 
            week.add(); 
            cnt++; 
       } 
       void printdate() 
       { 
                 std::cout<<year.getyear()<<"年"<<month.getmonth()<<"月"<<day.getday()<<"号"<<"   晴   "<<week.getweek()<<"   "<<cnt<<std::endl; 
       }        
private: 
        YEAR year; 
        MONTH month; 
        DAY day; 
        WEEK week; 
        int cnt; 
}; 
 
int main() 

#ifdef LOCAL 
       freopen("input.txt","r",stdin); 
       freopen("output.txt","w",stdout); 
#endif 
        DATE date; 
        date.setdate(2011,11,30,4,538); 
        int n; 
        std::cin>>n; 
        while(n--) 
        { 
              date.printdate(); 
              date.add();          
        } 
        return 0; 


摘自 Dreamer Thinker Doer