Курсовая работа: "Визуализация бинарного поиска"

This commit is contained in:
Никита Шипилов 2024-05-11 23:56:29 +04:00
commit bcd334d031
72 changed files with 3303 additions and 0 deletions

Binary file not shown.

3
.vs/ProjectSettings.json Normal file
View File

@ -0,0 +1,3 @@
{
"CurrentProjectSetting": null
}

View File

@ -0,0 +1,6 @@
{
"ExpandedNodes": [
""
],
"PreviewInSolutionExplorer": false
}

BIN
.vs/slnx.sqlite Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BinarySearch", "BinarySearch\BinarySearch.csproj", "{D32DE24F-D9A3-411A-91C6-142A6FA1B7CF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D32DE24F-D9A3-411A-91C6-142A6FA1B7CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D32DE24F-D9A3-411A-91C6-142A6FA1B7CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D32DE24F-D9A3-411A-91C6-142A6FA1B7CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D32DE24F-D9A3-411A-91C6-142A6FA1B7CF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6D9191C7-467F-4DA5-A5FB-D9795C6A8B77}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,111 @@
using BinarySearch.State;
namespace BinarySearch.Algorithm;
/// <summary>
/// Класс-Реализатор
/// </summary>
public class BinarySearchAlgorithm
{
private List<int> sortedArray;
private int target;
private int left { get; set; }
private int right { get; set; }
private int mid { get; set; }
private int? targetIndex { get; set; }
/// <summary>
/// Конструктор класса-реализатора
/// </summary>
/// <param name="array"></param>
/// <param name="target"></param>
public BinarySearchAlgorithm(List<int> array, int target)
{
targetIndex = null;
sortedArray = array;
this.target = target;
left = 0;
right = array.Count - 1;
mid = left + (right - left) / 2;
SortArray();
}
/// <summary>
/// Сортировка массива
/// </summary>
private void SortArray()
{
sortedArray.Sort();
}
/// <summary>
/// Совершение шага алгоритма
/// </summary>
public void ExecuteStep()
{
if (left <= right)
{
if (sortedArray[mid] == target)
{
targetIndex = mid;
left = mid + 1;
right = mid - 1;
return;
}
if (left == right)
{
targetIndex = -1;
left = mid + 1;
right = mid - 1;
return;
}
if (sortedArray[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
mid = left + (right - left) / 2;
}
else
{
targetIndex = -1;
}
}
/// <summary>
/// Создание состояние актуального шага
/// </summary>
/// <returns></returns>
public SearchState CreateState()
{
return new SearchState(left, right, mid, targetIndex, sortedArray, target);
}
/// <summary>
/// Восстановление шага алгоритма по состоянию
/// </summary>
/// <param name="state"></param>
public void RestoreState(SearchState state)
{
left = state.Left;
right = state.Right;
mid = state.Mid;
targetIndex = state.TargetIndex;
sortedArray = state.Array;
target = state.Target;
}
/// <summary>
/// Проверка на завершенность алгоритма
/// </summary>
/// <returns></returns>
public bool IsOver()
{
return left <= right;
}
}

View File

@ -0,0 +1,127 @@
using BinarySearch.State;
namespace BinarySearch.Algorithm;
/// <summary>
/// Класс для визуализации бинарного поиска.
/// </summary>
public class BinarySearchVisualizer
{
private readonly MainForm _mainForm;
private readonly List<int> _array;
/// <summary>
/// Конструктор класса BinarySearchVisualizer.
/// </summary>
/// <param name="mainForm">Главная форма приложения.</param>
/// <param name="array">Массив, который будет визуализироваться.</param>
public BinarySearchVisualizer(MainForm mainForm, List<int> array)
{
_mainForm = mainForm ?? throw new ArgumentNullException(nameof(mainForm));
_array = array;
}
/// <summary>
/// Визуализация текущего состояния поиска.
/// </summary>
/// <param name="state">Текущее состояние поиска.</param>
public void Visualize(SearchState state)
{
Color color;
if (state.TargetIndex == null)
{
color = Color.Orange;
} else if (state.TargetIndex >= 0)
{
color = Color.Green;
} else
{
color = Color.Red;
}
UpdateFlowLayoutPanelByStep(state, color);
}
/// <summary>
/// Обновление панели с элементами.
/// </summary>
public void UpdateFlowLayoutPanel()
{
_mainForm.flowLayoutPanelArray.Controls.Clear();
_mainForm.flowLayoutPanelIndex.Controls.Clear();
if (_array != null)
{
for (int i = 0; i < _array.Count; i++)
{
TextBox textBox = new()
{
Text = _array[i].ToString(),
Width = 40,
ReadOnly = false
};
TextBox textBoxIndex = new()
{
Text = i.ToString(),
Width = 40,
ReadOnly = true,
Enabled = false
};
_mainForm.flowLayoutPanelArray.Controls.Add(textBox);
_mainForm.flowLayoutPanelIndex.Controls.Add(textBoxIndex);
}
}
}
/// <summary>
/// Обновление панели с элементами по шагам
/// </summary>
/// <param name="state"></param>
/// <param name="color"></param>
private void UpdateFlowLayoutPanelByStep(SearchState state, Color color)
{
_mainForm.flowLayoutPanelArray.Controls.Clear();
_mainForm.flowLayoutPanelIndex.Controls.Clear();
if (state.Mid < state.Target)
{
_mainForm.labelMid.Text = "";
}
if (_array != null)
{
for (int i = 0; i < _array.Count; i++)
{
TextBox textBox = new()
{
Text = _array[i].ToString(),
Width = 40,
ReadOnly = true
};
if (i < state.Left || i > state.Right)
{
textBox.BackColor = Color.Black;
textBox.ForeColor = Color.White;
textBox.Enabled = false;
}
if (i == state.Mid)
{
textBox.BackColor = color;
textBox.ForeColor = Color.White;
textBox.Enabled = true;
}
TextBox textBoxIndex = new()
{
Text = i.ToString(),
Width = 40,
ReadOnly = true,
Enabled = false
};
_mainForm.flowLayoutPanelArray.Controls.Add(textBox);
_mainForm.flowLayoutPanelIndex.Controls.Add(textBoxIndex);
}
}
}
}

View File

@ -0,0 +1,44 @@
using BinarySearch.State;
namespace BinarySearch.Algorithm;
/// <summary>
/// Класс, управляющий выполнением бинарного поиска.
/// </summary>
public class Manager
{
private readonly StateStorage _storage;
/// <summary>
/// Конструктор класса Manager
/// </summary>
/// <param name="storage">Хранилище состояний.</param>
public Manager(StateStorage storage)
{
_storage = storage;
}
/// <summary>
/// Выполнение бинарного поиска.
/// </summary>
/// <param name="parameters">Параметры поиска.</param>
public void ExecuteBinarySearch(SearchParameters parameters)
{
if (parameters == null)
{
throw new ArgumentNullException(nameof(parameters));
}
BinarySearchAlgorithm algorithm = new(parameters.Array, parameters.Target);
SearchState? state;
_storage.Clear();
while (algorithm.IsOver())
{
state = algorithm.CreateState();
_storage.AddState(state);
algorithm.ExecuteStep();
}
state = algorithm.CreateState();
_storage.AddState(state);
}
}

View File

@ -0,0 +1,34 @@
namespace BinarySearch.Algorithm;
/// <summary>
/// Класс-Параметр
/// </summary>
public class SearchParameters
{
public List<int>? Array { get; }
public int Target { get; }
/// <summary>
/// Конструктор класса-параметра
/// </summary>
public SearchParameters()
{
Array = new List<int>();
Target = 0;
}
/// <summary>
/// Конструктор класса-параметра с параметрами
/// </summary>
/// <param name="array"></param>
/// <param name="target"></param>
public SearchParameters(List<int>? array, int target)
{
Array = array;
if (Array != null)
{
Array.Sort();
}
Target = target;
}
}

View File

@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Update="Forms\AddForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Forms\InfoForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Forms\InitDataForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Forms\MainForm.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@ -0,0 +1,89 @@
namespace BinarySearch.Forms
{
partial class AddForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonAdd = new Button();
labelAdd = new Label();
numericUpDownNumber = new NumericUpDown();
((System.ComponentModel.ISupportInitialize)numericUpDownNumber).BeginInit();
SuspendLayout();
//
// buttonAdd
//
buttonAdd.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonAdd.Location = new Point(2, 41);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(303, 23);
buttonAdd.TabIndex = 5;
buttonAdd.Text = "Добавить элемент";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// labelAdd
//
labelAdd.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
labelAdd.AutoSize = true;
labelAdd.Location = new Point(2, 14);
labelAdd.Name = "labelAdd";
labelAdd.Size = new Size(93, 15);
labelAdd.TabIndex = 4;
labelAdd.Text = "Введите число:";
//
// numericUpDownNumber
//
numericUpDownNumber.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
numericUpDownNumber.Location = new Point(101, 12);
numericUpDownNumber.Maximum = new decimal(new int[] { 200, 0, 0, 0 });
numericUpDownNumber.Minimum = new decimal(new int[] { 200, 0, 0, int.MinValue });
numericUpDownNumber.Name = "numericUpDownNumber";
numericUpDownNumber.Size = new Size(204, 23);
numericUpDownNumber.TabIndex = 3;
//
// AddForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(308, 83);
Controls.Add(buttonAdd);
Controls.Add(labelAdd);
Controls.Add(numericUpDownNumber);
Name = "AddForm";
Text = "Добавить элемент";
((System.ComponentModel.ISupportInitialize)numericUpDownNumber).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonAdd;
private Label labelAdd;
private NumericUpDown numericUpDownNumber;
}
}

View File

@ -0,0 +1,34 @@
using BinarySearch.Algorithm;
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 BinarySearch.Forms;
public partial class AddForm : Form
{
public delegate void AddNumberDelegate(int number);
public event AddNumberDelegate AddNumberEvent;
public AddForm()
{
InitializeComponent();
}
private void buttonAdd_Click(object sender, EventArgs e)
{
// Получаем значение из numericUpDownNumber
int number = (int)numericUpDownNumber.Value;
// Вызываем событие и передаем значение в главную форму
AddNumberEvent?.Invoke(number);
// Закрываем текущую форму
this.Close();
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,121 @@
namespace BinarySearch
{
partial class InfoForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InfoForm));
groupBox1 = new GroupBox();
richTextBox1 = new RichTextBox();
fontDialog1 = new FontDialog();
pictureBox1 = new PictureBox();
groupBox2 = new GroupBox();
richTextBox2 = new RichTextBox();
groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
groupBox2.SuspendLayout();
SuspendLayout();
//
// groupBox1
//
groupBox1.Controls.Add(richTextBox1);
groupBox1.Location = new Point(13, 13);
groupBox1.Margin = new Padding(4);
groupBox1.Name = "groupBox1";
groupBox1.Padding = new Padding(4);
groupBox1.Size = new Size(491, 320);
groupBox1.TabIndex = 0;
groupBox1.TabStop = false;
groupBox1.Text = "Основное";
//
// richTextBox1
//
richTextBox1.Location = new Point(8, 30);
richTextBox1.Margin = new Padding(4);
richTextBox1.Name = "richTextBox1";
richTextBox1.Size = new Size(475, 283);
richTextBox1.TabIndex = 0;
richTextBox1.Text = resources.GetString("richTextBox1.Text");
//
// pictureBox1
//
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
pictureBox1.Image = (Image)resources.GetObject("pictureBox1.Image");
pictureBox1.Location = new Point(511, 13);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(506, 542);
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.TabIndex = 1;
pictureBox1.TabStop = false;
//
// groupBox2
//
groupBox2.Controls.Add(richTextBox2);
groupBox2.Location = new Point(13, 340);
groupBox2.Name = "groupBox2";
groupBox2.Size = new Size(491, 215);
groupBox2.TabIndex = 2;
groupBox2.TabStop = false;
groupBox2.Text = "Использование программы";
//
// richTextBox2
//
richTextBox2.Location = new Point(8, 28);
richTextBox2.Name = "richTextBox2";
richTextBox2.Size = new Size(475, 181);
richTextBox2.TabIndex = 0;
richTextBox2.Text = resources.GetString("richTextBox2.Text");
//
// InfoForm
//
AutoScaleDimensions = new SizeF(9F, 21F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.PapayaWhip;
ClientSize = new Size(1029, 563);
Controls.Add(groupBox2);
Controls.Add(pictureBox1);
Controls.Add(groupBox1);
Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
Margin = new Padding(4);
Name = "InfoForm";
Text = "Информация об алгоритме";
groupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
groupBox2.ResumeLayout(false);
ResumeLayout(false);
}
#endregion
private GroupBox groupBox1;
private RichTextBox richTextBox1;
private FontDialog fontDialog1;
private PictureBox pictureBox1;
private GroupBox groupBox2;
private RichTextBox richTextBox2;
}
}

