某农业大学c/c++第五次实验(类和对象)

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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值