问题描述

定义一个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相关推荐

  1. C++编程练习:多态实验——设计一个基类Shapes,Shapes类公有派生产生矩形类Rectangle和圆类Circle

    例.设计一个基类Shapes,包含成员函数display()并声明为纯虚函数.Shapes类公有派生产生矩形类Rectangle和圆类Circle,分别定义display()函数实现其主要几何元素的显 ...

  2. python定义一个圆类_python设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性。编写构造方法和其他方法,计算周长和面积。...

    ** Python:设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性.编写构造方法和其他方法,计算周长和面积.请编写程序验证类的功能. class Circle: def -init-( ...

  3. python设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性。编写构造方法和其他方法,计算周长和面积。

    ** Python:设计一个Circle(圆)类,包括圆心位置`,半径,颜色等属性.编写构造方法和其他方法,计算周长和面积.请编写程序验证类的功能. class Circle: def -init-( ...

  4. 二次修改:【练习题】构造方法的重载:Vehicles(交通工具)-Car(小汽车)和Truck(卡车)类继承于Vehicles类

    package day09; /*总结:  * 1:想要调用父类的成员方法可以在子类,使用super引用父类的成员方法   super.run();     *   * 2:有参构造方法可以把  成员 ...

  5. 【练习题】构造方法的重载:Vehicles(交通工具)-Car(小汽车)和Truck(卡车)类继承于Vehicles类

    package day09;/*2.[练习题]构造方法的重载: 定义一个名为Vehicles(交通工具)的基类,该类中应包含String类型的成员属性brand(商标)和color(颜色),还应包含成 ...

  6. python 类继承方法_python类的继承、多继承及其常用魔术方法

    继承 一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法.属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就 ...

  7. 什么是继承?Java中如何声明一个类继承另一个类?

    在现实生活中,说到继承,多会想到子女继承父辈的财产.事业等.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关联体系.例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动 ...

  8. java 圆类 圆锥类_以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone

    学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone 代码示例: import java.util.Scanner; class Point4{ private dou ...

  9. 第十周实验指导--任务3--先建立一个Point(点)类,再派生出一个Circle(圆)类,再派生出一个Cylinder(圆柱体)类...

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:定义Compl ...

最新文章

  1. hackthon提高
  2. C++11 并发指南一(C++11 多线程初探)
  3. sql 显示百分比_轻松搞定数据分析之SQL——简单查询
  4. 通过继承来实现注解方式的属性注入
  5. steam夏日促销用Python爬取排行榜上的游戏打折信息
  6. python布尔运算可以比较浮点数吗_Python3 基础之:令人困惑的浮点数运算
  7. c语言追踪机械腿位置,基于传感器的下肢可穿戴机械腿软件系统设计与实现
  8. solidworks工程图模板为什么不能存为slddrt格式
  9. Log4j使用配置总结
  10. cad图纸怎么转换成图片?
  11. R语言随机森林模型回归randomForest
  12. 华硕员工长篇记实:天堂向左,华硕往右
  13. Python将大量图片拼接成心形图片(二)
  14. 微信小程序例子——获取用户登录信息
  15. Selenium自动化测试网页加载太慢怎么办
  16. BS架构调用TSC TTP-244 Pro条码打印机的常见问题及解决方案
  17. 照做的话,发不了SCI论文你来找我
  18. 曾宝仪和机器人_41岁曾宝仪和男友林明谦如老夫老妻 差点与黄子佼狭路相逢(图) - 中华娱乐网...
  19. 几种VCS(版本控制系统)的特点和异同
  20. Android谷歌地图+定位

热门文章

  1. [转]C#中得到程序当前工作目录和执行目录的一些方法
  2. android 后台邮件发送,Android邮件发送
  3. 非word格式文件700015怎么办_vim黑科技--在word/浏览器/excel等环境中使用vim
  4. zookeeper 密码_「附源码」Dubbo+Zookeeper 的 RPC 远程调用框架
  5. html中加盒子,在HTML中各类型盒子的基线应如何确定
  6. 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
  7. django常用的模型字段类型和常用的查询
  8. 三十八、Scrapy 下载中间件Middleware
  9. 聚类(中)层次聚类 基于密度的聚类算法
  10. AAAI 2022有哪些值得读的NLP相关论文?