Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

绿色网站无广告
会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

面向对象小练习

来源: Jack_Wong2010 分享至:
晚上写日记,发现已经好几十篇都没写了
因为日记是按天数排列的,为了保证排列不断开
就要手动把日期天气星期篇数神马的一一加上
工程何其大也,还好咱是学软件的
能让计算机帮我完成这项工作
就编了一个小程序
顺便实践一下面向对象的编程思想
实现了年月日按日递增的功能(闰年已考虑在内) 


设计的大体思想:
设计三个类YEAR,MONTH,DAY暂且称为年 月 日吧 
具体过程是这样的:
年月日都会“自增” (即类中有一个add()函数) 
日增到月的最后一天之后会自动跳转到下个月的一号
但是日怎么知道到了这个月的最后一天呢
这就要让月来告诉他,但是要是碰到二月呢,是28天还是29天
这就要让年来告诉月今年是不是闰年
程序开始运行: 
天开始“自增”
但月什么时候自增呢
这就要让天来告诉他了
同理,年要不要自增要让月来告诉他


通过设计三个类的成员函数建立三个类的通信关系
来实现由日自增带动月自增
月自增带动年自增


上不得台面的东西,见笑了 



#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;
}



Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史