Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 01.05.2011, 12:22   #1
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию геометрические фигуры.

Здравствуйте. Ниже представлен код моей программы. Создаю абстрактный класс - фигуры. Затем классы наследники: треугольник, прямоугольник, квадрат, ромб, трапеция.
В каждом классе наследнике - конструкторы: площадь и периметр.
Есть тест для прямоугольника и треугольника.
Работа программы:
Вводим стороны и высоту, на выходе получаем площади и периметры фигур.
Внимание вопросы:
1) Посоветуйте пожалуйста, как можно улучшить данный незатейливый код!Может как то красивее что ли.
2) Только в начале изучения ООП. В рамках данной програмке как можно реалидзовать инкапсуляцию и полиморфизм? Если можно!
nikozavr вне форума Ответить с цитированием
Старый 01.05.2011, 12:23   #2
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Вот первая часть кода:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace geomfigur
{
    abstract class Figura
    {
        public abstract double Ploshad();
        public abstract double Perimetr();
    }
    class Treugolnik : Figura//наследование треугольник наследник фигуры
    {
        double a, b, c;
        //конструктор
 
        public Treugolnik(double a, double b, double c)
        {
            this.a = a;
            this.b = b;
            this.c = c;
        }
        public override double Ploshad()
        {
            //throw new NotImplementedException();
            {
                double p = (a + b + c) / 2;
                return Math.Sqrt(p * (p - a) * (p - b) * (p - c));
            }
        }
        public override double Perimetr()
        {
            return (a + b + c);
 
        }
    }
    class Pramougolnik : Figura
    {
        double a, b;
        //construktor
        public Pramougolnik(double a, double b)
        {
            this.a = a;
            this.b = b;
        }
 
        public override double Ploshad()
        {
            return a * b;
        }
        public override double Perimetr()
        {
            return (a + b) * 2;
        }
        class Kvadrat : Figura
        {
            double a;
            public Kvadrat(double a)
            {
                this.a = a;
            }
            public override double Ploshad()
            {
                //throw new NotImplementedException();
                return a * a;
            }
            public override double Perimetr()
            {
                return a + a + a + a;
            }
            class Romb : Figura
            {
                double a, b, c;
                public Romb(double b, double c, double a)
                {
                    this.b = b;
                    this.c = c;
                    this.a = a;
                }
                public override double Ploshad()
                {
                    //throw new NotImplementedException();
                    return b * c / 2;
                }
                public override double Perimetr()
                {
                    return 4 * a;
                }
                class Trapezia : Figura
                {
                    double a, b, c, d, h;
                    public Trapezia(double b, double c, double a, double d, double h)
                    {
                        this.b = b;
                        this.c = c;
                        this.a = a;
                        this.d = d;
                        this.h = h;
                    }
                    public override double Ploshad()
                    {
                        //throw new NotImplementedException();
                        return ((a + b) / 2) * h;
                    }
                    public override double Perimetr()
                    {
                        return a + b + c + d;
                    }
                }
nikozavr вне форума Ответить с цитированием
Старый 01.05.2011, 12:24   #3
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

а ВОТ вторая часть:
Код:
 class Test
                {
 
                    class Program
                    {
                        public static void Main(string[] args)
                        {
                            Figura f1, f2, f3, f4, f5;
                            f1 = new Treugolnik(3, 4, 5);
                            f2 = new Pramougolnik(2, 6);
                            System.Console.WriteLine(f1.Perimetr() + ", " + f1.Ploshad());
                            System.Console.WriteLine(f2.Perimetr() + ", " + f2.Ploshad());
                            Console.ReadLine();
                            //конец теста
                            Console.WriteLine("a=");
                            int a = Convert.ToInt32(Console.ReadLine());
                            Console.WriteLine("b=");
                            int b = Convert.ToInt32(Console.ReadLine());
                            Console.WriteLine("c=");
                            int c = Convert.ToInt32(Console.ReadLine());
                            Console.WriteLine("d=");
                            int d = Convert.ToInt32(Console.ReadLine());
                            Console.WriteLine("h=");
                            int h = Convert.ToInt32(Console.ReadLine());
 
                            f1 = new Treugolnik(a, b, c);
                            f2 = new Pramougolnik(a, b);
                            f3 = new Kvadrat(a);
                            f4 = new Romb(a, b, c);
                            f5 = new Trapezia(a, b, c, d, h);
                            System.Console.WriteLine("периметр и площадь треугольника "+f1.Perimetr() + ", " + f1.Ploshad());
                            System.Console.WriteLine("периметр и площадь прямоугольника "+f2.Perimetr() + ", " + f2.Ploshad());
                            System.Console.WriteLine("периметр и площадь квадрата "+f3.Perimetr() + ", " + f3.Ploshad());
                            System.Console.WriteLine("периметр и площадь ромба "+f4.Perimetr() + ", " + f4.Ploshad());
                            System.Console.WriteLine("периметр и площадьтрапеции "+f5.Perimetr() + ", " + f5.Ploshad());
                            Console.ReadLine();
                        }
                    }
                }
            }
        }
    }
}
nikozavr вне форума Ответить с цитированием
Старый 01.05.2011, 14:47   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
1) Посоветуйте пожалуйста, как можно улучшить данный незатейливый код!
Квадрат является частным случаем прямоугольника (как и окружность - частный случай элипса), поэтому логично сделать так:
Код:
    public class Kvadrat : Pramougolnik
    {
        public Kvadrat(double a)
            : base(a, a)
        { }
    }
