含有成员函数的结构体练习
你的生日是星期几?
我们已经知道,公元 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成员。
需要注意几点:
- 日期对象的weekday属性成员应由程序计算日期对应的星期几,所得值再对其赋值。
- setValue函数中应对实参进行校验:
(1) 如果第一个参数小于1,则year赋值为1;
(2) 如果第二个参数小于1,则month赋值为1,如果第二个参数大于12,则month赋值为12;
(3) 如果第三个参数小于1,则day赋值为1,如果第三个参数大于31,则day赋值为31。
(4) 其他情况均认为实参合法,均以实参值赋值。 - 成员函数 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 }

浙公网安备 33010602011771号