日期处理器高质量C语言程序_第1页
日期处理器高质量C语言程序_第2页
日期处理器高质量C语言程序_第3页
日期处理器高质量C语言程序_第4页
日期处理器高质量C语言程序_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计题目:日期处理器2012年09月06日【程序功能简介】:程序能处理如2-12-2004或2/12/2004等格式的日期处理,并能进行日期的加法计算,输入日期的字符串形式,如1-MAR——2003,同时还能进行两个日期的大小比较,返回两个日期相差的天数及月份数*【课程设计要求】*1将日期加天数的成员函数voidAddDays(intdays)改为重载+运算符2将计算两个日期相差天数的成员函数intFindDifferenceInDays(DateFormatter)改为重载—运算符3设计重载运算符‘—’的函数,实现日期对象减去天数的功能4设计重载运算符‘++’,‘——’的函数,实现日期对象自加、自减的功能5设计重载输入输出流函数,实现日期对象的输入、输出操作,要求输入能自动识别多种格式的日期方式,若日期数据有错(如输入的月份为13月等能自动予以提示并重新输入,输出时能同时输出各种格式的日期6修改main函数结构,采用菜单选项的形式,分别测试成员函数或重载运算符函数的功能注:运算符重载函数既可重载为成员函数也可以重载为友元函数*【源程序分析(包括结构、模块、功能)】*#include<iostream.h>#include<iomanip.h>#include<time.h>#include<string>usingnamespacestd;classDateFormatter//日期格式类{private: intday; intmon; intyear;public: DateFormatter(); DateFormatter(intday,intmon,intyear); DateFormatter(char*date); inlineintGetDay(){returnday;}//返回日期 inlineintGetMonth(){returnmon;}//返回月份 inlineintGetYear(){returnyear;}//返回年份 inlinevoidSetDay(intd){day=d;}//设置日期 inlinevoidSetMonth(intm){mon=m;}//设置月份 inlinevoidSetYear(inty){year=y;}//设置年份 inlineboolIsLeapYear()//查看是否是闰年 { if(year%4==0&&year%100!=0||year%400==0){ returntrue; }else{ returnfalse; } } voidAddDays(intdays);//在日期上加上天数 voidMinDays(intdays);//在日期上减去天数 voidIncrementMonth();//在日期上加上月份 char*GetDate(); char*Time(intdays,intmon,intyear); intFindDifferenceInMonths(DateFormatter);//返回两个日期间月份的差值 intFindDifferenceInDays(DateFormatter);//返回两个日期间天数的差值 intFindDifferenceInMonth(DateFormatter); intFindDifferenceInDay(DateFormatter); staticchar*Today()//返回当前系统时间的字符串 { consttime_tcurr=time(0); tm*dt=localtime(&curr); intd=dt->tm_mday; inty=(dt->tm_year+1900); intm=dt->tm_mon; charmn[4]; strcpy(mn,FindMonth(m)); charret[25]; strcpy(ret,FormatDate(d,mn,y)); returnret; } char*GetFormattedDate(); intoperator<(DateFormatterdf); intoperator>(DateFormatterdf); intoperator==(DateFormatterdf); intoperator++(); intoperator--();private: staticchar*FindMonth(intm)//根据月份返回表示月份的字符串 {if(m==0){ return"JAN"; }elseif(m==1){ return"FEB"; }elseif(m==2){ return"MAR"; }elseif(m==3){ return"APR"; }elseif(m==4){ return"MAY"; }elseif(m==5){ return"JUN"; }elseif(m==6){ return"JUL"; }elseif(m==7){ return"AUG"; }elseif(m==8){ return"SEP"; }elseif(m==9){ return"OCT"; }elseif(m==10){ return"NOV"; }elseif(m==11){ return"DEC"; }else{ return"NUL"; } } intFindMonthInNumber(stringm);//将用字符串表示的月份形式转换为数字形式 staticchar*FormatDate(intd,char*m,inty)//将时间用字符串形式表示 { char*dy=newchar[25]; char*yr=newchar[25]; dy=itoa(d,dy,10); yr=itoa(y,yr,10); strcat(dy,"-"); strcat(dy,m); strcat(dy,"-"); strcat(dy,yr); returndy; } stringto_lower(strings);//将字符串中所有字母转换为小写 intFindDaysInMonth(intm)//返回月份中的最大天数 {if(m==0){ return31; }elseif(m==1){ if(IsLeapYear()){ return29; }else{ return28; } }elseif(m==2){ return31; }elseif(m==3){ return30; }elseif(m==4){ return31; }elseif(m==5){ return30; }elseif(m==6){ return31; }elseif(m==7){ return31; }elseif(m==8){ return30; }elseif(m==9){ return31; }elseif(m==10){ return30; }elseif(m==11){ return31; } return-1; } }; DateFormatter::DateFormatter()//构造函数,将成员数据赋值为当前系统时间 {consttime_tcurr=time(0); tm*dt=localtime(&curr); this->day=dt->tm_mday; this->mon=dt->tm_mon; this->year=(dt->tm_year+1900); } DateFormatter::DateFormatter(intday,intmon,intyear)//构造函数,用指定时间设置成员函数 { this->day=day; this->mon=mon; this->year=year; } DateFormatter::DateFormatter(char*date)/*构造函数,将字符串表示的日期形式还原成整型,可以 识别诸如1/1/031-12-2003等形式的字符串*/ { if(strlen(date)>8){ strings1=date; intp=s1.find_first_of('-');//找到第一个'-',如12-2-2003 stringday; stringmonth; stringyear; if(p==2){ day=s1.substr(0,2);//取出日期 month=s1.substr(3,3);//取出月份 year=s1.substr(7,4);//取出年份 }elseif(p==1){ day=s1.substr(0,1); month=s1.substr(2,3); year=s1.substr(6,4); } charcday[5]; strcpy(cday,day.c_str());//日期转换为字符串 charcyear[5]; strcpy(cyear,year.c_str()); this->day=atoi(cday);//将字符串转换为整型数字 this->mon=FindMonthInNumber(month); this->year=atoi(cyear); } elseif(strlen(date)==8||strlen(date)==7||strlen(date)==6) {intlen=strlen(date); stringstr=date; stringday; stringmonth; stringyear; intp1=str.find_first_of('-'); if(p1<=0)p1=str.find_first_of('/');//如果格式中无'-',寻找'/' intp2=str.find_last_of('-'); if(p2<=0)p2=str.find_last_of('/'); if(len==8){ day=str.substr(0,2);//同样将年、月、日转换成整型数字 month=str.substr(3,2); year=str.substr(6,2); }elseif(len==7){ if(p1==1){ day=str.substr(0,1); if(p2==3){ month=str.substr(2,1); year=str.substr(4,2); }else{ month=str.substr(2,2); year=str.substr(5,2); } }else{ day=str.substr(0,2); if(p2==3){ month=str.substr(2,1); year=str.substr(4,2); }else{ month=str.substr(3,2); year=str.substr(5,2); } } }elseif(len==6){ day=str.substr(0,1); month=str.substr(2,1); year=str.substr(4,2); } intm=atoi((month.c_str())); m-=1; intyr=atoi((year.c_str())); chary[5]; if(yr>=0&&yr<=70)//再将年份前面补上世纪 {strcpy(y,"20"); strcat(y,year.c_str()); }else{ strcpy(y,"19"); strcat(y,year.c_str()); } this->day=atoi((day.c_str())); this->mon=m; this->year=atoi(y); } } intDateFormatter::FindMonthInNumber(stringm)//识别月份的英文形式,还原成整数 {if(to_lower(m)=="jan"){ return0; }elseif(to_lower(m)=="feb"){ return1; }elseif(to_lower(m)=="mar"){ return2; }elseif(to_lower(m)=="apr"){ return3; }elseif(to_lower(m)=="may"){ return4; }elseif(to_lower(m)=="jun"){ return5; }elseif(to_lower(m)=="jul"){ return6; }elseif(to_lower(m)=="aug"){ return7; }elseif(to_lower(m)=="sep"){ return8; }elseif(to_lower(m)=="oct"){ return9; }elseif(to_lower(m)=="nov"){ return10; }elseif(to_lower(m)=="dec"){ return11; }else{ return-1; } } stringDateFormatter::to_lower(strings)//将字符串中的大写转换成小写 {intlen=s.length(); for(inti=0;i<len;i++){ if(s[i]>='A'&&s[i]<='Z'){ s[i]=tolower(s[i]); } } returns; } char*DateFormatter::GetDate()//将以整型表示的日期转换为字符串的形式 {char*d=newchar[25]; char*m=newchar[25]; char*y=newchar[25]; d=itoa(day,d,10); m=itoa((mon+1),m,10); y=itoa(year,y,10); strcat(d,"/"); strcat(d,m); strcat(d,"/"); strcat(d,y); charret[25]; strcpy(ret,d); delete[]d; delete[]m; delete[]y; returnret; } char*DateFormatter::GetFormattedDate()//将用整数表示的时间改用字符串表示 {charmn[5]; strcpy(mn,FindMonth(mon)); charret[25]; strcpy(ret,FormatDate(day,mn,year)); returnret; } voidDateFormatter::AddDays(intdays)//日期加上天数成为一个新的日期,递归计算 {if(days<=0)return; intcurr_day=this->day;//取对象当前日期 intcurr_mon=this->mon;//取对象当前月份 intdays_in_mon=FindDaysInMonth(curr_mon);//当前月份中共有多少天数 if(this->mon==11&&days_in_mon==curr_day)//当月份为12月且当前日期为31天时 {this->year++;//对象年份加1 } if(days_in_mon==curr_day)//当前日期计满时 {this->mon++;//当前月份加1 this->day=0;//日期清零 if(this->mon>11)//当前月份为12月,月份变为1月 {this->mon=0;} days_in_mon=FindDaysInMonth(this->mon);//新月份的天数 } if(days<=days_in_mon)//相加的月数小于新月份的天数 {this->day+=days;//当前日期加上新天数 if(this->day>days_in_mon)//若大于当前月份应有的天数 {this->mon++;//当前月份加1 if(this->mon>11)//当前月份为12月,月份变为1月 {this->mon=0;} this->day-=days_in_mon;//当前天数标准化 } return; } else//当相加的天数大于当前月份的天数时 {intdays_to_add=days_in_mon-curr_day;//计算补满月份还需要的天数 this->day+=days_to_add;//补满当前月份的天数 if(this->day>days_in_mon)//天数多余当前月份 {this->day=1;//为第一号 } intrem_days=days-days_to_add;//求出剩余的天数 AddDays(rem_days);//递归计算 return; } }voidDateFormatter::MinDays(intdays)//日期减去天数成为一个新的日期,递归计算 {if(days<=0)return; intcurr_day=this->day;//取对象当前日期 intcurr_mon=this->mon;//取对象当前月份 intdays_in_mon; if(this->mon==0&&days_in_mon==1)//当月份为1月且当前日期为1天时 {this->year--;//对象年份减1 } if(days<curr_day)//当相减的天数小于当前日期时 {this->day-=days;} //当前日期减去新天数 elseif(days==curr_day){ this->mon--; this->day=FindDaysInMonth(this->mon);} else{ this->mon--; days_in_mon=FindDaysInMonth(this->mon); intdays_to_tot=days_in_mon+curr_day;//计算加上上个月的天数后的总天数 if(days_to_tot>days)//总天数大于新天数 {this->day=days_to_tot-days;}//直接相减 elseif(days_to_tot==days){ this->mon--; this->day=FindDaysInMonth(this->mon);} else{ intrem_days=days-days_in_mon;//求出剩余的天数 MinDays(rem_days);//递归计算 return;} } } voidDateFormatter::IncrementMonth()//月份加1 {mon++; if(mon>11) {mon=0; year++; } } intDateFormatter::FindDifferenceInMonths(DateFormatterdft)/*返回参数时间与对象时间相差的月份*/ {intdiff=0; if(this->year==dft.year&&this->mon==dft.mon)returndiff; if(dft.year>this->year){ do{ this->mon++; diff++; }while(this->year==dft.year&&this->mon==dft.mon);} elseif(dft.year==this->year&&dft.mon>this->mon){ do{ this->mon++; diff++; }while(this->year==dft.year&&this->mon==dft.mon);} else{ do{ dft.mon++; diff++; }while(this->year==dft.year&&this->mon==dft.mon);} returndiff; } intDateFormatter::FindDifferenceInDays(DateFormatterdft)//返回参数时间与对象时间相差的天数 {intdiff=0; if(dft==*this)//参数时间等于对象时间 {returndiff;}//返回差值 while(dft>*this)//参数时间大于对象时间 {this->day++; diff++; dft++; } while(dft<*this)//参数时间小于对象时间 {dft.day++; diff++; dft++; } returndiff; } intDateFormatter::operator<(DateFormatterdf)//重载<运算符,对象时间大于参数时间返回1 {if(df.year>this->year){ return1; }elseif(df.year==this->year&&df.mon>this->mon){ return1; }elseif(df.mon==this->mon&&df.day>this->day){ return1; }else{ return0; } } intDateFormatter::operator>(DateFormatterdf)//重载>运算符,对象时间小于参数时间返回1 {if(df.year<this->year){ return1; }elseif(df.year==this->year&&df.mon<this->mon){ return1; }elseif(df.mon==this->mon&&df.day<this->day){ return1; }else{ return0; } } intDateFormatter::operator==(DateFormatterdf)//重载==运算符,对象时间等于参数时间返回1{if((df.year==this->year) &&(df.mon==this->mon)&&(df.day==this->day)){ return1; }else{ return0; } } intDateFormatter::operator++()//重载++运算符 { intcurr_day=this->day;//取对象当前日期 intcurr_mon=this->mon;//取对象当前月份 intdays_in_mon=FindDaysInMonth(curr_mon);//当前月份中共有多少天数 if(curr_day<days_in_mon){//当天数少于该月最大天数 this->day=curr_day+1; }elseif(curr_mon<11){//当月份小于12月 this->mon=curr_mon+1; this->day=1; }else{//年份加1 this->year++; this->mon=1; this->day=1; } return0; }intDateFormatter::operator--()//重载--运算符 {intcurr_day=this->day;//取对象当前日期 intcurr_mon=this->mon;//取对象当前月份if(curr_day>1){//当天数多于1天 this->day--; }elseif(curr_mon>0){//当月份大于一月 this->mon--;this->day=FindDaysInMonth(this->mon); }else{//年份减1 this->year--; this->mon=12; this->day=30; } return0; } char*DateFormatter::Time(intdays,intmon,intyear){ intd; d=FindDaysInMonth(mon); if(days>d){cout<<"您输入的日期有误,请重新输入"<<endl;} if(mon>11){cout<<"您输入的月份有误,请重新输入"<<endl;} charmn[5]; strcpy(mn,FindMonth(mon-1)); charret[25]; strcpy(ret,FormatDate(days,mn,year)); returnret; }intmain(){ intdays=0; intmon=0; intyear=0; chartmp[25],tmp2[25]; DateFormatterdft("08/09/12"); DateFormattertmpdft("1/1/12"); cout<<setw(30)<<"欢迎使用日期格式处理程序"<<'\n'; cout<<setw(25)<<"制作人:林逸超"<<'\n'; cout<<setw(27)<<"Todayis:08/09/12"<<endl; cout<<"1.增加天数\n2.减少天数\n3.日期比较\n4.日期自加\n5.日期自减\n0.退出\n"; cout<<"请输入选择功能的相应序号:"; intnum; cin>>num; while(num) { switch(num) { case1: cout<<"输入增加多少天"<<endl; cin>>days; dft.AddDays(days); strcpy(tmp,dft.GetFormattedDate()); cout<<"结果是"<<tmp<<endl; cout<<"请输入选择功能的相应序号:"; cin>>num; break; case2: cout<<"输入减少多少天"<<endl; cin>>days; dft.MinDays(days); strcpy(tmp,dft.GetFormattedDate()); cout<<"结果是"<<tmp<<endl; cout<<"请输入选择功能的相应序号:"; cin>>num; break; case3: cout<<"请按日/月/年的形式输入要比较的日期"<<endl; cin>>days>>mon>>year; strcpy(tmp,dft.GetFormattedDate()); cout<<"FirstDate:"<<tmp<<endl; strcpy(tmp2,tmpdft.Time(days,mon,year)); cout<<"SecondDate:"<<tmp2<<endl; cout<<"Diffindays:"<<tmpdft.FindDifferenceInDays(dft)<<endl; cout<<"Diffinmonths:"<<tmpdft.FindDifferenceInMonths(dft)<<endl; co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论