diff --git a/Aop4/Aop4.sln b/Aop4/Aop4.sln new file mode 100644 index 0000000..351e1a6 --- /dev/null +++ b/Aop4/Aop4.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34525.116 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Aop4", "Aop4\Aop4.vcxproj", "{325E9151-1DD3-46F9-92DF-38BF04D3741F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Debug|x64.ActiveCfg = Debug|x64 + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Debug|x64.Build.0 = Debug|x64 + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Debug|x86.ActiveCfg = Debug|Win32 + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Debug|x86.Build.0 = Debug|Win32 + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Release|x64.ActiveCfg = Release|x64 + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Release|x64.Build.0 = Release|x64 + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Release|x86.ActiveCfg = Release|Win32 + {325E9151-1DD3-46F9-92DF-38BF04D3741F}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {11FE05AC-626B-4577-BD0E-7AA74D8175A2} + EndGlobalSection +EndGlobal diff --git a/Aop4/Aop4/Aop4.cpp b/Aop4/Aop4/Aop4.cpp new file mode 100644 index 0000000..a13f1e6 --- /dev/null +++ b/Aop4/Aop4/Aop4.cpp @@ -0,0 +1,128 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include + +#include +#include +#include +#include + +#define SIZE 10 + +struct DataItem { + int key; + int data; +}; + +struct DataItem* hashArray[SIZE]; +struct DataItem* dummyItem; + +int hashCode1(int key) { + return key % SIZE; +} + +int hashCode2(int key) { + return 7 - (key % 7); // should be a prime number less than SIZE +} + +void insert(int key, int data) { + struct DataItem* item = (struct DataItem*)malloc(sizeof(struct DataItem)); + item->key = key; + item->data = data; + + int hashIndex = hashCode1(key); + int stepSize = hashCode2(key); + + while (hashArray[hashIndex] != NULL && hashArray[hashIndex]->key != -1) { + hashIndex += stepSize; + hashIndex %= SIZE; + } + + hashArray[hashIndex] = item; +} + +struct DataItem* search(int key) { + int hashIndex = hashCode1(key); + int stepSize = hashCode2(key); + + while (hashArray[hashIndex] != NULL) { + if (hashArray[hashIndex]->key == key) { + return hashArray[hashIndex]; + } + + hashIndex += stepSize; + hashIndex %= SIZE; + } + + return NULL; +} + +void display() { + int i; + for (i = 0; i < SIZE; i++) { + if (hashArray[i] != NULL) { + printf("(%d,%d) ", hashArray[i]->key, hashArray[i]->data); + } + else { + printf("~ "); + } + } + printf("\n"); +} + +int main() { + int choice, key, data; + dummyItem = (struct DataItem*)malloc(sizeof(struct DataItem)); + dummyItem->key = -1; + dummyItem->data = -1; + + // Fill the hash table with random values at the start + srand(time(NULL)); + for (int i = 0; i < SIZE; i++) { + int key = rand() % 100; // Generate a random key + int data = rand() % 1000; // Generate a random data + insert(key, data); + } + + while (1) { + printf("\n--- Menu ---\n"); + printf("1. Insert an element"); + printf("2. Search for an element"); + printf("3. Display the hash table"); + printf("4. Exit"); + printf("Choose an action: "); + scanf("%d", &choice); + + switch (choice) { + case 1: + printf("Enter key: "); + scanf("%d", &key); + printf("Enter data: "); + scanf("%d", &data); + insert(key, data); + break; + case 2: + printf("Enter key to search for: "); + scanf("%d", &key); + struct DataItem* item = search(key); + if (item != NULL) { + printf("Element found: (%d, %d)\n", item->key, item->data); + } + else { + printf("Element not found.\n"); + } + break; + case 3: + printf("Hash table: "); + display(); + break; + case 4: + printf("Program terminated.\n"); + exit(0); + default: + printf("Invalid choice. Please try again.\n"); + } + } + + return 0; +} \ No newline at end of file diff --git a/Aop4/Aop4/Aop4.vcxproj b/Aop4/Aop4/Aop4.vcxproj new file mode 100644 index 0000000..b34cf0b --- /dev/null +++ b/Aop4/Aop4/Aop4.vcxproj @@ -0,0 +1,136 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {325e9151-1dd3-46f9-92df-38bf04d3741f} + Aop4 + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdc11 + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/Aop4/Aop4/Aop4.vcxproj.filters b/Aop4/Aop4/Aop4.vcxproj.filters new file mode 100644 index 0000000..656314d --- /dev/null +++ b/Aop4/Aop4/Aop4.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Исходные файлы + + + \ No newline at end of file diff --git a/Coursework/Coursework.sln b/Coursework/Coursework.sln new file mode 100644 index 0000000..6b0f705 --- /dev/null +++ b/Coursework/Coursework.sln @@ -0,0 +1,25 @@ + +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}") = "Coursework", "Coursework\Coursework.csproj", "{937829AA-8125-47BC-9126-78E67D379D9D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {937829AA-8125-47BC-9126-78E67D379D9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {937829AA-8125-47BC-9126-78E67D379D9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {937829AA-8125-47BC-9126-78E67D379D9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {937829AA-8125-47BC-9126-78E67D379D9D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DA38A496-655D-4DA5-B898-F9A1FB78DA07} + EndGlobalSection +EndGlobal diff --git a/Coursework/Coursework/Coursework.csproj b/Coursework/Coursework/Coursework.csproj new file mode 100644 index 0000000..e1a0735 --- /dev/null +++ b/Coursework/Coursework/Coursework.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net7.0-windows + enable + true + enable + + + \ No newline at end of file diff --git a/Coursework/Coursework/Program.cs b/Coursework/Coursework/Program.cs new file mode 100644 index 0000000..a99519e --- /dev/null +++ b/Coursework/Coursework/Program.cs @@ -0,0 +1,18 @@ +using Coursework.forms; + +namespace Coursework; + +public class Program +{ + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new MainForm()); + } +} \ No newline at end of file diff --git a/Coursework/Coursework/classes/Manager.cs b/Coursework/Coursework/classes/Manager.cs new file mode 100644 index 0000000..728c3d4 --- /dev/null +++ b/Coursework/Coursework/classes/Manager.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Coursework.classes +{ + public class Manager + { + private SortedArrayOperation arrayOperation; + private StateStorage stateStorage; + + public Manager() + { + arrayOperation = new SortedArrayOperation(); + stateStorage = new StateStorage(); + } + + public void PerformOperation(int element, bool isAddOperation) + { + if (isAddOperation) + { + arrayOperation.AddElement(element); + } + else + { + arrayOperation.RemoveElement(element); + } + + State currentState = arrayOperation.GetState(); + stateStorage.AddState(currentState); + } + + public void SaveStates(string filePath) + { + stateStorage.SaveStatesToFile(filePath); + } + + public void LoadStates(string filePath) + { + stateStorage.LoadStatesFromFile(filePath); + } + } + +} diff --git a/Coursework/Coursework/classes/Parameters.cs b/Coursework/Coursework/classes/Parameters.cs new file mode 100644 index 0000000..90c64de --- /dev/null +++ b/Coursework/Coursework/classes/Parameters.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Coursework.classes; + +public class Parameters +{ + public int InitialSize { get; set; } + public int InitialMaxValue { get; set; } +} diff --git a/Coursework/Coursework/classes/SortedArrayOperation.cs b/Coursework/Coursework/classes/SortedArrayOperation.cs new file mode 100644 index 0000000..4661305 --- /dev/null +++ b/Coursework/Coursework/classes/SortedArrayOperation.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; +using System.Windows.Forms; +using static System.Windows.Forms.AxHost; + +namespace Coursework.classes; + +public class SortedArrayOperation +{ + private List sortedArray; + + public SortedArrayOperation() + { + sortedArray = new List(); + } + + public void AddElement(int element) + { + int index = sortedArray.BinarySearch(element); + if (index < 0) + { + sortedArray.Insert(~index, element); + } + } + + public void RemoveElement(int element) + { + sortedArray.Remove(element); + } + + public State GetState() + { + return new State(sortedArray); + } +} diff --git a/Coursework/Coursework/classes/State.cs b/Coursework/Coursework/classes/State.cs new file mode 100644 index 0000000..883c8d0 --- /dev/null +++ b/Coursework/Coursework/classes/State.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Coursework.classes; + +public class State +{ + public List ArrayState { get; } + + public State(List arrayState) + { + ArrayState = new List(arrayState); + } +} diff --git a/Coursework/Coursework/classes/StateStorage.cs b/Coursework/Coursework/classes/StateStorage.cs new file mode 100644 index 0000000..d1564f3 --- /dev/null +++ b/Coursework/Coursework/classes/StateStorage.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Coursework.classes; + +public class StateStorage +{ + private List states; + + public StateStorage() + { + states = new List(); + } + + public void AddState(State state) + { + states.Add(state); + } + + public void SaveStatesToFile(string filePath) + { + using (StreamWriter writer = new StreamWriter(filePath)) + { + foreach (State state in states) + { + foreach (int element in state.ArrayState) + { + writer.WriteLine(element); + } + writer.WriteLine(); + } + } + } + + public void LoadStatesFromFile(string filePath) + { + states.Clear(); + using (StreamReader reader = new StreamReader(filePath)) + { + List currentState = new List(); + string line; + while ((line = reader.ReadLine()) != null) + { + if (line == "") + { + states.Add(new State(currentState)); + currentState.Clear(); + } + else + { + currentState.Add(int.Parse(line)); + } + } + } + } +} diff --git a/Coursework/Coursework/classes/Visualizer.cs b/Coursework/Coursework/classes/Visualizer.cs new file mode 100644 index 0000000..52fd97a --- /dev/null +++ b/Coursework/Coursework/classes/Visualizer.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Coursework.classes; + +public class Visualizer +{ + public void Visualize(State state) + { + // Implement visualization of the array state + foreach (int element in state.ArrayState) + { + Console.Write(element + " "); + } + Console.WriteLine(); + } +} diff --git a/Coursework/Coursework/forms/InputForm.Designer.cs b/Coursework/Coursework/forms/InputForm.Designer.cs new file mode 100644 index 0000000..e32b7a9 --- /dev/null +++ b/Coursework/Coursework/forms/InputForm.Designer.cs @@ -0,0 +1,39 @@ +namespace Coursework.forms +{ + partial class InputForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "InputForm"; + } + + #endregion + } +} \ No newline at end of file diff --git a/Coursework/Coursework/forms/InputForm.cs b/Coursework/Coursework/forms/InputForm.cs new file mode 100644 index 0000000..ff607e4 --- /dev/null +++ b/Coursework/Coursework/forms/InputForm.cs @@ -0,0 +1,62 @@ +using Coursework.classes; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Coursework.forms +{ + public partial class InputForm : Form + { + private Manager manager; + + public InputForm(Manager manager) + { + this.manager = manager; + + Label label1 = new Label(); + label1.Text = "Initial Size:"; + TextBox sizeTextBox = new TextBox(); + + Label label2 = new Label(); + label2.Text = "Initial Max Value:"; + TextBox maxValueTextBox = new TextBox(); + + Button submitButton = new Button(); + submitButton.Text = "Submit"; + submitButton.Click += (sender, e) => + { + int size = int.Parse(sizeTextBox.Text); + int maxValue = int.Parse(maxValueTextBox.Text); + + // Set initial parameters + Parameters initialParameters = new Parameters + { + InitialSize = size, + InitialMaxValue = maxValue + }; + + // Initialize array with initial values + Random random = new Random(); + for (int i = 0; i < size; i++) + { + manager.PerformOperation(random.Next(maxValue), true); + } + + this.Close(); + }; + + Controls.Add(label1); + Controls.Add(sizeTextBox); + Controls.Add(label2); + Controls.Add(maxValueTextBox); + Controls.Add(submitButton); + } + } + +} diff --git a/Coursework/Coursework/forms/InputForm.resx b/Coursework/Coursework/forms/InputForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Coursework/Coursework/forms/InputForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Coursework/Coursework/forms/MainForm.Designer.cs b/Coursework/Coursework/forms/MainForm.Designer.cs new file mode 100644 index 0000000..edd5ccd --- /dev/null +++ b/Coursework/Coursework/forms/MainForm.Designer.cs @@ -0,0 +1,39 @@ +namespace Coursework.forms +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "MainForm"; + } + + #endregion + } +} \ No newline at end of file diff --git a/Coursework/Coursework/forms/MainForm.cs b/Coursework/Coursework/forms/MainForm.cs new file mode 100644 index 0000000..f8692ff --- /dev/null +++ b/Coursework/Coursework/forms/MainForm.cs @@ -0,0 +1,56 @@ +using Coursework.classes; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Coursework.forms +{ + public partial class MainForm : Form + { + private Manager manager; + private TextBox elementTextBox; + + public MainForm() + { + InitializeComponent(); + manager = new Manager(); + + // Create TableLayoutPanel + var tableLayoutPanel = new TableLayoutPanel(); + tableLayoutPanel.Dock = DockStyle.Top; + tableLayoutPanel.RowCount = 1; + tableLayoutPanel.ColumnCount = 3; + + // Add controls to TableLayoutPanel + tableLayoutPanel.Controls.Add(new Label { Text = "Element:" }, 0, 0); + elementTextBox = new TextBox(); + tableLayoutPanel.Controls.Add(elementTextBox, 1, 0); + var addButton = new Button { Text = "Add Element" }; + addButton.Click += AddButtonClick; + tableLayoutPanel.Controls.Add(addButton, 2, 0); + var removeButton = new Button { Text = "Remove Element" }; + removeButton.Click += RemoveButtonClick; + tableLayoutPanel.Controls.Add(removeButton, 3, 0); + + Controls.Add(tableLayoutPanel); + } + + private void AddButtonClick(object sender, EventArgs e) + { + int element = int.Parse(elementTextBox.Text); + manager.PerformOperation(element, true); + } + + private void RemoveButtonClick(object sender, EventArgs e) + { + int element = int.Parse(elementTextBox.Text); + manager.PerformOperation(element, false); + } + } +} diff --git a/Coursework/Coursework/forms/MainForm.resx b/Coursework/Coursework/forms/MainForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Coursework/Coursework/forms/MainForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Coursework2/Coursework2.sln b/Coursework2/Coursework2.sln new file mode 100644 index 0000000..99b07de --- /dev/null +++ b/Coursework2/Coursework2.sln @@ -0,0 +1,25 @@ + +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}") = "Coursework2", "Coursework2\Coursework2.csproj", "{CFEAC293-2FF8-4540-8CA3-4A4FBCFD8DAD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CFEAC293-2FF8-4540-8CA3-4A4FBCFD8DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CFEAC293-2FF8-4540-8CA3-4A4FBCFD8DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CFEAC293-2FF8-4540-8CA3-4A4FBCFD8DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CFEAC293-2FF8-4540-8CA3-4A4FBCFD8DAD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6AF063FA-1D75-4AAD-91B5-FCB220F89BAB} + EndGlobalSection +EndGlobal diff --git a/Coursework2/Coursework2/Coursework2.csproj b/Coursework2/Coursework2/Coursework2.csproj new file mode 100644 index 0000000..e1a0735 --- /dev/null +++ b/Coursework2/Coursework2/Coursework2.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net7.0-windows + enable + true + enable + + + \ No newline at end of file diff --git a/Coursework2/Coursework2/Program.cs b/Coursework2/Coursework2/Program.cs new file mode 100644 index 0000000..f794ce3 --- /dev/null +++ b/Coursework2/Coursework2/Program.cs @@ -0,0 +1,17 @@ +namespace Coursework2 +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/AbstractCompany.cs b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/AbstractCompany.cs index 6eb2517..dbb2052 100644 --- a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/AbstractCompany.cs +++ b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/AbstractCompany.cs @@ -38,7 +38,7 @@ public abstract class AbstractCompany /// /// Вычисление максимального количества элементов, который можно разместить в окне /// - private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); + private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight)-6; /// /// Конструктор diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/ListGenericObjects.cs b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/ListGenericObjects.cs index 86a38e5..8de8d91 100644 --- a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/ListGenericObjects.cs +++ b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/ListGenericObjects.cs @@ -1,4 +1,5 @@ -using System; +using ProjectGasolineTanker.Exceptions; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -21,16 +22,6 @@ public class ListGenericObjects : ICollectionGenericObjects public int Count => _collection.Count; - /// - /// Конструктор - /// - public ListGenericObjects() - { - _collection = new(); - } - - public CollectionType GetCollectionType => CollectionType.List; - public int MaxCount { get @@ -47,10 +38,20 @@ public class ListGenericObjects : ICollectionGenericObjects } } + public CollectionType GetCollectionType => CollectionType.List; + + /// + /// Конструктор + /// + public ListGenericObjects() + { + _collection = new(); + } + public T? Get(int position) { if (position >= Count || position < 0) - return null; + throw new PositionOutOfCollectionException(position); return _collection[position]; } @@ -58,7 +59,8 @@ public class ListGenericObjects : ICollectionGenericObjects public int Insert(T obj) { if (Count + 1 > _maxCount) - return -1; + throw new CollectionOverflowException(Count); + _collection.Add(obj); return Count; } @@ -66,9 +68,11 @@ public class ListGenericObjects : ICollectionGenericObjects public int Insert(T obj, int position) { if (Count + 1 > _maxCount) - return -1; + throw new CollectionOverflowException(Count); + if (position < 0 || position > Count) - return -1; + throw new PositionOutOfCollectionException(position); + _collection.Insert(position, obj); return 1; } @@ -76,7 +80,7 @@ public class ListGenericObjects : ICollectionGenericObjects public T? Remove(int position) { if (position < 0 || position > Count) - return null; + throw new PositionOutOfCollectionException(position); T? temp = _collection[position]; _collection.RemoveAt(position); diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/MassiveGenericObjects.cs index c019d95..aebffc2 100644 --- a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,4 +1,5 @@ -using System; +using ProjectGasolineTanker.Exceptions; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -52,12 +53,16 @@ public class MassiveGenericObjects : ICollectionGenericObjects public T? Get(int position) { if (position < 0 || position >= Count) - return null; + throw new PositionOutOfCollectionException(position); + + if (position >= _collection.Length && _collection[position] == null) + throw new ObjectNotFoundException(position); + return _collection[position]; } public int Insert(T obj) - { + { for (int i = 0; i < Count; i++) { if (_collection[i] == null) @@ -66,13 +71,13 @@ public class MassiveGenericObjects : ICollectionGenericObjects return i; } } - return -1; + throw new CollectionOverflowException(Count); } public int Insert(T obj, int position) { if (position < 0 || position >= Count) - return -1; + throw new PositionOutOfCollectionException(position); if (_collection[position] == null) { @@ -101,19 +106,16 @@ public class MassiveGenericObjects : ICollectionGenericObjects } temp--; } - - return -1; + throw new CollectionOverflowException(Count); } public T? Remove(int position) { if (position < 0 || position >= Count) - return null; + throw new PositionOutOfCollectionException(position); if (_collection[position] == null) - { - return null; - } + throw new ObjectNotFoundException(position); T? temp = _collection[position]; _collection[position] = null; @@ -128,3 +130,4 @@ public class MassiveGenericObjects : ICollectionGenericObjects } } } + diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/StorageCollection.cs b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/StorageCollection.cs index b3abe18..1c90976 100644 --- a/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/StorageCollection.cs +++ b/ProjectGasolineTanker/ProjectGasolineTanker/CollectionGenericObjects/StorageCollection.cs @@ -1,4 +1,5 @@ using ProjectGasolineTanker.Drawings; +using ProjectGasolineTanker.Exceptions; using System; using System.Collections.Generic; using System.Linq; @@ -92,10 +93,10 @@ public class StorageCollection } } - public bool SaveData(string filename) + public void SaveData(string filename) { if (_storages.Count == 0) - return false; + throw new InvalidDataException("В хранилище отсутсвуют коллекции для сохранения"); if (File.Exists(filename)) File.Delete(filename); @@ -130,14 +131,13 @@ public class StorageCollection sw.Write(_separatorItems); } } - return true; } - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new FileNotFoundException("Файл не существует"); } using (FileStream fs = new(filename, FileMode.Open)) @@ -147,12 +147,12 @@ public class StorageCollection string str = sr.ReadLine(); if (str == null || str.Length == 0) { - return false; + throw new InvalidDataException("В файле нет данных"); } if (!str.Equals(_collectionKey)) { - return false; + throw new InvalidOperationException("В файле неверные данные"); } _storages.Clear(); @@ -168,7 +168,7 @@ public class StorageCollection ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); if (collection == null) { - return false; + throw new InvalidOperationException("Не удалось создать коллекцию"); } collection.MaxCount = Convert.ToInt32(record[2]); @@ -176,16 +176,24 @@ public class StorageCollection string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); foreach (string elem in set) { - if (elem?.CreateDrawingTanker() is T airplane) + if (elem?.CreateDrawingTanker() is T tanker) { - if (collection.Insert(airplane) == -1) - return false; + try + { + if (collection.Insert(tanker) == -1) + { + throw new InvalidOperationException("Объект не удалось добавить в коллекцию: " + record[3]); + } + } + catch (CollectionOverflowException ex) + { + throw new ArgumentOutOfRangeException("Коллекция переполнена", ex); + } } } _storages.Add(record[0], collection); } } - return true; } private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/CollectionOverflowException.cs b/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..047cd31 --- /dev/null +++ b/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace ProjectGasolineTanker.Exceptions; + +[Serializable] +internal class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } + + public CollectionOverflowException() : base() { } + + public CollectionOverflowException(string message) : base(message) { } + + public CollectionOverflowException(string message, Exception exception) : base(message, exception) { } + + protected CollectionOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/ObjectNotFoundException.cs b/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..9cc8bbf --- /dev/null +++ b/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace ProjectGasolineTanker.Exceptions; + +[Serializable] +internal class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { } + + public ObjectNotFoundException() : base() { } + + public ObjectNotFoundException(string message) : base(message) { } + + public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { } + + protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/PositionOutOfCollectionException.cs b/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..ca0ef90 --- /dev/null +++ b/ProjectGasolineTanker/ProjectGasolineTanker/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace ProjectGasolineTanker.Exceptions; + +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции. Позиция " + i) { } + + public PositionOutOfCollectionException() : base() { } + + public PositionOutOfCollectionException(string message) : base(message) { } + + public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { } + + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/FormTankerCollection.cs b/ProjectGasolineTanker/ProjectGasolineTanker/FormTankerCollection.cs index 8f697ef..4652365 100644 --- a/ProjectGasolineTanker/ProjectGasolineTanker/FormTankerCollection.cs +++ b/ProjectGasolineTanker/ProjectGasolineTanker/FormTankerCollection.cs @@ -9,6 +9,8 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ProjectGasolineTanker.Drawings; +using Microsoft.Extensions.Logging; +using ProjectGasolineTanker.Exceptions; namespace ProjectGasolineTanker; @@ -20,13 +22,17 @@ public partial class FormTankerCollection : Form /// private AbstractCompany? _company = null; + private readonly ILogger _logger; + /// /// Конструктор /// - public FormTankerCollection() + public FormTankerCollection(ILogger logger) { InitializeComponent(); _storageCollection = new(); + _logger = logger; + _logger.LogInformation("Форма загрузилась"); } /// @@ -49,18 +55,26 @@ public partial class FormTankerCollection : Form private void SetTanker(DrawingTanker tanker) { if (_company == null || tanker == null) - { return; - } - if (_company + tanker != -1) + try { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _company.Show(); + if (_company + tanker != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Добавлен объект: " + tanker.GetDataForSave()); + } } - else + catch (CollectionOverflowException ex) { - MessageBox.Show("Не удалось добавить объект"); + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + catch (ObjectNotFoundException ex) + { + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); } } @@ -82,14 +96,25 @@ public partial class FormTankerCollection : Form } int pos = Convert.ToInt32(maskedTextBox1.Text); - if (_company - pos != null) + + try { - MessageBox.Show("Объект удален"); - pictureBox.Image = _company.Show(); + if (_company - pos != null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Удален объект по позиции " + pos); + } } - else + catch (PositionOutOfCollectionException ex) { - MessageBox.Show("Не удалось удалить объект"); + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + catch (ObjectNotFoundException ex) + { + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); } } @@ -109,11 +134,22 @@ public partial class FormTankerCollection : Form int counter = 100; while (tanker == null) { - tanker = _company.GetRandomObject(); - counter--; - if (counter <= 0) + try { - break; + tanker = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } + } + catch (PositionOutOfCollectionException ex) + { + MessageBox.Show(ex.Message); + } + catch (ObjectNotFoundException ex) + { + MessageBox.Show(ex.Message); } } @@ -152,14 +188,34 @@ public partial class FormTankerCollection : Form return; } - CollectionType collectionType = CollectionType.None; - if (radioButtonMassive.Checked) - collectionType = CollectionType.Massive; - else if (radioButtonList.Checked) - collectionType = CollectionType.List; + //CollectionType collectionType = CollectionType.None; + //if (radioButtonMassive.Checked) + // collectionType = CollectionType.Massive; + //else if (radioButtonList.Checked) + // collectionType = CollectionType.List; - _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); - RefreshListBoxItems(); + //_storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + //RefreshListBoxItems(); + + try + { + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + { + collectionType = CollectionType.Massive; + } + else if (radioButtonList.Checked) + { + collectionType = CollectionType.List; + } + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + RefreshListBoxItems(); + _logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text); + } + catch (Exception ex) + { + _logger.LogError("Ошибка: {Message}", ex.Message); + } } private void RefreshListBoxItems() @@ -169,9 +225,7 @@ public partial class FormTankerCollection : Form { string? colName = _storageCollection.Keys?[i]; if (!string.IsNullOrEmpty(colName)) - { listBoxCollection.Items.Add(colName); - } } } @@ -221,13 +275,16 @@ public partial class FormTankerCollection : Form { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.SaveData(saveFileDialog.FileName)) + try { + _storageCollection.SaveData(saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); } - else + catch (Exception ex) { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } @@ -236,14 +293,17 @@ public partial class FormTankerCollection : Form { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.LoadData(openFileDialog.FileName)) + try { + _storageCollection.LoadData(openFileDialog.FileName); MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); RefreshListBoxItems(); + _logger.LogInformation("Загрузка из файла: {filename}", openFileDialog.FileName); } - else + catch (Exception ex) { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/Program.cs b/ProjectGasolineTanker/ProjectGasolineTanker/Program.cs index 913060e..d3731fc 100644 --- a/ProjectGasolineTanker/ProjectGasolineTanker/Program.cs +++ b/ProjectGasolineTanker/ProjectGasolineTanker/Program.cs @@ -1,3 +1,8 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; + namespace ProjectGasolineTanker { internal static class Program @@ -11,7 +16,27 @@ namespace ProjectGasolineTanker // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormTankerCollection()); + ServiceCollection services = new(); + ConfigureServices(services); + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + Application.Run(serviceProvider.GetRequiredService()); + } + + private static void ConfigureServices(ServiceCollection services) + { + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + services.AddSingleton() + .AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder().AddJsonFile($"{pathNeed}serilog.json").Build()).CreateLogger()); + }); } } } \ No newline at end of file diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/ProjectGasolineTanker.csproj b/ProjectGasolineTanker/ProjectGasolineTanker/ProjectGasolineTanker.csproj index af03d74..08ed916 100644 --- a/ProjectGasolineTanker/ProjectGasolineTanker/ProjectGasolineTanker.csproj +++ b/ProjectGasolineTanker/ProjectGasolineTanker/ProjectGasolineTanker.csproj @@ -8,6 +8,20 @@ enable + + + + + + + + + + + + + + True @@ -23,4 +37,10 @@ + + + Always + + + \ No newline at end of file diff --git a/ProjectGasolineTanker/ProjectGasolineTanker/serilog.json b/ProjectGasolineTanker/ProjectGasolineTanker/serilog.json new file mode 100644 index 0000000..fa91ef7 --- /dev/null +++ b/ProjectGasolineTanker/ProjectGasolineTanker/serilog.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { "path": "log.log" } + } + ], + "Properties": { + "Application": "Sample" + } + } +} \ No newline at end of file