使用c++设计矩形类

一、前言

为了更深入的学习c++,小编将带领大家一起使用c++实现矩形,本文就介绍了一些相关的代码。

二、带分数的运算

Rectangle类,该类只保存长方形的4个顶点的坐标。构造函数调用set函数,接受4组坐标并验证它们均在第一象限中,并且构成长方形,成员函数计算长度,宽度,周长和面积,判断是否为正方形。

1.头文件(Rectangle.h)

/*
本程序考虑了不按照顺序输入,任意输入四个点判断的情况
本程序的方法:先判断ab是否平行于cd,再判断ab是否等于cd,最后判断ab是否垂直于cd
一个简单的算法是:使用中点到四个点距离相等来判断矩形;或者用勾股定理判断三个角是否为直角;
下面只给出使用第一种方法的情形
*/
#include<iostream>
using namespace std;
//长方形类
class Rectangle
{
private:
	class Point 
	{
	public:
		double x;//x坐标
		double y;//y坐标
	};
	Point a, b, c, d;//记录坐标
	double length;//记录长度
	double width;//记录宽度
public:
	void Set();//构造函数
	void Area();//计算面积
	void Perimeter();//计算周长
	void Get();//计算长度宽度
	bool JudgeR();//判断是否为矩形
	bool JudgeS();//判断是否为正方形
};

2.源文件(实现函数)

#include"Rectangle.h"
#include<iostream>
using namespace std;

