设计一个日期类Date,包括年、月、日等私有数据成员

设计一个日期类Date,包括年、月、日等私有数据成员,除了设置、输出日期的成员函数外,还有如下两个成员函数:leap(inty)用于判断是否是闰年next()用于求一已知... 设计一个日期类Date,包括年、月、日等私有数据成员,除了设置、输出日期的成员函数外,还有如下两个成员函数:
leap(int y)用于判断是否是闰年
next( )用于求一已知日期的后一天。为方便起见,假设输入的已知日期皆为有效日期.
再编写主程序,对任意日期进行操作。
展开
 我来答
匿名用户
2009-03-15
展开全部
#include <iostream>
#include <string>
using namespace std;

/**-----------------------------------------------------------------------------
* 常量声明
*------------------------------------------------------------------------------
*/
const int c_defaultYear = 2007; //默认年份
const int c_defaultMonth = 10; //默认月份
const int c_defaultDay = 10; //默认日期

#define CESHI //如果要做主函数测试,将此行注释即可

/**-----------------------------------------------------------------------------
* CDate类声明段
*------------------------------------------------------------------------------
*/
class CDate
{
public:
CDate(); //构造函数
CDate(int a,int b,int c); //带参数的构造函数
CDate(const CDate &p); //copy构造函数
~CDate(); //析构函数

public:
int getYear() const; //返回年份
int getMonth() const; //返回月份
int getDay() const; //返回日期
bool isLeap() const; //返回是否是闰年
bool isLeap();
void print(); //打印
private:
bool isittrue(int,int,int); //检测是否有误
void defaultset(); //使用默认设置
private:
int m_Year; //年
int m_Month; //月
int m_Day; //日
static int sn; //静态变量

};
int CDate::sn = 1; //初始化静态变量

/**-----------------------------------------------------------------------------
* CDate类实现段
*------------------------------------------------------------------------------
*/
CDate::CDate()
{
cout<<"无参数构造函数被调用.\n";
cout<<"请输入年月日,以空格隔开:";
int t_Year = 0,t_Month = 0,t_Day = 0;
cin>>t_Year>>t_Month>>t_Day;
if(cin.fail()) //如果输入字符串、浮点数等将退出
{
cout<<"输入错误,程序将采用默认值构造\n";
defaultset();
sn++;
return;
}

if(isittrue(t_Year,t_Month,t_Day)) //判断输入是否正确,正确则继续进行
{
m_Year = t_Year;
m_Month = t_Month;
m_Day = t_Day;
}
else
{
cout<<"输入有误,程序将采用默认值构造类\n";
defaultset();
}

sn++; //静态变量自增,用于计数
}
CDate::CDate(int a,int b,int c)
{
cout<<"带参数的构造函数被调用\n";
if(isittrue(a,b,c))
{
m_Year = a;
m_Month = b;
m_Day = c;
}
else
{
cout<<"参数有误,程序将采用默认值构造类\n";
defaultset();
}

sn++;
}
CDate::CDate(const CDate &p)
{
cout<<"拷贝构造函数被调用\n";
m_Year = p.getYear();
m_Month = p.getMonth();
m_Day = p.getDay();

sn++;
}
CDate::~CDate()
{
cout<<"析构函数被调用.\n";
}

int CDate::getYear() const
{
return m_Year;
}
int CDate::getMonth() const
{
return m_Month;
}
int CDate::getDay() const
{
return m_Day;
}

bool CDate::isLeap() const
{
if((m_Year%4==0&&m_Year%100!=0)||(m_Year%100==0&&m_Year%400 ==0))
return true;
else
return false;
}
bool CDate::isLeap()
{
if((m_Year%4==0&&m_Year%100!=0)||(m_Year%100==0&&m_Year%400 ==0))
return true;
else
return false;
}

void CDate::print()
{
cout<<m_Year<<"年"<<m_Month<<"月"<<m_Day<<"日"<<endl;
cout<<"sn="<<sn<<endl<<endl;
}

bool CDate::isittrue(int a,int b,int c) //检测输入字符的逻辑正确性
{
if(a<0||b<0||c<0||b>12||c>31)
return false;
else if((b==2&&isLeap()&&c>29)||b==2&&!isLeap()&&c>28)
return false;
else if((b==4||b==6||b==9||b==11)&&c>30)
return false;
else if((b==1||b==3||b==5||b==7||b==8||b==10||b==12)&&c>31)
return false;
else
return true;
}

void CDate::defaultset() //使用默认值构造类
{
m_Year = c_defaultYear;
m_Month = c_defaultMonth;
m_Day = c_defaultDay;
}

/**-----------------------------------------------------------------------------
* 公共函数定义段
*------------------------------------------------------------------------------
*/

