创建圆的继承类以显示缩放比例



我有一项任务:
制作一个控制台应用程序来构建可以:

a( 从键盘/文本文件输入圆参数
b(从键盘/文字文件输出圆参数c( 计算正方形
d(计算长度
e(进行圆的自动缩放(函数返回半径改变的圆的缩放副本(圆心坐标不得改变(

所以,正如我所理解的,我需要创建圆形对象并使用继承进行缩放复制,但我真的不知道如何实现这一点。

这是我的代码:

using System;
using System.IO;
using System.Text;
namespace Task4_modified
{
class Program
{
static void Main(string[] args)
{

Circle circle1 = new Circle();
circle1.DataInput(out double axisX1, out double axisY1, out double axisX2, out double axisY2);
double radiusVector = circle1.VectorLength(axisX1, axisY1, axisX2, axisY2);
double circleSquare = circle1.CircleSquare(radiusVector);
double circleLength = circle1.CircleLength(radiusVector);
Console.WriteLine($"nCoordinates of radius-vector:n x1: {axisX1}t y1: {axisY1}n x2: {axisX2}t y2: {axisY2}n");
Console.WriteLine($" Coordinates of center: ({axisX1};{axisY1})n Radius: {radiusVector}n Square: {circleSquare}n Length: {circleLength}n ");
Circle2 circle2 = new Circle2();
circle1.Zooming(out double zoom);

double zoomedRadius = circle1.ZoomingTheCricle(ref radiusVector, ref zoom);
double zoomedCircleSquare = circle1.CircleSquare(zoomedRadius);
double zoomedCircleLength = circle1.CircleLength(zoomedRadius);
Console.WriteLine($"nCoordinates of zoomed radius-vector:n x1: {axisX1}t y1: {axisY1}n x2: {axisX2 * zoom}t y2: {axisY2 * zoom}n");
Console.WriteLine($" Coordinates of center: ({axisX1};{axisY1})n Zoomed radius: {zoomedRadius}n Zoomed square: {zoomedCircleSquare}n Zoomed length: {zoomedCircleLength}n ");
Console.ReadKey();
}

}
class Circle
{
public double VectorLength(double x1, double y1, double x2, double y2)
{
double stdVector = Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
return stdVector;
}
public double CircleSquare(double r)
{
double square = r * r * Math.PI;
return square;
}
public double CircleLength(double r)
{
double length = 2 * Math.PI * r;
return length;
}
public double ZoomingTheCricle(ref double radiusVector, ref double zoom)
{
double zoomedRadiusVector = radiusVector * zoom;
return zoomedRadiusVector;
}
public void DataInput(out double axisX1, out double axisY1, out double axisX2, out double axisY2)
{
const string UNDERLINE = "x1B[4m";
const string RESET = "x1B[0m";
Console.Write($"Press {UNDERLINE}F{RESET} to use file data input or press {UNDERLINE}ANY KEY{RESET} to input from keyboard: ");
char check = Console.ReadKey().KeyChar;
if (check == 'f')
{
Console.Write("Enter X1 coordinate: ");
var temp_x1 = Console.ReadLine();
while (!double.TryParse(temp_x1, out axisX1))
{
Console.WriteLine("Invalid value, try again");
temp_x1 = Console.ReadLine();
}
Console.Write("Enter Y1 coordinate: ");
var temp_y1 = Console.ReadLine();
while (!double.TryParse(temp_y1, out axisY1))
{
Console.WriteLine("Invalid value, try again");
temp_y1 = Console.ReadLine();
}
Console.Write("Enter X2 coordinate: ");
var temp_x2 = Console.ReadLine();
while (!double.TryParse(temp_x2, out axisX2))
{
Console.WriteLine("Invalid value, try again");
temp_x2 = Console.ReadLine();
}
Console.Write("Enter Y2 coordinate: ");
var temp_y2 = Console.ReadLine();
while (!double.TryParse(temp_y2, out axisY2))
{
Console.WriteLine("Invalid value, try again");
temp_y2 = Console.ReadLine();
}
}
else
{
string path = @"C:Usersnc_6dsourcerepostask4&5Task4-5Task4_modifiedTextFile1.txt";
using StreamReader sr = new StreamReader(path, Encoding.Default);
axisX1 = Convert.ToDouble(sr.ReadLine());
axisY1 = Convert.ToDouble(sr.ReadLine());
axisX2 = Convert.ToDouble(sr.ReadLine());
axisY2 = Convert.ToDouble(sr.ReadLine());
}
}
public void Zooming(out double zoom)
{
Console.Write("Enter zoom factor: ");
var temp_zoom = Console.ReadLine();
while (!double.TryParse(temp_zoom, out zoom))
{
Console.WriteLine("Invalid value, try again");
temp_zoom = Console.ReadLine();
}
}
}
class Circle2 : Circle
{

}
}

我大约几周前就开始学习C#了,所以如果有任何帮助,我将不胜感激。

我不确定我是否完全理解你的任务,但这是我的尝试。

继承似乎并不真正适合您的任务,更确切地说,您应该简单地创建一个具有适当修改值的新圆。

对于当前的设置来说,这有点棘手,因为circle类本质上只是提供方法来处理圆,但实际上并没有存储属性。

我建议你重新写下你目前的尝试,试着坚持以下几点:

确保将IO逻辑排除在类之外

圆圈不需要知道如何接收输入或如何输出结果。它——相当坦率——只需要知道如何成为一个圆圈。

为了实现这一点,将圆保持为一种"圆";数据保持器";,允许它进行与其相关的计算,但不让它接收输入。相反,在Main方法中用于输入圆。

class Circle {
public float x;
public float y;
public float radius;
public double CalculateArea()
{
// ...
}
// ...
}

一旦你这样做,你会发现创建一个新的缩放版本非常容易:

public Circle ScaleAsNew(double scale) {
return new Circle {
x = this.x;
y = this.y;
radius = this.radius * scale;
};
}

避免双重代码

目前,您的许多代码在整个程序中都是重复的,主要是输入接收。虽然这不是必要的,但我建议您将其外包到一个方法中,该方法对变量进行提示,并一直尝试返回有效的输出,直到用户输入为止!

希望我能帮助你!

最新更新