//构造函数
void Rectangle::Set() 
{
	//输入坐标
	cout << "第1个坐标的x值:"; cin >> a.x;
	cout << "第1个坐标的y值:"; cin >> a.y;
	cout << "第2个坐标的x值:"; cin >> b.x;
	cout << "第2个坐标的y值:"; cin >> b.y;
	cout << "第3个坐标的x值:"; cin >> c.x;
	cout << "第3个坐标的y值:"; cin >> c.y;
	cout << "第4个坐标的x值:"; cin >> d.x;
	cout << "第4个坐标的y值:"; cin >> d.y;
	//开始判断是否在第一象限内
	if (a.x >= 0 && a.y>= 0 && b.x >= 0 && b.y >= 0 && c.x >= 0 && c.y >= 0 && d.x >= 0 && d.y >= 0)
	{
		cout << "已成功输入!" << endl;
	}
	else//产生异常,人为抛出异常信息
	{
		cout << "坐标的值并非在第一象限,无法设置!" << endl;
		throw new out_of_range("坐标的值并非在第一象限,无法设置!");
	}
	//开始判断能否组成矩形
	if (JudgeR())
	{
		cout << "输入坐标能组成矩形!" << endl;
		if (JudgeS())
		{
			cout << "该矩形是正方形!" << endl;
			Get();
		}
		else
		{
			cout << "该矩形是长方形!" << endl;
			Get();
		}
	}
	else 
	{
		cout << "输入坐标不能组成矩形!" << endl;
		throw new out_of_range("输入坐标不能组成矩形!");
	}
}
//判断矩形函数
bool Rectangle::JudgeR()
{
	//四个顶点先输入对点坐标时
	if (a.x != b.x && a.y != b.y) 
	{
		double ab_y = a.y - b.y;
		double ab_x = a.x - b.x;
		double cd_y = c.y - d.y;
		double cd_x = c.x - d.x;
		if (abs(ab_x) != abs(cd_x) || abs(ab_y) != abs(cd_y))
			return false;
		else
			return true;
	}
	//四个顶点先左后右,先左后右输入
	else if ((a.x == b.x || a.y == b.y) && (a.x == c.x || a.y == c.y))
	{
		double ab_y = a.y - b.y;
		double ab_x = a.x - b.x;
		double cd_y = c.y - d.y;
		double cd_x = c.x - d.x;
		//首先判断ab是否平行于cd
		if (ab_x == 0 || cd_x == 0)
		{
			if (ab_x != cd_x)
				return false;
			else
			{
				if (ab_y / ab_x != cd_y / cd_x)
				{
					return false;
				}
			}
		}
		//再判断ab是否等于cd
		if (ab_y * ab_y + ab_x * ab_x != cd_x * cd_x + cd_y * cd_y)
			return false;
		//然后判断ab是否垂直于ac
		double ac_y = a.y - c.y;
		double ac_x = a.x - c.x;
		if (ab_x == 0)
		{
			if (ac_y != 0)
				return false;
		}
		else if (ac_x == 0)
		{
			if (ab_y != 0)
				return false;
		}
		else if ((ac_y / ac_x) * (ab_y / ab_x) != -1)
		{
			return false;
		}
	}
	//四个顶点先左后右,先右后左输入
	else if ((a.x == b.x || a.y == b.y) && (a.x != c.x || a.y != c.y)) 
	{
		double ab_y = a.y - b.y;
		double ab_x = a.x - b.x;
		double cd_y = d.y - c.y;
		double cd_x = d.x - c.x;
		//首先判断ab是否平行于cd
		if (ab_x == 0 || cd_x == 0)
		{
			if (ab_x != cd_x)
				return false;
			else
			{
				if (ab_y / ab_x != cd_y / cd_x)
				{
					return false;
				}
			}
		}
		//再判断ab是否等于cd
		if (ab_y * ab_y + ab_x * ab_x != cd_x * cd_x + cd_y * cd_y)
			return false;
		//然后判断ab是否垂直于ac
		double ac_y = a.y - d.y;
		double ac_x = a.x - d.x;
		if (ab_x == 0)
		{
			if (ac_y != 0)
				return false;
		}
		else if (ac_x == 0)
		{
			if (ab_y != 0)
				return false;
		}
		else if ((ac_y / ac_x) * (ab_y / ab_x) != -1)
		{
			return false;
		}
	}
	return true;
}
//判断正方形函数
bool Rectangle::JudgeS() 
{
	double ab_y = a.y - b.y;
	double ab_x = a.x - b.x;
	double cd_y = c.y - d.y;
	double cd_x = c.x - d.x;
	double ac_y = a.y - c.y;
	double ac_x = a.x - c.x;
	if (ab_y == 0) 
	{
		if (ab_x != ac_y) 
		{
			return false;
		}
	}
	else if (ab_x == 0) 
	{
		if (ab_y != ac_x)
		{
			return false;
		}
	}
	else 
	{
		if (ab_y != ab_x)
		{
			return false;
		}
	}
	return true;
}
//计算长度,宽度
void Rectangle::Get() 
{
	double d1 = 0, d2 = 0;
	if (a.x != b.x) {
		d1 = abs(a.x - b.x);
		if (a.y != b.y) {
			d2 = abs(a.y - b.y);
		}
		else {
			d2 = abs(a.y - c.y);
		}
	}
	else {
		if (a.y != b.y) {
			d1 = abs(a.y - b.y);
			d2 = abs(a.x - c.x);
		}
	}
	if (d1 > d2)
	{
		length = d1;
		width = d2;
		cout << "长度为:" << length << endl << "宽度为:" << width << endl;
	}
	else if (d1 == d2)
	{
		length = d2;
		width = length; 
		cout << "正方形的宽为:" << width << endl;
	}
	else if (d1 < d2) 
	{
		length = d2;
		width = d1;
		cout << "长度为:" << length << endl << "宽度为:" << width << endl;
	}
}
//计算面积
void Rectangle::Area() 
{
	if (JudgeS())
		cout << "该正方形的面积是:   " << (width * length) << endl;
	else
		cout << "该长方形的面积是:   " << (width * length) << endl;
}
//计算周长
void Rectangle::Perimeter() 
{
	if (JudgeS())
		cout << "该正方形的周长是:   " << 2 * (width + length) << endl;
	else
		cout << "该长方形的周长是:   " << 2 * (width + length) << endl;
}

3.源文件(测试函数)

#include"Rectangle.h"
#include<iostream>
using namespace std;

int main() 
{
	Rectangle rec;
	rec.Set();//输入坐标
	rec.Area();//计算面积
	rec.Perimeter();//计算周长
	return 0;
}

4.运行截图

在这里插入图片描述

三、总结

以上就是今天要讲的内容,本文仅仅简单介绍了矩形类的设计,代码仅供大家参考,希望大家有所收获,感谢!

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值