1. | Time时间类 【问题描述】 设计一个Time类,并设计多个重载的构造函数,可以设置时间、进行时间的加减运算、按12小时格式和24小时格式输出时间。 例如: 其中构造函数Time::Time(int s)根据总秒数计算hour、minute、second并构造对象; 成员函数void Time::print_12()按12小时格式显示时间,如“09:20:45 AM”、“03:15:20 PM”; 成员函数void Time::print_24()按24小时格式显示时间,如“09:20:45”、“4:30:20”; 成员函数Time Time::Add(Time&)用来实现两个时间对象的值进行相加;(请注意:创建临时对象保存结果,并返回该对象) 成员函数Time Time::Sub(Time&)用来实现两个时间对象的值进行相减。(请注意:使用时间值大的减去小的,避免出现负数情况) 为了检验Time类的功能,主函数按如下方式设计: 【输入形式】无输入 【输出形式】程序运行结果 【样例输入】无 【样例输出】 t2:01:23:34 PM t2:13:23:34 t1+t2:15:57:34 t1-t2:10:49:34 t3:01:02:03 |
---|
#include<bits/stdc++.h>
using namespace std;
class Time
{
private:
int hour,minute,second;
public:
int SecCalc()//返回总秒数
{
return(hour*60+minute)*60+second;
}
Time(int h,int m,int s=0);//构造函数
Time(int s=0);//根据总秒数计算hour、minute、second并构造对象
void SetTime(int h=0,int m=0, int s=0);
void print_12();//按12小时格式显示时间
void print_24();//按24小时格式显示时间
Time Add(Time &);//实现两个时间对象的值进行相加
Time Sub(Time &);//实现两个时间对象的值进行相减
};
Time::Time(int h,int m,int s)//构造函数
{
hour=h;
minute=m;
second=s;
}
Time::Time(int s)//根据总秒数计算hour、minute、second并构造对象
{
hour=s/3600;
minute=(s-hour*3600)/60;
second=s-hour*3600-60*minute;
}
void Time::SetTime(int h,int m, int s)
{
hour=h;
minute=m;
second=s;
}
void Time::print_12()//按12小时格式显示时间
{
if(hour>12)
{
cout << setw(2) << setfill('0') << hour-12 << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second << " PM";
}
else
{
cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second << " AM";
}
}
void Time::print_24()
{
cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second;
}
Time Time::Add(Time &t)//实现两个时间对象的值进行相加
{
Time tt;
tt.second = second+t.second;
tt.minute = tt.second/60 + minute + t.minute;
tt.second %= 60;
tt.hour = tt.minute/60 + hour + t.hour;
tt.minute %= 60;
tt.hour %= 24;
return tt;
}
Time Time::Sub(Time &t)//实现两个时间对象的值进行相减
{
int s = fabs( this->SecCalc() - t.SecCalc() );
Time tt(s);
return tt;
}
int main()
{
Time t1(2,34),t2,t3(3723);
t2.SetTime(13,23,34);
cout<<"t2:";
t2.print_12();
cout<<endl<<"t2:";
t2.print_24();
cout<<"\nt1+t2:";
t1.Add(t2).print_24();
cout<<"\nt2-t1:";
t2.Sub(t1).print_24();
cout<<endl<<"t3:";
t3.print_24();
return 0;
}
2. | 椭圆类——2(拷贝构造函数和析构函数) 【问题描述】 (1)拷贝(复制)构造函数的实现。在已经完成的“椭圆类——1”的基础上,增加一个拷贝构造函数。函数原型格式:Ellipse(const Ellipse & e); (2)增加Show()函数,显示椭圆的外切矩形的顶点坐标。 (3)增加一个成员函数Fun(int y),将椭圆外切矩形的左上角和右下角的纵坐标分别加y和减y。 (4)增加析构函数,在析构函数中输出“xigou”以及待析构对象的外切矩形左上角的横纵坐标。 【输入形式】在主函数中输入顶点坐标后创建一个对象,并用该对象作为初始值再创建一个新对象。输入一个值,用于修改新对象的外切矩形的纵坐标。 【输出形式】在主函数里调用这2个对象的Show函数分别输出外切矩形的顶点坐标,调用Area函数分别计算并输出椭圆的面积。接收修改值y后,调用Fun函数修改新对象的纵坐标。重新计算新对象的面积并输出。 【样例输入】 -3 1 3 -1 1 【样例输出】 -3 1 3 -1 -3 1 3 -1 9.4245 9.4245 18.849 xigou -3 2 xigou -3 1 |
---|
#include<bits/stdc++.h>
using namespace std;
class Ellipse
{
private:
int x1,y1,x2,y2;
public:
Ellipse(int a,int b,int c,int d)
{
x1=a;
y1=b;
x2=c;
y2=d;
}
Ellipse(const Ellipse & e)
{
x1=e.x1;
x2=e.x2;
y1=e.y1;
y2=e.y2;
}
~Ellipse()
{
cout<<"xigou "<<x1<<" "<<y1<<endl;
}
void Show()
{
cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
void Fun(int y)
{
y1 += y;
y2 -= y;
}
double Area()
{
return 3.1415*(y2-y1)*(x1-x2)/4.0;
}
};
int main()
{
int x1,x2,y1,y2,y;
cin>>x1>>y1>>x2>>y2;
cin>>y;
Ellipse a(x1,y1,x2,y2);
Ellipse a2(a);
a.Show();
a2.Show();
cout<<a.Area()<<endl;
a2.Fun(y);
cout<<a.Area()<<endl;
cout<<a2.Area()<<endl;
return 0;
}
3. | String类(资源空间问题、深复制与浅复制) 【问题描述】 自行编写代码完成自己的String类。注意这里的String字符S大写,主要目的是与C++自带的string类相互区分。 class String //请勿修改本类的声明,请实现具体的成员函数。 { public: String(const char *str=NULL); //构造函数 String(const String &r); //拷贝构造函数 ~String(); //析构函数 private: char *mydata; //请勿修改数据成员的类型 }; int main() //请勿修改主函数 { String s1,s2("hello"); String s3(s2); return 0; } 请在构造函数、拷贝构造函数、析构函数的函数体里添加相应的cout语句,输出对应的提示。 【输入形式】无输入 【输出形式】构造函数、拷贝构造函数和析构函数里的提示语句 【样例输入】无 【样例输出】 gouzao gouzao hello kaobei gouzao hello xigou hello xigou hello xigou |
---|
#include<bits/stdc++.h>
using namespace std;
class String //请勿修改本类的声明,请实现具体的成员函数。
{
public:
String(const char *str=NULL); //构造函数
String(const String &r); //拷贝构造函数
~String(); //析构函数
private:
char *mydata; //请勿修改数据成员的类型
};
String::String(const char *str)
{
if(str==NULL)
{
cout << "gouzao"<<endl;
mydata=NULL;
}
else
{
cout << "gouzao "<<str<<endl;
mydata=new char[10];
strcpy(mydata,str);//复制字符串
}
}
String::String(const String &r)
{
cout << "kaobei gouzao " << r.mydata << endl;
mydata=new char[10];
strcpy(mydata,r.mydata);//复制字符串
}
String::~String()//析构函数
{
if( mydata==NULL )
{
cout << "xigou" << endl;
}
else
{
cout << "xigou " << mydata << endl;
}
}
int main() //请勿修改主函数
{
String s1,s2("hello");
String s3(s2);
return 0;
}
4. | 椭圆类——3 (类的复杂设计) 【问题描述】 (1)在前一周作业题(椭圆类——2)的基础上,增加一个Point类(点类),包括私有成员横纵坐标x和y(均为int型),以及参数带默认值的构造函数Point(x=0,y=0); (2)给Point类增加拷贝(复制)构造函数Point(Point& p); (3)增加析构函数~Point();输出"Point xigou"以及待析构的点的横纵坐标。 (4)增加取横纵坐标值的函数int GetX(); int GetY(); (5)删除Ellipse类原来的四个数据成员,重新修改为 Point a,b; (6)修改Ellipse原来的构造函数Ellipse(int x1,int y1,int x2,int y2);注意使用冒号语法对组合成员进行构造,并在构造函数里输出“gouzao 1”和x1,y1,x2,y2的值。 (7)增加一个Ellipse类的构造函数Ellipse(Point &p1,Point &p2); 并在构造函数里输出“gouzao 2”和x1,y1,x2,y2的值。 (8)修改Ellipse的析构函数的输出内容为“Ellipse xigou”以及待析构对象的外切矩形右下角的横纵坐标。 (9)去掉Ellipse类的拷贝构造函数、Fun函数,并修改剩余函数里的错误。 【输入形式】 主函数:输入四个坐标点,用其初始化一个Ellipse对象e1。输入两对坐标点,用其初始化2个Point对象p1和p2。用p1和p2初始化一个新的Ellipse对象e2。最后调用e1和e2的Show函数分别显示坐标,调用e1和e2的Area函数计算并输出。 【输出形式】 程序运行结果 【样例输入】 -3 1 3 -1 -3 2 3 -2 【样例输出】 gouzao 1 -3 1 3 -1 gouzao 2 -3 2 3 -2 -3 1 3 -1 -3 2 3 -2 9.4245 18.849 Ellipse xigou 3 -2 Point xigou 3 -2 Point xigou -3 2 Point xigou 3 -2 Point xigou -3 2 Ellipse xigou 3 -1 Point xigou 3 -1 Point xigou -3 1 |
---|
#include<bits/stdc++.h>
using namespace std;
class Point
{
private:
int px,py;
public:
Point(int x,int y)
{
px=x;
py=y;
}
Point(Point& p)
{
px=p.px;
py=p.py;
}
~Point()
{
cout << "Point xigou " << px << " " << py << endl;
}
int GetX()
{
return px;
}
int GetY()
{
return py;
}
};
class Ellipse
{
private:
Point a,b;
public:
Ellipse(int x1,int y1,int x2,int y2);
Ellipse(Point &p1,Point &p2);
~Ellipse()
{
cout <<"Ellipse xigou "<<b.GetX()<<" "<<b.GetY()<<endl;
}
void Show()
{
cout << a.GetX() << " " << a.GetY() << " "
<<b.GetX()<<" "<<b.GetY()<<endl;
}
double Area()
{
return 3.1415*fabs(b.GetX()-a.GetX()) * fabs(b.GetY()-a.GetY())/4.0;
}
};
Ellipse::Ellipse(int xx1,int yy1,int xx2,int yy2):a(xx1,yy1),b(xx2,yy2)
{
cout << "gouzao 1 " << a.GetX() << " " << a.GetY() << " "
<< b.GetX() << " " << b.GetY() << endl;
}
Ellipse::Ellipse(Point &p1,Point &p2):a(p1),b(p2)
{
cout <<"gouzao 2 "<<a.GetX()<<" "<<a.GetY()<<" "
<<b.GetX()<<" "<<b.GetY()<<endl;
}
int main()
{
int x1,y1,x2,y2,x3,y3,x4,y4;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
Ellipse e1(x1,y1,x2,y2);
Point p1(x3,y3);
Point p2(x4,y4);
Ellipse e2(p1,p2);
e1.Show();
e2.Show();
cout << fixed << setprecision(4) << e1.Area() << endl;
cout << fixed << setprecision(3) << e2.Area() << endl;
return 0;
}
5. | 椭圆类——1(类的设计) 【问题描述】 设计并测试一个名为Ellipse的椭圆类: (1)其私有数据成员为外切矩形的左上角与右下角两个点的坐标(4个int型数据成员x1,y1,x2,y2) (2)声明4个公有的成员函数分别访问椭圆的外切矩形的顶点坐标,例如int Getx1(); (3)设计1个构造函数Ellipse(int,int,int,int)对椭圆的外切矩形的顶点坐标赋值 (4)设计1个公有成员函数Area()计算椭圆的面积。 【输入形式】在主函数里输入顶点坐标,并声明一个Ellipse类的对象。 【输出形式】在主函数里调用该对象的成员函数输出外切矩形的顶点坐标,计算并输出椭圆的面积。 【样例输入】 -3 1 3 -1 【样例输出】 -3 1 3 -1 9.4245 |
---|
#include<bits/stdc++.h>
using namespace std;
class Ellipse
{
private:
int x1,y1,x2,y2;
public:
Ellipse(int a,int b,int c,int d)
{
x1=a;
y1=b;
x2=c;
y2=d;
}
int getx1()
{
return x1;
}
int getx2()
{
return x2;
}
int gety1()
{
return y1;
}
int gety2()
{
return y2;
}
double Area()
{
return 3.1415*(y2-y1)*(x1-x2)/4.0;
}
};
int main()
{
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
Ellipse a(x1,y1,x2,y2);
cout << a.getx1()<<" "<<a.gety1()<<" "<<a.getx2()<<" "<<
a.gety2()<<endl;
cout << a.Area();
return 0;
}