You are on page 1of 10

Міністерство науки і освіти України

Звіт з лабораторної роботи №4


З дисципліни «Об'єктно-орієнтоване програмування»

Виконав:
Студент групи 122-22-3.
Трубіцин С.В.
Перевірив:
Приходченко С.Д.

м. Дніпро
2023 рік
ЛАБОРАТОРНА РОБОТА № 4

ВИВЧЕННЯ ПОЛІМОРФІЗМУ У КЛАСАХ C#

Тема роботи: Вивчення поліморфізму у класах C#

Мета роботи: навчитися створювати віртуальні методи; навчитися


перевантажувати арифметичні операції та операції порівняння;

Постановка завдання: Скласти схему алгоритму та програму мовою С#


відповідно до заданого варіанта. Налагодити та розв’язати задачу на ПК.
Варіант 19: клас 1: паралелограм; клас 2: еліпс; Операція "/", яка
знаходить частку периметрів графічних об'єктів.

Хід роботи:

Рис.1. Розробка форми.

2
Рис.2 Ініціалізація об'єктів та інші обчислювальні дії для кнопки.

Рис.3 Написання методів для форми малюнку та графічних об'єктів.

3
Рис.4 Створення класу паралелограма та реалізація методів.

Рис.5 Створення класу еліпса та реалізація методів.

4
Рис.6 Діаграма класів.
Лістинг (код) програми:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace lr4_OOP
{
public partial class Form1 : Form
{
private Parallelogram parallelogram;
private Ellipse ellipse;

public Form1()
{
InitializeComponent();
// Ініціалізуємо об'єкти паралелограма та еліпса
parallelogram = new Parallelogram("Паралелограм", 60, 30, 45);
ellipse = new Ellipse("Еліпс", 80, 40);
}

private void Form1_Load(object sender, EventArgs e)


{

private void buttonCalculate_Click(object sender, EventArgs e)


{
// Отримуємо значення сторін паралелограма та еліпса з текстових полів
int side1Parallelogram = int.Parse(textBoxSide1Parallelogram.Text);
int side2Parallelogram = int.Parse(textBoxSide2Parallelogram.Text);
int majorAxisEllipse = int.Parse(textBoxMajorAxisEllipse.Text);
int minorAxisEllipse = int.Parse(textBoxMinorAxisEllipse.Text);

// Оновлюємо об'єкти з новими значеннями


parallelogram = new Parallelogram("Паралелограм", side1Parallelogram, side2Parallelogram, 45);
ellipse = new Ellipse("Еліпс", majorAxisEllipse, minorAxisEllipse);

// Перемальовуємо полотно
5
pictureBox1.Invalidate();

// Обчислюємо та виводимо суму та частку периметрів об'єктів


double perimeterSum = parallelogram.GetPerimeter() + ellipse.GetPerimeter();
double perimeterDivision = parallelogram / ellipse; // Операція ділення

labelResult.Text = $"Частка периметрів: {perimeterDivision}";

MessageBox.Show(parallelogram.Show());
MessageBox.Show(ellipse.Show());
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)


{
Graphics g = e.Graphics;

// Малюємо об'єкти на полотні (pictureBox)


parallelogram.Draw(g);
ellipse.Draw(g);
}
}

abstract class CGraphicsObject


{
public string ObjectName { get; set; }

// Абстрактний метод для отримання периметру


public abstract double GetPerimeter();

// Абстрактний метод для малювання об'єкта на полотні


public abstract void Draw(Graphics g);

// Абстрактний метод для отримання назви класу об'єкта


public abstract string GetClassName();

// Абстрактний метод для отримання інформації про об'єкт


public abstract string Show();

// Перевантажена операція додавання для обчислення суми периметрів


public static double operator +(CGraphicsObject a, CGraphicsObject b)
{
return a.GetPerimeter() + b.GetPerimeter();
}

// Перевантажена операція ділення для обчислення частки периметрів


public static double operator /(CGraphicsObject a, CGraphicsObject b)
{
return a.GetPerimeter() / b.GetPerimeter();
}
}

class Parallelogram : CGraphicsObject


{
public int Side1 { get; set; }
public int Side2 { get; set; }
public int Angle { get; set; }

public Parallelogram(string name, int side1, int side2, int angle)


{
ObjectName = name;
Side1 = side1;
Side2 = side2;
Angle = angle;
}

6
// Реалізація методу для обчислення периметру паралелограма
public override double GetPerimeter()
{
return 2 * (Side1 + Side2);
}

// Реалізація методу для малювання паралелограма


public override void Draw(Graphics g)
{
int x = 200;
int y = 200;

Point[] points = new Point[4];


points[0] = new Point(x, y);
points[1] = new Point(x + Side1, y);
points[2] = new Point(x + Side1 + (int)(Side2 * Math.Cos(Math.PI * Angle / 180)), y + (int)(Side2 *
Math.Sin(Math.PI * Angle / 180)));
points[3] = new Point(x + (int)(Side2 * Math.Cos(Math.PI * Angle / 180)), y + (int)(Side2 * Math.Sin(Math.PI *
Angle / 180)));

g.DrawPolygon(Pens.Green, points);
}

// Реалізація методу для отримання назви класу об'єкта


public override string GetClassName()
{
return "Parallelogram";
}

// Реалізація методу для виводу інформації про об'єкт


public override string Show()
{
return $"Object: {ObjectName}\nClass: {GetClassName()}\nPerimeter: {GetPerimeter()}";
}
}

class Ellipse : CGraphicsObject


{
public int MajorAxis { get; set; }
public int MinorAxis { get; set; }

public Ellipse(string name, int major, int minor)


{
ObjectName = name;
MajorAxis = major;
MinorAxis = minor;
}

// Реалізація методу для обчислення периметру еліпса


public override double GetPerimeter()
{
return 2 * Math.PI * Math.Sqrt((Math.Pow(MajorAxis, 2) + Math.Pow(MinorAxis, 2)) / 2);
}

// Реалізація методу для малювання еліпса


public override void Draw(Graphics g)
{
int x = 100;
int y = 100;

g.DrawEllipse(Pens.Blue, x, y, 2 * MajorAxis, 2 * MinorAxis);


}

// Реалізація методу для отримання назви класу об'єкта


public override string GetClassName()

7
{
return "Ellipse";
}

// Реалізація методу для виводу інформації про об'єкт


public override string Show()
{
return $"Object: {ObjectName}\nClass: {GetClassName()}\nPerimeter: {GetPerimeter()}";
}
}
}

Результати розрахунку задачі:

Рис.7 Базовий вигляд форми

8
Рис.8 Завдання значень для об’єктів.

Рис. 9 Результат вимірів програми при 4 та 2 для паралелограму та 7 та 9 для


еліпсу.

9
Рис.10 Загальний результат після роботи програми.

Висновки: У результаті виконання лабораторної роботи з мови програмування


C#, була створена ієрархія класів для роботи з графічними об'єктами,
включаючи абстрактний клас CGraphicsObject та його спадкоємці Paralellogram
і Ellipse. Кожен клас містив конструктори, деструктори, методи доступу до
полів, а також метод Show, який виводив інформацію про об'єкти та їх предків.
Оператор «/» був перевантажений для знаходження частки периметрів
графічних об'єктів. Класи були відображені на формі Windows за допомогою
Windows Forms.

10

You might also like