View File

@ -0,0 +1,20 @@
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 BinarySearch
{
public partial class InfoForm : Form
{
public InfoForm()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,863 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="richTextBox1.Text" xml:space="preserve">
<value>Бинарный поиск — тип поискового алгоритма, который последовательно делит пополам заранее отсортированный массив данных, чтобы обнаружить нужный элемент. Другие его названия — двоичный поиск, метод половинного деления, дихотомия.
Основная последовательность действий алгоритма выглядит так:
1. Сортируем массив данных.
2. Делим его пополам и находим середину.
3. Сравниваем срединный элемент с заданным искомым элементом.
4. Если искомое число больше среднего — продолжаем поиск в правой части массива (если он отсортирован по возрастанию): делим ее пополам, повторяя пункт 3. Если же заданное число меньше — алгоритм продолжит поиск в левой части массива, снова возвращаясь к пункту 3.
</value>
</data>
<metadata name="fontDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
y8t9OXly1jP/5uv6e1yS17Ksb6scmLwuz56fTPOlLz/euW80evHl/dFSWUaWW16Xb/y3bx2ZLt/D3J6d
/jJ9Wa/khfF86nm3Un/fy3M7fPzBeyTrm9v/62NnD1+Herq8Bt2iY9bzyP/raZO8TmV+rdSvcZm2+x6e
dV/Wr7w2Ofl1/Tzqeef/ub2VTFtPl/nk9vK6lfl357mrUbwA9JriBWAoWhvbu5CyI5od6+5fxbOzm/u6
O6OTne0NFi/1jvCD990vZC5++9KR0QXZkf1B5y/9r77+5gPPI/PIzmxur29rFS/1zv6012NaeZS0ljVv
8tjMd97iZfIcDkqS7mvz1vj7lJ3t7kmUy7pPW86vb946fP55bH1fKaRSppR5Zh1efOmVyfO9/564X7xk
HnXBk+Vn/pm+vr2b+vuQ+dfPISM5ymOz/DLdk09//YH1KutQP771PJIyfff7WgqT7vqW51i/R8q0rfdG
6748Nuuf1PPJ/0spVN+Wx+d9W25rpbweL3Ret/L8UsrU0+9iFC8AvaZ4ARiK1sb2LqTeEW3l4fHOXA47
qHfyJjvwGyxeyiiMZ765XyLU95Wd5G88e39ExbSUHf6sX73DmXWcp3iZ3Pbs+cnz+eu/2Z++9Xr0pXj5
6c9/OfW1mZRZ4/XrrufVH16f3Pbk0+ceeJ2S8nqX519uz/LzunRLjHJfSoKnnv76wdf3vw/dsiIpr1/r
eZaU9Wi9xnXKep0580jzvrynsh71+zXFQ6ZvfW8n3/uq7EhSWmZdVlG8vPbGlcltrcPLyvevzD//5utZ
xUtZ12nTXPz285P7rzYOTdqlKF4Aek3xAjAUrY3tXUjZEc3OZnbUSjLCJTt+pdzIDnTZodvfQd0/JKSb
7KSWndZkWvHSHR2RzFO81I8vBUx935NPf22yvNZ5MbrJ9NmxzPTd2+cpXq7+8N3J19kJLveV16jOPMVL
7u8mr2XrXBwleWymm6d4qcuNafPM6JVpj/nnn+8f3lI/hywj34s89zJdef71vMp7qiTftzzn8h44rnjJ
crLsVllS7i/fr7L8aSnr3Hr/JeV7VcqpWc8jyfst86vnUcqM3F/fnufYvX3R4qW8V+p1KHntf98vZcpr
mNvy9bRSJSnFyrSfl5+Nbz9uHrsQxQtAryleAIaitbG9Cyk7otlpbd2fpGDI75P7O+T3S4j8Bb4cmvTa
61cO51WKllbxUnaS89iyjN+Od3AvPre/E1jvaNalxWRUxsv3d/BbxUuZd3n8rJTn0d2hb82nfs75OudK
yXPNDnp9X9arPKZknuIljy2vY/e1bJUR5bGZ76y0vmez5pdl3i9E7hdTk9d+vP55rcoIljyvMr/yfS47
8OU5z0o5J8w8xcus72vuT0k17f463efYTXlPldE45etZyfzqeeS55Pbue6F1e55vPa9W6vdNnmdrmjrl
NZyneMnrmmm6o5JKcoLe3J/pWvfvShQvAL2meAEYitbG9i6k7IjO2mktO5/1Dvm0oqG749otXso0WWb9
u6pOvaNZlxZl3uX+7tdZrzLiZdqOZJ1Mnx3KB08KO7t4yf9TEuX1yPOv7+u+Hsm8xUv3vvK47gmBS/LY
3J/XMvPuJvfVxUspUaaNeCnzu1+I7L+epZjK653HpzDLfTnMqkybQ5JyX/k+1++DvCbTsr+c/hQv5XCs
bvEyz/MoyWuWx9S3JeV7Uk9fipc8v/p7l5Tz8eT/Zfo8zxz+111+nTJt/p/Hzypecl93neqU4uXJp841
79+VKF4Aek3xAjAUrY3tXUjZEZ2101p2Rusd8mlFQ+7LtGWHv1W8lGSns4zwyEiJVkFR35ad03qHuVW8
lHKhtQPfTXnuZV3r22cVL6WAKOfZqO9r7cCetHgpz2/a+Wry2NzfXf9p9+V7MW09krKeZXll3erypnzd
fQ3K12UUUw7RyeFBrXXr5rjipbwO3YKsJOs17/c9084qXrqvUabP85g2fSspR/I6dW/PPDPv+j1SipfW
96R1XylK5nl/z1O8lHPG1KPP6uRnc9r67VIULwC9pngBGIrWxvYupOyItnb8kxxS89Wnz01+n9Q75NOK
hu6IgVnFSzezipeyjvXyyg55a/oyGqXc3kp5fHdESZ7ftOKlrEtdKMx6PZKTFi/HFSV5bO5vlRut+0oZ
0jpRbKYvo0bKTn1uy/Tle5mU55Jp68OOyrlQymuZx5YT1bZOBFunFC95/D/8Y/d7sX94We6b9jokZb0e
+/LjM0c7Zb3Ke6lbXpTDx3JfOWQq05fzoMxzSeu8rpm29ZzLc6xf+0WLl3Jbq9jppqzLrOIlI1ryPc7z
7r4n8jrm9u4672IULwC9pngBGIrWxvYupOyITnbQnr1wJLmSTXbKcl9dZOzvVO8XDa++cf8cL7n6Uaav
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
AYoXADYjf4FWuIjIuqOAAWDNFC8ArFcKlwz9b+0QiYisKwoYANZE8QLAeihcRKSPUcAAsGKKFwBWS+Ei
IkPI3XsKGABWQvECwGooXERkaMl5p3KFNQUMAEukeAFgubLDkqH7rZ0aEZEhJAVMrrgGAEugeAFgOfb2
RqOP77V3YkREhhgFDABLoHgB4HRSuGRo/od32jsuIiJDjwIGgFNQvABwMgqX7cq7P7kxuvjcpdEzz16Y
5NU3roz+9Vc3D+/P/1946fLk39/evD164eXLk+nymLfeuXZkXnV++++3J/Mq8y3zaE17fbwOb71ztZnc
V0977UfXJ/Oqb6vvy2Na99XPM/9255tk/fL4zKd7X8lP/+W9yTT5t9yWr6etU9J6HjKspID5P359c3T5
8mURERlobty4cbA1uzaKFwAWo3DZrvzu1mj04suXD38n/+UXHh39xcNnJv9/6KGHDqe78r3vT25LYZH7
S8rj/uEfv3Nkvskv/u39yfxy/5ceOzv66799YvL/M2ceeaCA+N2tvcP7W/nGs996YNp6/Y67L7dn3TOv
rHemKeuWEqme9t1/+tnk9swjxVF9X1Kva1mv3Hbx289PHtMqV67+8Pr+smYUMzKcpJx78qmvTb6nIiIy
rKR8WTPFCwCLcR6X7Uldujz25cePjN4oI1zK16V4efjMI6MfVCNBSrmSwuG1N64c3p4iIrdn+rqIKNOn
fKlLjVJm/M3ffeXwtnJ7lnua4qV+nvVzyrStsuTV19+cTNudviTPodz/1NNfP7y9FDYXnztaQmU5zzx7
frKcaaN9ZHjJ9zKFYnkviIjIMKJ4AWAQXLloO5JCICXIF/7qi8cWAileuuVKSSkiMp9yWxnh8Q+dEiIp
86rLjrIuqyle9iajXOr1K/n1zVuT++6PXBlNypYs85lvnm8WRClRsq7Z6a7nWZaTx5Tbkiwj86tLGhlu
PrgzGv2f/9ft0XffvHJk6LqIiPQ3Tzxxf1Rtvl4zxQsAJ6eAGXbKCI261JiWUpa0zudSlx0pcPJ1GUly
9UfXJ7fVyXK788pjUmZ01yW3d9exXl497bT77o9EufTAupQROKXwyeOf+eaFyeNzX3c9U6JkFM/b49sy
XV2yTEbWvHR58pi6VCqv3axzxkj/k8Ilh1nmcEsAhiVlS+kfFC8ADJICZphZ5LwjxxUvpazI4Url6/p3
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
52/GH7Ld6cttp/0lJ+0AACzbNhYvPxtvy5d9qdPsK+Txf/23TzTvm5V5y4i+5Mr3vj95rmfOPNK8v5vf
3dobPfPNC6OHHnportLkd7dGk4Il05fvR+u2TSfftxRQQ/v+JYqXEypPOlmG1jdn6MkPaF6f/MC27p83
L758/032l194dPQXD595oDgY2g9fCpDynK7OWYKU1/OtOVv9fMhm+vr1L7flg7iedpMZ8gdoNwAAy7aN
xUu2hbNNn+3S0/xBNY9fpHh5959+Nnr4zCNzb0/3JW8dFC9f+KsvNu/vZtuKl9/evD16YbxPmPdMn4qg
RaJ4OaHypJNlaH1zhp5lFC+loEjhUn9o1Dvp+QE8SdO9ydS/bOb94Civ57YUL/kelg/QrNM8vxT6HgCA
ZdvWQ42yLXjaP7xlG3LR4iU77kMrXpJsK8/7em1T8fLqG28e7i9kn1Dxong5ldY3Z+gpRcFpipcyj9fe
uNK8P8n9QyteknxwLlI2lNdi6MVLt3BRvAAATOfkutOTbchdKV4WyVCKl6xb5t0qlPIcnnz6a4ff40zX
hyLopFG8nFB50skytL45Q09+IPL6LKN4mfXhmPuHWLwsmnleizp9LV6+9NjZw+9Z1ifrkq/n+aXQ9wAA
LNsQi5ds12UbtBxGlHMM5lyNL7z8yuE0OXVAaz9h8tiXL0+mnzxmPE0en0PTk3qnu2xT5v9ZVn1OyHrb
Mv/PYzOvybbweJoyv+S0I2+mpbwOZf7lddhf/v1t+kw3bd2TWedpzLy78z2ueMlzrqcv67lI8dJabmtZ
01LPf9rjfjB+vvOuT9+jeDmh8qSTZWh9c4ae/EDk9ckPSPe+7g9qpql/4PL/WR+Omab8P/dn2Fl9/yI/
9IukfOiVXyI5QW79YVOmq59fPjzr+0qm/bJJuicTzvMpr2drXq3pk+7rX26bVrxkncrzKfNpTXeavD3+
/tQflooXAIDphli81Nut5Y9uSf3H0vw/t9WPe/v/de1w2nJux/J1/p/bnnzq3OH0uT3zee1/v3I4XUnO
h1IKj4x06d5fMmvHP9vG9T5GK7O2YXNS3Mw/y69fh7LcvE6ZR/08k3rdk1/82/uT27/x7LeOzD+35zUp
jyv/z795XbrP7Tc3bx2+7t3ps/1flxqzio6rP3z3cJ3zvMo8s97zbtPPU7zUUbwoXg5uOZ3WN2foKR+4
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
</value>
</data>
<data name="richTextBox2.Text" xml:space="preserve">
<value>Данная программа позволяет вам посмотреть на графическую демонастрацию работы алгоритма "Бинарный поиск".
Для этого вам потребуется создать базовый целочисленный массив и указать какой элемент вы хотите найти. Так же если у вас есть сохраненный .bin файл с сохраненным состоянием там, то можете выгрузить его (CTRL+L).
После того как у вас появится в главной форме массив нажмите на кнопку запуска алгоритма. Теперь вы можете пройтись вперед и просмотреть шаги выполнения алгоритма. Так же можно сохранить данный массив (CTRL+S).
Желаю вам успехов в изучении алгоритмов!</value>
</data>
</root>

View File

@ -0,0 +1,131 @@
namespace BinarySearch
{
partial class InitDataForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
numericUpDownNumber = new NumericUpDown();
labelAdd = new Label();
buttonAdd = new Button();
buttonSave = new Button();
listBoxArray = new ListBox();
buttonReset = new Button();
((System.ComponentModel.ISupportInitialize)numericUpDownNumber).BeginInit();
SuspendLayout();
//
// numericUpDownNumber
//
numericUpDownNumber.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
numericUpDownNumber.Location = new Point(159, 10);
numericUpDownNumber.Maximum = new decimal(new int[] { 200, 0, 0, 0 });
numericUpDownNumber.Minimum = new decimal(new int[] { 200, 0, 0, int.MinValue });
numericUpDownNumber.Name = "numericUpDownNumber";
numericUpDownNumber.Size = new Size(275, 23);
numericUpDownNumber.TabIndex = 0;
//
// labelAdd
//
labelAdd.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
labelAdd.AutoSize = true;
labelAdd.Location = new Point(12, 12);
labelAdd.Name = "labelAdd";
labelAdd.Size = new Size(141, 15);
labelAdd.TabIndex = 1;
labelAdd.Text = "Введите искомое число:";
//
// buttonAdd
//
buttonAdd.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonAdd.Location = new Point(12, 157);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(422, 23);
buttonAdd.TabIndex = 2;
buttonAdd.Text = "Добавить элемент";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// buttonSave
//
buttonSave.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonSave.Location = new Point(12, 186);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(422, 23);
buttonSave.TabIndex = 3;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// listBoxArray
//
listBoxArray.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
listBoxArray.FormattingEnabled = true;
listBoxArray.ItemHeight = 15;
listBoxArray.Items.AddRange(new object[] { "" });
listBoxArray.Location = new Point(12, 43);
listBoxArray.Name = "listBoxArray";
listBoxArray.Size = new Size(422, 79);
listBoxArray.TabIndex = 4;
//
// buttonReset
//
buttonReset.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
buttonReset.Location = new Point(12, 128);
buttonReset.Name = "buttonReset";
buttonReset.Size = new Size(422, 23);
buttonReset.TabIndex = 5;
buttonReset.Text = "Сбросить";
buttonReset.UseVisualStyleBackColor = true;
buttonReset.Click += buttonReset_Click;
//
// InitDataForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(446, 220);
Controls.Add(buttonReset);
Controls.Add(listBoxArray);
Controls.Add(buttonSave);
Controls.Add(buttonAdd);
Controls.Add(labelAdd);
Controls.Add(numericUpDownNumber);
Name = "InitDataForm";
Text = "Добавление данных";
((System.ComponentModel.ISupportInitialize)numericUpDownNumber).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private NumericUpDown numericUpDownNumber;
private Label labelAdd;
private Button buttonAdd;
private Button buttonSave;
private ListBox listBoxArray;
private Button buttonReset;
}
}

View File

@ -0,0 +1,89 @@
using BinarySearch.Algorithm;
using BinarySearch.Forms;
namespace BinarySearch;
/// <summary>
/// Форма для инициализации данных перед выполнением поиска.
/// </summary>
public partial class InitDataForm : Form
{
/// <summary>
/// Делегат для передачи параметров поиска.
/// </summary>
/// <param name="searchParameters">Параметры поиска.</param>
public delegate void InitParametersDelegate(SearchParameters searchParameters);
/// <summary>
/// Событие, срабатывающее при инициализации параметров поиска.
/// </summary>
public event InitParametersDelegate? InitParametersEvent;
private List<int> _arrayInit;
/// <summary>
/// Инициализирует новый экземпляр формы InitDataForm.
/// </summary>
public InitDataForm()
{
_arrayInit = new List<int>();
InitializeComponent();
}
/// <summary>
/// Обновляет элементы списка на форме.
/// </summary>
private void UpdateListBox()
{
listBoxArray.Items.Clear();
foreach (int number in _arrayInit)
{
listBoxArray.Items.Add(number);
}
}
/// <summary>
/// Обработчик события нажатия кнопки "Добавить число".
/// Открывает диалоговое окно для добавления числа.
/// </summary>
private void buttonAdd_Click(object sender, EventArgs e)
{
AddForm addForm = new();
addForm.AddNumberEvent += AddNumberEventHandler;
addForm.ShowDialog();
}
/// <summary>
/// Обработчик события добавления числа из диалогового окна.
/// Добавляет число в список и обновляет элементы списка на форме.
/// </summary>
/// <param name="number">Добавленное число.</param>
private void AddNumberEventHandler(int number)
{
_arrayInit.Add(number);
UpdateListBox();
}
/// <summary>
/// Обработчик события нажатия кнопки "Сбросить".
/// Очищает список и обновляет элементы списка на форме.
/// </summary>
private void buttonReset_Click(object sender, EventArgs e)
{
_arrayInit.Clear();
UpdateListBox();
numericUpDownNumber.Value = 0;
}
/// <summary>
/// Обработчик события нажатия кнопки "Сохранить".
/// Формирует объект параметров поиска и вызывает событие инициализации параметров поиска.
/// </summary>
private void buttonSave_Click(object sender, EventArgs e)
{
SearchParameters parameters = new SearchParameters(_arrayInit, (int)numericUpDownNumber.Value);
InitParametersEvent?.Invoke(parameters);
this.Close();
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,306 @@
namespace BinarySearch
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
groupBoxTools = new GroupBox();
buttonStepBack = new Button();
buttonStart = new Button();
buttonStepForward = new Button();
buttonInfo = new Button();
buttonAddData = new Button();
flowLayoutPanelArray = new FlowLayoutPanel();
labelIsTarget = new Label();
labelTarget = new Label();
flowLayoutPanelIndex = new FlowLayoutPanel();
menuStrip1 = new MenuStrip();
файлToolStripMenuItem = new ToolStripMenuItem();
toolStripMenuItemSave = new ToolStripMenuItem();
toolStripMenuItemLoad = new ToolStripMenuItem();
saveFileDialog = new SaveFileDialog();
openFileDialog = new OpenFileDialog();
labelMid = new Label();
progressBarSteps = new ProgressBar();
groupBox1 = new GroupBox();
groupBox2 = new GroupBox();
textBoxSteps = new TextBox();
textBoxStep = new TextBox();
groupBoxTools.SuspendLayout();
menuStrip1.SuspendLayout();
groupBox1.SuspendLayout();
groupBox2.SuspendLayout();
SuspendLayout();
//
// groupBoxTools
//
groupBoxTools.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
groupBoxTools.AutoSize = true;
groupBoxTools.Controls.Add(buttonStepBack);
groupBoxTools.Controls.Add(buttonStart);
groupBoxTools.Controls.Add(buttonStepForward);
groupBoxTools.Controls.Add(buttonInfo);
groupBoxTools.Controls.Add(buttonAddData);
groupBoxTools.Location = new Point(788, 27);
groupBoxTools.Name = "groupBoxTools";
groupBoxTools.Size = new Size(200, 384);
groupBoxTools.TabIndex = 0;
groupBoxTools.TabStop = false;
groupBoxTools.Text = "Инструменты";
//
// buttonStepBack
//
buttonStepBack.Location = new Point(11, 109);
buttonStepBack.Name = "buttonStepBack";
buttonStepBack.Size = new Size(183, 23);
buttonStepBack.TabIndex = 4;
buttonStepBack.Text = "Шаг назад";
buttonStepBack.UseVisualStyleBackColor = true;
buttonStepBack.Click += buttonStepBack_Click;
//
// buttonStart
//
buttonStart.Location = new Point(11, 138);
buttonStart.Name = "buttonStart";
buttonStart.Size = new Size(183, 23);
buttonStart.TabIndex = 3;
buttonStart.Text = "Начать бинарный поиск";
buttonStart.UseVisualStyleBackColor = true;
buttonStart.Click += buttonStart_Click;
//
// buttonStepForward
//
buttonStepForward.Location = new Point(11, 80);
buttonStepForward.Name = "buttonStepForward";
buttonStepForward.Size = new Size(183, 23);
buttonStepForward.TabIndex = 2;
buttonStepForward.Text = "Шаг вперед";
buttonStepForward.UseVisualStyleBackColor = true;
buttonStepForward.Click += buttonStepForward_Click;
//
// buttonInfo
//
buttonInfo.Location = new Point(11, 22);
buttonInfo.Name = "buttonInfo";
buttonInfo.Size = new Size(183, 23);
buttonInfo.TabIndex = 1;
buttonInfo.Text = "Информация";
buttonInfo.UseVisualStyleBackColor = true;
buttonInfo.Click += buttonInfo_Click;
//
// buttonAddData
//
buttonAddData.Location = new Point(11, 51);
buttonAddData.Name = "buttonAddData";
buttonAddData.Size = new Size(183, 23);
buttonAddData.TabIndex = 0;
buttonAddData.Text = "Ввести данные";
buttonAddData.UseVisualStyleBackColor = true;
buttonAddData.Click += buttonAddData_Click;
//
// flowLayoutPanelArray
//
flowLayoutPanelArray.Location = new Point(12, 96);
flowLayoutPanelArray.Name = "flowLayoutPanelArray";
flowLayoutPanelArray.Size = new Size(757, 36);
flowLayoutPanelArray.TabIndex = 3;
//
// labelIsTarget
//
labelIsTarget.AutoSize = true;
labelIsTarget.Location = new Point(12, 34);
labelIsTarget.Name = "labelIsTarget";
labelIsTarget.Size = new Size(114, 15);
labelIsTarget.TabIndex = 4;
labelIsTarget.Text = "Искомое значение:";
//
// labelTarget
//
labelTarget.AutoSize = true;
labelTarget.Location = new Point(132, 34);
labelTarget.Name = "labelTarget";
labelTarget.Size = new Size(74, 15);
labelTarget.TabIndex = 5;
labelTarget.Text = "Не выбрано";
//
// flowLayoutPanelIndex
//
flowLayoutPanelIndex.Location = new Point(12, 56);
flowLayoutPanelIndex.Name = "flowLayoutPanelIndex";
flowLayoutPanelIndex.Size = new Size(757, 36);
flowLayoutPanelIndex.TabIndex = 4;
//
// menuStrip1
//
menuStrip1.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem });
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
menuStrip1.Size = new Size(988, 24);
menuStrip1.TabIndex = 6;
menuStrip1.Text = "menuStrip1";
//
// файлToolStripMenuItem
//
файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItemSave, toolStripMenuItemLoad });
файлToolStripMenuItem.Name = айлToolStripMenuItem";
файлToolStripMenuItem.Size = new Size(48, 20);
файлToolStripMenuItem.Text = "Файл";
//
// toolStripMenuItemSave
//
toolStripMenuItemSave.Enabled = false;
toolStripMenuItemSave.Name = "toolStripMenuItemSave";
toolStripMenuItemSave.ShortcutKeys = Keys.Control | Keys.S;
toolStripMenuItemSave.Size = new Size(173, 22);
toolStripMenuItemSave.Text = "Сохранить";
toolStripMenuItemSave.Click += toolStripMenuItemSave_Click;
//
// toolStripMenuItemLoad
//
toolStripMenuItemLoad.Name = "toolStripMenuItemLoad";
toolStripMenuItemLoad.ShortcutKeys = Keys.Control | Keys.L;
toolStripMenuItemLoad.Size = new Size(173, 22);
toolStripMenuItemLoad.Text = "Загрузить";
toolStripMenuItemLoad.Click += toolStripMenuItemLoad_Click;
//
// saveFileDialog
//
saveFileDialog.Filter = "bin file | *.bin";
//
// openFileDialog
//
openFileDialog.FileName = "openFileDialog1";
openFileDialog.Filter = "bin file | *.bin";
//
// labelMid
//
labelMid.AutoSize = true;
labelMid.Location = new Point(12, 140);
labelMid.Name = "labelMid";
labelMid.Size = new Size(0, 15);
labelMid.TabIndex = 7;
//
// progressBarSteps
//
progressBarSteps.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
progressBarSteps.Location = new Point(12, 377);
progressBarSteps.Name = "progressBarSteps";
progressBarSteps.Size = new Size(770, 23);
progressBarSteps.TabIndex = 8;
//
// groupBox1
//
groupBox1.Controls.Add(textBoxSteps);
groupBox1.Location = new Point(12, 310);
groupBox1.Name = "groupBox1";
groupBox1.Size = new Size(133, 61);
groupBox1.TabIndex = 9;
groupBox1.TabStop = false;
groupBox1.Text = "Количество шагов";
//
// groupBox2
//
groupBox2.Controls.Add(textBoxStep);
groupBox2.Location = new Point(151, 310);
groupBox2.Name = "groupBox2";
groupBox2.Size = new Size(131, 61);
groupBox2.TabIndex = 10;
groupBox2.TabStop = false;
groupBox2.Text = "Актуальный шаг";
//
// textBoxSteps
//
textBoxSteps.Enabled = false;
textBoxSteps.Location = new Point(6, 22);
textBoxSteps.Name = "textBoxSteps";
textBoxSteps.Size = new Size(121, 23);
textBoxSteps.TabIndex = 0;
//
// textBoxStep
//
textBoxStep.Enabled = false;
textBoxStep.Location = new Point(4, 22);
textBoxStep.Name = "textBoxStep";
textBoxStep.Size = new Size(121, 23);
textBoxStep.TabIndex = 1;
//
// MainForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.Moccasin;
ClientSize = new Size(988, 412);
Controls.Add(groupBox2);
Controls.Add(groupBox1);
Controls.Add(progressBarSteps);
Controls.Add(labelMid);
Controls.Add(flowLayoutPanelIndex);
Controls.Add(labelTarget);
Controls.Add(labelIsTarget);
Controls.Add(flowLayoutPanelArray);
Controls.Add(groupBoxTools);
Controls.Add(menuStrip1);
MainMenuStrip = menuStrip1;
Name = "MainForm";
Text = "Бинарный поиск";
groupBoxTools.ResumeLayout(false);
menuStrip1.ResumeLayout(false);
menuStrip1.PerformLayout();
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
groupBox2.ResumeLayout(false);
groupBox2.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private GroupBox groupBoxTools;
private Button buttonInfo;
private Button buttonAddData;
private Button buttonStepForward;
private Button buttonStart;
public FlowLayoutPanel flowLayoutPanelArray;
private Label labelIsTarget;
private Label labelTarget;
public FlowLayoutPanel flowLayoutPanelIndex;
private MenuStrip menuStrip1;
private ToolStripMenuItem файлToolStripMenuItem;
private ToolStripMenuItem toolStripMenuItemSave;
private ToolStripMenuItem toolStripMenuItemLoad;
private SaveFileDialog saveFileDialog;
private OpenFileDialog openFileDialog;
public Label labelMid;
private Button buttonStepBack;
private ProgressBar progressBarSteps;
private GroupBox groupBox1;
private GroupBox groupBox2;
private TextBox textBoxSteps;
private TextBox textBoxStep;
}
}

