SLIDE1

Friday, May 22, 2015

class CDate biểu diễn ngày tháng năm và các phép toán+-

5. Định nghĩa lớp CDate biểu diễn khái niệm ngày, tháng, năm với các phép toán +, - (cộng, trừ thêm một số ngày), ++, -- (thêm bớt một ngày), - (khoảng cách giữa hai CDate tính bằng ngày). Phép toán <<, >> để xuất, nhập dữ liệu loại CDate.
cdate.h
#pragma once
#include<iostream>
using namespace std;
class cdate
{
private:
    int ngay,thang,nam;
public:
    cdate(void);
    ~cdate(void);
    bool check(const int&,const int&,const int&);
    cdate operator+(const int&);
    cdate operator-(const int&);
    long long operator-(const cdate&);
    void operator++();
    void operator--();
    friend ostream &operator<<(ostream &out,const cdate&);
    friend istream &operator>>(istream &in,cdate &);
};


cdate.cpp
#include "cdate.h"
cdate::cdate(void)
{
}
cdate::~cdate(void)
{
}
bool cdate::check(const int &a,const int &b,const int &c)
{
    switch(b)
    {
    case 1:case 3:case 5: case 7: case 8: case 10: case 12:
        if(a<=0 || a>31) return false;
        break;
    case 4: case 6: case 9: case 11:
        if(a<=0 || a>30) return false;
        break;
    case 2:
        if(c%400==0 ||(c%4==0 && c%100!=0))
        {
            if(a<=0 || a>29) return false;
        }
        else if(a<=0 || a>28) return false;
        break;
    default: return false;
    }
    return true;
}
istream &operator>>(istream &in,cdate &d)
{
    bool k;
    do{
        k=false;
        cout<<"ngay =";in>>d.ngay;
        cout<<"thang=";in>>d.thang;
        cout<<"nam  =";in>>d.nam;
        k=d.check(d.ngay,d.thang,d.nam);
        if(k==false) cout<<"khong hop le!\n";
    }while(!k);
    return in;
}
cdate cdate::operator+(const int &x)
{
    cdate d;
    d.ngay=ngay;
    d.thang=thang;
    d.nam=nam;
    int k=d.ngay+x;
    do{
        switch(d.thang)
        {
        case 1:case 3:case 5: case 7:case 8: case 10: case 12:
            if(k>31)
            {
                d.thang++;
                if(d.thang==13)
                {
                    d.thang=1;
                    d.nam++;
                }
                k-=31;
            }
            else
            {
                d.ngay=k;
                k=0;
            }
            break;
        case 4:case 6: case 9: case 11:
            if(k>30)
            {
                d.thang++;
                k-=30;
            }
            else
            {
                d.ngay=k;
                k=0;
            }
            break;
        case 2:
            if(d.nam%400==0 || (d.nam%4==0 && d.nam%100!=0))
            {
                if(k>29)
                {
                    d.thang++;
                    k-=29;
                }
                else
                {
                    d.ngay=k;
                    k=0;
                }
            }
            else
            {
                if(k>28)
                {
                    d.thang++;
                    k-=28;
                }
                else
                {
                    d.ngay=k;
                    k=0;
                }
            }
            break;
        }
    }while(k>0);
    return d;
}
ostream &operator<<(ostream &out,const cdate& d)
{
    out<<d.ngay<<"/"<<d.thang<<"/"<<d.nam;
    return out;
}
cdate cdate::operator-(const int &a)
{
    cdate d;
    d.ngay=ngay;
    d.thang=thang;
    d.nam=nam;
    int x=a;
    do{
        if(d.ngay>x)
        {
            d.ngay-=x;
            x=0;
        }
        else
        {
            x-=d.ngay;
            d.thang--;
            switch(d.thang)
            {
            case 1:case 3: case 5: case 7: case 8: case 10:
                d.ngay=31;
                break;
            case 4: case 6: case 9: case 11:
                d.ngay=30;
                break;
            case 2:
                if(d.nam%400==0 || (d.nam%4==0 && d.nam%100!=0)) d.ngay=29;
                else d.ngay=28;
                break;
            case 0:
                d.thang=12;
                d.nam--;
                d.ngay=31;
                break;
            }
        }
    }while(x>0);
    return d;
}
long long cdate::operator-(const cdate &d)
{
    cdate x;
    x.ngay=ngay;
    x.thang=thang;
    x.nam=nam;
    long long a=x.ngay;
    do{
        switch(x.thang)
        {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            a+=31;
            x.thang--;
            if(x.thang==0)
            {
                x.nam--;
                x.thang=12;
            }
            break;
        case 4: case 6: case 9: case 11:
            a+=30;
            x.thang--;
            break;
        case 2:
            if(x.nam%400==0 || (x.nam%4==0 && x.nam%100!=0))
            {
                a+=29;
                x.thang--;
            }
            else
            {
                a+=28;
                x.thang--;
            }
        }
    }while(x.nam>0);

    x.ngay=d.ngay;
    x.thang=d.thang;
    x.nam=d.nam;
    long long b=x.ngay;
    do{
        switch(x.thang)
        {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            b+=31;
            x.thang--;
            if(x.thang==0)
            {
                x.nam--;
                x.thang=12;
            }
            break;
        case 4: case 6: case 9: case 11:
            b+=30;
            x.thang--;
            break;
        case 2:
            if(x.nam%400==0 || (x.nam%4==0 && x.nam%100!=0))
            {
                b+=29;
                x.thang--;
            }
            else
            {
                b+=28;
                x.thang--;
            }
        }
    }while(x.nam>0);
    return a-b;
}
void cdate::operator++()
{
    ngay++;
    switch(thang)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        if(ngay>31)
        {
            ngay=1;
            thang++;
            if(thang>12)
            {
                nam++;
                thang=1;
            }
        }
        break;
    case 4: case 6: case 9: case 11:
        if(ngay>30)
        {
            ngay=1;
            thang++;
        }
        break;
    case 2:
        if(nam%400==0 || (nam%4==0 && nam%100!=0))
        {
            if(ngay>29)
            {
                ngay=1;
                thang++;
            }
        }
        else
        {
            if(ngay>28)
            {
                ngay=1;
                thang++;
            }
        }
    }
}
void cdate::operator--()
{
    ngay--;
    if(ngay==0)
    {
        thang--;
        switch(thang)
        {
        case 1: case 3: case 5: case 7: case 8: case 10:
            ngay=31;
            break;
        case 0:
            ngay=31;
            thang=12;
            nam--;
            break;
        case 4: case 6: case 9: case 11:
            ngay=30;
            break;
        case 2:
            if(nam%400==0 || (nam%4==0 && nam%100!=0)) ngay=29;
            else ngay=28;
            break;
        }
    }
}
main.cpp
#include"cdate.h"
void main()
{
    cdate x,y;
    cin>>x;
    x++;
    cout<<x<<endl;
    x--;
    cout<<x;
    system("pause");
}