Цитата:
Может как то красивее что ли.
Что, на твой взгляд, здесь не очень красиво?

Цитата:
2) Только в начале изучения ООП. В рамках данной програмке как можно реалидзовать инкапсуляцию и полиморфизм? Если можно!
Полиморфизм и заключается в переопределении методов в производных классах(Полиморфизм):
Код:
public override double Perimetr()
...
public override double Ploshad()
...
Также здесь присутствует и инкапсуляция(Инкапсуляция):
В примере определены открытые интерфейсы:
Код:
public double Ploshad();
public double Perimetr();
А как эти методы реализованы, и какие данные хранит каждый конкретный экземпляр класса(a и b или a, b и с) - инкапсулировано в каждом отдельном классе.


P.S.
Попробуй сделать визуализацию для наглядности. Можно добавить метод Draw(), пусть каждая фигура сама себя отрисовывает:
Код:
    public abstract class Figura
    {
        protected int _x;
        protected int _y;
        public Figura(int x, int y)
        {
            this._x = x;
            this._y = y;
        }

        public abstract double Ploshad();
        public abstract double Perimetr();
        public abstract void Draw(System.Drawing.Graphics graphics);
    }
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 15:01   #5
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Спасибо. насчет визуализации недопонял. Ваш кусок кода куда вставить?
nikozavr вне форума Ответить с цитированием
Старый 01.05.2011, 15:03   #6
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Туплю, куда вставить понял. Дальше что делать и как это работает? Рлдскажите пожалуйста поподробнее.

Не могу разобраться с интерфейсами, коллекциями и делегированием. На практике. Можно ли эти вещи у меня в коде реализовать. Читаю, вроде ясно. В кодах проблема. Как и с полиморфизмом.
nikozavr вне форума Ответить с цитированием
Старый 01.05.2011, 15:25   #7
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Дальше что делать и как это работает?
Я лишь предложил направление, в котором можно расширить код.

Если подробнее, то я имел ввиду следующее:
1. Создать winform приложение;
2. На уровне класса объявить список объектов:
Код:
private List<Figura> FiguraList;
3. Где-нибудь его заполнить (например в Form1_Load).
Код:
FiguraList = new List<Figura>();
FiguraList.Add(new Pramougolnik(10, 10, 50, 70)); // Во все конструкторы добавить первые параметры x и y.
...
4. На форме расположить pictureBox;
5. Можно создать отдельный класс для инкапсуляции списка объектов, но если просто, то в в событии Paint pictureBox прописать:
Код:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    foreach(Figura f in FiguraList)
    {
        f.Draw(e.Graphics);
    }
}
Например, для прямоугольнка метод Draw() можно реализовать так:
Код:
Rectangle rec = new Rectangle();

rec.X = _x;
rec.Y = _y;
rec.Width = a;
rec.Height = b;

using (Pen pen = new Pen(Color.Black, 2))
{
    graphics.DrawRectangle(pen, rec);
}
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 01.05.2011 в 16:15.
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 15:32   #8
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Охренеть. попробую.
nikozavr вне форума Ответить с цитированием
Старый 01.05.2011, 16:45   #9
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Предложенное направление понравилось. Надеюсь поможете справиться.

Итак. Создал виндовс форм. Пять текстбоксов для ввода сторон фигур. Кнопка - по ее нажатию происходит расчет и отрисовка?
10 текстбоксов для вывода расчитанных площадей и периметров.
Пикчербокс для отрисовки фигур.

Ну и как теперь соединить мою программу и эту форму?

