万年历面向对象实现

使用面向对象的方法实现一个万年历(阳历版)。


  • 【实现提示】:

本问题的关键是确定所求月份的第一天是星期几。如我们想确定2009年12月1日是星期几,我们可以采用下面的方法:
(1) 求出2009年12月1日是当年的第几天,存在c里面。
(2) s=year-1+(year-1)/4-(year-1)/100+(year-1)/400 + c;
(3) num=s%7; 则num表示该天星期几,0表示星期天,1表示星期一,……
输出格式如下:(如2009年12月)
这里写图片描述


C++ Code:

类的头文件声明:

#ifndef CIRCLE_H
#define CIRCLE_H

class Date {
private:
    int year, momth;
public:
    Date(int y = 1970, int m = 1);
    void setDate(int y, int m);  //设置日期
    bool isLeapYear();  //判断闰年
    int monthDays();  //该月有多少天
    int dayNumber();  //该天是当年第几天
    int week();  //该天星期几
};

#endif
类的实现:
#include "calendar.h"

Date::Date(int year, int momth) //构造函数
{
    this->year = year;
    this->momth = momth;
}

void Date::setDate(int year, int momth)  //设置日期
{
    this->year = year;
    this->momth = momth;
}

bool Date::isLeapYear() //判断是否为闰年
{
    bool leap = false;
    if ((this->year % 4 == 0 && this->year % 100 != 0) || this->year % 400 == 0) {
        leap = true;
    }

    return leap;
}

int Date::monthDays() //该月有多少天
{
    int d;
    switch (this->momth)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        d = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        d = 30;
        break;
    case 2:
        d = this->isLeapYear() ? 29 : 28;
        break;
    default :
        break;
    }
    return d;
}

int Date::dayNumber() //该天是当年第几天
{ 
    int sum = 0;
    int mom[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    mom[2] = this->isLeapYear() ? 29 : 28;
    for (int m = 1; m < this->momth; m++) {
        sum += mom[m];
    }

    return sum;
}

int Date::week() //该天星期几
{
    int year = this->year - 1;
    int s = year + (year / 4) - (year / 100) + (year / 400);
    int num = s + dayNumber() + 1;

    return num % 7;
}
主函数的实现:
#include <iostream>
#include "calendar.h"
using namespace std;

void print(Date date)
{
    int cnt = date.week();
    cout << "日\t一\t二\t三\t四\t五\t六" << endl;
    for (int i = 0; i < cnt; i++) {
        cout << " \t";
    }
    for (int i = 1; i <= date.monthDays(); i++) {
        cout << i << "\t";
        cnt++;
        if (cnt % 7 == 0) {
            cout << endl;
        }
    }
    cout << endl;
    system("pause");
}

void scan(int &y, int &m)
{
    system("cls");
    cout << "请输入需查看的年、月:" << endl;
    cin >> y;
    cin >> m;
}

int main()
{
    int year, momth, x = 0;
    scan(year, momth);
    Date date(year, momth);
    print(date);
    while (true) {
        cout << "\n是否需要修改查询的时间?\n1、是\t2、否" << endl;
        cin >> x;
        if (x == 1) {
            scan(year, momth);
            date.setDate(year, momth);
            print(date);
        }
        else {
            break;
        }
    }

    return 0;
}
  • 非类实现:
    Code:
#include <iostream>
using namespace std;

bool IsLeap_year(int year) //判断是否为闰年
{
    bool leap = false;
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        leap = true;
    }

    return leap;
}

int SumDay(int *mom, int momth) //返回此年到这个月前的天数
{
    int sum = 0;
    for (int i = 0; i < momth - 1; i++) {
        sum += mom[i];
    }

    return sum;
}

int CntWeek(int *mom, int momth, int year) //返回此年1月1号所在星期几
{
    int s = year + (year / 4) - (year / 100) + (year / 400);
    int t = s + SumDay(mom, momth) + 1;

    return t % 7;
}

int main()
{
    int year, momth, day;
    int mom[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    while (true) {
        cout << "请输入需查看的年、月(输入0结束程序):" << endl;
        cin >> year;
        if (!year) {
            break;
        }
        cin >> momth;
        if (IsLeap_year(year)) {
            mom[1] = 29;
        }
        else {
            mom[1] = 28;
        }
        int cnt = CntWeek(mom, momth, year - 1);
        cout << "日\t一\t二\t三\t四\t五\t六" << endl;
        for (int i = 0; i < cnt; i++) {
            cout << " \t";
        }
        for (int i = 1; i <= mom[momth - 1]; i++) {
            cout << i << "\t";
            cnt++;
            if (cnt % 7 == 0) {
                cout << endl;
            }
        }
        cout << endl;
        system("pause");
        system("cls");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41799219/article/details/80140667