233 lines
10 KiB
Typst
233 lines
10 KiB
Typst
#set text(size: 1.3em)
|
||
|
||
// title
|
||
|
||
#align(center)[Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики]
|
||
\
|
||
\
|
||
\
|
||
#align(center)[Факультет инфокоммуникационных технологий]
|
||
#align(center)[Направление подготовки 11.03.02]
|
||
\
|
||
\
|
||
#align(center)[Лабораторная работа №1]
|
||
#align(center)[Создание программы с помощью среды разработки VisualStudio.NET]
|
||
\
|
||
\
|
||
\ //#align(center)[Вариант 19]
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
\
|
||
#align(right)[Выполнил:]
|
||
#align(right)[Дощенников Никита Андреевич]
|
||
#align(right)[Группа: К3221]
|
||
#align(right)[Проверил:]
|
||
#align(right)[Иванов Сергей Евгеньевич]
|
||
\
|
||
\
|
||
#align(center)[Санкт-Петербург]
|
||
#align(center)[2025]
|
||
|
||
#pagebreak()
|
||
|
||
=== Цель работы:
|
||
|
||
- Ознакомиться с основами языка программирования C\# и .NET.
|
||
- Научиться создавать и запускать консольные приложения.
|
||
- Получить навыки отладки программ.
|
||
- Освоить базовые операции ввода/вывода и обработку исключений.
|
||
- Реализовать простые задачи в виде консольных программ.
|
||
|
||
=== Задачи:
|
||
|
||
- Реализовать программу «Hello, Name», которая считывает имя пользователя и выводит приветствие.
|
||
- Создать проект в среде разработки (или с помощью .NET CLI) и реализовать аналогичную программу Greeter.
|
||
- Провести отладку программы с использованием точек останова и просмотра переменных.
|
||
- Написать программу Divider, которая выполняет деление целых чисел с обработкой исключений.
|
||
- Реализовать программу вычисления площади равностороннего треугольника по заданному периметру.
|
||
|
||
=== Теория:
|
||
|
||
- Язык C\# является объектно-ориентированным языком, работающим в рамках платформы .NET.
|
||
- Консольные приложения содержат метод Main(), являющийся точкой входа программы.
|
||
- Для работы с консолью используются методы Console.WriteLine() и Console.ReadLine().
|
||
- Обработка ошибок выполняется с помощью конструкции try-catch.
|
||
- Для вычисления площади равностороннего треугольника можно использовать формулу Герона:
|
||
|
||
$
|
||
S = sqrt(p(p - a)(p - b)(p - c)), space.quad p = P/2
|
||
$
|
||
|
||
где $P$ - периметр треугольника.
|
||
|
||
=== Практическая часть.
|
||
|
||
==== Hello, Name
|
||
|
||
```csharp
|
||
using System;
|
||
|
||
class Program
|
||
{
|
||
static void Main()
|
||
{
|
||
string myName;
|
||
Console.WriteLine("enter your name");
|
||
myName = Console.ReadLine();
|
||
Console.WriteLine("hello, {0}", myName);
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
|
||
|
||
Пример работы:
|
||
|
||
#align(center)[#image("assets/1.png")]
|
||
|
||
=== Debug:
|
||
|
||
==== Ход выполнения:
|
||
|
||
- В JetBrains Rider был создан новый проект типа Console Application.
|
||
|
||
- В файл Program.cs добавлен код программы.
|
||
|
||
- Программа была запущена через встроенный терминал IDE.
|
||
|
||
- Для проверки корректности работы была введена строка с именем. Программа вывела корректное приветствие.
|
||
|
||
- Для изучения процесса отладки были установлены точки останова (breakpoints) на строках ввода и вывода.
|
||
|
||
- С помощью пошагового выполнения (Step Over/Step Into) наблюдалось изменение значения переменной myName.
|
||
|
||
- В окне Debug и панели Variables было подтверждено, что введённое значение корректно сохраняется в переменной.
|
||
|
||
Пример:
|
||
|
||
#align(center)[#image("assets/6.png")]
|
||
#align(center)[#image("assets/7.png")]
|
||
#align(center)[#image("assets/8.png")]
|
||
#align(center)[#image("assets/9.png")]
|
||
#align(center)[#image("assets/10.png")]
|
||
|
||
|
||
==== Divider
|
||
|
||
```
|
||
using System;
|
||
|
||
class DivideIt
|
||
{
|
||
public static void Main(string[] args)
|
||
{
|
||
try
|
||
{
|
||
Console.WriteLine("enter the first integer");
|
||
string temp = Console.ReadLine();
|
||
int i = Int32.Parse(temp);
|
||
Console.WriteLine("enter the second integer");
|
||
temp = Console.ReadLine();
|
||
int j = Int32.Parse(temp);
|
||
int k = i / j;
|
||
Console.WriteLine("{0} / {1} = {2}", i, j, k);
|
||
}
|
||
catch (FormatException e)
|
||
{
|
||
Console.WriteLine("format exception was thrown: {0}", e.Message);
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
Console.WriteLine("exception was thrown: {0}", e.Message);
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
Пример:
|
||
|
||
#align(center)[#image("assets/2.png")]
|
||
#align(center)[#image("assets/3.png")]
|
||
#align(center)[#image("assets/4.png")]
|
||
|
||
==== TriangleArea
|
||
|
||
```csharp
|
||
using System;
|
||
using System.Globalization;
|
||
|
||
class TriangleArea
|
||
{
|
||
static void Main()
|
||
{
|
||
Console.WriteLine("perimeter");
|
||
double p = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
|
||
double a = p / 3.0;
|
||
double s = Math.Sqrt((1.5 * a) * (0.5 * a) * (0.5 * a) * (0.5 * a));
|
||
Console.WriteLine("side \tarea");
|
||
Console.WriteLine("{0}\t{1}", a.ToString("F2", CultureInfo.InvariantCulture), s.ToString("F2", CultureInfo.InvariantCulture));
|
||
}
|
||
}
|
||
```
|
||
|
||
Пример:
|
||
|
||
#align(center)[#image("assets/5.png")]
|
||
|
||
=== Выводы:
|
||
|
||
В ходе выполнения лабораторной работы:
|
||
|
||
- Освоены основы работы с консольными приложениями на C\#.
|
||
- Получены навыки ввода/вывода данных, обработки исключений.
|
||
- Реализованы несколько программ, решающие простые задачи.
|
||
- Освоены базовые приёмы отладки приложений.
|
||
|
||
=== Code review:
|
||
|
||
|
||
*Резюме*
|
||
|
||
В данном коде представлены три класса: DivideIt, Greeter и TriangleArea. Каждый из них выполняет свою задачу, однако в коде есть несколько моментов, которые можно улучшить для повышения его качества и надежности.
|
||
|
||
*Ошибка*
|
||
|
||
В классе DivideIt отсутствует обработка деления на ноль, что может привести к исключению DivideByZeroException. Рекомендуется добавить проверку перед выполнением деления.
|
||
|
||
*Стиль кода*
|
||
|
||
Код в целом написан в соответствии с общепринятыми стандартами C\#. Однако, для улучшения читаемости, стоит использовать более понятные сообщения для пользователя. Например, вместо "enter the first integer" можно использовать "Введите первое целое число".
|
||
|
||
*Структура кода*
|
||
|
||
Каждый класс имеет свою собственную функцию Main, что является хорошей практикой. Однако, стоит рассмотреть возможность вынесения логики в отдельные методы для повышения модульности и повторного использования кода.
|
||
|
||
*Читаемость*
|
||
|
||
Читаемость кода можно улучшить, добавив комментарии, объясняющие логику работы программы. Это поможет другим разработчикам быстрее понять, что делает код.
|
||
|
||
*Производительность*
|
||
|
||
Код не содержит явных проблем с производительностью, однако, использование Int32.Parse и double.Parse без предварительной проверки входных данных может привести к исключениям, что негативно скажется на производительности в случае частых ошибок ввода.
|
||
|
||
*Масштабируемость*
|
||
|
||
Код не очень масштабируемый, так как каждая программа выполняет только одну задачу. Для более сложных приложений стоит рассмотреть использование классов и методов для разделения логики.
|
||
|
||
*Безопасность*
|
||
|
||
Обработка исключений в коде присутствует, но стоит добавить более специфическую обработку для DivideByZeroException в классе DivideIt. Это поможет избежать потенциальных проблем при делении на ноль.
|
||
|
||
*Обработка ошибок*
|
||
|
||
Обработка ошибок реализована, но стоит улучшить сообщения об ошибках, чтобы они были более информативными. Например, можно указать, что именно было введено неверно.
|
||
|
||
*Заключение*
|
||
|
||
В целом, код выполняет свои функции, но требует доработки для повышения надежности, читаемости и масштабируемости. Рекомендуется внести предложенные изменения, чтобы улучшить качество кода и сделать его более устойчивым к ошибкам.
|