C++编程问题

下面程序设计了一个日期类如下,通过成员函数init来初始化,print输出
class Date{
int y,m,d;
void init(){
y=year; m=month; d=day;
}
void print(){
cout<<y<<" year "<<m<<" month "<<d<<" day"<<endl;
}
}
int main(){
Date d;
d.init();
d.print();
return 0;
}
问题2.根据上面修改的类,继续添加成员函数,要求能进行日期相减得到相差的天数,日期可以加上一个数,得到新的日期. 为简化程序,设每个月都是30天.
提示: 增加成员函数 int subDate( Date d){……}
Date addNum( int num){ …… }
在main函数中验证如下
Date d1,d2,d3; d1.init(1900,2,1); d2.init(1900,1,1);
cout<<d1.subDate(d2); //结果为30
d3 = d1.add(5);
d3.print(); //d1 是 1900,2,6
思考: addNum( int num)函数的返回值是否可以定义为void?即这样使用:
d1.add(5); d1.print( );
d1自身的日期加5,如果要这么做, addNum函数要如何修改?
提示:注意区分当前对象,如果需要返回当前对象自己,可以使用return *this;
this 是指向当前对象的指针,*this 表示当前对象

问题3. 修改前面的程序, 初始化一个错误的日期,如 Date d1; d1.init(1900,13,45);
程序可以运行么? 怎么修改程序保证程序不会输出一个错误的日期
提示: 如果初始化出错了后面的就没必要运行下去了,可以用函数exit(0)结束程序
通过这个例子程序思考对象的安全性,如何保证对象是正常的,能不能把日期的年月日开放给使用者等
2.3.2 实验内容 运算符重载
问题1:以下有类Point,请添加适当成员函数以便Point对象可以进行运算
class Point{
int x,y;
public:
void init( int a, int b){
x =a; y = b;
}
void disp(){
cout<<x<<” “<<y<<endl;
}
} ;
int main(){
Point a,b,c ;
a.init(1,2) ; b.init(3,4)
c = a + b ;
c.disp() ;
}
采用2种方式重载+运算符:成员函数和全局函数方式
提示:
成员函数方式 Point operator+(const Point& a)
全局函数方式 Point operator+(const Point& a,const Point& b)
那位大哥帮忙做下,明天中午之前要,谢谢了

第1题:
class Date{
public:
int y,m,d;
void init(int year,int month,int day) //init函数应加上相应的形参
{
y=year; m=month; d=day;
if(m>12||d>30){exit(0);} //测试输入的日期和月分是否合法。
}

int subDate(Date d) //日期相减函数
{//因为一年有360天,一个月有30天,因此计算公式如下。
return (this->y-d.y)*360+(this->m-d.m)*30+this->d-d.d;
}

Date addNum(int num) //日期相加函数
{d=d+num; //将日期加上相应的数
if(d>30) //若日期相加大于30,则执行已下语句
{m=m+d/30; //超过30天则月分相应的增加
d=d%30; //日期为超过天数的余数,比如日期有35,则这一天是5号,月分相应增加1月
if(d==0){d=30;} //如果d%30的余数为0,则表明这一天是30号。
if(m>12) //判断月分是否大于12,如果大于12相应的年限应加1年
{y=y+m/12;m=m%12;if(m==0){m=12;}} //计算方法与日期相同。
}
return *this;
}
void print(){
cout<<y<<" year "<<m<<" month "<<d<<" day"<<endl;
}
};

int main(){
Date d,d1,d2;
d.init(1900,2,5);
d1.init(1901,3,25);

int i=d1.subDate(d); //测试subDate函数
d.addNum(26); //测试addNum函数

d.print();
cout<<i<<endl;
system("pause");
return 0;
}

第2题:因为同时重载两个+操作符会出问题,出于示例,并减少程序量,本示例在全局重载的是-操作符函数。

class Point{
int x,y;
public:
void init( int a, int b){
x =a; y = b;
}
void disp(){
cout<<x<<" "<<y<<endl;
}

Point operator+(const Point& a) //重载的成员+操作符函数
{ Point s;
s.x=this->x+a.x; s.y=this->y+a.y;
return s;
}
friend Point operator-(const Point& a,const Point& b);
} ;

Point operator-(const Point& a,const Point& b) //全局重载-操作符函数
{ Point s;
s.x=a.x-b.x; s.y=a.y-b.y;
return s;
}

int main(){
Point a,b,c,d ;
a.init(1,2) ; b.init(3,4); d.init(1,1);
c = a + b +d; //测试+操作符
c.disp() ;
c=a-b; //测试-操作符
c.disp();
c=b-a-d; //测试-操作符
c.disp();
system("pause");
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-08-27
问题在哪儿呢?
相似回答