ISEbd-12_Osyagina_A.A._Simple_LabWork06 #6
11
LAB02/02/02.csproj
Normal file
11
LAB02/02/02.csproj
Normal file
@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<RootNamespace>_02</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
58
LAB02/02/Program.cs
Normal file
58
LAB02/02/Program.cs
Normal file
@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
||||
class EditDistance//Определяет класс EditDistance для вычисления редакционного расстояния между двумя строками.
|
||||
{
|
||||
static int Min(int a, int b, int c)//Вспомогательный метод, возвращающий минимальное из трех заданных целых чисел.
|
||||
{
|
||||
return Math.Min(Math.Min(a, b), c);
|
||||
}
|
||||
|
||||
static int EditDistanceDP(string str1, string str2)//Статический метод, который вычисляет редакционное расстояние между двумя строками str1 и str2 с использованием динамического программирования.Содержит двумерный массив dp для хранения вычисленных значений.
|
||||
{
|
||||
int m = str1.Length;
|
||||
int n = str2.Length;
|
||||
|
||||
int[,] dp = new int[m + 1, n + 1];//Инициализирует массив dp базовыми случаями: dp[i, 0] = i: Если строка str1 пуста, расстояние равно длине str2.dp[0, j] = j: Если строка str2 пуста, расстояние равно длине str1.
|
||||
|
||||
// Заполняем базовые случаи
|
||||
for (int i = 0; i <= m; i++)
|
||||
{
|
||||
for (int j = 0; j <= n; j++)
|
||||
{
|
||||
if (i == 0)
|
||||
dp[i, j] = j; // Если первая строка пустая, расстояние - длина второй строки
|
||||
else if (j == 0)
|
||||
dp[i, j] = i; // Если вторая строка пустая, расстояние - длина первой строки
|
||||
else if (str1[i - 1] == str2[j - 1])
|
||||
dp[i, j] = dp[i - 1, j - 1]; // Если символы совпадают, берем значение из диагонали
|
||||
else
|
||||
dp[i, j] = 1 + Min(dp[i - 1, j], // Удаление
|
||||
dp[i, j - 1], // Вставка
|
||||
dp[i - 1, j - 1]); // Замена
|
||||
}
|
||||
}
|
||||
|
||||
return dp[m, n];
|
||||
}
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
string str1 = "кот";
|
||||
string str2 = "скат";
|
||||
|
||||
// Измерение времени выполнения
|
||||
Stopwatch stopwatch = new Stopwatch();
|
||||
stopwatch.Start();
|
||||
int distance = EditDistanceDP(str1, str2);
|
||||
stopwatch.Stop();
|
||||
Console.WriteLine("Редакционное расстояние между '{0}' и '{1}' равно {2}", str1, str2, distance);
|
||||
Console.WriteLine("Время выполнения: " + stopwatch.ElapsedMilliseconds + " миллисекунд");
|
||||
|
||||
// Измерение использования памяти
|
||||
Process currentProcess = Process.GetCurrentProcess();
|
||||
long memoryUsed = currentProcess.PrivateMemorySize64 / (1024 * 1024); // Переводим байты в мегабайты
|
||||
|
||||
Console.WriteLine("Редакционное расстояние между '{0}' и '{1}' равно {2}", str1, str2, EditDistanceDP(str1, str2));
|
||||
}
|
||||
}
|
11
LAB02/03/03.csproj
Normal file
11
LAB02/03/03.csproj
Normal file
@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<RootNamespace>_03</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
1
LAB02/03/Program.cs
Normal file
1
LAB02/03/Program.cs
Normal file
@ -0,0 +1 @@
|
||||
|
39
LAB02/1/1.csproj
Normal file
39
LAB02/1/1.csproj
Normal file
@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Alg;
|
||||
|
||||
class Program // O(n^2)
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
int n1 = Convert.ToInt32(Console.ReadLine());
|
||||
FindPrimes(n1);
|
||||
}
|
||||
|
||||
static void FindPrimes(int n)
|
||||
{
|
||||
bool[] isPrime = new bool[n + 1];
|
||||
for (int i = 2; i <= n; i++)
|
||||
{
|
||||
isPrime[i] = true;
|
||||
}
|
||||
|
||||
for (int i = 2; i <= n; i++)
|
||||
{
|
||||
|
||||
|
||||
if (isPrime[i] == true)
|
||||
{
|
||||
Console.Write(i + " ");
|
||||
for (int j = i * i; j <= n; j += i)
|
||||
{
|
||||
isPrime[j] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
2
LAB02/1/Program.cs
Normal file
2
LAB02/1/Program.cs
Normal file
@ -0,0 +1,2 @@
|
||||
// See https://aka.ms/new-console-template for more information
|
||||
Console.WriteLine("Hello, World!");
|
11
LAB02/2/2.csproj
Normal file
11
LAB02/2/2.csproj
Normal file
@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<RootNamespace>_2</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
81
LAB02/2/Program.cs
Normal file
81
LAB02/2/Program.cs
Normal file
@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Alg;
|
||||
class Program // БЫСТРАЯ СОРТИРОВКА (В лучшем случае O(n*log(n)), в худшем O(n^2))
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
int[] myArray = randomGenerate(10, 1, 100); // Создаем массив из 10000 элементов со значениями от 1 до 1000000
|
||||
|
||||
Console.WriteLine("Исходный массив:");
|
||||
printArray(myArray); // Выводим массив на экран
|
||||
|
||||
quickSort(myArray, 0, myArray.Length - 1); // Сортируем массив быстрой сортировкой
|
||||
Console.WriteLine("Отсортированный массив:");
|
||||
printArray(myArray); // Выводим отсортированный массив на экран
|
||||
}
|
||||
|
||||
static int[] randomGenerate(int size, int minValue, int maxValue)
|
||||
{
|
||||
Random rnd = new Random();
|
||||
int[] array = new int[size];
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
array[i] = rnd.Next(minValue, maxValue + 1); // Генерируем случайное число от minValue до maxValue
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
static void printArray(int[] array)
|
||||
{
|
||||
foreach (int num in array)
|
||||
{
|
||||
Console.Write(num + " ");
|
||||
}
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
static void quickSort(int[] array, int low, int high)
|
||||
{
|
||||
if (low < high)
|
||||
{
|
||||
int pivotIndex = partition(array, low, high);
|
||||
|
||||
// Рекурсивно сортируем элементы до и после опорного элемента
|
||||
quickSort(array, low, pivotIndex - 1);
|
||||
quickSort(array, pivotIndex + 1, high);
|
||||
}
|
||||
}
|
||||
|
||||
static int partition(int[] array, int low, int high)
|
||||
{
|
||||
int pivot = array[high];
|
||||
int i = low - 1; // Индекс меньшего элемента
|
||||
|
||||
for (int j = low; j < high; j++)
|
||||
{
|
||||
// Если текущий элемент меньше или равен опорному
|
||||
if (array[j] <= pivot)
|
||||
{
|
||||
i++;
|
||||
|
||||
// Обмен значениями
|
||||
int temp = array[i];
|
||||
array[i] = array[j];
|
||||
array[j] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
// Обмен значениями
|
||||
int temp1 = array[i + 1];
|
||||
array[i + 1] = array[high];
|
||||
array[high] = temp1;
|
||||
|
||||
return i + 1;
|
||||
}
|
||||
}
|
11
LAB02/3.1/3.1.csproj
Normal file
11
LAB02/3.1/3.1.csproj
Normal file
@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<RootNamespace>_3._1</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
39
LAB02/3.1/Program.cs
Normal file
39
LAB02/3.1/Program.cs
Normal file
@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Alg;
|
||||
|
||||
class Program // O(n^2)//Это объявление класса с именем "Program". Комментарий "// O(n^2)" указывает на то, что алгоритм внутри метода "FindPrimes" имеет временную сложность O(n^2), что означает квадратичную зависимость от размера входных данных.
|
||||
{
|
||||
static void Main(string[] args)//Это объявление метода Main, который является точкой входа в программу. Он принимает массив строк args в качестве аргументов.
|
||||
{
|
||||
int n1 = Convert.ToInt32(Console.ReadLine());//Прочитывает ввод пользователя с консоли и конвертирует его в целое число, которое сохраняется в переменной n1.
|
||||
FindPrimes(n1);//Вызов метода FindPrimes с аргументом n1.
|
||||
}
|
||||
|
||||
static void FindPrimes(int n)//Объявление метода FindPrimes, который принимает целочисленный аргумент n.
|
||||
{
|
||||
bool[] isPrime = new bool[n + 1];//Создание массива isPrime длиной n+1, который будет использоваться для отслеживания простых чисел.
|
||||
for (int i = 2; i <= n; i++)//Начало цикла от 2 до n.
|
||||
{
|
||||
isPrime[i] = true;//Установка флага isPrimei в true, так как i является простым числом.
|
||||
}
|
||||
|
||||
for (int i = 2; i <= n; i++)//Начало второго цикла от 2 до n.
|
||||
{
|
||||
|
||||
|
||||
if (isPrime[i] == true)//Проверка, является ли число i простым.
|
||||
{
|
||||
Console.Write(i + " ");//Вывод числа i на консоль.
|
||||
for (int j = i * i; j <= n; j += i)//Цикл, который помечает значения, кратные i, как непростые.
|
||||
{
|
||||
isPrime[j] = false;//Установка флага isPrimej в false, так как j не является простым числом.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
11
LAB02/3/3.csproj
Normal file
11
LAB02/3/3.csproj
Normal file
@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<RootNamespace>_3</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
42
LAB02/3/Program.cs
Normal file
42
LAB02/3/Program.cs
Normal file
@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Alg;
|
||||
class Program // O(log(n))
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
int[] arr = { 2, 3, 4, 10, 40 };//Инициализация массива arr с элементами 2, 3, 4, 10, 40.
|
||||
int x = 10;//Определение переменной x, которая равна искомому элементу.
|
||||
int result = BinarySearch(arr, x);//Вызов метода BinarySearch для поиска элемента x в массиве arr.
|
||||
|
||||
if (result == -1)//Проверка результата поиска и вывод соответствующего сообщения.
|
||||
|
||||
Console.WriteLine("Элемент не найден");
|
||||
else
|
||||
Console.WriteLine("Элемент найден в индексе: " + result);
|
||||
}
|
||||
static int BinarySearch(int[] arr, int x)//Объявление метода BinarySearch, который принимает массив arr и искомый элемент x.
|
||||
{
|
||||
int left = 0;//Инициализация переменной left, которая указывает на начальный индекс массива.
|
||||
int right = arr.Length - 1;//Инициализация переменной right, которая указывает на конечный индекс массива.
|
||||
|
||||
while (left <= right)// Начало цикла, который выполняется, пока левая граница не превысит правую.
|
||||
{
|
||||
int mid = left + (right - left) / 2;//Вычисление среднего индекса mid для деления массива на две части.
|
||||
|
||||
if (arr[mid] == x)//Проверка, является ли элемент в середине массива равным искомому элементу x.
|
||||
return mid;
|
||||
|
||||
if (arr[mid] < x)//Если элемент в середине меньше x, сдвигаем левую границу поиска.
|
||||
left = mid + 1;
|
||||
else
|
||||
right = mid - 1;//Иначе сдвигаем правую границу поиска.
|
||||
}
|
||||
|
||||
return -1; // элемент не найден
|
||||
}
|
||||
}
|
56
LAB02/LAB02.sln
Normal file
56
LAB02/LAB02.sln
Normal file
@ -0,0 +1,56 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.8.34525.116
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LAB02", "LAB02\LAB02.csproj", "{295B61E5-A2D5-453C-87D5-7CAC7ACABE3F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "02", "02\02.csproj", "{CD634B3A-8F12-4936-9082-3EFD2EB0C4E7}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03", "03", "{C21E56E7-6AC7-4310-963B-BDDC0AC3CBF6}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "2", "2\2.csproj", "{E69E6275-619D-4D71-B923-9963C88A9F2B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "3", "3\3.csproj", "{3802D8BD-C1BC-4DCB-B205-2BC83722E194}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "3.1", "3.1\3.1.csproj", "{42D05460-8C32-4F20-8606-07EA30B22E8C}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{295B61E5-A2D5-453C-87D5-7CAC7ACABE3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{295B61E5-A2D5-453C-87D5-7CAC7ACABE3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{295B61E5-A2D5-453C-87D5-7CAC7ACABE3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{295B61E5-A2D5-453C-87D5-7CAC7ACABE3F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CD634B3A-8F12-4936-9082-3EFD2EB0C4E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CD634B3A-8F12-4936-9082-3EFD2EB0C4E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CD634B3A-8F12-4936-9082-3EFD2EB0C4E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CD634B3A-8F12-4936-9082-3EFD2EB0C4E7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E69E6275-619D-4D71-B923-9963C88A9F2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E69E6275-619D-4D71-B923-9963C88A9F2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E69E6275-619D-4D71-B923-9963C88A9F2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E69E6275-619D-4D71-B923-9963C88A9F2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3802D8BD-C1BC-4DCB-B205-2BC83722E194}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3802D8BD-C1BC-4DCB-B205-2BC83722E194}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3802D8BD-C1BC-4DCB-B205-2BC83722E194}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3802D8BD-C1BC-4DCB-B205-2BC83722E194}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{42D05460-8C32-4F20-8606-07EA30B22E8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{42D05460-8C32-4F20-8606-07EA30B22E8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{42D05460-8C32-4F20-8606-07EA30B22E8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{42D05460-8C32-4F20-8606-07EA30B22E8C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{E69E6275-619D-4D71-B923-9963C88A9F2B} = {C21E56E7-6AC7-4310-963B-BDDC0AC3CBF6}
|
||||
{3802D8BD-C1BC-4DCB-B205-2BC83722E194} = {C21E56E7-6AC7-4310-963B-BDDC0AC3CBF6}
|
||||
{42D05460-8C32-4F20-8606-07EA30B22E8C} = {C21E56E7-6AC7-4310-963B-BDDC0AC3CBF6}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {4B6E121E-4A2B-40E0-B768-CFD795B324BA}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
10
LAB02/LAB02/LAB02.csproj
Normal file
10
LAB02/LAB02/LAB02.csproj
Normal file
@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
56
LAB02/LAB02/Program.cs
Normal file
56
LAB02/LAB02/Program.cs
Normal file
@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
|
||||
class CoinChange
|
||||
{
|
||||
static void MakeChange(int[] coins, int amount)// объявляет статический метод (без экземпляра класса) с именем MakeChange, который принимает два аргумента: coins - массив значений монет и amount - сумму, для которой нужно подобрать сдачу.
|
||||
|
||||
{
|
||||
Stopwatch stopwatch = new Stopwatch();
|
||||
stopwatch.Start();
|
||||
Array.Sort(coins);//сортирует массив монет в порядке возрастания.
|
||||
Array.Reverse(coins);//переворачивает отсортированный массив, чтобы монеты были в порядке убывания.
|
||||
|
||||
List<int> change = new List<int>();//создает новый пустой список для хранения монет, использованных для сдачи.
|
||||
int totalCoins = 0; //инициализирует переменную totalCoins, которая будет хранить общее количество монет в сдаче, значением 0.
|
||||
|
||||
|
||||
foreach (int coin in coins) // перебирает каждую монету в отсортированном массиве монет.
|
||||
{
|
||||
while (amount >= coin) //проверяет, является ли сумма больше или равна текущей монете.
|
||||
{
|
||||
change.Add(coin); //добавляет текущую монету в список сдачи.
|
||||
amount -= coin;//вычитает значение текущей монеты из суммы.
|
||||
|
||||
totalCoins++;//величивает счетчик общего количества монет на 1.
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine("Монеты для сдачи:");//выводит строку "Монеты для сдачи:" в консоль.
|
||||
foreach (int coin in change)//перебирает список сдачи
|
||||
{
|
||||
Console.Write(coin + " ");//выводит каждое значение монеты в консоль, разделяя их пробелами
|
||||
}
|
||||
Console.WriteLine("\nВсего монет: " + totalCoins);//выводит строку "Всего монет:" в консоль, а затем общее количество монет в сдаче
|
||||
|
||||
|
||||
stopwatch.Stop();
|
||||
|
||||
Console.WriteLine($"\nВремя выполнения: {stopwatch.ElapsedMilliseconds} мс");
|
||||
|
||||
// Получаем данные о потреблении памяти
|
||||
Process proc = Process.GetCurrentProcess();
|
||||
long memoryUsed = proc.PrivateMemorySize64;
|
||||
|
||||
Console.WriteLine($"Использование памяти: {memoryUsed / 1024} KB");
|
||||
}
|
||||
|
||||
static void Main(string[] args)//объявляет статический метод Main, который является входной точкой программы
|
||||
{
|
||||
int[] coins = { 25, 10, 5, 1 };//создает массив монет с номиналами 25, 10, 5 и 1.
|
||||
int amount = 63;//устанавливает сумму для сдачи в 63 единицы.
|
||||
|
||||
MakeChange(coins, amount);//вызывает метод MakeChange, передавая ему массив монет и сумму.
|
||||
}
|
||||
}
|
@ -20,7 +20,7 @@ public class StorageCollection<T>
|
||||
_storages = new Dictionary<string, ICollectionGenericObjects<T>>();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void AddCollection(string name, CollectionType collectionType)
|
||||
{
|
||||
// TODO проверка, что name не пустой и нет в словаре записи с таким ключом
|
||||
@ -40,7 +40,7 @@ public class StorageCollection<T>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void DelCollection(string name)
|
||||
{
|
||||
// TODO Прописать логику для удаления коллекции
|
||||
@ -48,7 +48,7 @@ public class StorageCollection<T>
|
||||
_storages.Remove(name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public ICollectionGenericObjects<T>? this[string name]
|
||||
{
|
||||
get
|
||||
@ -65,122 +65,112 @@ public class StorageCollection<T>
|
||||
|
||||
private readonly string _separatorItems = ";";
|
||||
|
||||
public bool SaveData(string filname)
|
||||
/// <summary>
|
||||
/// Сохранение информации в хранилище в файл
|
||||
/// </summary>
|
||||
/// <param name="filename">Путь и имя файла</param>
|
||||
/// <returns>true - сохранение прошло успешно, false - ошибка при сохранении данных</returns>
|
||||
public bool SaveData(string filename)
|
||||
{
|
||||
if (_storages.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (File.Exists(filname))
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
File.Delete(filname);
|
||||
File.Delete(filename);
|
||||
|
||||
}
|
||||
|
||||
if (File.Exists(filname))
|
||||
using (StreamWriter writer = new StreamWriter(filename))
|
||||
{
|
||||
File.Delete(filname);
|
||||
}
|
||||
|
||||
StringBuilder sb = new();
|
||||
|
||||
sb.Append(_collectionKey);
|
||||
foreach (KeyValuePair<string, ICollectionGenericObjects<T>> value in _storages)
|
||||
{
|
||||
sb.Append(Environment.NewLine);
|
||||
// не сохраняем пустые коллекции
|
||||
if (value.Value.Count == 0)
|
||||
writer.Write(_collectionKey);
|
||||
foreach (KeyValuePair<string, ICollectionGenericObjects<T>> value in _storages)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
sb.Append(value.Key);
|
||||
sb.Append(_separatorForKeyValue);
|
||||
sb.Append(value.Value.GetCollectionType);
|
||||
sb.Append(_separatorForKeyValue);
|
||||
sb.Append(value.Value.MaxCount);
|
||||
sb.Append(_separatorForKeyValue);
|
||||
|
||||
foreach (T? item in value.Value.GetItems())
|
||||
{
|
||||
string data = item?.GetDataForSave() ?? string.Empty;
|
||||
if (string.IsNullOrEmpty(data))
|
||||
StringBuilder sb = new();
|
||||
sb.Append(Environment.NewLine);
|
||||
|
||||
if (value.Value.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
sb.Append(data);
|
||||
sb.Append(_separatorItems);
|
||||
sb.Append(value.Key);
|
||||
sb.Append(_separatorForKeyValue);
|
||||
sb.Append(value.Value.GetCollectionType);
|
||||
sb.Append(_separatorForKeyValue);
|
||||
sb.Append(value.Value.MaxCount);
|
||||
sb.Append(_separatorForKeyValue);
|
||||
foreach (T? item in value.Value.GetItems())
|
||||
{
|
||||
string data = item?.GetDataForSave() ?? string.Empty;
|
||||
if (string.IsNullOrEmpty(data))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
sb.Append(data);
|
||||
sb.Append(_separatorItems);
|
||||
}
|
||||
writer.Write(sb);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
using FileStream fs = new(filname, FileMode.Create);
|
||||
byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString());
|
||||
fs.Write(info, 0, info.Length);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Загрузка информации в хранилище из файла
|
||||
/// </summary>
|
||||
/// <param name="filename">Путь и имя файла</param>
|
||||
/// <returns>true - загрузка прошла успешно, false - ошибка при загрузке данных</returns>
|
||||
public bool LoadData(string filename)
|
||||
{
|
||||
if (!File.Exists(filename))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
string bufferTextFromFile = "";
|
||||
using (FileStream fs = new(filename, FileMode.Open))
|
||||
using (StreamReader fs = File.OpenText(filename))
|
||||
{
|
||||
byte[] b = new byte[fs.Length];
|
||||
UTF8Encoding temp = new(true);
|
||||
while (fs.Read(b, 0, b.Length) > 0)
|
||||
{
|
||||
bufferTextFromFile += temp.GetString(b);
|
||||
}
|
||||
}
|
||||
|
||||
string[] strs = bufferTextFromFile.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (strs == null || strs.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!strs[0].Equals(_collectionKey))
|
||||
{
|
||||
//если нет такой записи, то это не те файлы
|
||||
return false;
|
||||
}
|
||||
|
||||
_storages.Clear();
|
||||
foreach (string data in strs)
|
||||
{
|
||||
string[] record = data.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (record.Length != 4)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]);
|
||||
ICollectionGenericObjects<T> collection = StorageCollection<T>.CreateCollection(collectionType);
|
||||
if (collection == null)
|
||||
string str = fs.ReadLine();
|
||||
if (str == null || str.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
collection.MaxCount = Convert.ToInt32(record[2]);
|
||||
|
||||
string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (string elem in set)
|
||||
if (!str.StartsWith(_collectionKey))
|
||||
{
|
||||
if (elem?.CreateDrawningBoat() is T warship)
|
||||
return false;
|
||||
}
|
||||
_storages.Clear();
|
||||
string strs = "";
|
||||
while ((strs = fs.ReadLine()) != null)
|
||||
{
|
||||
string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (record.Length != 4)
|
||||
{
|
||||
if (collection.Insert(warship) == -1)
|
||||
continue;
|
||||
}
|
||||
CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]);
|
||||
ICollectionGenericObjects<T>? collection = StorageCollection<T>.CreateCollection(collectionType);
|
||||
if (collection == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
collection.MaxCount = Convert.ToInt32(record[2]);
|
||||
string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (string elem in set)
|
||||
{
|
||||
if (elem?.CreateDrawningBoat() is T militaryAircraft)
|
||||
{
|
||||
return false;
|
||||
if (collection.Insert(militaryAircraft) == -1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
_storages.Add(record[0], collection);
|
||||
}
|
||||
|
||||
_storages.Add(record[0], collection);
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
private static ICollectionGenericObjects<T>? CreateCollection(CollectionType collectionType)
|
||||
{
|
||||
@ -191,4 +181,4 @@ public class StorageCollection<T>
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user
Записывать в файл можно сразу, без использования StringBuilder