You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#继承实现圆锥计算:圆类面积值无法传递问题排查

解决圆锥类继承圆类时的数值传递与计算问题

问题根源

  1. 整数除法错误:1/3在C#中是整数除法,结果为0,导致圆锥体积始终为0。
  2. 重写方法未调用父类逻辑:Conus的Stchet方法重写后没有执行父类的Stchet,导致父类的S(圆面积)未被计算,始终为默认值0。
  3. 输入类型不匹配:读取半径时用Convert.ToInt32会截断小数,导致精度丢失。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:04:54