Obliczanie pola ze wzoru Herona z użyciem klasy abstrakcyjnej

0

Hej, mam kod który wygląda tak:

using System;

namespace zadaniepierwsze
{
    class Program
    {
        static void Main(string[] args)
        {
           pole.Rww x = new pole(2,4,5);
            x.Pole();
            Console.ReadKey();
        }
    }

    abstract class pole
    {
        double a, b, c;

        public double Pole()
        {
            double p = Obwod() / 2;
            return Math.Sqrt(p * (p - a) * (p - a) * (p - c));
        }

        public double Obwod()
        {
            return a + a + c;
        }

        public override string ToString()
        {
            object p1 = this.Pole();
            return string.Format("{0:0.00}", p1);
        }

       public class Rww : pole
        {
            public override string ToString()
            {
                double p = 0.00;
                return Math.Sqrt(p * (p - a) * (p - a) * (p - c));
            }
        }
    }
}

Ma obliczać Pole ze wzoru Herona, używając klasy abstracyjnej oraz metody przeciążającej ToString(). Ja już wysiadam, nie mam pomysłu czemu to nie chce działać. Czy mogę prosić o małą pomoc ? Jakieś wskazówki ?

1

Ogólnie to tam masz bardzo dużo błędów. Po pierwsze klasę 'Rww' umieściłes wewnątrz klasy abstrakcyjnej 'pole', popraw to sobie tak aby była to osobna klasa.

0

No masz tam trochę nieprawidłowości. Mylisz pojęcie dziedziczenia z kompozycją / agregacją. Popatrz na ten przykład:

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

namespace App
{
    interface IShape
    {
        double Field { get; }
        double Perimiter { get; }
        string Name { get; }

        void ComputeField();
        void ComputePerimeter();
    }

    class Square : IShape
    {
        private double a;
        private double field, perimiter;

        public double Field
        {
            get { return this.field; }
        }

        public double Perimiter
        {
            get { return this.perimiter; }
        }

        public string Name
        {
            get { return nameof(Square); }
        }

        public Square(double a)
        {
            this.a = a;
        }

        public void ComputeField()
        {
            this.field = this.a * this.a;
        }

        public void ComputePerimeter()
        {
            this.perimiter = 4.0 * this.a;
        }
    }

    class Rectangle : IShape
    {
        private double a, b;
        private double field, perimiter;

        public double Field
        {
            get { return this.field; }
        }

        public double Perimiter
        {
            get { return this.perimiter; }
        }

        public string Name
        {
            get { return nameof(Rectangle); }
        }

        public Rectangle(double a, double b)
        {
            this.a = a;
            this.b = b;
        }

        public void ComputeField()
        {
            this.field = this.a * this.b;
        }

        public void ComputePerimeter()
        {
            this.perimiter = 2.0 * this.a + 2.0 * this.b;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var shapes = new List<IShape> { new Rectangle(2.0, 4.5), new Square(7.6) };
            foreach (var s in shapes)
            {
                s.ComputeField();
                s.ComputePerimeter();

                Console.WriteLine(string.Format("Name: {0}\nField: {1}\nPerimiter: {2}\n", s.Name, s.Field, s.Perimiter));
            }
        }
    }
}

Mamy sobie abstrakta czyli interfejs o nazwie IShape, który jest implementowany przez klasy reprezentujące kwadrat i prostokąt.

0

Zmodyfikowałem trochę kod i finalnie wyszło mi coś takiego:

using System;

namespace zadaniepierwsze
{
   
    
    abstract public class pole
    {
        double a, b, c;

        public double Pole()
        {
            double p = Obwod() / 2;
            return Math.Sqrt(p * (p - a) * (p - a) * (p - c));
        }

        public double Obwod()
        {
            return a + a + c;
        }

        public override string ToString()
        {
            object p1 = this.Pole();
            return string.Format("{0:0.00}", p1);
        }
      
    }
  public class Rww : pole
    {
        
        public Rww(double c, double a, double b) : base(a, b, c);
        


    }
    class Glowna
    {
        static void Main(string[] args)
        {
           
            Rww trojkat = new Rww(5, 6,3);               
          
            System.Console.WriteLine("Pole wynosi: {0}", trojkat.Pole());
        }



    }
}

Mam jednak error:

C# “must declare a body because it is not marked abstract, extern, or partial”

Proszę o jakąś małą wskazówkę/podpowiedź :)

0

public Rww(double c, double a, double b) : base(a, b, c);

Daj tu nawias klamrowy

  public Rww(double c, double a, double b) : base(a, b, c)
{
}
0

Spróbuj tego:
Tylko posprawdzaj jeszcze wzory

using System;

namespace zadaniepierwsze
{
    public abstract class Figura
    {
        protected double _a;
        protected double _b;
        protected double _c;

        public Figura(double a, double b, double c)
        {
            _a = a;
            _b = b;
            _c = c;
        }

        public abstract double Pole();

        public abstract double Obwod();
    }

    public class Trojkat : Figura
    {
        public Trojkat(double a, double b, double c) : base(a, b, c)
        {

        }

        public override double Obwod()
        {
            return _a + _b + _c;
        }

        public override double Pole()
        {           
            double p = Obwod() / 2;
            return Math.Sqrt(p * (p - _a) * (p - _b) * (p - _c));
        }

        public override string ToString()
        {
            object p1 = Pole();
            return string.Format("{0:0.00}", p1);
        }
    }

    public class Glowna
    {
        static void Main(string[] args)
        {
            Trojkat trojkat = new Trojkat(5, 6, 3);

            Console.WriteLine("Pole wynosi: {0}", trojkat.Pole());
        }
    }
}
0

@cSharpKazik: Może to i zadziała ale nie widzę powodu, dla którego utrudniamy sobie życia klasą abstrakcyjną zamiast zwyczajnie zastosować interfejs :)

0
grzesiek51114 napisał(a):

@cSharpKazik: Może to i zadziała ale nie widzę powodu, dla którego utrudniamy sobie życia klasą abstrakcyjną zamiast zwyczajnie zastosować interfejs :)

Uwierz mi że bym chciał, ale takie mam wymogi na studiach :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1