首页 > 代码库 > C++学习之路 : class练习

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() const116         {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             }else128             {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              }else163              {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     }else178     {179         for (int i = year1; i < year2; i++) {180             if(isLeapYear(i))181             {182                 sum += 366;183             }else184             {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     else216         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 }

 

缺少一个 判断函数检验  输入的年月日是否非法。   其他功能均已实现

C++学习之路 : class练习