#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. Это поможет избежать потенциальных проблем при делении на ноль. *Обработка ошибок* Обработка ошибок реализована, но стоит улучшить сообщения об ошибках, чтобы они были более информативными. Например, можно указать, что именно было введено неверно. *Заключение* В целом, код выполняет свои функции, но требует доработки для повышения надежности, читаемости и масштабируемости. Рекомендуется внести предложенные изменения, чтобы улучшить качество кода и сделать его более устойчивым к ошибкам.