C++学习之路 : class练习
需求:
1.作业:写一个Date类
a) 数据成员:year/month/day ok
b) 提供两个构造函数 ok
c) 实现功能setDate设置日期 ok
d) 把时间设定为今天 setToday(); ok
e) toString() 打印格式:2009/7/31 ok
f) toFormatString:对于月份采用英文 September 19 2014 ok
g) isLeapYear() 判断是否是闰年 ok
h) calDayOfYear() 计算该日期是当年的第几天(注意闰年) ok
i) 写一个全局的函数int differenceDate(const Date &d1, const Date &d2);比较两个日期的差异(d1 - d2), 可以写为static函数 ok
j) 写一个static函数today(),返回代表今天的Date对象。
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <time.h> 5 #include <stdlib.h> 6 #include <stdio.h> 7 8 #define ERR_EXIT(m) \ 9 do { \ 10 perror(m);\ 11 exit(EXIT_FAILURE);\ 12 }while(0) 13 14 using namespace std; 15 16 17 18 19 class Date 20 { 21 private : 22 int year_; 23 int month_ ; 24 int day_; 25 public : 26 27 28 Date() : 29 year_(2014), month_(1), day_(1) 30 {} 31 32 Date(int year, int month, int day) : 33 year_(year), month_(month), day_(day) 34 35 { 36 } 37 38 void setDate(int year, int month,int day) 39 { 40 year_ = year ; 41 month_ = month ; 42 day_ = day ; 43 } ; 44 45 int getYear() const 46 { 47 return year_; 48 } 49 50 int getmonth() const 51 { 52 return month_ ; 53 } 54 55 int getDay() const 56 { 57 return day_ ; 58 } 59 60 int whatDay() 61 { 62 time_t t; 63 t = time(NULL) ; 64 struct tm* now = localtime(&t) ; 65 int day = now->tm_yday; 66 67 return day ; 68 } 69 70 void setToday() 71 { 72 time_t t; 73 t = time(NULL); 74 struct tm* now = localtime(&t) ; 75 76 year_ = 1900 + now->tm_year; 77 78 month_ = 1 + now->tm_mon ; 79 day_ = now->tm_mday ; 80 81 printf("local time is %s", asctime(now)); 82 } 83 84 void toString() 85 { 86 cout << year_ << "/" << month_ << "/" << day_ << endl; 87 } 88 89 void toFormatString() 90 { 91 switch (month_) 92 { 93 case 1: cout << "January " ; break ; 94 case 2: cout << "February " ; break; 95 case 3: cout << "March " ; break; 96 case 4: cout << "April " ; break; 97 case 5: cout << "May " ; break; 98 case 6: cout << "June " ; break ; 99 case 7: cout << "July" ; break; 100 case 8: cout << "August" ; break ; 101 case 9: cout << "September" ;break; 102 case 10: cout << "October" ;break; 103 case 11: cout << "November" ; break; 104 case 12: cout << "December" ;break; 105 default : ERR_EXIT("月份输入错误") ;break; 106 } 107 cout << day_ << " " << year_ <<endl; 108 109 } 110 bool isLeapYear() const 111 { 112 return (year_ % 400 == 0) || (year_ % 4 == 0 && year_ % 100 != 0) ; 113 } 114 115 int calDayOfYear() const 116 { 117 int sum = 0; 118 if(isLeapYear()) 119 { 120 int sign[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} ; 121 for(int i = 1; i < month_; i++) 122 { 123 cout << "进入闰年循环" << endl; 124 sum += sign[i] ; 125 } 126 127 }else 128 { 129 int sign[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} ; 130 for(int i = 1; i < month_; i++) 131 { 132 cout << "进入非闰年循环" << endl; 133 sum += sign[i] ; 134 } 135 136 } 137 sum += day_ ; 138 139 return sum ; 140 } 141 } ; 142 143 144 bool isLeapYear(int year) 145 { 146 return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0) ; 147 } 148 149 static int differenceDate(const Date &d1, const Date &d2) 150 { 151 int temp(0); 152 int sum(0) ; 153 int year1 = d1.getYear() ; 154 int year2 = d2.getYear() ; 155 156 if( year1 > year2) 157 { 158 for (int i = year2; i < year1; i++) { 159 if(isLeapYear(i)) 160 { 161 sum += 366 ; 162 }else 163 { 164 sum += 365 ; 165 } 166 } 167 sum += d2.calDayOfYear() ; 168 sum -= d1.calDayOfYear() ; 169 170 }else if(year1 == year2) 171 { 172 sum = d1.calDayOfYear() - d2.calDayOfYear() ; 173 if(sum < 0) 174 { 175 sum = -sum; 176 } 177 }else 178 { 179 for (int i = year1; i < year2; i++) { 180 if(isLeapYear(i)) 181 { 182 sum += 366; 183 }else 184 { 185 sum += 365; 186 } 187 sum += d2.calDayOfYear() ; 188 sum -= d1.calDayOfYear() ; 189 } 190 } 191 192 return sum ; 193 } 194 195 static Date toDay(Date &kong) 196 { 197 kong.setToday() ; 198 return kong; 199 } 200 201 int main(int argc, const char *argv[]) 202 { 203 Date test; 204 //test.setToday() ; 205 cout << "设置前-----------------" << endl; 206 test.toString() ; 207 test.setDate(2014, 9, 20) ; 208 cout << "设置后-----------------" << endl; 209 test.toString() ; 210 cout << "toFormatString" << endl; 211 test.toFormatString() ; 212 cout << "isLeapYear" << endl; 213 if(test.isLeapYear()) 214 cout << "是闰年" << endl ; 215 else 216 cout << "不是闰年" << endl; 217 cout << "calDayOfYear " << endl; 218 int num = test.calDayOfYear() ; 219 cout << "第 "<< num << "天" <<endl; 220 221 cout<< "----whatDay()----" << endl; 222 int day = test.whatDay() ; 223 cout << day << endl; 224 225 Date d1(2002, 1, 1) ; 226 Date d2(2001, 1, 1) ; 227 int dif; 228 dif = differenceDate(d1, d2) ; 229 230 cout << "-----differenceDate--------" << endl ; 231 cout << dif << endl; 232 return 0; 233 }
缺少一个 判断函数检验 输入的年月日是否非法。 其他功能均已实现