#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. Это поможет избежать потенциальных проблем при делении на ноль.

*Обработка ошибок*

Обработка ошибок реализована, но стоит улучшить сообщения об ошибках, чтобы они были более информативными. Например, можно указать, что именно было введено неверно.

*Заключение*

В целом, код выполняет свои функции, но требует доработки для повышения надежности, читаемости и масштабируемости. Рекомендуется внести предложенные изменения, чтобы улучшить качество кода и сделать его более устойчивым к ошибкам.
