ООП в C# - функция всегда возвращает 0

Рейтинг: 0Ответов: 1Опубликовано: 20.11.2014

Объясните, пожалуйста, почему в результате выдает всегда 0? С# только начал изучать, скорее всего что то не учел. Вот код консольного приложения:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    abstract public class Solid
    {
        protected double a = 0, b = 0;
        public virtual double GetVolume()
        {
            return 1 / 3 * Math.Pow(a,2) * b;
        }
    }
    public class Cone : Solid
    {
        public double R;
        public double H;
        public override double GetVolume()
        {
            base.a = R;
            base.b = H;
            return base.GetVolume();
        }
    }
    public class Pyramid : Solid
    {
        public double A;
        public double H;
        public override double GetVolume()
        {
            base.a = A;
            base.b = H;
            return base.GetVolume();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Pyramid pyramid = new Pyramid();
            Cone cone = new Cone();
            //
            Console.Write("Введите сторону пирамиды: ");
            pyramid.A = Convert.ToDouble(Console.ReadLine());
            Console.Write("Введите высоту пирамиды: ");
            pyramid.H = Convert.ToDouble(Console.ReadLine());
            ///
            Console.Write("Введите радиус конуса: ");
            cone.R = Convert.ToDouble(Console.ReadLine());
            Console.Write("Введите высоту конус: ");
            cone.H = Convert.ToDouble(Console.ReadLine());
            //
            Console.WriteLine("Объем пирамиды = "+pyramid.GetVolume());
            Console.WriteLine("Объем конуса   = " + cone.GetVolume());
            Console.ReadKey();
        }
    }
}

Ответы

▲ 3Принят

В методе Solid.GetVolume() у вас присутствует цклочисленное деление 1 / 3. Так как оба операнда целые, результат округляется вниз до ближайшего целого, получается 0, на который вы умножаете всё выражение. Отсюда ноль. Чтобы при делении 1 / 3 получить 0.3333, необходимо, чтобы хотя бы один из операндов был с плавающей точкой. Этого можно добиться либо явным преобразованием ((float) 1 / 3), либо использованием литерала с плавающей точкой (1.0 / 3 или 1f / 3).