bool isStrReal(string dStr)
{
if(dStr.size()!=8)
return false;
//以下内容中的string长度一定为8
for(int i=0;i<8;i++)
{
int temp = static_cast<int>(dStr[i]);
/*
//如果无法编译请注释上面一行,解注释这一行
int temp = (int)(dStr[i]);
*/
if(temp<48||temp>57)
{
return false;
}
}

return true;
}
CDate changeToCDate(string dStr)
{
//设置变量用于提取字符串中的整形变量
int year=0,month=0,day=0;

if(!isStrReal(dStr))
{
cout<<"你的字符串有误,程序将返回默认值构造的类"<<endl;
CDate p(c_defaultYear,c_defaultMonth,c_defaultDay);
return p;
}
else
{
//注意:这里-48是将编译器自动转换的ASCII码值转化成可操作整数值
year = (dStr[0]-48)*1000+(dStr[1]-48)*100+(dStr[2]-48)*10+(dStr[3]-48);
month = (dStr[4]-48)*10+(dStr[5]-48);
day = (dStr[6]-48)*10+(dStr[7]-48);
}

CDate p(year,month,day);

return p;

}

/**-----------------------------------------------------------------------------
* 主函数实现段
*------------------------------------------------------------------------------
*/

int main(void)
{

cout<<"以下将开始测试普通定义类、带参数构造类、copy构造函数构造类.\n";
cout<<"-----------------------------------------------------------\n";
CDate CDate1;
CDate1.print();

system("pause");

CDate CDate2(1900,3,4);
CDate2.print();

system("pause");

CDate CDate3(CDate2);
CDate3.print();

system("pause");

cout<<"\n以下将是闰年检测测试部分.\n";
cout<<"-----------------------------------------------------------\n";
CDate CDate4(2008,7,8);
if(CDate3.isLeap())
cout<<CDate3.getYear()<<"年是闰年\n";
else
cout<<CDate3.getYear()<<"年不是闰年\n";

if(CDate4.isLeap())
cout<<CDate4.getYear()<<"年是闰年\n";
else
cout<<CDate4.getYear()<<"年不是闰年\n";

system("pause");

cout<<"\n以下将测试字符串转换定义类.\n";
cout<<"-----------------------------------------------------------\n";
string ss("20080323");
cout<<"我们定义的字符串是"<<ss<<endl;
CDate date5 = changeToCDate(ss);
date5.print();

system("pause");

#ifndef CESHI

cout<<"\n以下将测试错误反馈.\n";
cout<<"-----------------------------------------------------------\n";
cout<<"首先定义一个类wrongdate1,请在接下来的过程中输入错误的数据,如:<22.3 33 33>、<abd d 33>等错误数据。\n";
CDate wrongdate1;
wrongdate1.print();
system("pause");

cout<<"接下来测试逻辑错误,请输入如这样的值:<2008 13 1>、< 1234 2 30>、<2007 2 29>等\n";
CDate wrongdate2;
wrongdate2.print();

system("pause");

cout<<"接下来测试字符串的错误检测\n";
cout<<"请输入一个不是按照格式的字符串,如:sdfkasf,2008323,20080333等\n";
string str;
cout<<"输入:";
cin>>str;
CDate wrongdate3 = changeToCDate(str);
wrongdate3.print();

system("pause");

cout<<"测试完毕。"<<endl;
#endif

return 0;
}
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
myronshi2002
推荐于2017-09-13
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
#include "iostream.h"
#include "stdio.h"
class date
{private:
int year;
int month;
int day;
public:
void set(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void print()
{
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
}
bool leap()
{
if((year%4==0&&year%100!=0)||year%400==0)
cout<<year<<"年是闰年"<<endl;
else
cout<<year<<"年不是闰年"<<endl;
return year;
}
void next()
{
int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(leap()) months[1]=29;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
if(day==31){month++;day=1;}
else day++;
break;
}
case 4:
case 6:
case 9:
case 11:
{
if(day==30){month++;day=1;}
else day++;break;
}
case 2:
{
if(day==months[1]){month++;day=1;}
else day++;break;
}
case 12:
{
if(day==31){year++;month=1;day=1;}
else day++;break;
}
}
cout<<"明天的年月日为:"<<endl;
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;

}
};
void main()
{
date a;
int y,m,d;
cin>>y>>m>>d;
a.set(y,m,d);
a.print();
a.leap();
a.next();
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
刚强又憨厚的超人F
2016-05-05 · TA获得超过146个赞
知道答主
回答量:90
采纳率:100%
帮助的人:19.2万
展开全部
可以通过excel表来设计。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超级香堤荣府
2016-03-26
知道答主
回答量:1
采纳率:0%
帮助的人:1144
展开全部
而非V沟通过哥哥大风刮过
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式