This commit is contained in:
nik
2025-09-30 14:26:54 +03:00
parent 8bd93df2ae
commit 8164e04835
633 changed files with 8 additions and 8 deletions

309
labs/lab5_done/report.typ Normal file
View File

@@ -0,0 +1,309 @@
#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)[Лабораторная работа №5]
#align(center)[Создание и использование массив]
\
\
\ //#align(center)[Вариант 19]
\
\
\
\
\
\
\
#align(right)[Выполнил:]
#align(right)[Дощенников Никита Андреевич]
#align(right)[Группа: К3221]
#align(right)[Проверил:]
#align(right)[Иванов Сергей Евгеньевич]
\
\
#align(center)[Санкт-Петербург]
#align(center)[2025]
#pagebreak()
=== Цель работы:
Изучить массивы и приобрести навыки работы с ними.
=== Упражнение 1. Работа с массивом размерного типа данных.
В этом упражнении в проекте `Loop` (из третьей лабораторной) я реализовал массив для хранения данных.
```cs
public static void Main(string[] args)
{
int[] myArray = {100, 1, 32, 3, 14, 25, 6, 17, 8, 99};
int n = 10;
for (int i = 0; i < n; i++)
{
if (myArray[i] % 2 == 0) myArray[i] = 0;
Console.Write(myArray[i] + " ");
}
}
```
Примеры:
#align(center)[#image("assets/1.png")]
```cs
public static void Main(string[] args)
{
int[] myArray;
Console.WriteLine("input an amount of elements: ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("input elements one by one: ");
myArray = new int[n];
for (int i = 0; i < myArray.Length; ++i)
{
Console.Write("a[{0}] = ", i);
myArray[i] = int.Parse(Console.ReadLine());
}
foreach (int x in myArray) Console.Write("{0} ", x);
}
```
#align(center)[#image("assets/2.png")]
=== Упражнение 2. Перемножение матриц.
В этом упражнении я написал программу перемножения матриц 2 на 2.
```cs
using System;
public class Program
{
public static void Main(string[] args)
{
int[,] m1 = new int[2, 2];
int[,] m2 = new int[2, 2];
fillQuadraticMatrix(ref m1, 2);
fillQuadraticMatrix(ref m2, 2);
int[,] res = multiplyQuadraticMatrix(m1, m2, 2);
printQuadraticMatrix(res, 2);
}
static void fillQuadraticMatrix(ref int[,] m, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write("m[{0}][{1}] = ", i, j);
m[i, j] = int.Parse(Console.ReadLine());
}
}
}
static void printQuadraticMatrix(int[,] m, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(m[i, j] + " ");
}
Console.Write("\n");
}
}
static int[,] multiplyQuadraticMatrix(int[,] m1, int[,] m2, int n)
{
int[,] res = new int[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
res[i, j] += m1[i, k] * m2[k, j];
}
}
}
return res;
}
}
```
Тесты:
#align(center)[#image("assets/3.png")]
=== Упражнение 3. Обработка данных массива.
В этом упражнении я написал программу, которая заполняет массив элементами пользователя и выполняет обработку данных, а именно определяет сумму всех элементов массива, среднего значения массива, расчет суммы отрицательных или положительных элементов, расчет суммы элементов с нечетными или четными номерами, находит максимальный или минимальный элемент массива и вывести их индексы, расчитать произведение элементов массива, расположенных между максимальным и минимальным элементами.
```cs
using System;
public class Program
{
static int SumPos(int[] a)
{
int r = 0;
foreach (int x in a) if (x > 0) r += x;
return r;
}
static int SumNeg(int[] a)
{
int r = 0;
foreach (int x in a) if (x < 0) r += x;
return r;
}
static int SumArr(int[] a) => SumPos(a) + SumNeg(a);
static double AvgArr(int[] a) => a.Length == 0 ? double.NaN : (double)SumArr(a) / a.Length;
static int SumEvenPos(int[] a)
{
int r = 0;
for (int i = 0; i < a.Length; i += 2) r += a[i];
return r;
}
static int SumOddPos(int[] a)
{
int r = 0;
for (int i = 1; i < a.Length; i += 2) r += a[i];
return r;
}
static int MaxIdx(int[] a)
{
if (a.Length == 0) return -1;
int idx = 0, m = a[0];
for (int i = 1; i < a.Length; i++)
if (a[i] > m) { m = a[i]; idx = i; }
return idx;
}
static int MinIdx(int[] a)
{
if (a.Length == 0) return -1;
int idx = 0, m = a[0];
for (int i = 1; i < a.Length; i++)
if (a[i] < m) { m = a[i]; idx = i; }
return idx;
}
static int ProductBetweenMinMax(int[] a)
{
int start = MinIdx(a), end = MaxIdx(a);
if (start == -1 || end == -1) return -1;
if (start > end) { int t = start; start = end; end = t; }
if (end - start <= 1) return -1;
int r = 1;
for (int i = start + 1; i < end; i++) r *= a[i];
return r;
}
public static void Main(string[] args)
{
Console.Write("input an arr length: ");
int n = int.Parse(Console.ReadLine());
int[] arr = new int[n];
for (int i = 0; i < arr.Length; i++)
{
Console.Write("arr[{0}] = ", i);
arr[i] = int.Parse(Console.ReadLine());
}
Console.WriteLine("sum of the array's elements is {0}", SumArr(arr));
Console.WriteLine("avg value of the array is {0}", AvgArr(arr));
Console.WriteLine("sum of positive array values is {0}, sum of negative array values is {1}", SumPos(arr), SumNeg(arr));
Console.WriteLine("sum of elements on even positions is {0}, sum of elements on odd positions is {1}", SumEvenPos(arr), SumOddPos(arr));
Console.WriteLine("index of max array element is {0}", MaxIdx(arr));
Console.WriteLine("index of min array element is {0}", MinIdx(arr));
Console.WriteLine("product of numbers between min and max is {0}", ProductBetweenMinMax(arr));
}
}
```
Тесты:
#align(center)[#image("assets/4.png")]
=== Выводы.
В ходе проделанной работы я изучил массивы и приобрел навыки работы с ними.
=== Code review. (by #link("https://zzzcode.ai")[zzzcode.ai])
*Резюме*
Код представляет собой набор функций для работы с массивами целых чисел, включая вычисление суммы положительных и отрицательных элементов, среднего значения, суммы элементов на четных и нечетных позициях, а также индексов максимального и минимального элементов. Также реализована функция для вычисления произведения элементов между минимальным и максимальным значениями.
*Ошибка*
Код не обрабатывает возможные исключения, такие как `FormatException` при вводе данных пользователем. Это может привести к сбоям программы, если пользователь введет некорректные данные.
*Стиль кода*
Стиль кода в целом соответствует стандартам C\#. Однако, использование однострочных конструкций `if` может ухудшить читаемость. Рекомендуется использовать фигурные скобки для всех условных операторов.
*Структура кода*
Код организован в виде статических методов внутри класса `Program`. Это позволяет легко вызывать методы из `Main`. Однако, стоит рассмотреть возможность разделения логики на несколько классов для улучшения модульности.
*Читаемость*
Читаемость кода в целом хорошая, но можно улучшить, добавив комментарии к методам, чтобы объяснить их назначение. Также стоит использовать более описательные имена переменных.
*Производительность*
Производительность кода в целом приемлема для небольших массивов. Однако, для больших массивов стоит рассмотреть возможность использования параллельных вычислений или оптимизации алгоритмов.
*Масштабируемость*
Код может столкнуться с проблемами масштабируемости при работе с большими массивами, особенно в методах, которые используют вложенные циклы. Рекомендуется оптимизировать алгоритмы для повышения производительности.
*Безопасность*
Код не содержит явных уязвимостей, но отсутствие обработки исключений может привести к сбоям. Рекомендуется добавить обработку исключений для повышения надежности.
*Обработка ошибок*
Обработка ошибок в коде отсутствует. Рекомендуется добавить блоки `try-catch` для обработки возможных исключений, особенно при вводе данных пользователем.
*Заключение*
Код выполняет свои функции, но требует улучшений в области обработки ошибок, читаемости и структуры. Рекомендуется внести изменения для повышения надежности и удобства использования.