C#——Ellipse(椭圆)类[继承Circle(圆)类][实现IComparable接口、IComparerrT接口]DEMO
问题描述
定义一个Circle类,其功能有:
1)两个double类型属性X和Y,可读写圆心坐标
2)一个double类型属性Radius,可读写圆的半径
3)一个构造方法,以指定的x,y,radius来构造
4)一个只读属性Area,获取圆面积
5)一个只读属性Perimeter,获取圆周长
6)一个方法bool Contains(double x, double y),如果指定的点(x, y)处于本圆内,返回true
7)一个方法bool Contains(Circle circle),如果指定的圆circle包含在本圆内,返回true
8)一个方法bool Extend(double range, out Circle newCircle),半径扩大(加上range),输出扩大后的newCircle,返回true。如果Radius+range为负,无法扩大,则输出原来的圆,且返回false。
在一个Main方法中对上述功能进行测试
添加一个Ellipse(椭圆)类:
1)X, Y, MajorRadius, MinorRadius属性
2)至少两个Ellipse构造方法,一个调用另一个
3)只读属性Area
4)实例方法bool Contains(double x, double y)
5)实例方法string ToString()
6)让Circle类继承Ellipse类,将其中的重复代码删去
7)在MajorRadius, MinorRadius属性的set访问器中,对value进行检查,如果value<=0,抛出异常(throw new ArgumentException("主轴长度不能为负");),并保证MajorRadius>=MinorRadius
在一个Main方法中对上述功能进行测试
1)Circle继承IComparable或IComparable<Circle>,使得Circle可比较大小。
在比较时,根据圆半径判定两个圆的大小关系。
2)基于Ellipse生成一个比较器类,继承IComparer或IComparer<Ellipse>,
并添加int类型属性CompareType。
在比较时,如果CompareType为0,比较长轴;为1时,比较短轴;为2时,比较面积。
在一个Main方法中对上述功能进行测试
在Main方法中:
1)利用Random类生成至少5个Circle,放入ArrayList或List<Circle>,
调用Sort()方法进行排序,输出排序后的元素。
2)利用Random类生成至少5个Ellipse,放入ArrayList或List<Ellipse>,
调用Sort(IComparer)方法进行排序,输出排序后的元素。
源代码
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Homework
{class Ellipse{public double X { get; set; }public double Y { get; set; }private double _majorRadius;public double MajorRadius{get{return _majorRadius;}set{if (value <= 0)return;if (value < _minorRadius){_majorRadius = _minorRadius;_minorRadius = value;}else_majorRadius = value;}}private double _minorRadius;public double MinorRadius{get{return _minorRadius;}set{if (value <= 0)return;if (value > _majorRadius){_minorRadius = _majorRadius;_majorRadius = value;}else_minorRadius = value;}}public Ellipse() : this(0, 0, 2, 1){X = Y = 0;MajorRadius = 2;MinorRadius = 1;}public Ellipse(double x, double y, double major, double minor){X = x;Y = y;MajorRadius = major;MinorRadius = minor;}public virtual double Area{get{return Math.PI * MajorRadius * MinorRadius;}}public double DistanceTo(double x, double y){return Math.Sqrt((X - x) * (X - x) + (Y - y) * (Y - y));}public virtual bool Contains(double x, double y){return (X - x) * (X - x) / (MajorRadius * MajorRadius) +(Y - y) * (Y - y) / (MinorRadius * MinorRadius) < 1;}public override string ToString(){return $"椭圆:圆心在({X}, {Y}),主轴半径为{MajorRadius}, 短轴半径为{MinorRadius}";}}class EllipseComparer : IComparer<Ellipse> {public int CompareType = 0;public EllipseComparer():this(0){}public EllipseComparer(int type) {CompareType = type;}public int Compare(Ellipse x, Ellipse y){if (CompareType == 0){return x.MajorRadius.CompareTo(y.MajorRadius);}else if (CompareType == 1){return x.MinorRadius.CompareTo(y.MinorRadius);}else{return x.Area.CompareTo(y.Area);}}}class Circle : Ellipse, IComparable{public double Radius{get{return MinorRadius;}set{MajorRadius = value;MinorRadius = value;}}public Circle() : this(0, 0, 1){}public Circle(double cx, double cy, double r): base(cx, cy, r, r){Radius = r;}public override double Area{get { return Math.PI * Radius * Radius; }}public double Perimeter{get { return 2 * Math.PI * Radius; }}public override bool Contains(double x, double y){return DistanceTo(x, y) <= Radius;}public bool Contains(Circle circle){return DistanceTo(circle.X, circle.Y) <= Radius - circle.Radius;}public bool Overlaps(Circle circle){return DistanceTo(circle.X, circle.Y) <= Radius + circle.Radius;}public bool Extend(double range, out Circle newCircle){if (Radius + range < 0){newCircle = new Circle(X, Y, Radius);return false;}newCircle = new Circle(X, Y, Radius + range);return true;}public override string ToString(){return $"圆:圆心在({X}, {Y}),半径为{Radius}";}public int CompareTo(Object other){return this.Radius.CompareTo(((Circle)other).Radius);}}/*** Circle继承IComparable或IComparable<Circle>,使得Circle可比较大小。* 在比较时,根据圆半径判定两个圆的大小关系。* 基于Ellipse生成一个比较器类,继承IComparer或IComparer<Ellipse>,* 并添加int类型属性CompareType。* 在比较时,如果CompareType为0,比较长轴;为1时,比较短轴;为2时,比较面积。* 在Main方法中,利用Random类生成至少5个Circle,放入ArrayList或List<Circle>,* 调用Sort()方法进行排序,输出排序后的元素。* 利用Random类生成至少5个Ellipse,放入ArrayList或List<Ellipse>,* 调用Sort(IComparer)方法进行排序,输出排序后的元素。*/class Program{static void Main(string[] args){Random random = new Random();ArrayList circleList = new ArrayList();for(int i=0; i < 10;i++){circleList.Add(new Circle(random.NextDouble(),random.NextDouble(),random.NextDouble()));}Console.WriteLine("圆排序前:");for (int i = 0; i < 10; i++){Console.WriteLine(circleList[i]);}circleList.Sort();Console.WriteLine("圆排序后:");for (int i = 0; i < 10; i++){Console.WriteLine(circleList[i]);}List<Ellipse> ellipseList = new List<Ellipse>();for (int i = 0; i < 10; i++){ellipseList.Add(new Ellipse(random.NextDouble(), random.NextDouble(), random.NextDouble(),random.NextDouble()));}Console.WriteLine("椭圆排序前:");for (int i = 0; i < 10; i++){Console.WriteLine(ellipseList[i]);}ellipseList.Sort(new EllipseComparer());Console.WriteLine("椭圆排序后:");for (int i = 0; i < 10; i++){Console.WriteLine(ellipseList[i]);}}}
}
运行结果
参考文章
https://blog.csdn.net/weixin_43272781/article/details/105176909
https://blog.csdn.net/weixin_43272781/article/details/105292114
C#——Ellipse(椭圆)类[继承Circle(圆)类][实现IComparable接口、IComparerrT接口]DEMO相关推荐
- C++编程练习:多态实验——设计一个基类Shapes,Shapes类公有派生产生矩形类Rectangle和圆类Circle
例.设计一个基类Shapes,包含成员函数display()并声明为纯虚函数.Shapes类公有派生产生矩形类Rectangle和圆类Circle,分别定义display()函数实现其主要几何元素的显 ...
- python定义一个圆类_python设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性。编写构造方法和其他方法,计算周长和面积。...
** Python:设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性.编写构造方法和其他方法,计算周长和面积.请编写程序验证类的功能. class Circle: def -init-( ...
- python设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性。编写构造方法和其他方法,计算周长和面积。
** Python:设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性.编写构造方法和其他方法,计算周长和面积.请编写程序验证类的功能. class Circle: def -init-( ...
- 二次修改:【练习题】构造方法的重载:Vehicles(交通工具)-Car(小汽车)和Truck(卡车)类继承于Vehicles类
package day09; /*总结: * 1:想要调用父类的成员方法可以在子类,使用super引用父类的成员方法 super.run(); * * 2:有参构造方法可以把 成员 ...
- 【练习题】构造方法的重载:Vehicles(交通工具)-Car(小汽车)和Truck(卡车)类继承于Vehicles类
package day09;/*2.[练习题]构造方法的重载: 定义一个名为Vehicles(交通工具)的基类,该类中应包含String类型的成员属性brand(商标)和color(颜色),还应包含成 ...
- python 类继承方法_python类的继承、多继承及其常用魔术方法
继承 一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法.属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就 ...
- 什么是继承?Java中如何声明一个类继承另一个类?
在现实生活中,说到继承,多会想到子女继承父辈的财产.事业等.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关联体系.例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动 ...
- java 圆类 圆锥类_以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone
学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone 代码示例: import java.util.Scanner; class Point4{ private dou ...
- 第十周实验指导--任务3--先建立一个Point(点)类,再派生出一个Circle(圆)类,再派生出一个Cylinder(圆柱体)类...
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:定义Compl ...
最新文章
- hackthon提高
- C++11 并发指南一(C++11 多线程初探)
- sql 显示百分比_轻松搞定数据分析之SQL——简单查询
- 通过继承来实现注解方式的属性注入
- steam夏日促销用Python爬取排行榜上的游戏打折信息
- python布尔运算可以比较浮点数吗_Python3 基础之:令人困惑的浮点数运算
- c语言追踪机械腿位置,基于传感器的下肢可穿戴机械腿软件系统设计与实现
- solidworks工程图模板为什么不能存为slddrt格式
- Log4j使用配置总结
- cad图纸怎么转换成图片?
- R语言随机森林模型回归randomForest
- 华硕员工长篇记实:天堂向左,华硕往右
- Python将大量图片拼接成心形图片(二)
- 微信小程序例子——获取用户登录信息
- Selenium自动化测试网页加载太慢怎么办
- BS架构调用TSC TTP-244 Pro条码打印机的常见问题及解决方案
- 照做的话,发不了SCI论文你来找我
- 曾宝仪和机器人_41岁曾宝仪和男友林明谦如老夫老妻 差点与黄子佼狭路相逢(图) - 中华娱乐网...
- 几种VCS(版本控制系统)的特点和异同
- Android谷歌地图+定位
热门文章
- [转]C#中得到程序当前工作目录和执行目录的一些方法
- android 后台邮件发送,Android邮件发送
- 非word格式文件700015怎么办_vim黑科技--在word/浏览器/excel等环境中使用vim
- zookeeper 密码_「附源码」Dubbo+Zookeeper 的 RPC 远程调用框架
- html中加盒子,在HTML中各类型盒子的基线应如何确定
- 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
- django常用的模型字段类型和常用的查询
- 三十八、Scrapy 下载中间件Middleware
- 聚类(中)层次聚类 基于密度的聚类算法
- AAAI 2022有哪些值得读的NLP相关论文?