View File

@ -0,0 +1,188 @@
using BinarySearch.Algorithm;
using BinarySearch.State;
namespace BinarySearch;
/// <summary>
/// Главная форма приложения для визуализации бинарного поиска.
/// </summary>
public partial class MainForm : Form
{
private readonly StateStorage _stateStorage;
private readonly Manager _manager;
private SearchParameters _parameters;
private BinarySearchVisualizer _visualizer;
/// <summary>
/// Конструктор главной формы.
/// </summary>
public MainForm()
{
InitializeComponent();
_stateStorage = new StateStorage();
_manager = new Manager(_stateStorage);
_parameters = new SearchParameters();
_visualizer = new BinarySearchVisualizer(this, _parameters.Array);
buttonStepForward.Enabled = false;
buttonStepBack.Enabled = false;
buttonStart.Enabled = false;
}
/// <summary>
/// Обработчик события добавления данных.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonAddData_Click(object sender, EventArgs e)
{
InitDataForm initDataForm = new();
initDataForm.InitParametersEvent += InitParametersEventHandler;
initDataForm.ShowDialog();
}
/// <summary>
/// Обработчик события инициализации параметров поиска.
/// </summary>
/// <param name="searchParameters"></param>
private void InitParametersEventHandler(SearchParameters searchParameters)
{
_parameters = new SearchParameters(searchParameters.Array, searchParameters.Target);
_visualizer = new BinarySearchVisualizer(this, _parameters.Array);
_visualizer.UpdateFlowLayoutPanel();
labelTarget.Text = searchParameters.Target.ToString();
buttonStart.Enabled = true;
}
/// <summary>
/// Обработчик события запуска бинарного поиска.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStart_Click(object sender, EventArgs e)
{
_stateStorage.Reset();
_visualizer.UpdateFlowLayoutPanel();
_manager.ExecuteBinarySearch(_parameters);
progressBarSteps.Maximum = _stateStorage.GetStatesCount();
textBoxSteps.Text = _stateStorage.GetStatesCount().ToString();
progressBarSteps.Value = 0;
textBoxStep.Text = 0.ToString();
toolStripMenuItemSave.Enabled = true;
buttonStepForward.Enabled = true;
buttonStepBack.Enabled = false;
}
/// <summary>
/// Обработчик события шага вперед бинарного поиска.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStepForward_Click(object sender, EventArgs e)
{
SearchState? searchState = _stateStorage.GetNextState();
progressBarSteps.Value = _stateStorage.GetCurrentIndex()+1;
textBoxStep.Text = (_stateStorage.GetCurrentIndex() + 1).ToString();
SearchState? searchStateCheck = _stateStorage.GetNextState();
if (searchStateCheck == null && searchState != null)
{
buttonStepForward.Enabled = false;
if (searchState.TargetIndex != null && searchState.TargetIndex >= 0)
{
MessageBox.Show($"Число {searchState.Target} найдено с индексом: {searchState.TargetIndex}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
} else if (searchState.TargetIndex != null && searchState.TargetIndex < 0)
{
MessageBox.Show($"Число {searchState.Target} не найдено", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
_visualizer.Visualize(searchState);
return;
}
searchState = _stateStorage.GetPreviousState();
if (searchState == null)
{
return;
}
_visualizer.Visualize(searchState);
buttonStepForward.Enabled = true;
buttonStepBack.Enabled = true;
}
/// <summary>
/// Обработчик события шага назад бинарного поиска.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStepBack_Click(object sender, EventArgs e)
{
SearchState? searchState = _stateStorage.GetPreviousState();
if (searchState == null)
{
return;
}
progressBarSteps.Value = _stateStorage.GetCurrentIndex()+1;
textBoxStep.Text = (_stateStorage.GetCurrentIndex() + 1).ToString();
_visualizer.Visualize(searchState);
buttonStepForward.Enabled = true;
buttonStepBack.Enabled = true;
}
/// <summary>
/// Обработчик события открытия формы информации
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonInfo_Click(object sender, EventArgs e)
{
InfoForm infoForm = new();
infoForm.ShowDialog();
}
/// <summary>
/// Обработчик события сохранения состояния в файл.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripMenuItemSave_Click(object sender, EventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
if (_stateStorage.SaveToFile(saveFileDialog.FileName))
{
MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
/// <summary>
/// Обработчик события загрузки состояния из файла.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripMenuItemLoad_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
if (_stateStorage.LoadFromFile(openFileDialog.FileName))
{
SearchState? state = _stateStorage.GetNextState();
if (state != null)
{
_parameters = new SearchParameters(state.Array, state.Target);
_visualizer = new BinarySearchVisualizer(this, _parameters.Array);
_visualizer.UpdateFlowLayoutPanel();
labelTarget.Text = state.Target.ToString();
_stateStorage.GetPreviousState();
}
buttonStart.Enabled = true;
MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>132, 17</value>
</metadata>
<metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>267, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,17 @@
namespace BinarySearch
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[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());
}
}
}

View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BinarySearch.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BinarySearch.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,34 @@
namespace BinarySearch.State;
/// <summary>
/// Класс-состояние
/// </summary>
[Serializable]
public class SearchState
{
public int Left { get; }
public int Right { get; }
public int Mid { get; }
public List<int> Array { get; }
public int Target { get; }
public int? TargetIndex { get; }
/// <summary>
/// Конструктор класса состояния
/// </summary>
/// <param name="left"></param>
/// <param name="right"></param>
/// <param name="mid"></param>
/// <param name="targetIndex"></param>
/// <param name="array"></param>
/// <param name="target"></param>
public SearchState(int left, int right, int mid, int? targetIndex, List<int> array, int target)
{
Left = left;
Right = right;
Mid = mid;
TargetIndex = targetIndex;
Array = array;
Target = target;
}
}

View File

@ -0,0 +1,148 @@
using System.Runtime.Serialization.Formatters.Binary;
namespace BinarySearch.State;
/// <summary>
/// Класс-Хранилище
/// </summary>
public class StateStorage
{
private List<SearchState> states;
private int currentIndex;
/// <summary>
/// Конструктор класса-хранилища
/// </summary>
public StateStorage()
{
states = new List<SearchState>();
currentIndex = -1;
}
/// <summary>
/// Получение количества элементов хранилище
/// </summary>
/// <returns></returns>
public int GetStatesCount() { return states.Count; }
/// <summary>
/// Получения актуального индекса
/// </summary>
/// <returns></returns>
public int GetCurrentIndex() { return currentIndex; }
/// <summary>
/// Добавление состояния в хранилище
/// </summary>
/// <param name="state"></param>
public void AddState(SearchState state)
{
states.Add(state);
}
/// <summary>
/// Очистка хранилища
/// </summary>
public void Clear()
{
states.Clear();
Reset();
}
/// <summary>
/// Сброс актуального индекса
/// </summary>
public void Reset()
{
currentIndex = -1;
}
/// <summary>
/// Получение следующего состояния
/// </summary>
/// <returns></returns>
public SearchState? GetNextState()
{
if (currentIndex+1 < states.Count)
{
currentIndex++;
return states[currentIndex];
}
else
{
return null;
}
}
/// <summary>
/// Получение предыдущего состояния
/// </summary>
/// <returns></returns>
public SearchState? GetPreviousState()
{
if (currentIndex > 0 && currentIndex < states.Count)
{
currentIndex--;
return states[currentIndex];
}
else
{
return null;
}
}
/// <summary>
/// Проверка на то дошли ли мы до конца хранилища
/// </summary>
/// <returns></returns>
public bool IsTraversalComplete()
{
return currentIndex >= states.Count - 1;
}
/// <summary>
/// Сохранение хранилища в бинарный файл
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public bool SaveToFile(string filename)
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
using FileStream fs = new FileStream(filename, FileMode.Create);
#pragma warning disable SYSLIB0011
formatter.Serialize(fs, states);
#pragma warning restore SYSLIB0011
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Error saving file: {ex.Message}");
return false;
}
}
/// <summary>
/// Загрузка хранилища из бинарного файла
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public bool LoadFromFile(string filename)
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
using FileStream fs = new FileStream(filename, FileMode.Open);
#pragma warning disable SYSLIB0011
states = (List<SearchState>)formatter.Deserialize(fs);
#pragma warning restore SYSLIB0011
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Error loading file: {ex.Message}");
return false;
}
}
}

