288 lines
11 KiB
Typst
288 lines
11 KiB
Typst
#set text(size: 1.3em)
|
||
|
||
#show raw.where(block: false): box.with(
|
||
fill: luma(240),
|
||
inset: (x: 3pt, y: 0pt),
|
||
outset: (y: 3pt),
|
||
radius: 2pt,
|
||
)
|
||
|
||
#show raw.where(block: true): block.with(
|
||
fill: luma(240),
|
||
inset: 10pt,
|
||
radius: 4pt,
|
||
)
|
||
|
||
// title
|
||
|
||
#align(center)[Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики]
|
||
\
|
||
\
|
||
\
|
||
#align(center)[Факультет инфокоммуникационных технологий]
|
||
#align(center)[Направление подготовки 11.03.02]
|
||
\
|
||
\
|
||
#align(center)[Лабораторная работа №6]
|
||
#align(center)[Создание и использование классов]
|
||
\
|
||
\
|
||
\ //#align(center)[Вариант 19]
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
#align(right)[Выполнил:]
|
||
#align(right)[Дощенников Никита Андреевич]
|
||
#align(right)[Группа: К3221]
|
||
#align(right)[Проверил:]
|
||
#align(right)[Иванов Сергей Евгеньевич]
|
||
\
|
||
\
|
||
#align(center)[Санкт-Петербург]
|
||
#align(center)[2025]
|
||
|
||
#pagebreak()
|
||
|
||
=== Цель работы:
|
||
|
||
Изучить понятия класса как пользовательского типа данных и приобрести навыки работы с классами.
|
||
|
||
=== Упражнение 1. Разработка класса Book.
|
||
|
||
В этом упражнении я создал класс `Book` c полями автор, название, год издания и стоимость аренды за книгу, а также методами.
|
||
|
||
```cs
|
||
using System;
|
||
|
||
class Book
|
||
{
|
||
private String author;
|
||
private String title;
|
||
private String publisher;
|
||
private int pages;
|
||
private int year;
|
||
|
||
private static double price = 9;
|
||
|
||
static Book()
|
||
{
|
||
price = 10;
|
||
}
|
||
|
||
public Book()
|
||
{
|
||
|
||
}
|
||
|
||
|
||
public Book(String author, String title, String publisher, int pages, int year)
|
||
{
|
||
this.author = author;
|
||
this.title = title;
|
||
this.publisher = publisher;
|
||
this.pages = pages;
|
||
this.year = year;
|
||
}
|
||
|
||
public Book(String author, String title)
|
||
{
|
||
this.author = author;
|
||
this.title = title;
|
||
}
|
||
|
||
public void SetBook(String author, String title, String publisher, int pages, int year)
|
||
{
|
||
this.author = author;
|
||
this.title = title;
|
||
this.publisher = publisher;
|
||
this.pages = pages;
|
||
this.year = year;
|
||
}
|
||
|
||
public static void SetPrice(double price)
|
||
{
|
||
Book.price = price;
|
||
}
|
||
|
||
public void Show()
|
||
{
|
||
Console.WriteLine("\nКнига:\n Автор: {0}\n Название: {1}\n Год издания: {2}\n {3} стр.\n Стоимость аренды: {4}", author, title, year, pages, Book.price);
|
||
}
|
||
|
||
public double PriceBook(int s)
|
||
{
|
||
double cost = s * price;
|
||
return cost;
|
||
}
|
||
|
||
}
|
||
```
|
||
|
||
Тесты:
|
||
|
||
```cs
|
||
public static void Main(string[] args)
|
||
{
|
||
Book b1 = new Book();
|
||
b1.SetBook("Пушкин А.С.", "Капитанская дочка", "Вильямс", 123, 2012);
|
||
Book.SetPrice(12);
|
||
b1.Show();
|
||
Console.WriteLine("\n Итоговая стоимость аренды: {0} р.", b1.PriceBook(3));
|
||
}
|
||
```
|
||
|
||
Пример:
|
||
|
||
#align(center)[#image("assets/1.png")]
|
||
|
||
=== Упражнение 2. Использование конструкторов.
|
||
|
||
В этом упражнении я добавил конструктор для инициализации объекта.
|
||
|
||
Тесты:
|
||
|
||
```cs
|
||
public static void Main(string[] args)
|
||
{
|
||
Book b1 = new Book();
|
||
b1.SetBook("Пушкин А.С.", "Капитанская дочка", "Вильямс", 123, 2012);
|
||
Book.SetPrice(12);
|
||
b1.Show();
|
||
Console.WriteLine("\n Итоговая стоимость аренды: {0} р.", b1.PriceBook(3));
|
||
|
||
Book b2 = new Book("Толстой Л.Н.", "Война и мир", "Наука и жизнь", 1234, 2013);
|
||
b2.Show();
|
||
|
||
Book b3 = new Book("Лермонтов М.Ю.", "Мцыри");
|
||
b3.Show();
|
||
}
|
||
```
|
||
|
||
Примеры:
|
||
|
||
#align(center)[#image("assets/2.png")]
|
||
|
||
=== Упражнение 3. Реализация класса Triangle.
|
||
|
||
В этом упражнении я создал класс Triangle и разработал следующие элементы класса:
|
||
|
||
- Поля: стороны треугольника.
|
||
- Конструктор, позволяющий создать экземпляр класса с заданными длинами сторон.
|
||
- Методы, позволяющие вывести длины сторон треугольника на экран, расчитать периметр треугольника, расчитать площадь треугольника, реализовать проверку, позволяющую установить, существует ли треугольник с данными длинами сторон.
|
||
|
||
```cs
|
||
using System;
|
||
|
||
class Triangle
|
||
{
|
||
private int a;
|
||
private int b;
|
||
private int c;
|
||
|
||
public Triangle(int a, int b, int c)
|
||
{
|
||
this.a = a;
|
||
this.b = b;
|
||
this.c = c;
|
||
}
|
||
|
||
public void Show()
|
||
{
|
||
Console.WriteLine("a: {0}\nb: {1}\nc: {2}", a, b, c);
|
||
}
|
||
|
||
public int Perimeter()
|
||
{
|
||
return a + b + c;
|
||
}
|
||
|
||
public double Area()
|
||
{
|
||
double p = Perimeter() / 2;
|
||
return Math.Sqrt(p * (p - a) * (p - b) * (p - c));
|
||
}
|
||
|
||
public bool Exists()
|
||
{
|
||
if (a <= 0 || b <= 0 || c <= 0) return false;
|
||
|
||
double maxSide = Math.Max(Math.Max(a, b), Math.Max(b, c));
|
||
|
||
if (maxSide >= a + b + c - maxSide) return false;
|
||
|
||
return true;
|
||
}
|
||
}
|
||
```
|
||
|
||
Тесты:
|
||
|
||
```cs
|
||
public static void Main(string[] args)
|
||
{
|
||
Triangle t1 = new Triangle(3, 4, 5);
|
||
t1.Show();
|
||
Console.WriteLine("perimeter = {0}", t1.Perimeter());
|
||
Console.WriteLine("area = {0}", t1.Area());
|
||
Console.WriteLine("does this triangle exist? {0}", t1.Exists());
|
||
|
||
Triangle t2 = new Triangle(3, 4, 7);
|
||
t2.Show();
|
||
Console.WriteLine("does this triangle exist? {0}", t2.Exists());
|
||
}
|
||
```
|
||
|
||
Пример:
|
||
|
||
#align(center)[#image("assets/3.png")]
|
||
|
||
=== Выводы.
|
||
|
||
В ходе проделанной работы я изучил понятия класса как пользовательского типа данных и приобрел навыки работы с классами.
|
||
|
||
=== Code review. (by #link("https://zzzcode.ai")[zzzcode.ai])
|
||
|
||
*Резюме*
|
||
|
||
Код, представленный выше, реализует два класса: `Book` и `Triangle`. Класс `Book` управляет информацией о книгах, включая автора, название, издателя, количество страниц и год издания. Класс `Triangle` отвечает за свойства треугольника, такие как стороны, периметр и площадь. В целом, код демонстрирует базовые принципы объектно-ориентированного программирования, но требует улучшений в области стиля, структуры и обработки ошибок.
|
||
|
||
*Ошибка*
|
||
|
||
В классе `Book` метод `SetBook` не проверяет входные параметры на корректность. Например, количество страниц и год издания могут быть отрицательными значениями. Это может привести к некорректным данным. Рекомендуется добавить валидацию входных данных.
|
||
|
||
*Стиль кода*
|
||
|
||
Код написан в целом в соответствии с общепринятыми стандартами C\#. Однако, использование типа `String` вместо `string` не является стандартным стилем C\#. Рекомендуется использовать `string` для повышения читаемости и соответствия стилю C\#.
|
||
|
||
*Структура кода*
|
||
|
||
Структура классов в целом логична, но методы и свойства можно было бы организовать более последовательно. Например, методы, связанные с установкой и получением значений, можно сгруппировать вместе. Это улучшит читаемость и упростит навигацию по коду.
|
||
|
||
*Читаемость*
|
||
|
||
Читаемость кода можно улучшить, добавив комментарии к методам и классам, чтобы объяснить их назначение. Также стоит использовать более описательные имена переменных и методов, чтобы сделать код более самодокументируемым.
|
||
|
||
*Производительность*
|
||
|
||
Код не содержит явных проблем с производительностью, однако использование статического поля `price` может быть улучшено. Если цена книги должна быть уникальной для каждого экземпляра, лучше сделать это полем экземпляра.
|
||
|
||
*Масштабируемость*
|
||
|
||
Код может быть сложно масштабировать из-за жесткой привязки к конкретным полям и методам. Рекомендуется рассмотреть возможность использования интерфейсов или абстрактных классов для улучшения гибкости и расширяемости.
|
||
|
||
*Безопасность*
|
||
|
||
Код не содержит явных уязвимостей, однако отсутствие валидации входных данных может привести к проблемам. Рекомендуется добавить проверки на корректность данных, чтобы избежать потенциальных ошибок.
|
||
|
||
*Обработка ошибок*
|
||
|
||
Обработка ошибок в коде отсутствует. Рекомендуется использовать исключения для обработки некорректных данных и других возможных ошибок, чтобы обеспечить более надежное выполнение программы.
|
||
|
||
*Заключение*
|
||
|
||
Код представляет собой хорошую основу для работы с книгами и треугольниками, но требует улучшений в области стиля, структуры и обработки ошибок. Внедрение предложенных изменений повысит качество кода и упростит его поддержку в будущем.
|