Date
准备用C++重写上次的QA的大作业日历。
最近在看C++看见不少Date相关的题目和内容,记在这里。
1.C++程序设计语言 5.9.13 定义一个Date以保存日期的轨迹。提供一些函数,从输入读Date,向输出写Date,以及用一个日期去初始化Date.
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 struct Date 6 { 7 int day_:5; //位域仅用5个位 代表这个整数成员 8 int month_:4; 9 int year_:15; 10 }; 11 12 13 14 std::istream& operator>>(std::istream &input,Date &d) 15 { 16 int const bufsize=6; 17 char buffer[bufsize]; 18 input.getline(buffer,bufsize,'/'); 19 d.month_=atoi(buffer); 20 input.getline(buffer,bufsize,'/'); 21 d.day_=atoi(buffer); 22 input>>d.year_; 23 return input; 24 } 25 26 27 std::ostream& operator<<(std::ostream &output,Date &d) 28 { 29 output<<d.month_<<"/"<<d.day_<<"/"<<d.year_; 30 return output; 31 } 32 33 Date& init(Date& d,unsigned day,unsigned month,int year) 34 { 35 d.day_=day; 36 d.month_=month; 37 d.year_=year; 38 return d; 39 }
遇到的问题:1> getline (来自百度百科)
istream& getline ( istream &is , string &str , char delim );
istream& getline ( istream& , string& );
is 进行读入操作的输入流
str 存储读入的内容
delim 终结符
返回值:与参数is是一样的
将输入流is中读到的字符存入str中,直到遇到终结符delim才结束。对于第一个函数delim是可以由用户自己定义的终结符;对于第二个函数delim默认为 '\n'(换行符)。
函数在输入流is中遇到文件结束符(EOF)或者在读入字符的过程中遇到错误都会结束。
在遇到终结符delim后,delim会被丢弃,不存入str中。在下次读入操作时,将在delim的下个字符开始读入。
这个getline是个全局函数,而不是iostream的成员函数getline。
getline操作返回的是is(输入流),在使用while(getline(cin,line))的时候若想退出循环应使用EOF或ctrl+Z。
etline也可以作为成员函数使用
cin.getline(char* cha,int num,char f);
向cha中输入num个字符,输入过程中达到num个数或者提前遇到f字符,输入结束。
2>atoi
int atoi (const char * str);
Convert string to integer
3>struct 4>
1 struct Date 2 { 3 int day_:5; //位域仅用5个位 代表这个整数成员 4 int month_:4; 5 int year_:15; 6 };
时
1 input>>d.year_;
通不过
5>关于流
2> 7.10.19 写一个函数,实现为5.9[13]定义的Date加上一天,一个月,一年的功能,写一个函数对于所给的Date给出对应的星期几。写一个函数给出参数Date之后第一个星期一对应的Date。
1 struct Date{ 2 unsigned day_:5; 3 unsigned month_:4; 4 int year_:15; 5 }; 6 7 8 bool is_leap_year(int y) 9 { 10 return !(y%4)&&((y%100)||!(y%400)); //四年一润,百年不闰,四百年再闰 ((y%4==0)&&(y%100!=0))||(y%400==0) 11 } 12 13 struct Month{ 14 enum{Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}; 15 static int n_days(int m,int y) //n_days 显示每年每月最多多少天? 16 { 17 return m!=Feb?n_days_[m-1]:(is_leap_year(y)?29:28); 18 } 19 private: 20 static int const n_days_[12]; 21 22 }; 23 24 int const Month::n_days_[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 25 26 27 Date next_year(Date const &d) 28 { 29 Date n; 30 n.day_=d.day_; 31 n.month_=d.month_; 32 n.year_=d.year_+1; 33 //2月29日,但不是闰年! 这个月是29天! 34 if (n.day_>Month::n_days(n.month_,n.year_)) 35 { 36 n.month_=3; 37 n.day_=1; 38 } 39 return n; 40 } 41 /* 42 Date next_month(Date const &d) 43 { 44 Date n; 45 n.day_=d.day_; 46 n.month_=d.month_+1; 47 n.year_=d.year_; 48 if(n.month_>12) //12月 49 { 50 n.month_=1; 51 n.year_+=1; 52 } 53 return n; 54 } 55 */ 56 Date next_month(Date const &d) 57 { 58 Date n; 59 n.day_=d.day_; 60 n.month_=d.month_%12+1; 61 n.year_=d.year_; 62 if(n.month_==1) //如果是1月 说明年数+1,年数加1 next——year(n); 63 n=next_year(n); 64 if(n.day_>Month::n_days(n.month_,n.year_))// 这个月的天数超过下一个月的天数!将使用下一个月的天数!!! 65 n.day_=Month::n_days(n.month_,n.year_); 66 return n; 67 } 68 69 70 /* 71 Date next_day(Date const &d) 72 { 73 Date n; 74 n.day_=d.day_+1; 75 n.month_=d.month_; 76 n.year_=n.year_; 77 if(n.day_>Month::n_days(n.month_,n.year_)) //超过每月最多天数 78 { 79 if(n.month_==12) 80 { 81 n.year_+=1; 82 n.month_=1; 83 n.day_=1; 84 } 85 else 86 { 87 n.month_+=1; 88 n.day_=1; 89 } 90 } 91 */ 92 93 Date next_day(Date const &d) 94 { 95 Date n; 96 n.day_=(d.day_)%Month::n_days(d.month_,d.year_)+1; 97 n.month_=d.month_; 98 n.year_=d.year_; 99 if(n.day_==1) 100 return next_month(n); 101 else return n ; 102 } 103 //每一年的一月一日的星期几都向前移一天,而闰年要移两天。如果处于非闰年Y中,必须推移[Y-1]+((Y-1)/4-(Y-1)/100+(Y-1)/400)]%7个星期中的天数。处闰年的3月或者再后面的月需要再推一天。在非闰年与该年的1月1日比月M的第一天需要推移MS【M-1】个星期的天数MS【】 104 enum DayOfWeek{Sunday=0,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};//1年1月1日从星期一开始。 105 int MS[]={0,3,3,6,1,4,5,2,5,0,3,5}; 106 DayOfWeek day_of_week(Date const &dt) 107 { 108 int const y=dt.year_,m=dt.month_,d=dt.day_; 109 int const j1=(1+y-1+(y-1)/4-(y-1)/100+(y-1)/400)%7; 110 if(m<=2||is_leap_year(y)) 111 return DayOfWeek((j1+MS[m-1]+d-1)%7); 112 else 113 return DayOfWeek((j1+MS[m-2]+d)%7); 114 } 115 116 Date next_monday(Date const &d) 117 { 118 DayOfWeek dday=day_of_week(d); 119 int const n_days=(dday==Sunday)?1:7-dday; 120 Date Monday(d); 121 for (int k=0;k!=n_days;++k) 122 { 123 Monday=next_day(Monday); 124 } 125 return Monday; 126 127 }
暂时不清楚的问题:函数如果调入调出 输入输出的问题还是不很清楚!