View File

@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"BinarySearch/1.0.0": {
"runtime": {
"BinarySearch.dll": {}
}
}
}
},
"libraries": {
"BinarySearch/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

View File

@ -0,0 +1,18 @@
{
"runtimeOptions": {
"tfm": "net7.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "7.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "7.0.0"
}
],
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true
}
}
}

View File

@ -0,0 +1,66 @@
{
"format": 1,
"restore": {
"C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\BinarySearch.csproj": {}
},
"projects": {
"C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\BinarySearch.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\BinarySearch.csproj",
"projectName": "BinarySearch",
"projectPath": "C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\BinarySearch.csproj",
"packagesPath": "C:\\Users\\Shiplov\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Shiplov\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0-windows"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
},
"Microsoft.WindowsDesktop.App.WindowsForms": {
"privateAssets": "none"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Shiplov\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.8.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Shiplov\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@ -0,0 +1,25 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("BinarySearch")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("BinarySearch")]
[assembly: System.Reflection.AssemblyTitleAttribute("BinarySearch")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
// Создано классом WriteCodeFragment MSBuild.

View File

@ -0,0 +1 @@
1d747fb8a31ff8aaece430d2476a61103b8e3209701086c3b8734998b4b745be

View File

@ -0,0 +1,19 @@
is_global = true
build_property.ApplicationManifest =
build_property.StartupObject =
build_property.ApplicationDefaultFont =
build_property.ApplicationHighDpiMode =
build_property.ApplicationUseCompatibleTextRendering =
build_property.ApplicationVisualStyles =
build_property.TargetFramework = net7.0-windows
build_property.TargetPlatformMinVersion = 7.0
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = BinarySearch
build_property.ProjectDir = C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@ -0,0 +1,10 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.Drawing;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
global using global::System.Windows.Forms;

View File

@ -0,0 +1 @@
17617cbbbb9c70f103e1bc84611596da5414cd65c4cbfd62e5ffa2cd30ef04af

View File

@ -0,0 +1,20 @@
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\bin\Debug\net7.0-windows\BinarySearch.exe
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\bin\Debug\net7.0-windows\BinarySearch.deps.json
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\bin\Debug\net7.0-windows\BinarySearch.runtimeconfig.json
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\bin\Debug\net7.0-windows\BinarySearch.dll
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\bin\Debug\net7.0-windows\BinarySearch.pdb
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.AssemblyInfoInputs.cache
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.AssemblyInfo.cs
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.csproj.CoreCompileInputs.cache
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.dll
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\refint\BinarySearch.dll
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.pdb
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.genruntimeconfig.cache
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\ref\BinarySearch.dll
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.MainForm.resources
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.csproj.GenerateResource.cache
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.InitDataForm.resources
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.InfoForm.resources
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.Forms.AddForm.resources
C:\Users\Shiplov\source\repos\BinarySearch_PIBD-11_ShipilovNikita\BinarySearch\BinarySearch\obj\Debug\net7.0-windows\BinarySearch.Properties.Resources.resources

View File

@ -0,0 +1,11 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {}
},
"libraries": {}
}

