日期处理器 高质量C语言程序.docx
- 文档编号:12941790
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:26
- 大小:160.05KB
日期处理器 高质量C语言程序.docx
《日期处理器 高质量C语言程序.docx》由会员分享,可在线阅读,更多相关《日期处理器 高质量C语言程序.docx(26页珍藏版)》请在冰点文库上搜索。
日期处理器高质量C语言程序
设计题目:
日期处理器
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
#include
#include
#include
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 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 {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; } intDateFormatte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 日期处理器 高质量C语言程序 日期 处理器 质量 语言 程序