含有成员函数的结构体练习

 

你的生日是星期几?

我们已经知道,公元 1年1月1日是星期四,知道了这个事实,我们就可以编程计算任意一个日期是星期几,但需要注意的是,罗马教皇格里戈八世在1582年2月24日颁布法令,永远抹去了1582年10月5日到1582年10月14日。历史上从来不曾有过这10天。也就是说,1582年10月4日是星期四,它的第二天是1582年10月15日星期五。

题目已经定义了结构体类型Calendar,以及三个成员函数原型,需要你定义这三个函数的实现。

结构体类型及成员函数接口定义:

定义一个全局字符串数组,表示周日至周六的英语单词。
string week[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
在这里描述结构体和成员函数接口:
struct Calendar{
    int year;
    int month;
    int day;
    int weekday;//注:星期天为0,星期一为1,...,星期六为6;01-1-1为星期四
    int fromInitDays();
    void setValue(int,int,int);
    void show();    
}

关于函数接口及其参数。fromInitDays()函数计算当前日期至公元1年1月1日起的天数,比如当前日期是公元1年1月3日,则该函数值为2(即距公元1年1月1日2天)。 setValue函数有三个参数,第一个参数值赋给日期对象的year成员,第二个参数值赋给日期对象的month成员,第三个参数值赋给日期对象的day成员。
需要注意几点:

  1. 日期对象的weekday属性成员应由程序计算日期对应的星期几,所得值再对其赋值。
  2. setValue函数中应对实参进行校验:
    (1) 如果第一个参数小于1,则year赋值为1;
    (2) 如果第二个参数小于1,则month赋值为1,如果第二个参数大于12,则month赋值为12;
    (3) 如果第三个参数小于1,则day赋值为1,如果第三个参数大于31,则day赋值为31。
    (4) 其他情况均认为实参合法,均以实参值赋值。
  3. 成员函数 show()按如下格式显示日期信息:
    年-月-日:星期

裁判测试程序样例

在这里给出函数被调用进行测试的例子:
#include <iostream>
#include <string>
using namespace std;

string week[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

struct Calendar{
    int year;
    int month;
    int day;
    int weekday;//注:星期天为0,星期一为1,...,星期六为6;01-1-1为星期四
    int fromInitDays();
    void setValue(int y,int m,int d);
    void show();

};
int main()
{
    Calendar birthday;
    int y,m,d;
    cin>>y>>m>>d;
    birthday.setValue(y,m,d);
    cout<<birthday.fromInitDays()<<endl;
    birthday.show();
    return 0;
}

/* 请在这里填写答案 */

输出样例1:

第一行输出距公元1年1月1日的天数,第二行输出:年-月-日:星期(英文单词)

1
1-1-2:Friday
 

输入样例2:

在一行上输入三个整数,以空格分隔,分别表示:年 月 日

2022 3 12
 

输出样例2:

第一行输出距公元1年1月1日的天数,第二行输出:年-月-日:星期(英文单词)

738215
2022-3-12:Saturday
 

输入样例3:

在一行上输入三个整数,以空格分隔,分别表示:年 月 日
这是一个错误的输入实例:

2022 -2 35
 

输出样例3:

第一行输出距公元1年1月1日的天数,第二行输出:年-月-日:星期(英文单词)
输入的第二个数据是-2月,因此month被赋值为1月,输入的第三数据是35日,因此day被赋值为31日

738175
2022-1-31:Monday
 1 /* 请在这里填写答案 */
 2 //12个月
 3 int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
 4 //用来存放差的天数
 5 int res = 0;
 6 int Calendar::fromInitDays() {
 7     //统计年份,平年365,闰年366;
 8     for(int i = 1;i<year;++i){
 9         if((i%4==0&&i%100!=0)||i%400==0)
10             res+=366;
11         else   res+=365;
12     }
13     //统计月份
14     for(int i = 1;i<month;++i){
15         res+=months[i];
16     }
17     //如果今年是闰年且过了2月,那么res++;
18     if(month>2&&((year%4==0&&year%100!=0)||year%400==0))
19         res++;
20     
21     //加上日差
22     res+=day-1;
23 
24     //教皇的法令
25     if(year>1582||(year==1582&&(month>10||(month==10&&day>14))))   res-=10;
26     //本来是处理1582年10月5~15日的代码
27     //后来想了想如果历史上不存在,输入也不会有
28     //测试点也没卡这个
29     // if(year==1582&&month==10&&day>=5)
30     //     res-=(day>14?10:(day-5));
31     
32     return res;
33 
34 }
35 void Calendar::setValue(int year, int month, int day) {
36     if(year<1) this->year = 1;
37     else     this->year = year;
38 
39     if(month<1) this->month = 1;
40     else if(month>12)   this->month = 12;
41     else    this->month = month;
42 
43     if(day<1)   this->day = 1;
44     else if(day>31) this->day = 31;
45     else    this->day = day;
46 }
47 void Calendar::show() {
48     cout<<year<<"-"<<month<<"-"<<day<<":";
49     //第一天是星期四
50     cout<<week[(res+4)%7];
51 }

 

posted @ 2022-03-20 15:41  寄情良玉赠旅人  阅读(194)  评论(0)    收藏  举报