Files
oop/labs/lab1_done/report.typ
2025-09-30 08:21:09 +03:00

233 lines
10 KiB
Typst
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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