日期处理器 高质量C语言程序.docx

上传人:b****9 文档编号:25536479 上传时间:2023-06-09 格式:DOCX 页数:26 大小:160.05KB
下载 相关 举报
日期处理器 高质量C语言程序.docx_第1页
第1页 / 共26页
日期处理器 高质量C语言程序.docx_第2页
第2页 / 共26页
日期处理器 高质量C语言程序.docx_第3页
第3页 / 共26页
日期处理器 高质量C语言程序.docx_第4页
第4页 / 共26页
日期处理器 高质量C语言程序.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

日期处理器 高质量C语言程序.docx

《日期处理器 高质量C语言程序.docx》由会员分享,可在线阅读,更多相关《日期处理器 高质量C语言程序.docx(26页珍藏版)》请在冰豆网上搜索。

日期处理器 高质量C语言程序.docx

日期处理器高质量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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1