Код формы делю на три сообщения:
Код:
namespace WindowsFormsApplication1
{
    partial class Form1
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Код, автоматически созданный конструктором форм Windows

        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.textBox3 = new System.Windows.Forms.TextBox();
            this.textBox4 = new System.Windows.Forms.TextBox();
            this.textBox5 = new System.Windows.Forms.TextBox();
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.button1 = new System.Windows.Forms.Button();
            this.textBox6 = new System.Windows.Forms.TextBox();
            this.textBox7 = new System.Windows.Forms.TextBox();
            this.textBox8 = new System.Windows.Forms.TextBox();
            this.textBox9 = new System.Windows.Forms.TextBox();
            this.textBox10 = new System.Windows.Forms.TextBox();
            this.textBox11 = new System.Windows.Forms.TextBox();
            this.textBox12 = new System.Windows.Forms.TextBox();
            this.textBox13 = new System.Windows.Forms.TextBox();
            this.textBox14 = new System.Windows.Forms.TextBox();
            this.textBox15 = new System.Windows.Forms.TextBox();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(13, 33);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 20);
            this.textBox1.TabIndex = 0;
            this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
            // 
            // textBox2
            // 
            this.textBox2.Location = new System.Drawing.Point(13, 69);
            this.textBox2.Name = "textBox2";
            this.textBox2.Size = new System.Drawing.Size(100, 20);
            this.textBox2.TabIndex = 1;
            // 
            // textBox3
            // 
            this.textBox3.Location = new System.Drawing.Point(13, 110);
            this.textBox3.Name = "textBox3";
            this.textBox3.Size = new System.Drawing.Size(100, 20);
            this.textBox3.TabIndex = 2;
            this.textBox3.TextChanged += new System.EventHandler(this.textBox3_TextChanged);
            // 
            // textBox4
            // 
            this.textBox4.Location = new System.Drawing.Point(13, 154);
            this.textBox4.Name = "textBox4";
            this.textBox4.Size = new System.Drawing.Size(100, 20);
            this.textBox4.TabIndex = 3;
            this.textBox4.TextChanged += new System.EventHandler(this.textBox4_TextChanged);
            // 
            // textBox5
            // 
            this.textBox5.Location = new System.Drawing.Point(13, 195);
            this.textBox5.Name = "textBox5";
            this.textBox5.Size = new System.Drawing.Size(100, 20);
            this.textBox5.TabIndex = 4;
            this.textBox5.TextChanged += new System.EventHandler(this.textBox5_TextChanged);
            //
nikozavr вне форума Ответить с цитированием
Старый 01.05.2011, 16:46   #10
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Код:
 // pictureBox1
            // 
            this.pictureBox1.Location = new System.Drawing.Point(426, 33);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(239, 247);
            this.pictureBox1.TabIndex = 5;
            this.pictureBox1.TabStop = false;
            this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(148, 108);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 6;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // textBox6
            // 
            this.textBox6.Location = new System.Drawing.Point(265, 33);
            this.textBox6.Name = "textBox6";
            this.textBox6.Size = new System.Drawing.Size(100, 20);
            this.textBox6.TabIndex = 7;
            // 
            // textBox7
            // 
            this.textBox7.Location = new System.Drawing.Point(265, 59);
            this.textBox7.Name = "textBox7";
            this.textBox7.Size = new System.Drawing.Size(100, 20);
            this.textBox7.TabIndex = 8;
            // 
            // textBox8
            // 
            this.textBox8.Location = new System.Drawing.Point(265, 110);
            this.textBox8.Name = "textBox8";
            this.textBox8.Size = new System.Drawing.Size(100, 20);
            this.textBox8.TabIndex = 9;
            // 
            // textBox9
            // 
            this.textBox9.Location = new System.Drawing.Point(265, 137);
            this.textBox9.Name = "textBox9";
            this.textBox9.Size = new System.Drawing.Size(100, 20);
            this.textBox9.TabIndex = 10;
            // 
            // textBox10
            // 
            this.textBox10.Location = new System.Drawing.Point(265, 168);
            this.textBox10.Name = "textBox10";
            this.textBox10.Size = new System.Drawing.Size(100, 20);
            this.textBox10.TabIndex = 11;
            // 
            // textBox11
            // 
            this.textBox11.Location = new System.Drawing.Point(265, 194);
            this.textBox11.Name = "textBox11";
            this.textBox11.Size = new System.Drawing.Size(100, 20);
            this.textBox11.TabIndex = 12;
            // 
            // textBox12
            // 
            this.textBox12.Location = new System.Drawing.Point(265, 233);
            this.textBox12.Name = "textBox12";
            this.textBox12.Size = new System.Drawing.Size(100, 20);
            this.textBox12.TabIndex = 13;
            // 
            // textBox13
            // 
            this.textBox13.Location = new System.Drawing.Point(265, 260);
            this.textBox13.Name = "textBox13";
            this.textBox13.Size = new System.Drawing.Size(100, 20);
            this.textBox13.TabIndex = 14;
            // 
            // textBox14
            // 
            this.textBox14.Location = new System.Drawing.Point(265, 301);
            this.textBox14.Name = "textBox14";
            this.textBox14.Size = new System.Drawing.Size(100, 20);
            this.textBox14.TabIndex = 15;
            // 
            // textBox15
            // 
            this.textBox15.Location = new System.Drawing.Point(265, 327);
            this.textBox15.Name = "textBox15";
            this.textBox15.Size = new System.Drawing.Size(100, 20);
            this.textBox15.TabIndex = 16;
            //
nikozavr вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Геометрические Задачки. Otar4ik C# (си шарп) 8 08.08.2014 11:15
Геометрические преобразования в OpenGL alhon Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 03.07.2010 07:07
Геометрические фигуры в С++ zfoxx Общие вопросы C/C++ 5 05.11.2009 12:09
как с помощью html рисовать геометрические фигуры 1100100011000101 HTML и CSS 3 01.05.2009 19:17
Помогите как чертить геометрические фигуры в режиме консоли в среде anvarx Помощь студентам 4 02.08.2008 14:15