220 lines
9.2 KiB
Typst
220 lines
9.2 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)[Лабораторная работа №2]
|
||
#align(center)[Создание и использование размерных типов данных]
|
||
\
|
||
\
|
||
\ //#align(center)[Вариант 19]
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
#align(right)[Выполнил:]
|
||
#align(right)[Дощенников Никита Андреевич]
|
||
#align(right)[Группа: К3221]
|
||
#align(right)[Проверил:]
|
||
#align(right)[Иванов Сергей Евгеньевич]
|
||
\
|
||
\
|
||
#align(center)[Санкт-Петербург]
|
||
#align(center)[2025]
|
||
|
||
#pagebreak()
|
||
|
||
=== Цель работы:
|
||
|
||
Изучить размерные типы данных и приобрести навыки работы со структурными типами.
|
||
|
||
=== Упражнение 1. Создание перечисления.
|
||
|
||
Я создал перечисление для представления различных типов банковских счетов и использовал его для создания двух переменных, которым присвоил значения `Checking` и `Deposit`. Затем я вывел значения этих переменных при помощи функции `Console.WriteLine()`.
|
||
|
||
```cs
|
||
using System;
|
||
|
||
public enum AccountType { Checking, Deposit }
|
||
|
||
public class Enum
|
||
{
|
||
public static void Main(string[] args)
|
||
{
|
||
AccountType goldAccount;
|
||
AccountType platinumAccount;
|
||
|
||
goldAccount = AccountType.Checking;
|
||
platinumAccount = AccountType.Deposit;
|
||
|
||
Console.WriteLine("The Customer Account Type is {0}", goldAccount);
|
||
Console.WriteLine("The Customer Account Type is {0}", platinumAccount);
|
||
}
|
||
}
|
||
```
|
||
|
||
Пример работы:
|
||
|
||
#align(center)[#image("assets/1.png")]
|
||
|
||
=== Упражнение 2. Создание и использование структуры.
|
||
|
||
Я создал структуру, которую можно использовать для представления банковских счетов. Для хранения номеров счетов (`long`), балансов счетов (`decimal`) и типов счетов (`AccountType`). Затем создал переменную типа структуры, заполнил ее данными и вывел результаты на консоль.
|
||
|
||
```cs
|
||
using System;
|
||
|
||
public enum AccountType { Checking, Deposit }
|
||
|
||
public struct BankAccount
|
||
{
|
||
public long accNo;
|
||
public decimal accBal;
|
||
public AccountType accType;
|
||
}
|
||
|
||
public class Struct
|
||
{
|
||
public static void Main(string[] args)
|
||
{
|
||
BankAccount goldAccount;
|
||
|
||
|
||
goldAccount.accType = AccountType.Checking;
|
||
goldAccount.accBal = (decimal)3200.00;
|
||
Console.Write("Enter account number: ");
|
||
goldAccount.accNo = long.Parse(Console.ReadLine());
|
||
|
||
Console.WriteLine("*** Account Summary ***");
|
||
Console.WriteLine("Acct Number {0}", goldAccount.accNo);
|
||
Console.WriteLine("Acct Type {0}", goldAccount.accType);
|
||
Console.WriteLine("Acct Balance ${0}", goldAccount.accBal);
|
||
}
|
||
}
|
||
```
|
||
|
||
Пример работы:
|
||
|
||
#align(center)[#image("assets/2.png")]
|
||
|
||
=== Упражнение 3. Реализация структуры Distance.
|
||
|
||
Создал структуру Distance, определяющую длину в английской системе мер.
|
||
|
||
```cs
|
||
using System;
|
||
|
||
struct Distance
|
||
{
|
||
public int feet;
|
||
public int inches;
|
||
|
||
public void Print()
|
||
{
|
||
Console.WriteLine("{0}' - {1}''", feet, inches);
|
||
}
|
||
}
|
||
|
||
public class Program
|
||
{
|
||
public static void Main(string[] args)
|
||
{
|
||
Distance d1, d2, d3;
|
||
|
||
Console.Write("Input the first distance (feet): ");
|
||
d1.feet = int.Parse(Console.ReadLine());
|
||
Console.Write("Input the first distance (inches): ");
|
||
d1.inches = int.Parse(Console.ReadLine());
|
||
|
||
Console.Write("Input the second distance (feet): ");
|
||
d2.feet = int.Parse(Console.ReadLine());
|
||
Console.Write("Input the second distance (inches): ");
|
||
d2.inches = int.Parse(Console.ReadLine());
|
||
|
||
d3.feet = d1.feet + d2.feet;
|
||
d3.inches = d1.inches + d2.inches;
|
||
|
||
d3.feet += d3.inches % 12;
|
||
d3.inches = d3.inches / 12;
|
||
|
||
d3.Print();
|
||
|
||
}
|
||
}
|
||
```
|
||
|
||
Пример работы:
|
||
|
||
#align(center)[#image("assets/3.png")]
|
||
|
||
=== Выводы.
|
||
|
||
В ходе выполнения лабораторной работе я изучил размерные типы данных и приобрел навыки работы со структурными типами.
|
||
|
||
=== Code Review. (by #link("https://zzzcode.ai/")[zzzcode.ai])
|
||
|
||
*Резюме*
|
||
|
||
Код, представленный выше, демонстрирует использование перечислений, структур и базовых операций ввода-вывода в C\#. Однако, он содержит несколько недостатков, которые могут повлиять на его читаемость, производительность и безопасность.
|
||
|
||
*Ошибка*
|
||
|
||
В коде есть несколько потенциальных ошибок, связанных с обработкой ввода. Например, если пользователь введет некорректные данные (нечисловые значения), программа вызовет исключение. Рекомендуется использовать `TryParse` для безопасного парсинга.
|
||
|
||
*Стиль кода*
|
||
|
||
Стиль кода в целом соответствует стандартам C\#. Однако, использование имен классов Enum и Struct не является удачным, так как они могут вызвать путаницу с встроенными типами. Рекомендуется использовать более описательные имена, такие как `AccountEnum` и `BankAccountStruct`.
|
||
|
||
*Структура кода*
|
||
|
||
Код разбит на три отдельных класса, что хорошо для организации, но может быть улучшено. Например, можно объединить функциональность в один класс с методами, чтобы избежать дублирования кода.
|
||
|
||
*Читаемость*
|
||
|
||
Читаемость кода можно улучшить, добавив комментарии и более четкие имена переменных. Например, вместо `d1`, `d2`, `d3` можно использовать `firstDistance`, `secondDistance`, `resultDistance`.
|
||
|
||
*Производительность*
|
||
|
||
Производительность кода не вызывает серьезных проблем, однако, использование `Console.ReadLine()` в цикле может быть оптимизировано, если ввод данных будет обрабатываться в одном методе.
|
||
|
||
*Масштабируемость*
|
||
|
||
Код не очень масштабируемый, так как добавление новых типов счетов или новых единиц измерения потребует значительных изменений. Рекомендуется использовать более гибкие структуры данных, такие как классы или коллекции.
|
||
|
||
*Безопасность*
|
||
|
||
Безопасность кода может быть улучшена путем добавления обработки исключений и проверки ввода. Это поможет избежать сбоев программы при некорректном вводе данных.
|
||
|
||
*Обработка ошибок*
|
||
|
||
Обработка ошибок в текущем коде отсутствует. Рекомендуется добавить блоки *try-catch* для обработки возможных исключений, особенно при работе с вводом пользователя.
|
||
|
||
*Заключение*
|
||
|
||
Код демонстрирует базовые концепции C\#, но требует доработки для повышения его надежности, читаемости и безопасности. Рекомендуется внести изменения, чтобы улучшить структуру и обработку ошибок, а также использовать более описательные имена для классов и переменных.
|
||
|
||
|