View File

@ -0,0 +1,23 @@
{
"runtimeOptions": {
"tfm": "net7.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "7.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "7.0.0"
}
],
"additionalProbingPaths": [
"C:\\Users\\Shiplov\\.dotnet\\store\\|arch|\\|tfm|",
"C:\\Users\\Shiplov\\.nuget\\packages"
],
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true,
"Microsoft.NETCore.DotNetHostPolicy.SetAppPaths": true
}
}
}

View File

@ -0,0 +1 @@
25f9c3050f970304723cee3b20bcbf874bf3fff9365ec968ddade2be0586b906

View File

@ -0,0 +1,71 @@
{
"version": 3,
"targets": {
"net7.0-windows7.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net7.0-windows7.0": []
},
"packageFolders": {
"C:\\Users\\Shiplov\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\BinarySearch.csproj",
"projectName": "BinarySearch",
"projectPath": "C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\BinarySearch.csproj",
"packagesPath": "C:\\Users\\Shiplov\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Shiplov\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0-windows"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0-windows7.0": {
"targetAlias": "net7.0-windows",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
},
"Microsoft.WindowsDesktop.App.WindowsForms": {
"privateAssets": "none"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json"
}
}
}
}

View File

@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "HM7korIVwiBWjMmV/uHAObjv0X4KmytAWZoSMpBbHgkLArKWuV9FBcza8FWniuc9HTB3YhxSOB2WQ7stkxmMCQ==",
"success": true,
"projectFilePath": "C:\\Users\\Shiplov\\source\\repos\\BinarySearch_PIBD-11_ShipilovNikita\\BinarySearch\\BinarySearch\\BinarySearch.csproj",
"expectedPackageFiles": [],
"logs": []
}