C#继承实现圆锥计算:圆类面积值无法传递问题排查
解决圆锥类继承圆类时的数值传递与计算问题
问题根源
- 整数除法错误:
1/3在C#中是整数除法,结果为0,导致圆锥体积始终为0。 - 重写方法未调用父类逻辑:Conus的
Stchet方法重写后没有执行父类的Stchet,导致父类的S(圆面积)未被计算,始终为默认值0。 - 输入类型不匹配:读取半径时用
Convert.ToInt32会截断小数,导致精度丢失。 - Main方法中冗余代码:创建了多余的
Circle实例,且部分输入逻辑重复。
具体修改步骤
1. 修复Circle类的输入精度问题
修改Info_circle方法,用Convert.ToDouble读取半径,保留小数精度:
public virtual void Info_circle() { Console.WriteLine("Введите радиус круга"); this.radius = Convert.ToDouble(Console.ReadLine()); }
2. 修正Conus类的Stchet方法
- 先调用父类
base.Stchet()计算圆的面积和周长,确保base.S有有效值 - 把
1/3改为1.0/3,避免整数除法 - 增加高度有效性判断,防止无效计算:
public override void Stchet() { // 先执行父类计算,确保圆的面积S被赋值 base.Stchet(); // 仅当高度h大于0时计算圆锥参数 if (h > 0 && radius > 0) { this.V = (1.0 / 3) * base.S * this.h; // 圆锥表面积=侧面积+底面积 double lateralArea = Math.PI * base.radius * Math.Sqrt(Math.Pow(base.radius, 2) + Math.Pow(this.h, 2)); this.S_conusa = lateralArea + base.S; } else if (h <= 0) { Console.WriteLine("Высота конуса должна быть больше 0"); } }
3. 简化Main方法中Conus的调用逻辑
删除冗余的Circle实例,直接使用Conus自身继承的方法:
case 5: Conus conus = new Conus(); conus.Info_circle(); // 输入圆锥底面半径 conus.Info_conus(); // 输入圆锥高度 conus.Stchet(); // 一次计算所有参数(圆面积+圆锥体积/表面积) conus.Vyvod_conus(); break;
4. 修正Main方法中Circle的调用逻辑
删除多余的radius变量,直接使用Info_circle读取输入:
case 3: Circle circle = new Circle(); circle.Info_circle(); circle.Stchet(); circle.Vyvod(); break;
修改后的完整代码
Program类
class Program { static void Main() { Console.WriteLine("Выберите фигуру и введите цифру:\n1. Квадрат\n2. Прямоугольник\n3. Круг\n4. Треугольник\n5. Конус\n6. Пирамида"); int figure = Convert.ToInt32(Console.ReadLine()); switch (figure) { case 1: var square = new Square(); square.Info(); square.Stchet(); square.Vyvod(); break; case 2: Rectangle rectangle = new Rectangle(); rectangle.Info(); rectangle.Stchet(); rectangle.Vyvod(); break; case 3: Circle circle = new Circle(); circle.Info_circle(); circle.Stchet(); circle.Vyvod(); break; case 4: Triangle triangle = new Triangle(); triangle.Info(); triangle.vid(); triangle.Stchet(); triangle.Vyvod(); break; case 5: Conus conus = new Conus(); conus.Info_circle(); conus.Info_conus(); conus.Stchet(); conus.Vyvod_conus(); break; case 6: string vid_piramidy; Console.WriteLine("Введите 'квадрат', если хотите квадратную пирамиду\n" + "Введите 'прямоугольник', если хотите прямоугольную пирамиду\n"); vid_piramidy = Console.ReadLine(); var vid_strWithoutSpaces = vid_piramidy.Replace(" ", ""); if (vid_strWithoutSpaces.ToLower() == "квадрат") { Console.WriteLine(vid_strWithoutSpaces); } if (vid_strWithoutSpaces.ToLower() == "прямоугольник") { Console.WriteLine(vid_strWithoutSpaces); } break; } } }
Circle类
class Circle : Figure { protected double radius; protected double C; protected double S; public virtual void Info_circle() { Console.WriteLine("Введите радиус круга"); this.radius = Convert.ToDouble(Console.ReadLine()); } public virtual void Stchet() { if (radius > 0) { this.S = Math.PI * Math.Pow(radius, 2); this.C = radius * 2 * Math.PI; } else { Console.WriteLine("Существование такой окружности невозможно, это точка в пространстве"); } } public void Vyvod() { Console.WriteLine($"Периметр окружности: {C} \n Площадь окружности: {S}\n"); } }
Conus类
class Conus : Circle { protected double h; protected double V; protected double S_conusa; public void Info_conus() { Console.WriteLine("Введите высоту конуса"); this.h = Convert.ToDouble(Console.ReadLine()); } public override void Stchet() { base.Stchet(); if (h > 0 && radius > 0) { this.V = (1.0 / 3) * base.S * this.h; double lateralArea = Math.PI * base.radius * Math.Sqrt(Math.Pow(base.radius, 2) + Math.Pow(this.h, 2)); this.S_conusa = lateralArea + base.S; } else if (h <= 0) { Console.WriteLine("Высота конуса должна быть больше 0"); } } public void Vyvod_conus() { Console.WriteLine($"Площадь конуса равна {S_conusa}, объём равен {this.V}"); } }
内容的提问来源于stack exchange,提问作者Nenavizhu_Sumerki
相关产品推荐
相关产品推荐

