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;
}