diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c4efe2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,261 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/ASDC.Demo/ASDC.Demo.csproj b/ASDC.Demo/ASDC.Demo.csproj new file mode 100644 index 0000000..a7274b9 --- /dev/null +++ b/ASDC.Demo/ASDC.Demo.csproj @@ -0,0 +1,206 @@ + + + + + Debug + AnyCPU + {05737572-92DD-4A52-A098-78FB96F9CB5A} + WinExe + ASDC.Demo + ASDC.Demo + v4.7 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + + + + AnyCPU + true + full + false + ..\bin\Debug\ + DEBUG;TRACE + prompt + 4 + 7.2 + + + AnyCPU + none + true + ..\bin\Release\ + + + prompt + 4 + false + + + Resources\Icon.ico + + + + + + + + + + + + 4.0 + + + + + + + + + MSBuild:Compile + Designer + + + + ListWindow.xaml + + + SearchTestWindow.xaml + + + SortTestWindow.xaml + + + TreeWindow.xaml + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + TabItem.xaml + + + + + + + MainWindow.xaml + Code + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + PreserveNewest + + + PreserveNewest + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {6b1f81b6-002f-467e-bac5-007e0f8304d6} + ASDC + + + + \ No newline at end of file diff --git a/ASDC.Demo/App.config b/ASDC.Demo/App.config new file mode 100644 index 0000000..9d2c7ad --- /dev/null +++ b/ASDC.Demo/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/ASDC.Demo/App.xaml b/ASDC.Demo/App.xaml new file mode 100644 index 0000000..bbce9bf --- /dev/null +++ b/ASDC.Demo/App.xaml @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M0,0 L8,8 M0,8 L8,0 + M0,0 H8 V8 H0 V0 M0,1 H8 M0,2 H8 + M0,8 H8 M0,7 H8 M0,6 H8 + + + + + + + diff --git a/ASDC.Demo/App.xaml.cs b/ASDC.Demo/App.xaml.cs new file mode 100644 index 0000000..9c4526e --- /dev/null +++ b/ASDC.Demo/App.xaml.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; + +namespace ASDC.Demo +{ + /// + /// Логика взаимодействия для App.xaml + /// + public partial class App : Application + { + private void closeButton_Click(object sender, RoutedEventArgs e) + { + Window window = (sender as FrameworkElement).TemplatedParent as Window; + if (window != null) + SystemCommands.CloseWindow(window); + } + + private void maximizeButton_Click(object sender, RoutedEventArgs e) + { + Window window = (sender as FrameworkElement).TemplatedParent as Window; + if (window != null) + if (window.WindowState == WindowState.Maximized) + SystemCommands.RestoreWindow(window); + else + SystemCommands.MaximizeWindow(window); + } + + private void minimizeButton_Click(object sender, RoutedEventArgs e) + { + Window window = (sender as FrameworkElement).TemplatedParent as Window; + if (window != null) + SystemCommands.MinimizeWindow(window); + } + + private void border_Loaded(object sender, RoutedEventArgs e) + { + Window window = (sender as FrameworkElement).TemplatedParent as Window; + window.MaxWidth = SystemParameters.WorkArea.Width + 11; + window.MaxHeight = SystemParameters.WorkArea.Height + 8; + } + + private void closeButton_Click1(object sender, RoutedEventArgs e) + { + Controls.TabItem tabItem = (Controls.TabItem)(sender as FrameworkElement).TemplatedParent; + var tabControl = GetAncestor(tabItem); + int index = tabControl.Items.IndexOf(tabItem); + tabControl.Items.RemoveAt(index); + } + + public static T GetAncestor(FrameworkElement element) where T : FrameworkElement + { + var result = (FrameworkElement)element.Parent; + while (!(result is T)) + result = (FrameworkElement)result.Parent; + return (T)result; + + } + } + +} diff --git a/ASDC.Demo/Controls/TabItem.xaml b/ASDC.Demo/Controls/TabItem.xaml new file mode 100644 index 0000000..89a288d --- /dev/null +++ b/ASDC.Demo/Controls/TabItem.xaml @@ -0,0 +1,10 @@ + + + diff --git a/ASDC.Demo/Controls/TabItem.xaml.cs b/ASDC.Demo/Controls/TabItem.xaml.cs new file mode 100644 index 0000000..443350a --- /dev/null +++ b/ASDC.Demo/Controls/TabItem.xaml.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using ASDC.Data; + +namespace ASDC.Demo.Controls +{ + /// + /// Логика взаимодействия для TabItem.xaml + /// + public partial class TabItem : TabItem where TKey : IComparable + { + public Table Table { get; } + + public TabItemType TabItemType { get; } + + public int Algorithm { get; } + + public int ComparisionsCount { get; } + + public long SwapsCount { get; } + + public object Key { get; } + + private TabItem() + { + InitializeComponent(); + Style = (Style)Application.Current.TryFindResource("tabItemStyle"); + + } + + public TabItem(Table table) : this() + { + dataGrid.ItemsSource = (Table = table).Rows; + TabItemType = TabItemType.File; + } + + public TabItem(Table table, string key, int algorithm, int comparisionsCount) : this() + { + Key = key; + dataGrid.ItemsSource = (Table = table).Rows ?? new List(); + TabItemType = TabItemType.Search; + Algorithm = algorithm; + ComparisionsCount = comparisionsCount; + } + + public TabItem(Table table, int key, int algorithm, int comparisionsCount, long swapsCount) : this() + { + Key = key; + dataGrid.ItemsSource = (Table = table).Rows ?? new List(); + TabItemType = TabItemType.Sort; + Algorithm = algorithm; + ComparisionsCount = comparisionsCount; + SwapsCount = swapsCount; + } + } +} diff --git a/ASDC.Demo/Controls/TabItemType.cs b/ASDC.Demo/Controls/TabItemType.cs new file mode 100644 index 0000000..c0ba95f --- /dev/null +++ b/ASDC.Demo/Controls/TabItemType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ASDC.Demo.Controls +{ + public enum TabItemType + { + File, Search, Sort + } +} diff --git a/ASDC.Demo/Data/Citizen.cs b/ASDC.Demo/Data/Citizen.cs new file mode 100644 index 0000000..064b9a4 --- /dev/null +++ b/ASDC.Demo/Data/Citizen.cs @@ -0,0 +1,28 @@ +using System; +using System.Net; + +namespace ASDC.Data +{ + + [Serializable] + public struct Citizen : IComparable, IComparable + { + public long PIN { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public DateTime Birth { get; set; } + public Gender Gender { get; set; } + + public int CompareTo(Citizen other) + { +#if DEBUG + return (FirstName, LastName).CompareTo((other.FirstName, other.LastName)); +#else + return PIN.CompareTo(other.PIN); +#endif + } + + public int CompareTo(object obj) => CompareTo((Citizen)obj); + + } +} diff --git a/ASDC.Demo/Data/CitizenTable.cs b/ASDC.Demo/Data/CitizenTable.cs new file mode 100644 index 0000000..f071ed1 --- /dev/null +++ b/ASDC.Demo/Data/CitizenTable.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace ASDC.Data +{ + /// + /// Представляет рализацию таблицы со строками типа и ключём типа . + /// + public class CitizenTable : Table + { + public CitizenTable(int length) : base(length) + { + + } + + public CitizenTable(IEnumerable rows) : base(rows) + { + + } + + #region ~IHashTable~ + + public override Func HashFunction => (Id => Id.GetHashCode()); + + #endregion + + #region ~ITable~ + + public override Func KeySelector => (user => user.PIN); + + public void Open(string filename) + { + + } + + #endregion + } +} diff --git a/ASDC.Demo/Data/Gender.cs b/ASDC.Demo/Data/Gender.cs new file mode 100644 index 0000000..cd2b052 --- /dev/null +++ b/ASDC.Demo/Data/Gender.cs @@ -0,0 +1,18 @@ +namespace ASDC.Data +{ + /// + /// Задаёт пол. + /// + public enum Gender + { + /// + /// Мужской. + /// + Male, + + /// + /// Женский. + /// + Female + } +} diff --git a/ASDC.Demo/Data/Table.cs b/ASDC.Demo/Data/Table.cs new file mode 100644 index 0000000..4b01677 --- /dev/null +++ b/ASDC.Demo/Data/Table.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using ASDC.Search; + +namespace ASDC.Data +{ + public abstract class Table : ITable, ITreeTable, IHashTable where TKey : IComparable + { + public int Length { get; } + + public Table(int length) + { + Length = length; + Rows = new List(length); + Entries = new List[(int)(length * 1.5)]; + ((ITreeTable)this).Rows = new List>(); + } + + public Table(IEnumerable Rows) + { + if (Rows != null) + this.Rows = new List(Rows); + else + this.Rows = new List(); + } + + #region ~IHashTable~ + + public IList[] Entries { get; set; } + public abstract Func HashFunction { get; } + + #endregion + + #region ~ITable~ + + public IList Rows { get; set; } + public abstract Func KeySelector { get; } + + #endregion + + #region ~IBinaryTree~ + + IList> ITreeTable.Rows { get; set; } + + #endregion + + #region ~Methods~ + + public void Add(TSource item) + { + Rows.Add(item); + ((IHashTable)this).Insert(KeySelector, item); + ((ITreeTable)this).Insert(KeySelector, item); + } + + #endregion + } +} diff --git a/ASDC.Demo/ListWindow.xaml b/ASDC.Demo/ListWindow.xaml new file mode 100644 index 0000000..27b6891 --- /dev/null +++ b/ASDC.Demo/ListWindow.xaml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ASDC.Demo/ListWindow.xaml.cs b/ASDC.Demo/ListWindow.xaml.cs new file mode 100644 index 0000000..c534d84 --- /dev/null +++ b/ASDC.Demo/ListWindow.xaml.cs @@ -0,0 +1,125 @@ +using System; +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media.Imaging; +using ASDC.Collections; +using ASDC.Data; + + +namespace ASDC +{ + /// + /// Логика взаимодействия для ListWindow.xaml + /// + public partial class ListWindow : Window + { + System.Collections.Generic.ICollection collection1; + System.Collections.Generic.ICollection collection2; + + public ListWindow(System.Collections.Generic.ICollection collection) : this() + { + switch (collection1 = collection) + { + case ObservableStack stack: + collection2 = new ObservableStack(); + clearMenuItem.ToolTip = clearMenuItem2.ToolTip += " стек"; + break; + case ObservableQueue queue: + collection2 = new ObservableQueue(); + addMenuItem.ToolTip = addMenuItem2.ToolTip = "Добавить элемент (Enqueue)"; + removeMenuItem.ToolTip = removeMenuItem2.ToolTip = "Удалить элемент (Dequeue)"; + clearMenuItem.ToolTip = clearMenuItem2.ToolTip += " очередь"; + addMenuItem.Icon = new Image() + { + Source = new BitmapImage(new Uri(@"pack://application:,,,/Resources/AddBack.png")) + }; + addMenuItem2.Icon = new Image() + { + Source = new BitmapImage(new Uri(@"pack://application:,,,/Resources/AddBack.png")) + }; + break; + case ObservableDeque deque: + collection2 = new ObservableDeque(); + clearMenuItem.ToolTip = clearMenuItem2.ToolTip += " двухстороннюю очередь"; + addMenuItem.Header = "Добавить элемент в начало"; + removeMenuItem.Header = "Удалить элемент с начала"; + addMenuItem.ToolTip = addMenuItem2.ToolTip = "Добавить элемент в начало (PushFront)"; + removeMenuItem.ToolTip = removeMenuItem2.ToolTip = "Удалить элемент с начала (PopFront)"; + addBackMenuItem.Visibility = addBackMenuItem2.Visibility = removeBackMenuItem.Visibility = removeBackMenuItem2.Visibility = separator.Visibility = separator2.Visibility = Visibility.Visible; + break; + } + dataGrid.ItemsSource = collection2; + ((INotifyPropertyChanged)collection2).PropertyChanged += (sender, e) => + { + addMenuItem.IsEnabled = addMenuItem2.IsEnabled = addBackMenuItem.IsEnabled = addBackMenuItem2.IsEnabled = collection1.Count > 0; + removeMenuItem.IsEnabled = removeMenuItem2.IsEnabled = removeBackMenuItem.IsEnabled = removeBackMenuItem2.IsEnabled = clearMenuItem.IsEnabled = clearMenuItem2.IsEnabled = collection2.Count > 0; + countTextBlock.Text = "Количество " + collection2.Count.ToString(); + }; + } + + + public ListWindow() + { + InitializeComponent(); + } + + private void addMenuItem_Click(object sender, RoutedEventArgs e) + { + switch (collection1) + { + case ObservableStack stack: + ((ObservableStack)collection2).Push(stack.Pop()); + break; + case ObservableQueue queue: + ((ObservableQueue)collection2).Enqueue(queue.Dequeue()); + break; + case ObservableDeque deque: + ((ObservableDeque)collection2).PushFront(deque.PopFront()); + break; + } + } + + private void removeMenuItem_Click(object sender, RoutedEventArgs e) + { + switch (collection1) + { + case ObservableStack stack: + stack.Push(((ObservableStack)collection2).Pop()); + break; + case ObservableQueue queue: + queue.Enqueue(((ObservableQueue)collection2).Dequeue()); + break; + case ObservableDeque deque: + deque.PushFront(((ObservableDeque)collection2).PopFront()); + break; + } + } + + private void clearMenuItem_Click(object sender, RoutedEventArgs e) + { + // Не сокращать до лямбды + // Такой вызов вызывает делегат CollectionChanged Observable коллекций + switch (collection2) + { + case ObservableStack stack: + stack.Clear(); + break; + case ObservableQueue queue: + queue.Clear(); + break; + case ObservableDeque deque: + deque.Clear(); + break; + } + } + + + private void closeMenuItem_Click(object sender, RoutedEventArgs e) => Close(); + + private void addBackMenuItem_Click(object sender, RoutedEventArgs e) => ((ObservableDeque)collection2).PushBack(((ObservableDeque)collection1).PopBack()); + + private void removeBackMenuItem_Click(object sender, RoutedEventArgs e) => ((ObservableDeque)collection1).PushBack(((ObservableDeque)collection2).PopBack()); + + } +} diff --git a/ASDC.Demo/MainWindow.xaml b/ASDC.Demo/MainWindow.xaml new file mode 100644 index 0000000..305478e --- /dev/null +++ b/ASDC.Demo/MainWindow.xaml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ASDC.Demo/MainWindow.xaml.cs b/ASDC.Demo/MainWindow.xaml.cs new file mode 100644 index 0000000..130ebf5 --- /dev/null +++ b/ASDC.Demo/MainWindow.xaml.cs @@ -0,0 +1,388 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Xml.Linq; +using ASDC.Data; +using Microsoft.Win32; +using ASDC.Demo.Controls; +using ASDC.Search; +using ASDC.Sort; +using ASDC.Collections; +using System.Windows.Media.Imaging; + +namespace ASDC.Demo +{ + /// + /// Логика взаимодействия для MainWindow.xaml + /// + public partial class MainWindow : Window + { + OpenFileDialog openFileDialog; + + public MainWindow() + { + InitializeComponent(); + openFileDialog = new OpenFileDialog() + { + Filter = "Бинарные файлы (*.bin)|*.bin" + }; +#if DEBUG + sortKeyComboBox.ItemsSource = typeof(Citizen).GetProperties().Select(p => p.Name).Union(new List { "FirstName + LastName" }); + sortKeyComboBox.Width = 140.0; +#else + sortKeyComboBox.ItemsSource = typeof(Citizen).GetProperties().Select(p => p.Name); +#endif + } + + private void openMenuItem_Click(object sender, RoutedEventArgs e) + { + statusTextBlock.Text = "Открытие..."; + if (openFileDialog.ShowDialog() == true) + try + { + using (BinaryReader reader = new BinaryReader(File.OpenRead(openFileDialog.FileName))) + { + var table = new CitizenTable(reader.ReadInt32()); + for (int i = 0; i < table.Length; i++) + { + Citizen item = new Citizen(); + item.PIN = reader.ReadInt64(); + int l1 = reader.ReadInt32(); + for (int j = 0; j < l1; j++) + item.FirstName += reader.ReadChar(); + int l2 = reader.ReadInt32(); + for (int j = 0; j < l2; j++) + item.LastName += reader.ReadChar(); + var day = reader.ReadInt32(); + var month = reader.ReadInt32(); + var year = reader.ReadInt32(); + item.Birth = new DateTime(year, month, day); + item.Gender = (Gender)reader.ReadInt32(); + table.Add(item); + } + tabControl.SelectedIndex = tabControl.Items.Add(new TabItem(table) + { + Header = System.IO.Path.GetFileName(openFileDialog.FileName) + }); + Title = $"ASDC - {System.IO.Path.GetFileName(openFileDialog.FileName)}"; + statusTextBlock.Text = "Готово"; + } + } + catch (Exception ex) + { + tabControl.Items.Clear(); + MessageBox.Show(ex.ToString(), "ACDC", MessageBoxButton.OK, MessageBoxImage.Error); + statusTextBlock.Text = "Ошибка"; + } + else + statusTextBlock.Text = "Отменено"; + } + + + // Пример преобразования XML в понятные для программы BIN файлы. + + private void transformMenuItem_Click(object sender, RoutedEventArgs e) + { + statusTextBlock.Text = "Преобразование..."; + List result = new List(); + OpenFileDialog openFileDialog = new OpenFileDialog() + { + Title = "Преобразовать", + Filter = "XML файлы (*.xml)|*.xml" + }; + if (openFileDialog.ShowDialog() == true) + { + try + { + + XDocument doc = XDocument.Load(openFileDialog.FileName); + foreach (var record in doc.Element("dataset").Elements("record")) + { + result.Add(new Citizen() + { + PIN = long.Parse(record.Element("PIN").Value), + FirstName = record.Element("FirstName").Value, + LastName = record.Element("LastName").Value, + Gender = (Gender)int.Parse(record.Element("Gender").Value), + Birth = DateTime.Parse(record.Element("Birth").Value), + }); + } + + using (var writer = new BinaryWriter(new FileStream("citizens.bin", FileMode.OpenOrCreate))) + { + writer.Write(result.Count); + foreach (var item in result) + { + writer.Write(item.PIN); + writer.Write(item.FirstName.Length); + foreach (var c in item.FirstName) + writer.Write(c); + + writer.Write(item.LastName.Length); + foreach (var c in item.LastName) + writer.Write(c); + writer.Write(item.Birth.Day); + writer.Write(item.Birth.Month); + writer.Write(item.Birth.Year); + writer.Write((int)item.Gender); + } + } + statusTextBlock.Text = "Готово"; + } + catch (Exception) + { + MessageBox.Show("Не удалось преобразовать указанный файл!", "ASDC", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + } + + + private async void searchMenuItem_Click(object sender, RoutedEventArgs e) + { + + statusTextBlock.Text = "Поиск..."; + if (long.TryParse(searchKeyTextBox.Text, out long keyValue)) + { + var selectedItem = tabControl.SelectedItem as Controls.TabItem; + (IEnumerable result, int comparisonsCount) searchResult = default((IEnumerable, int)); + + switch ((SearchAlgorithm)searchAlgorithmComboBox.SelectedIndex) + { + case SearchAlgorithm.Linear: + searchResult = await selectedItem.Table.LinearSearchAsync(selectedItem.Table.KeySelector, keyValue); + break; + case SearchAlgorithm.Binary: + searchResult = await selectedItem.Table.BinarySearchAsync(selectedItem.Table.KeySelector, keyValue); + break; + case SearchAlgorithm.BinaryTree: + searchResult = selectedItem.Table.TreeSearch(selectedItem.Table.KeySelector, keyValue); + break; + case SearchAlgorithm.HashTable: + searchResult = await selectedItem.Table.HashSearchAsync(selectedItem.Table.KeySelector, keyValue); + break; + } + + tabControl.SelectedIndex = tabControl.Items.Add(new TabItem(new CitizenTable(searchResult.result), searchKeyTextBox.Text, searchAlgorithmComboBox.SelectedIndex, searchResult.comparisonsCount) + { + Header = $"{selectedItem.Header} - поиск" + }); + + statusTextBlock.Text = "Готово"; + } + else + { + MessageBox.Show("Введённое значение не является целым числом!", "ASDC", MessageBoxButton.OK, MessageBoxImage.Error); + statusTextBlock.Text = "Ошибка"; + } + + } + + private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + var selectedItem = tabControl.SelectedItem as TabItem; + + if (selectedItem == null) + { + openMenuItem.IsEnabled = openMenu2.IsEnabled = true; + searchAlgorithmComboBox.IsEnabled = searchKeyTextBox.IsEnabled = searchMenuItem.IsEnabled = searchTestMenuItem.IsEnabled = sortAlgorithmComboBox.IsEnabled = sortKeyComboBox.IsEnabled = sortMenuItem.IsEnabled = sortTestMenuItem.IsEnabled = stackMenuItem.IsEnabled = queueMenuItem.IsEnabled = dequeMenuItem.IsEnabled = inorderMenuItem.IsEnabled = preorderMenuItem.IsEnabled = postorderMenuItem.IsEnabled = false; + } + else if ( selectedItem.TabItemType == TabItemType.Search) + { + openMenuItem.IsEnabled = openMenu2.IsEnabled = false; + searchAlgorithmComboBox.SelectedIndex = selectedItem.Algorithm; + searchKeyTextBox.Text = selectedItem.Key.ToString(); + sortAlgorithmComboBox.SelectedIndex = -1; + sortKeyComboBox.SelectedIndex = -1; + + searchAlgorithmComboBox.IsEnabled = searchKeyTextBox.IsEnabled = searchMenuItem.IsEnabled = searchTestMenuItem.IsEnabled = sortAlgorithmComboBox.IsEnabled = sortKeyComboBox.IsEnabled = sortMenuItem.IsEnabled = sortTestMenuItem.IsEnabled = stackMenuItem.IsEnabled = queueMenuItem.IsEnabled = dequeMenuItem.IsEnabled = inorderMenuItem.IsEnabled = preorderMenuItem.IsEnabled = postorderMenuItem.IsEnabled = false; + + comparisionsCountTextBlock.Text = $"Сравнений {selectedItem.ComparisionsCount.ToString()}"; + comparisionsCountTextBlock.Visibility = Visibility.Visible; + } + else if (selectedItem != null && selectedItem.TabItemType == TabItemType.Sort) + { + openMenuItem.IsEnabled = openMenu2.IsEnabled = false; + searchAlgorithmComboBox.SelectedIndex = -1; + searchKeyTextBox.Text = string.Empty; + sortAlgorithmComboBox.SelectedIndex = selectedItem.Algorithm; + sortKeyComboBox.SelectedIndex = (int)selectedItem.Key; + + searchAlgorithmComboBox.IsEnabled = searchKeyTextBox.IsEnabled = searchMenuItem.IsEnabled = searchTestMenuItem.IsEnabled = sortAlgorithmComboBox.IsEnabled = sortKeyComboBox.IsEnabled = sortMenuItem.IsEnabled = sortTestMenuItem.IsEnabled = stackMenuItem.IsEnabled = queueMenuItem.IsEnabled = dequeMenuItem.IsEnabled = inorderMenuItem.IsEnabled = preorderMenuItem.IsEnabled = postorderMenuItem.IsEnabled = false; + + comparisionsCountTextBlock.Text = $"Сравнений {selectedItem.ComparisionsCount.ToString()}"; + comparisionsCountTextBlock.Visibility = Visibility.Visible; + timeTextBlock.Text = $"Перестановок {selectedItem.SwapsCount.ToString()}"; + timeTextBlock.Visibility = Visibility.Visible; + } + else + { + openMenuItem.IsEnabled = openMenu2.IsEnabled = false; + searchAlgorithmComboBox.IsEnabled = searchKeyTextBox.IsEnabled = searchTestMenuItem.IsEnabled = sortAlgorithmComboBox.IsEnabled = sortKeyComboBox.IsEnabled = sortTestMenuItem.IsEnabled = stackMenuItem.IsEnabled = queueMenuItem.IsEnabled = dequeMenuItem.IsEnabled = inorderMenuItem.IsEnabled = preorderMenuItem.IsEnabled = postorderMenuItem.IsEnabled = true; + searchMenuItem.IsEnabled = searchAlgorithmComboBox.SelectedIndex != -1 && !string.IsNullOrWhiteSpace(searchKeyTextBox.Text); + sortMenuItem.IsEnabled = sortAlgorithmComboBox.SelectedIndex != -1 && sortKeyComboBox.SelectedIndex != -1; + comparisionsCountTextBlock.Visibility = Visibility.Hidden; + timeTextBlock.Visibility = Visibility.Hidden; + } + } + + private void searchAlgorithmComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + searchMenuItem.IsEnabled = searchAlgorithmComboBox.SelectedIndex != -1 && !string.IsNullOrWhiteSpace(searchKeyTextBox.Text); + } + + private void searchKeyTextBox_TextChanged(object sender, TextChangedEventArgs e) + { + searchMenuItem.IsEnabled = searchAlgorithmComboBox.SelectedIndex != -1 && !string.IsNullOrWhiteSpace(searchKeyTextBox.Text); + } + + private void sortKeyComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + sortMenuItem.IsEnabled = sortAlgorithmComboBox.SelectedIndex != -1 && sortKeyComboBox.SelectedIndex != -1; + } + + private void sortMenuItem_Click(object sender, RoutedEventArgs e) + { + statusTextBlock.Text = "Сортировка..."; + var selectedItem = tabControl.SelectedItem as TabItem; + + (IEnumerable result, int comparisonsCount, int swapsCount) searchResult = default((IEnumerable, int, int)); + +#if DEBUG + if (sortKeyComboBox.Text == "FirstName + LastName") + { + Func keySelector = (row => (row.FirstName, row.LastName)); + switch ((SortAlgorithm)sortAlgorithmComboBox.SelectedIndex) + { + case SortAlgorithm.Bubble: + searchResult = selectedItem.Table.BubbleSort(keySelector); + break; + case SortAlgorithm.Quick: + searchResult = selectedItem.Table.QuickSort(keySelector); + break; + case SortAlgorithm.Selection: + searchResult = selectedItem.Table.SelectionSort(keySelector); + break; + case SortAlgorithm.Heap: + searchResult = selectedItem.Table.HeapSort(keySelector); + break; + case SortAlgorithm.Insert: + searchResult = selectedItem.Table.InsertSort(keySelector); + break; + case SortAlgorithm.Shell: + searchResult = selectedItem.Table.ShellSort(keySelector); + break; + } + } + else +#endif + switch ((SortAlgorithm)sortAlgorithmComboBox.SelectedIndex) + { + case SortAlgorithm.Bubble: + searchResult = selectedItem.Table.BubbleSort(row => (IComparable)row.GetType().GetProperty(sortKeyComboBox.Text).GetValue(row)); + break; + case SortAlgorithm.Quick: + searchResult = selectedItem.Table.QuickSort(row => (IComparable)row.GetType().GetProperty(sortKeyComboBox.Text).GetValue(row)); + break; + case SortAlgorithm.Selection: + searchResult = selectedItem.Table.SelectionSort(row => (IComparable)row.GetType().GetProperty(sortKeyComboBox.Text).GetValue(row)); + break; + case SortAlgorithm.Heap: + searchResult = selectedItem.Table.HeapSort(row => (IComparable)row.GetType().GetProperty(sortKeyComboBox.Text).GetValue(row)); + break; + case SortAlgorithm.Insert: + searchResult = selectedItem.Table.InsertSort(row => (IComparable)row.GetType().GetProperty(sortKeyComboBox.Text).GetValue(row)); + break; + case SortAlgorithm.Shell: + searchResult = selectedItem.Table.ShellSort(row => (IComparable)row.GetType().GetProperty(sortKeyComboBox.Text).GetValue(row)); + break; + } + + tabControl.SelectedIndex = tabControl.Items.Add(new TabItem(new CitizenTable(searchResult.result), sortKeyComboBox.SelectedIndex, sortAlgorithmComboBox.SelectedIndex, searchResult.comparisonsCount, searchResult.swapsCount) + { + Header = $"{selectedItem.Header} - сортировка" + }); + + statusTextBlock.Text = "Готово"; + + } + + private void sortTestMenuItem_Click(object sender, RoutedEventArgs e) + { + new SortTestWindow() + { + Owner = this + }.ShowDialog((CitizenTable)(tabControl.SelectedItem as TabItem).Table); + } + + private void searchTestMenuItem_Click(object sender, RoutedEventArgs e) + { + new SearchTestWindow() + { + Owner = this + }.ShowDialog((tabControl.SelectedItem as TabItem).Table); + } + + private void stackMenuItem_Click(object sender, RoutedEventArgs e) + { + new ListWindow(new ObservableStack((tabControl.SelectedItem as TabItem).Table.Rows)) + { + Title = "Стек", + Owner = this, + Icon = new BitmapImage(new Uri(@"pack://application:,,,/Resources/Stack.png")) + }.ShowDialog(); + } + + private void queueMenuItem_Click(object sender, RoutedEventArgs e) + { + new ListWindow(new ObservableQueue((tabControl.SelectedItem as TabItem).Table.Rows)) + { + Title = "Очередь", + Owner = this, + Icon = new BitmapImage(new Uri(@"pack://application:,,,/Resources/Queue.png")) + }.ShowDialog(); + } + + private void dequeMenuItem_Click(object sender, RoutedEventArgs e) + { + new ListWindow(new ObservableDeque((tabControl.SelectedItem as TabItem).Table.Rows)) + { + Title = "Двухсторонняя очередь", + Owner = this, + Icon = new BitmapImage(new Uri(@"pack://application:,,,/Resources/Deque.png")) + }.ShowDialog(); + } + + private void preorderMenuItem_Click(object sender, RoutedEventArgs e) + { + new TreeWindow(new BinarySearchTree((tabControl.SelectedItem as TabItem).Table.Rows).PreorderTraverse()) + { + Title = "Прямой обход", + Owner = this, + Icon = new BitmapImage(new Uri(@"pack://application:,,,/Resources/Preorder.png")) + }.ShowDialog(); + } + + private void inorderMenuItem_Click(object sender, RoutedEventArgs e) + { + new TreeWindow(new BinarySearchTree((tabControl.SelectedItem as TabItem).Table.Rows).InorderTraverse()) + { + Title = "Симметричный обход", + Owner = this, + Icon = new BitmapImage(new Uri(@"pack://application:,,,/Resources/Inorder.png")) + }.ShowDialog(); + } + + private void postorderMenuItem_Click(object sender, RoutedEventArgs e) + { + new TreeWindow(new BinarySearchTree((tabControl.SelectedItem as TabItem).Table.Rows).PostorderTraverse()) + { + Title = "Обратный обход", + Owner = this, + Icon = new BitmapImage(new Uri(@"pack://application:,,,/Resources/Postorder.png")) + }.ShowDialog(); + } + } +} diff --git a/ASDC.Demo/Properties/AssemblyInfo.cs b/ASDC.Demo/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c520d4c --- /dev/null +++ b/ASDC.Demo/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// Общие сведения об этой сборке предоставляются следующим набором +// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, +// связанные со сборкой. +[assembly: AssemblyTitle("ASDC")] +[assembly: AssemblyDescription("Демонстрация лабораторных работ №1-3")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("USM I1602")] +[assembly: AssemblyProduct("ASDC")] +[assembly: AssemblyCopyright("Copyright Козлович Артём © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми +// для компонентов COM. Если необходимо обратиться к типу в этой сборке через +// COM, задайте атрибуту ComVisible значение TRUE для этого типа. +[assembly: ComVisible(false)] + +//Чтобы начать создание локализуемых приложений, задайте +//CultureYouAreCodingWith в файле .csproj +//внутри . Например, если используется английский США +//в своих исходных файлах установите в en-US. Затем отмените преобразование в комментарий +//атрибута NeutralResourceLanguage ниже. Обновите "en-US" в +//строка внизу для обеспечения соответствия настройки UICulture в файле проекта. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //где расположены словари ресурсов по конкретным тематикам + //(используется, если ресурс не найден на странице, + // или в словарях ресурсов приложения) + ResourceDictionaryLocation.SourceAssembly //где расположен словарь универсальных ресурсов + //(используется, если ресурс не найден на странице, + // в приложении или в каких-либо словарях ресурсов для конкретной темы) +)] + + +// Сведения о версии сборки состоят из следующих четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер сборки +// Редакция +// +// Можно задать все значения или принять номер сборки и номер редакции по умолчанию. +// используя "*", как показано ниже: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] diff --git a/ASDC.Demo/Properties/Resources.Designer.cs b/ASDC.Demo/Properties/Resources.Designer.cs new file mode 100644 index 0000000..072d03a --- /dev/null +++ b/ASDC.Demo/Properties/Resources.Designer.cs @@ -0,0 +1,223 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ASDC.Demo.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.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() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [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("ASDC.Demo.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AddBack { + get { + object obj = ResourceManager.GetObject("AddBack", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AddFront { + get { + object obj = ResourceManager.GetObject("AddFront", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Clear { + get { + object obj = ResourceManager.GetObject("Clear", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Deque { + get { + object obj = ResourceManager.GetObject("Deque", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Exit { + get { + object obj = ResourceManager.GetObject("Exit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Icon, аналогичного (Значок). + /// + internal static System.Drawing.Icon Icon { + get { + object obj = ResourceManager.GetObject("Icon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Inorder { + get { + object obj = ResourceManager.GetObject("Inorder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Open { + get { + object obj = ResourceManager.GetObject("Open", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Postorder { + get { + object obj = ResourceManager.GetObject("Postorder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Preorder { + get { + object obj = ResourceManager.GetObject("Preorder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Queue { + get { + object obj = ResourceManager.GetObject("Queue", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap RemoveBack { + get { + object obj = ResourceManager.GetObject("RemoveBack", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap RemoveFront { + get { + object obj = ResourceManager.GetObject("RemoveFront", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Search { + get { + object obj = ResourceManager.GetObject("Search", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Sort { + get { + object obj = ResourceManager.GetObject("Sort", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Stack { + get { + object obj = ResourceManager.GetObject("Stack", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ASDC.Demo/Properties/Resources.resx b/ASDC.Demo/Properties/Resources.resx new file mode 100644 index 0000000..a0b3e97 --- /dev/null +++ b/ASDC.Demo/Properties/Resources.resx @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\AddBack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AddFront.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Deque.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Exit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Inorder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Postorder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Preorder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Queue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RemoveBack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RemoveFront.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Search.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Sort.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Stack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ASDC.Demo/Properties/Settings.Designer.cs b/ASDC.Demo/Properties/Settings.Designer.cs new file mode 100644 index 0000000..ab97efe --- /dev/null +++ b/ASDC.Demo/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ASDC.Demo.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.6.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/ASDC.Demo/Properties/Settings.settings b/ASDC.Demo/Properties/Settings.settings new file mode 100644 index 0000000..033d7a5 --- /dev/null +++ b/ASDC.Demo/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ASDC.Demo/Resources/AddBack.png b/ASDC.Demo/Resources/AddBack.png new file mode 100644 index 0000000..fce67ac Binary files /dev/null and b/ASDC.Demo/Resources/AddBack.png differ diff --git a/ASDC.Demo/Resources/AddFront.png b/ASDC.Demo/Resources/AddFront.png new file mode 100644 index 0000000..a612357 Binary files /dev/null and b/ASDC.Demo/Resources/AddFront.png differ diff --git a/ASDC.Demo/Resources/Clear.png b/ASDC.Demo/Resources/Clear.png new file mode 100644 index 0000000..510b507 Binary files /dev/null and b/ASDC.Demo/Resources/Clear.png differ diff --git a/ASDC.Demo/Resources/Deque.png b/ASDC.Demo/Resources/Deque.png new file mode 100644 index 0000000..d53df81 Binary files /dev/null and b/ASDC.Demo/Resources/Deque.png differ diff --git a/ASDC.Demo/Resources/Exit.png b/ASDC.Demo/Resources/Exit.png new file mode 100644 index 0000000..36654d6 Binary files /dev/null and b/ASDC.Demo/Resources/Exit.png differ diff --git a/ASDC.Demo/Resources/Icon.ico b/ASDC.Demo/Resources/Icon.ico new file mode 100644 index 0000000..08ca794 Binary files /dev/null and b/ASDC.Demo/Resources/Icon.ico differ diff --git a/ASDC.Demo/Resources/Inorder.png b/ASDC.Demo/Resources/Inorder.png new file mode 100644 index 0000000..0465e46 Binary files /dev/null and b/ASDC.Demo/Resources/Inorder.png differ diff --git a/ASDC.Demo/Resources/Open.png b/ASDC.Demo/Resources/Open.png new file mode 100644 index 0000000..b9e1d55 Binary files /dev/null and b/ASDC.Demo/Resources/Open.png differ diff --git a/ASDC.Demo/Resources/Postorder.png b/ASDC.Demo/Resources/Postorder.png new file mode 100644 index 0000000..c9742c4 Binary files /dev/null and b/ASDC.Demo/Resources/Postorder.png differ diff --git a/ASDC.Demo/Resources/Preorder.png b/ASDC.Demo/Resources/Preorder.png new file mode 100644 index 0000000..0cee8ff Binary files /dev/null and b/ASDC.Demo/Resources/Preorder.png differ diff --git a/ASDC.Demo/Resources/Queue.png b/ASDC.Demo/Resources/Queue.png new file mode 100644 index 0000000..59b8f49 Binary files /dev/null and b/ASDC.Demo/Resources/Queue.png differ diff --git a/ASDC.Demo/Resources/RemoveBack.png b/ASDC.Demo/Resources/RemoveBack.png new file mode 100644 index 0000000..1a59d5d Binary files /dev/null and b/ASDC.Demo/Resources/RemoveBack.png differ diff --git a/ASDC.Demo/Resources/RemoveFront.png b/ASDC.Demo/Resources/RemoveFront.png new file mode 100644 index 0000000..38a310a Binary files /dev/null and b/ASDC.Demo/Resources/RemoveFront.png differ diff --git a/ASDC.Demo/Resources/Search.png b/ASDC.Demo/Resources/Search.png new file mode 100644 index 0000000..ed5d30f Binary files /dev/null and b/ASDC.Demo/Resources/Search.png differ diff --git a/ASDC.Demo/Resources/SearchDisabled.png b/ASDC.Demo/Resources/SearchDisabled.png new file mode 100644 index 0000000..c5e76c2 Binary files /dev/null and b/ASDC.Demo/Resources/SearchDisabled.png differ diff --git a/ASDC.Demo/Resources/Sort.png b/ASDC.Demo/Resources/Sort.png new file mode 100644 index 0000000..c3dc691 Binary files /dev/null and b/ASDC.Demo/Resources/Sort.png differ diff --git a/ASDC.Demo/Resources/SortDisabled.png b/ASDC.Demo/Resources/SortDisabled.png new file mode 100644 index 0000000..bd118c5 Binary files /dev/null and b/ASDC.Demo/Resources/SortDisabled.png differ diff --git a/ASDC.Demo/Resources/Stack.png b/ASDC.Demo/Resources/Stack.png new file mode 100644 index 0000000..8afb0bb Binary files /dev/null and b/ASDC.Demo/Resources/Stack.png differ diff --git a/ASDC.Demo/SearchTestWindow.xaml b/ASDC.Demo/SearchTestWindow.xaml new file mode 100644 index 0000000..97a9c35 --- /dev/null +++ b/ASDC.Demo/SearchTestWindow.xaml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/ASDC.Demo/SearchTestWindow.xaml.cs b/ASDC.Demo/SearchTestWindow.xaml.cs new file mode 100644 index 0000000..180ff24 --- /dev/null +++ b/ASDC.Demo/SearchTestWindow.xaml.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows; +using ASDC.Data; + +namespace ASDC.Demo +{ + /// + /// Логика взаимодействия для SearchTestWindow.xaml + /// + public partial class SearchTestWindow : Window + { + + public SearchTestWindow() + { + InitializeComponent(); + + } + + /// + /// Открывает окно с результатами сложности поиска в таблице и возвращается только после закрытия нового открытого окна. + /// + /// Тип строк в таблице . + /// Тип ключа в таблице . + /// Таблица для по которой должна быть представлена информация о сложности поиска. + /// Значение типа указывающий, принято ли действие (true) или отменено (false). Возвращаемое значение является значением свойства перед закрытием окна. + public bool? ShowDialog(Table source) where TKey : IComparable + { + dataGrid.Items.Add(new { Algorithm = "Linear", Complexity = SearchComplexity(source, Search.Extensions.LinearSearch, source.KeySelector), TheoreticalComplexity = (source.Rows.Count + 1) / 2.0 }); + dataGrid.Items.Add(new { Algorithm = "Binary", Complexity = SearchComplexity(source, Search.Extensions.BinarySearch, source.KeySelector), TheoreticalComplexity = Math.Log(source.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Tree", Complexity = SearchComplexity(source, Search.Extensions.TreeSearch, source.KeySelector), TheoreticalComplexity = Math.Log(source.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Hash", Complexity = SearchComplexity(source, Search.Extensions.HashSearch, source.KeySelector), TheoreticalComplexity = 1 + (source.Rows.Count - 1) / (2.0 * ((IHashTable)source).Entries.Length) }); + return ShowDialog(); + } + + private double SearchComplexity(Table source, Func, Func, TKey, (IEnumerable result, int comparisionsCount)> searchFunction, Func keySelector) where TKey : IComparable + { + return source.Rows.Sum(row => searchFunction(source, keySelector, keySelector(row)).comparisionsCount) / (double)source.Rows.Count; + } + + } +} diff --git a/ASDC.Demo/SortTestWindow.xaml b/ASDC.Demo/SortTestWindow.xaml new file mode 100644 index 0000000..911867d --- /dev/null +++ b/ASDC.Demo/SortTestWindow.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/ASDC.Demo/SortTestWindow.xaml.cs b/ASDC.Demo/SortTestWindow.xaml.cs new file mode 100644 index 0000000..e0e8b97 --- /dev/null +++ b/ASDC.Demo/SortTestWindow.xaml.cs @@ -0,0 +1,58 @@ +using System; +using System.Windows; +using ASDC.Data; +using ASDC.Sort; +using static System.Math; + +namespace ASDC.Demo +{ + /// + /// Логика взаимодействия для SortTestWindow.xaml + /// + public partial class SortTestWindow : Window + { + public SortTestWindow() + { + InitializeComponent(); + + } + + + +#if DEBUG + public bool? ShowDialog(CitizenTable table) + { + Func keySelector = (row => (row.FirstName, row.LastName)); + dataGrid.Items.Add(new { Algorithm = "Bubble", MinComplexity = table.Rows.Count, Complexity = table.BubbleSort(keySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Quick", MinComplexity = table.Rows.Count * Log(table.Rows.Count, 2), Complexity = table.QuickSort(keySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Selection", MinComplexity = Pow(table.Rows.Count, 2), Complexity = table.SelectionSort(keySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Heap", MinComplexity = table.Rows.Count * Log(table.Rows.Count, 2), Complexity = table.HeapSort(keySelector).comparisonsCount, MaxComplexity = table.Rows.Count * Log(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Insertion", MinComplexity = table.Rows.Count, Complexity = table.InsertSort(keySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Shell", MinComplexity = table.Rows.Count * Log(table.Rows.Count, 2), Complexity = table.ShellSort(keySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + + return ShowDialog(); + } +#else + /// + /// Открывает окно с результатами сложности сортировки в таблице и возвращается только после закрытия нового открытого окна. + /// + /// Тип строк в таблице . + /// Тип ключа в таблице . + /// Таблица для по которой должна быть представлена информация о сложности сортировки. + /// Значение типа указывающий, принято ли действие (true) или отменено (false). Возвращаемое значение является значением свойства перед закрытием окна. + public bool? ShowDialog(Table table) where TKey : IComparable + { + + dataGrid.Items.Add(new { Algorithm = "Bubble", MinComplexity = table.Rows.Count, Complexity = table.BubbleSort(table.KeySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Quick", MinComplexity = table.Rows.Count * Log(table.Rows.Count, 2), Complexity = table.QuickSort(table.KeySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Selection", MinComplexity = Pow(table.Rows.Count, 2), Complexity = table.SelectionSort(table.KeySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Heap", MinComplexity = table.Rows.Count * Log(table.Rows.Count, 2), Complexity = table.HeapSort(table.KeySelector).comparisonsCount, MaxComplexity = table.Rows.Count * Log(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Insert", MinComplexity = table.Rows.Count, Complexity = table.InsertSort(table.KeySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + dataGrid.Items.Add(new { Algorithm = "Shell", MinComplexity = table.Rows.Count * Log(table.Rows.Count, 2), Complexity = table.ShellSort(table.KeySelector).comparisonsCount, MaxComplexity = Pow(table.Rows.Count, 2) }); + + return ShowDialog(); + } +#endif + + } +} diff --git a/ASDC.Demo/TreeWindow.xaml b/ASDC.Demo/TreeWindow.xaml new file mode 100644 index 0000000..09351cc --- /dev/null +++ b/ASDC.Demo/TreeWindow.xaml @@ -0,0 +1,10 @@ + + + diff --git a/ASDC.Demo/TreeWindow.xaml.cs b/ASDC.Demo/TreeWindow.xaml.cs new file mode 100644 index 0000000..9c02aa5 --- /dev/null +++ b/ASDC.Demo/TreeWindow.xaml.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Windows; +using ASDC.Data; + +namespace ASDC +{ + /// + /// Логика взаимодействия для TreeWindow.xaml + /// + public partial class TreeWindow : Window + { + public TreeWindow(IEnumerable collection) : this() + { + dataGrid.ItemsSource = collection; + } + + public TreeWindow() + { + InitializeComponent(); + } + } +} diff --git a/ASDC.Demo/citizens.bin b/ASDC.Demo/citizens.bin new file mode 100644 index 0000000..c3e9975 Binary files /dev/null and b/ASDC.Demo/citizens.bin differ diff --git a/ASDC.Demo/citizens.min.bin b/ASDC.Demo/citizens.min.bin new file mode 100644 index 0000000..afd14c8 Binary files /dev/null and b/ASDC.Demo/citizens.min.bin differ diff --git a/ASDC.Lab4/ASDC.Lab4.vcxproj b/ASDC.Lab4/ASDC.Lab4.vcxproj new file mode 100644 index 0000000..f51ca2a --- /dev/null +++ b/ASDC.Lab4/ASDC.Lab4.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260} + Win32Proj + ASDCLab4 + 10.0.16299.0 + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\bin\$(Configuration)\ + $(Configuration)\ + + + true + $(SolutionDir)\bin\$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)\bin\$(Configuration)\ + + + false + $(SolutionDir)\bin\$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Use + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/ASDC.Lab4/ASDC.Lab4.vcxproj.filters b/ASDC.Lab4/ASDC.Lab4.vcxproj.filters new file mode 100644 index 0000000..4b7483f --- /dev/null +++ b/ASDC.Lab4/ASDC.Lab4.vcxproj.filters @@ -0,0 +1,78 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;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 + + + {4520a562-82b1-49cc-be43-c1d1f012957c} + + + {2d6d827e-065b-4c23-8b9c-52b195ec5c0d} + + + + + Файлы заголовков + + + Файлы заголовков + + + Файлы заголовков + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\matrix + + + Файлы заголовков\data + + + Файлы заголовков\data + + + + + Исходные файлы + + + Исходные файлы + + + Исходные файлы + + + \ No newline at end of file diff --git a/ASDC.Lab4/_matrix4.h b/ASDC.Lab4/_matrix4.h new file mode 100644 index 0000000..0dee68f --- /dev/null +++ b/ASDC.Lab4/_matrix4.h @@ -0,0 +1,57 @@ +#pragma once + +template +/// +/// , . +/// +class _matrix4 +{ +public: + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + virtual T& at(int i1, int i2, int i3, int i4) = 0; + + /// + /// . + /// + virtual size_t getLength() = 0; + + /// + /// , . + /// + /// , , . + /// 32- , . + virtual int getLength(int dimension) = 0; + + /// + /// , . + /// + /// 32- , . + virtual int getAddCount() = 0; + + /// + /// , . + /// + /// 32- , . + virtual int getMulCount() = 0; + + /// + /// . + /// + /// , , . + /// . + virtual int getLowerBound(int dimension) = 0; + + /// + /// . + /// + /// , , . + /// . + virtual int getUpperBound(int dimension) = 0; +}; diff --git a/ASDC.Lab4/citizen.cpp b/ASDC.Lab4/citizen.cpp new file mode 100644 index 0000000..9a50484 --- /dev/null +++ b/ASDC.Lab4/citizen.cpp @@ -0,0 +1,36 @@ +#include "stdafx.h" +#include "citizen.h" + + +CITIZEN::CITIZEN() +{ + first_name = new char('\0'); + last_name = new char('\0'); + birth = tm(); +} + +CITIZEN::CITIZEN(FILE * file) +{ + fread(&pin, sizeof(int64_t), 1, file); + int count; + fread(&count, sizeof(int), 1, file); + first_name = new char[count + 1]; + fread(first_name, sizeof(char), count, file); + first_name[count] = '\0'; + fread(&count, sizeof(int), 1, file); + last_name = new char[count + 1]; + fread(last_name, sizeof(char), count, file); + last_name[count] = '\0'; + birth = tm(); + fread(&birth.tm_mday, sizeof(int), 1, file); + fread(&birth.tm_mon, sizeof(int), 1, file); + fread(&birth.tm_year, sizeof(int), 1, file); + fread(&gender, sizeof(int), 1, file); +} + + +CITIZEN::~CITIZEN() +{ + //delete[] first_name; + //delete[] last_name; +} diff --git a/ASDC.Lab4/citizen.h b/ASDC.Lab4/citizen.h new file mode 100644 index 0000000..40f2149 --- /dev/null +++ b/ASDC.Lab4/citizen.h @@ -0,0 +1,17 @@ +#pragma once + +class CITIZEN +{ +public: + + int64_t pin; + char* first_name; + char* last_name; + tm birth; + GENDER gender; + + CITIZEN(); + CITIZEN(FILE* file); + ~CITIZEN(); +}; + diff --git a/ASDC.Lab4/citizens222.bin b/ASDC.Lab4/citizens222.bin new file mode 100644 index 0000000..9652f59 Binary files /dev/null and b/ASDC.Lab4/citizens222.bin differ diff --git a/ASDC.Lab4/cmatrix4.h b/ASDC.Lab4/cmatrix4.h new file mode 100644 index 0000000..cfe33eb --- /dev/null +++ b/ASDC.Lab4/cmatrix4.h @@ -0,0 +1,135 @@ +#pragma once +#include "matrix4.h" +#include "resource.h" + +template +/// +/// , , . +/// +class cmatrix4 : public matrix4 +{ +public: + /// + /// . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// + cmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h); + + /// + /// , , . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// , . + /// + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// nullptr. + /// - - + /// . + /// + cmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T* array, size_t length); + + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + /// . + virtual T& at(int i1, int i2, int i3, int i4); + + /// + /// , . + /// + /// 32- , . + int getAddCount(); + + /// + /// , . + /// + /// 32- , . + int getMulCount(); + +private: + int getDimension(int dimension); +}; + +template +inline cmatrix4::cmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h) +{ +} + +template +inline cmatrix4::cmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T * array, size_t length) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h, array, length) +{ +} + +template +inline T & cmatrix4::at(int i1, int i2, int i3, int i4) +{ + if (i1 < matrix4::getLowerBound(1) || i1 > matrix4::getUpperBound(1)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I1); + if (i2 < matrix4::getLowerBound(2) || i2 > matrix4::getUpperBound(2)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I2); + if (i3 < matrix4::getLowerBound(3) || i3 > matrix4::getUpperBound(3)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I3); + if (i4 < matrix4::getLowerBound(4) || i4 > matrix4::getUpperBound(4)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I4); + + return matrix4::_vector[(i1 - this->getLowerBound(1)) * getDimension(1) + (i2 - this->getLowerBound(2)) * getDimension(2) + (i3 - this->getLowerBound(3)) * getDimension(3) + (i4 - this->getLowerBound(4)) * getDimension(4)]; +} + +template +inline int cmatrix4::getDimension(int dimension) +{ + int _dimension[4]; + _dimension[0] = 1; + for (int i = 1; i < dimension; i++) + _dimension[i] = _dimension[i - 1] * matrix4::getLength(i); + return _dimension[dimension - 1]; +} + + +template +inline int cmatrix4::getAddCount() +{ + return 7; +} + +template +inline int cmatrix4::getMulCount() +{ + return 10; +} diff --git a/ASDC.Lab4/cmatrix4m.h b/ASDC.Lab4/cmatrix4m.h new file mode 100644 index 0000000..5b73f0d --- /dev/null +++ b/ASDC.Lab4/cmatrix4m.h @@ -0,0 +1,153 @@ +#pragma once +#include "matrix4.h" +#include "resource.h" + +template +/// +/// , , , . +/// +class cmatrix4m : public matrix4 +{ + int* _dimension; + int _dimensionSum; + +public: + /// + /// . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// + cmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h); + + /// + /// , , . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// , . + /// + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// nullptr. + /// - - + /// . + /// + cmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T* array, size_t length); + + /// + /// , . + /// + ~cmatrix4m(); + + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + /// . + T& at(int i1, int i2, int i3, int i4); + + /// + /// , . + /// + /// 32- , . + virtual int getAddCount(); + + /// + /// , . + /// + /// 32- , . + virtual int getMulCount(); + +private: + int getDimension(int dimension); +}; + +template +inline cmatrix4m::cmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h) +{ + _dimension = new int[4]; + _dimension[0] = 1; + for (int i = 1; i <= 3; i++) + _dimension[i] = _dimension[i - 1] * matrix4::getLength(i); + _dimensionSum = _dimension[0] * this->getLowerBound(1) + _dimension[1] * this->getLowerBound(2) + _dimension[2] * this->getLowerBound(3) + _dimension[3] * this->getLowerBound(4); +} + +template +inline cmatrix4m::cmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T * array, size_t length) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h, array, length) +{ + _dimension = new int[4]; + _dimension[0] = 1; + for (int i = 1; i <= 3; i++) + _dimension[i] = _dimension[i - 1] * matrix4::getLength(i); + _dimensionSum = _dimension[0] * this->getLowerBound(1) + _dimension[1] * this->getLowerBound(2) + _dimension[2] * this->getLowerBound(3) + _dimension[3] * this->getLowerBound(4); +} + +template +inline cmatrix4m::~cmatrix4m() +{ + delete[] _dimension; +} + +template +inline int cmatrix4m::getAddCount() +{ + return 4; +} + +template +inline int cmatrix4m::getMulCount() +{ + return 4; +} + +template +inline int cmatrix4m::getDimension(int dimension) +{ + return _dimension[dimension - 1]; +} + +template +inline T & cmatrix4m::at(int i1, int i2, int i3, int i4) +{ + if (i1 < matrix4::getLowerBound(1) || i1 > matrix4::getUpperBound(1)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I1); + if (i2 < matrix4::getLowerBound(2) || i2 > matrix4::getUpperBound(2)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I2); + if (i3 < matrix4::getLowerBound(3) || i3 > matrix4::getUpperBound(3)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I3); + if (i4 < matrix4::getLowerBound(4) || i4 > matrix4::getUpperBound(4)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I4); + return i1 * getDimension(1) + i2 * getDimension(2) + i3 * getDimension(3) + i4 * getDimension(4) - _dimensionSum; +} diff --git a/ASDC.Lab4/gender.h b/ASDC.Lab4/gender.h new file mode 100644 index 0000000..f8b5800 --- /dev/null +++ b/ASDC.Lab4/gender.h @@ -0,0 +1,6 @@ +#pragma once + +enum GENDER : int +{ + MALE, FEMALE +}; \ No newline at end of file diff --git a/ASDC.Lab4/icmatrix4.h b/ASDC.Lab4/icmatrix4.h new file mode 100644 index 0000000..286ed5b --- /dev/null +++ b/ASDC.Lab4/icmatrix4.h @@ -0,0 +1,156 @@ +#pragma once +#include "matrix4.h" + +template +/// +/// , , , . +/// +class icmatrix4 : public matrix4 +{ + T**** iliffeVector; + +public: + /// + /// . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// + icmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h); + + /// + /// , , . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// , . + /// + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// nullptr. + /// - - + /// . + /// + icmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T* array, size_t length); + + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + /// . + T& at(int i1, int i2, int i3, int i4); + + /// + /// , . + /// + /// 32- , . + int getAddCount(); + + /// + /// , . + /// + /// 32- , . + int getMulCount(); + + +private: + //int getDimension(int index); +}; + +template +inline icmatrix4::icmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h) +{ + int offset = 0; + iliffeVector = new T***[matrix4::getLength(1)] - i1l; + for (int i1 = i1l; i1 <= i1h; i1++) + { + iliffeVector[i1] = new T**[matrix4::getLength(2)] - i2l; + for (int i2 = i2l; i2 <= i2h; i2++) + { + iliffeVector[i1][i2] = new T*[matrix4::getLength(3)] - i3l; + for (int i3 = i3l; i3 <= i3h; i3++) + { + iliffeVector[i1][i2][i3] = &(matrix4::_vector[offset]) - i4l; + offset += matrix4::getLength(4); + } + } + } +} + +template +inline icmatrix4::icmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T * array, size_t length) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h, array, length) +{ + int offset = 0; + iliffeVector = new T***[matrix4::getLength(4)] - i4l; + for (int i4 = i4l; i4 <= i4h; i4++) + { + iliffeVector[i4] = new T**[matrix4::getLength(3)] - i3l; + for (int i3 = i3l; i3 <= i3h; i3++) + { + iliffeVector[i4][i3] = new T*[matrix4::getLength(2)] - i2l; + for (int i2 = i2l; i2 <= i2h; i2++) + { + iliffeVector[i4][i3][i2] = &(matrix4::_vector[offset]) - i1l; + offset += matrix4::getLength(1); + } + } + } + +} + +template +inline T & icmatrix4::at(int i1, int i2, int i3, int i4) +{ + if (i1 < matrix4::getLowerBound(1) || i1 > matrix4::getUpperBound(1)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I1); + if (i2 < matrix4::getLowerBound(2) || i2 > matrix4::getUpperBound(2)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I2); + if (i3 < matrix4::getLowerBound(3) || i3 > matrix4::getUpperBound(3)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I3); + if (i4 < matrix4::getLowerBound(4) || i4 > matrix4::getUpperBound(4)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I4); + return iliffeVector[i4][i3][i2][i1]; +} + +template +inline int icmatrix4::getAddCount() +{ + return 0; +} + +template +inline int icmatrix4::getMulCount() +{ + return 0; +} \ No newline at end of file diff --git a/ASDC.Lab4/ilmatrix4.h b/ASDC.Lab4/ilmatrix4.h new file mode 100644 index 0000000..34379ef --- /dev/null +++ b/ASDC.Lab4/ilmatrix4.h @@ -0,0 +1,189 @@ +#pragma once +#include "matrix4.h" + +template +/// +/// , , , . +/// +class ilmatrix4 : public matrix4 +{ + T**** iliffeVector; + +public: + /// + /// . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// + ilmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h); + + /// + /// , , . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// , . + /// + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// nullptr. + /// - - + /// . + /// + ilmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T* array, size_t length); + + /// + /// , . + /// + ~ilmatrix4(); + + /// + /// , . + /// + /// 32- , . + int getAddCount(); + + /// + /// , . + /// + /// 32- , . + int getMulCount(); + + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + /// . + T& at(int i1, int i2, int i3, int i4); + + int getComplexity(); + +private: + int getDimension(int index); +}; + +template +inline ilmatrix4::ilmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h) +{ + int offset = 0; + iliffeVector = new T***[matrix4::getLength(1)] - i1l; + for (int i1 = i1l; i1 <= i1h; i1++) + { + iliffeVector[i1] = new T**[matrix4::getLength(2)] - i2l; + for (int i2 = i2l; i2 <= i2h; i2++) + { + iliffeVector[i1][i2] = new T*[matrix4::getLength(3)] - i3l; + for (int i3 = i3l; i3 <= i3h; i3++) + { + iliffeVector[i1][i2][i3] = &(matrix4::_vector[offset]) - i4l; + offset += matrix4::getLength(4); + } + } + } +} + +template +inline ilmatrix4::ilmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T * array, size_t length) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h, array, length) +{ + int offset = 0; + iliffeVector = new T***[matrix4::getLength(1)] - i1l; + for (int i1 = i1l; i1 <= i1h; i1++) + { + iliffeVector[i1] = new T**[matrix4::getLength(2)] - i2l; + for (int i2 = i2l; i2 <= i2h; i2++) + { + iliffeVector[i1][i2] = new T*[matrix4::getLength(3)] - i3l; + for (int i3 = i3l; i3 <= i3h; i3++) + { + iliffeVector[i1][i2][i3] = &(matrix4::_vector[offset]) - i4l; + offset += matrix4::getLength(4); + } + } + } +} + +template +inline ilmatrix4::~ilmatrix4() +{ + for (int i1 = index[0][0]; i1 <= index[0][1]; i1++) + { + for (int i2 = index[1][0]; i2 <= index[1][1]; i2++) + { + for (int i3 = index[2][0]; i3 <= index[2][1]; i3++) + delete[] iliffeVector[i1][i2][i3]; + delete[] iliffeVector[i1][i2]; + } + delete[] iliffeVector[i1]; + } + delete[] iliffeVector; +} + +template +inline int ilmatrix4::getAddCount() +{ + return 0; +} + +template +inline int ilmatrix4::getMulCount() +{ + return 0; +} + +template +inline T & ilmatrix4::at(int i1, int i2, int i3, int i4) +{ + if (i1 < matrix4::getLowerBound(1) || i1 > matrix4::getUpperBound(1)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I1); + if (i2 < matrix4::getLowerBound(2) || i2 > matrix4::getUpperBound(2)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I2); + if (i3 < matrix4::getLowerBound(3) || i3 > matrix4::getUpperBound(3)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I3); + if (i4 < matrix4::getLowerBound(4) || i4 > matrix4::getUpperBound(4)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I4); + return iliffeVector[i1][i2][i3][i4]; +} + +template +inline int ilmatrix4::getComplexity() +{ + return matrix4::getLength() * 4; +} + +template +inline int ilmatrix4::getDimension(int index) +{ + return 0; +} diff --git a/ASDC.Lab4/lmatrix4.h b/ASDC.Lab4/lmatrix4.h new file mode 100644 index 0000000..6759d8e --- /dev/null +++ b/ASDC.Lab4/lmatrix4.h @@ -0,0 +1,135 @@ +#pragma once +#include "matrix4.h" +#include "resource.h" + +template +/// +/// , , . +/// +class lmatrix4 : public matrix4 +{ + +public: + /// + /// . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// + lmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h); + + /// + /// , , . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// , . + /// + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// nullptr. + /// - - + /// . + /// + lmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T* array, size_t length); + + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + /// . + T& at(int i1, int i2, int i3, int i4); + + /// + /// , . + /// + /// 32- , . + int getAddCount(); + + /// + /// , . + /// + /// 32- , . + int getMulCount(); + +private: + int getDimension(int dimension); +}; + +template +inline lmatrix4::lmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h) +{ +} + +template +inline lmatrix4::lmatrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T * array, size_t length) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h, array, length) +{ +} + +template +inline int lmatrix4::getDimension(int dimension) +{ + int _dimension[4]; + _dimension[3] = 1; + for (int i = 2; i >= dimension - 1; i--) + _dimension[i] = _dimension[i + 1] * matrix4::getLength(i + 2); + return _dimension[dimension - 1]; +} + +template +inline T & lmatrix4::at(int i1, int i2, int i3, int i4) +{ + if (i1 < matrix4::getLowerBound(1) || i1 > matrix4::getUpperBound(1)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I1); + if (i2 < matrix4::getLowerBound(2) || i2 > matrix4::getUpperBound(2)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I2); + if (i3 < matrix4::getLowerBound(3) || i3 > matrix4::getUpperBound(3)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I3); + if (i4 < matrix4::getLowerBound(4) || i4 > matrix4::getUpperBound(4)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I4); + + return matrix4::_vector[(i1 - this->getLowerBound(1)) * getDimension(1) + (i2 - this->getLowerBound(2)) * getDimension(2) + (i3 - this->getLowerBound(3)) * getDimension(3) + (i4 - this->getLowerBound(4)) * getDimension(4)]; +} + +template +inline int lmatrix4::getAddCount() +{ + return 7; +} + +template +inline int lmatrix4::getMulCount() +{ + return 10; +} diff --git a/ASDC.Lab4/lmatrix4m.h b/ASDC.Lab4/lmatrix4m.h new file mode 100644 index 0000000..ccd4a5a --- /dev/null +++ b/ASDC.Lab4/lmatrix4m.h @@ -0,0 +1,153 @@ +#pragma once +#include "matrix4.h" +#include "resource.h" + +template +/// +/// , , , . +/// +class lmatrix4m : public matrix4 +{ + int* _dimension; + int _dimensionSum; + +public: + /// + /// . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// + lmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h); + + /// + /// , , . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// , . + /// + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// nullptr. + /// - - + /// . + /// + lmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T* array, size_t length); + + /// + /// , . + /// + ~lmatrix4m(); + + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + /// . + T& at(int i1, int i2, int i3, int i4); + + /// + /// , . + /// + /// 32- , . + int getAddCount(); + + /// + /// , . + /// + /// 32- , . + int getMulCount(); + +private: + int getDimension(int dimension); +}; + +template +inline lmatrix4m::lmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h) +{ + _dimension = new int[4]; + _dimension[3] = 1; + for (int i = 2; i >= 0; i--) + _dimension[i] = _dimension[i + 1] * matrix4::getLength(i + 2); + _dimensionSum = _dimension[0] * this->getLowerBound(1) + _dimension[1] * this->getLowerBound(2) + _dimension[2] * this->getLowerBound(3) + _dimension[3] * this->getLowerBound(4); +} + +template +inline lmatrix4m::lmatrix4m(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T * array, size_t length) : matrix4::matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h, array, length) +{ + _dimension = new int[4]; + _dimension[3] = 1; + for (int i = 2; i >= 0; i--) + _dimension[i] = _dimension[i + 1] * matrix4::getLength(i + 2); + _dimensionSum = _dimension[0] * this->getLowerBound(1) + _dimension[1] * this->getLowerBound(2) + _dimension[2] * this->getLowerBound(3) + _dimension[3] * this->getLowerBound(4); +} + +template +inline lmatrix4m::~lmatrix4m() +{ + delete[] _dimension; +} + +template +inline T & lmatrix4m::at(int i1, int i2, int i3, int i4) +{ + if (i1 < matrix4::getLowerBound(1) || i1 > matrix4::getUpperBound(1)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I1); + if (i2 < matrix4::getLowerBound(2) || i2 > matrix4::getUpperBound(2)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I2); + if (i3 < matrix4::getLowerBound(3) || i3 > matrix4::getUpperBound(3)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I3); + if (i4 < matrix4::getLowerBound(4) || i4 > matrix4::getUpperBound(4)) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_I4); + return matrix4::_vector[i1 * getDimension(1) + i2 * getDimension(2) + i3 * getDimension(3) + i4 * getDimension(4) - _dimensionSum]; +} + +template +inline int lmatrix4m::getAddCount() +{ + return 4; +} + +template +inline int lmatrix4m::getDimension(int dimension) +{ + return _dimension[dimension - 1]; +} + +template +inline int lmatrix4m::getMulCount() +{ + return 4; +} diff --git a/ASDC.Lab4/main.cpp b/ASDC.Lab4/main.cpp new file mode 100644 index 0000000..bcc0264 Binary files /dev/null and b/ASDC.Lab4/main.cpp differ diff --git a/ASDC.Lab4/matrix.h b/ASDC.Lab4/matrix.h new file mode 100644 index 0000000..67a6acf --- /dev/null +++ b/ASDC.Lab4/matrix.h @@ -0,0 +1,10 @@ +#pragma once + +#include "_matrix4.h" +#include "matrix4.h" +#include "cmatrix4.h" +#include "cmatrix4m.h" +#include "lmatrix4.h" +#include "lmatrix4m.h" +#include "icmatrix4.h" +#include "ilmatrix4.h" \ No newline at end of file diff --git a/ASDC.Lab4/matrix4.h b/ASDC.Lab4/matrix4.h new file mode 100644 index 0000000..06de7b8 --- /dev/null +++ b/ASDC.Lab4/matrix4.h @@ -0,0 +1,220 @@ +#pragma once +#include "_matrix4.h" +#include "resource.h" + +template +/// +/// , . +/// +class matrix4 : public _matrix4 +{ + int** index; + size_t* length; +protected: + T* _vector; + +public: + /// + /// . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// + matrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h); + + /// + /// , , . + /// + /// . + /// + /// . + /// . + /// . + /// . + /// . + /// . + /// , . + /// + /// + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// . + /// - - + /// nullptr. + /// - - + /// . + /// + matrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T* array, size_t length); + + /// + /// , . + /// + ~matrix4(); + + /// + /// . + /// + /// , . + /// , . + /// , . + /// , . + /// , . + /// . + virtual T& at(int i1, int i2, int i3, int i4) = 0; + + /// + /// . + /// + size_t getLength(); + + /// + /// , . + /// + /// , , . + /// 32- , . + /// + /// . + /// - - + /// . + /// + int getLength(int dimension); + + + /// + /// , . + /// + /// 32- , . + virtual int getAddCount() = 0; + + /// + /// , . + /// + /// 32- , . + virtual int getMulCount() = 0; + + /// + /// . + /// + /// , , . + /// . + /// + /// . + /// - - + /// . + /// + int getLowerBound(int dimension); + + /// + /// . + /// + /// , , . + /// . + /// + /// . + /// - - + /// . + /// + int getUpperBound(int dimension); + +private: + /*virtual int getDimension(int index) = 0;*/ +}; + +template +inline matrix4::matrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h) +{ + if (i1l > i1h) + throw std::invalid_argument(MESSAGE_INVALID_ARGUMENT_I1); + if (i2l > i2h) + throw std::invalid_argument(MESSAGE_INVALID_ARGUMENT_I2); + if (i3l > i3h) + throw std::invalid_argument(MESSAGE_INVALID_ARGUMENT_I3); + if (i4l > i4h) + throw std::invalid_argument(MESSAGE_INVALID_ARGUMENT_I4); + index = new int*[4]; + for (size_t i = 0; i < 4; i++) + index[i] = new int[2]; + index[0][0] = i1l; + index[0][1] = i1h; + index[1][0] = i2l; + index[1][1] = i2h; + index[2][0] = i3l; + index[2][1] = i3h; + index[3][0] = i4l; + index[3][1] = i4h; + length = new size_t[5]; + for (size_t i = 0; i < 4; i++) + length[i + 1] = abs(index[i][1] - index[i][0]) + 1; + length[0] = length[1] * length[2] * length[3] * length[4]; + _vector = new T[length[0]]; +} + +template +inline matrix4::matrix4(int i1l, int i1h, int i2l, int i2h, int i3l, int i3h, int i4l, int i4h, T * array, size_t length) : matrix4(i1l, i1h, i2l, i2h, i3l, i3h, i4l, i4h) +{ + if (array == nullptr) + throw std::invalid_argument(MESSAGE_INVALID_ARGUMENT_ARRAY); + int l = length < this->length[0] ? length : this->length[0]; + for (int i = 0; i < l; i++) + _vector[i] = array[i]; +} + +template +inline matrix4::~matrix4() +{ + for (size_t i = 0; i < 4; i++) + delete[] index[i]; + delete[] index; + delete[] _vector; +} + +template +inline size_t matrix4::getLength() +{ + return length[0]; +} + +template +inline int matrix4::getLength(int dimension) +{ + if (dimension < 1 || dimension > 4) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_DIMENSION); + return length[dimension]; +} + +template +inline int matrix4::getLowerBound(int dimension) +{ + if (dimension < 1 || dimension > 4) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_DIMENSION); + return index[dimension - 1][0]; +} + +template +inline int matrix4::getUpperBound(int dimension) +{ + if (dimension < 1 || dimension > 4) + throw std::out_of_range(MESSAGE_OUT_OF_RANGE_DIMENSION); + return index[dimension - 1][1]; +} + + + diff --git a/ASDC.Lab4/resource.h b/ASDC.Lab4/resource.h new file mode 100644 index 0000000..5061f18 --- /dev/null +++ b/ASDC.Lab4/resource.h @@ -0,0 +1,12 @@ +#pragma once + +#define MESSAGE_OUT_OF_RANGE_DIMENSION " \"dimension\" 1 4." +#define MESSAGE_OUT_OF_RANGE_I1 " \"i1\" ." +#define MESSAGE_OUT_OF_RANGE_I2 " \"i2\" ." +#define MESSAGE_OUT_OF_RANGE_I3 " \"i3\" ." +#define MESSAGE_OUT_OF_RANGE_I4 " \"i4\" ." +#define MESSAGE_INVALID_ARGUMENT_I1 " \"i1l\" \"i1h\"." +#define MESSAGE_INVALID_ARGUMENT_I2 " \"i2l\" \"i2h\"." +#define MESSAGE_INVALID_ARGUMENT_I3 " \"i3l\" \"i3h\"." +#define MESSAGE_INVALID_ARGUMENT_I4 " \"i4l\" \"i4h\"." +#define MESSAGE_INVALID_ARGUMENT_ARRAY "\"array\" nullptr." \ No newline at end of file diff --git a/ASDC.Lab4/stdafx.cpp b/ASDC.Lab4/stdafx.cpp new file mode 100644 index 0000000..bd8fbed Binary files /dev/null and b/ASDC.Lab4/stdafx.cpp differ diff --git a/ASDC.Lab4/stdafx.h b/ASDC.Lab4/stdafx.h new file mode 100644 index 0000000..ec342c8 Binary files /dev/null and b/ASDC.Lab4/stdafx.h differ diff --git a/ASDC.Lab4/targetver.h b/ASDC.Lab4/targetver.h new file mode 100644 index 0000000..ee45e5c Binary files /dev/null and b/ASDC.Lab4/targetver.h differ diff --git a/ASDC.sln b/ASDC.sln new file mode 100644 index 0000000..a1e0cfa --- /dev/null +++ b/ASDC.sln @@ -0,0 +1,63 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2027 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ASDC.Demo", "ASDC.Demo\ASDC.Demo.csproj", "{05737572-92DD-4A52-A098-78FB96F9CB5A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ASDC", "ASDC\ASDC.csproj", "{6B1F81B6-002F-467E-BAC5-007E0F8304D6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ASDC.Lab4", "ASDC.Lab4\ASDC.Lab4.vcxproj", "{9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Debug|x64.ActiveCfg = Debug|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Debug|x64.Build.0 = Debug|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Debug|x86.ActiveCfg = Debug|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Debug|x86.Build.0 = Debug|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Release|Any CPU.Build.0 = Release|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Release|x64.ActiveCfg = Release|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Release|x64.Build.0 = Release|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Release|x86.ActiveCfg = Release|Any CPU + {05737572-92DD-4A52-A098-78FB96F9CB5A}.Release|x86.Build.0 = Release|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Debug|x64.ActiveCfg = Debug|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Debug|x64.Build.0 = Debug|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Debug|x86.ActiveCfg = Debug|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Debug|x86.Build.0 = Debug|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Release|Any CPU.Build.0 = Release|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Release|x64.ActiveCfg = Release|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Release|x64.Build.0 = Release|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Release|x86.ActiveCfg = Release|Any CPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6}.Release|x86.Build.0 = Release|Any CPU + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Debug|x64.ActiveCfg = Debug|x64 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Debug|x64.Build.0 = Debug|x64 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Debug|x86.ActiveCfg = Debug|Win32 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Debug|x86.Build.0 = Debug|Win32 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Release|Any CPU.ActiveCfg = Release|Win32 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Release|x64.ActiveCfg = Release|x64 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Release|x64.Build.0 = Release|x64 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Release|x86.ActiveCfg = Release|Win32 + {9BE548AE-7068-44D7-9C9D-4AFEA6F0C260}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9979FE81-BB9D-46E2-936C-C71E283E13BF} + EndGlobalSection +EndGlobal diff --git a/ASDC/ASDC.csproj b/ASDC/ASDC.csproj new file mode 100644 index 0000000..25cd71f --- /dev/null +++ b/ASDC/ASDC.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {6B1F81B6-002F-467E-BAC5-007E0F8304D6} + Library + Properties + ASDC + ASDC + v4.7 + 512 + + + true + full + false + ..\bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + none + true + ..\bin\Release\ + + + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ASDC/Collections/BinaryTree.cs b/ASDC/Collections/BinaryTree.cs new file mode 100644 index 0000000..1d01f96 --- /dev/null +++ b/ASDC/Collections/BinaryTree.cs @@ -0,0 +1,462 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ASDC.Collections +{ + /// + /// Представляет строго типизированное бинарное дерево поиска. + /// + /// Тип элементов в бинарном дереве поиска. + public class BinarySearchTree : IEnumerable where T : IComparable + { + + #region ~Fields~ + + BinaryNode _root; + + #endregion + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public BinarySearchTree() + { + Count = 0; + } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Последовательность, элементы которой копируются в двоичное дерево поиска. + /// Свойство имеет значение . + public BinarySearchTree(IEnumerable collection) : this() + { + foreach (var item in collection) + Add(item); + } + + #endregion + + #region ~Properties~ + + public int Count { get; private set; } + + #endregion + + #region ~Methods~ + + /// + /// Добавляет объект в указанное поддерево двоичного дерева поиска . + /// + /// Поддерево, в которое будет добавлен элемент. + /// Объект, добавляемый в двоичное дерево поиска . Для ссылочных типов допускается значение . + private void Add(BinaryNode node, T item) + { + var itemNode = new BinaryNode(item); + var current = _root; + while (current != null) + switch (item.CompareTo(current.Value)) + { + case -1: + if (current.Left == null) + { + current.Left = itemNode; + Count++; + return; + } + else + current = current.Left; + break; + case 0: + throw new ArgumentException("Элемент с указанным ключём уже существует!", nameof(item)); + case 1: + if (current.Right == null) + { + current.Right = itemNode; + Count++; + return; + } + else + current = current.Right; + break; + default: + throw new Exception("Если вы видите эту ошибку, срочно напишите об этом на адрес kozakovi4@yandex.ru!"); + } + _root = itemNode; + Count++; + } + + /// + /// Добавляет объект в двоичное дерево поиска . + /// + /// Объект, добавляемый в двоичное дерево поиска . Для ссылочных типов допускается значение . + public void Add(T item) => Add(_root, item); + + /// + /// Удаляет первое вхождение указанного объекта из двоичного дерева поиска . + /// + /// Объект, который необходимо удалить из двоичного дерева поиска . Для ссылочных типов допускается значение . + /// Значение , если элемент успешно удален, в противном случае — значение . Этот метод также возвращает , если элемент не найден в односвязном списке . + public bool Remove(T item) + { + BinaryNode current = _root, parent = null; + bool left = false; + if (current == null) + return false; + if (item.CompareTo(current.Value) == 0) + { + _root = null; + Count--; + } + else + while (current != null) + { + switch (item.CompareTo(current.Value)) + { + case -1: + left = true; + parent = current; + current = current.Left; + break; + case 0: + if (left) + parent.Left = null; + else + parent.Right = null; + using (var enumerator = GetPreorderEnumerator(current)) + { + enumerator.MoveNext(); + while(enumerator.MoveNext()) + Add(parent, enumerator.Current); + } + Count--; + return true; + case 1: + left = false; + parent = current; + current = current.Right; + break; + } + } + return false; + } + + /// + /// Выполняет прямой обход двоичного дерева . + /// + /// Последовательность, в которой обрабатываются корни поддеревьев. + public IEnumerable PreorderTraverse() + { + var result = new List(Count); + using (var enumerator = GetPreorderEnumerator()) + while (enumerator.MoveNext()) + result.Add(enumerator.Current); + return result; + } + + /// + /// Выполняет прямой обход двоичного дерева . + /// + /// Действие, которое будет выполнено над корнями поддеревьев. + public void PreorderTraverse(Action action) + { + using (var enumerator = GetPreorderEnumerator()) + while (enumerator.MoveNext()) + action(enumerator.Current); + } + + /// + /// Выполняет симметричный обход двоичного дерева . + /// + /// Последовательность, в которой обрабатываются корни поддеревьев. + public IEnumerable InorderTraverse() + { + var result = new List(Count); + using (var enumerator = GetInorderEnumerator()) + while (enumerator.MoveNext()) + result.Add(enumerator.Current); + return result; + } + + /// + /// Выполняет симметричный обход двоичного дерева . + /// + /// Действие, которое будет выполнено над корнями поддеревьев. + public void InorderTraverse(Action action) + { + using (var enumerator = GetInorderEnumerator()) + while (enumerator.MoveNext()) + action(enumerator.Current); + } + + /// + /// Выполняет обратный обход двоичного дерева . + /// + /// Последовательность, в которой обрабатываются корни поддеревьев. + + public IEnumerable PostorderTraverse() + { + var result = new List(Count); + using (var enumerator = GetPostorderEnumerator()) + while (enumerator.MoveNext()) + result.Add(enumerator.Current); + return result; + } + + /// + /// Выполняет обратный обход двоичного дерева . + /// + /// Действие, которое будет выполнено над корнями поддеревьев. + + public void PostorderTraverse(Action action) + { + using (var enumerator = GetPostorderEnumerator()) + while (enumerator.MoveNext()) + action(enumerator.Current); + } + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов при симметричном обходе двоичного дерева поиска . + /// + /// Новый объект для . + public IEnumerator GetEnumerator() => GetInorderEnumerator(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов при симметричном обходе двоичного дерева поиска . + /// + /// Новый объект для . + IEnumerator IEnumerable.GetEnumerator() => GetInorderEnumerator(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов двоичного дерева поиска . + /// + /// Новый объект для . + + public BinaryEnumerator GetBinaryEnumerator() => new BinaryEnumerator(this); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов при прямом обходе двоичного дерева поиска , начиная с указанного узла. + /// + /// Новый объект для . + private IEnumerator GetPreorderEnumerator(BinaryNode node) + { + Stack stack = new Stack(); + BinaryNode current = node; + while (stack.Count > 0 || current != null) + if (current != null) + { + yield return current.Value; + stack.Push(current); + current = current.Left; + } + else + { + current = stack.Pop(); + current = current.Right; + } + } + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов при прямом обходе двоичного дерева поиска . + /// + /// Новый объект для . + public IEnumerator GetPreorderEnumerator() => GetPreorderEnumerator(_root); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов при симметричном обходе двоичного дерева поиска . + /// + /// Новый объект для . + public IEnumerator GetInorderEnumerator() + { + Stack stack = new Stack(); + BinaryNode current = _root; + while (stack.Count > 0 || current != null) + if (current != null) + { + stack.Push(current); + current = current.Left; + } + else + { + current = stack.Pop(); + yield return current.Value; + current = current.Right; + } + } + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов при обратном обходе двоичного дерева поиска . + /// + /// Новый объект для . + public IEnumerator GetPostorderEnumerator() + { + Stack stack = new Stack(); + BinaryNode current = _root; + BinaryNode last = null; + while (stack.Count > 0 || current != null) + if (current != null) + { + stack.Push(current); + current = current.Left; + } + else + { + var peeked = stack.Peek(); + if (peeked.Right != null && last != peeked.Right) + current = peeked.Right; + else + { + stack.Pop(); + yield return peeked.Value; + last = peeked; + } + } + } + + #endregion + + #region ~Classes~ + + /// + /// Представляет собой узел двоичного дерева. + /// + /// Тип данных, хранящихся в . + private class BinaryNode + { + /// + /// Инициализирует новый класс со значением . + /// + /// + public BinaryNode(T value) + { + Value = value; + } + + /// + /// Корень левого двоичного поддерева. + /// + public BinaryNode Left { get; set; } + + /// + /// Корень правого двоичного поддерева. + /// + public BinaryNode Right { get; set; } + + /// + /// Данные, хранящиеся в текущем узле. + /// + public T Value { get; set; } + + } + + /// + /// Выполняет перечисление элементов двоичного дерева поиска . + /// + public struct BinaryEnumerator : IDisposable + { + + #region ~Fields~ + + // Двоичное дерево. + BinarySearchTree _tree; + + // Корневой узел текущего двоичного поддерева. + private BinaryNode _currentNode; + + // Корневой узел левого двоичного поддерева. + private BinaryNode _leftNode; + + // Корневой узел правого двоичного поддерева. + private BinaryNode _rightNode; + + #endregion + + #region ~Properties~ + + /// + /// Возвращает элемент, расположенный в текущей позиции перечислителя. + /// + /// Элемент односвязного списка , находящийся в текущей позиции перечислителя. + /// Перечеслитель находится в начальном положении, т. е. перед первым элементом коллекции. + public T Current + { + get + { + if (_currentNode == null) + throw new InvalidOperationException(); + return _currentNode.Value; + } + } + + #endregion + + #region ~Constructors~ + + internal BinaryEnumerator(BinarySearchTree tree) + { + _tree = tree; + _currentNode = null; + _leftNode = _rightNode = _tree._root; + } + + #endregion + + #region ~Methods~ + + /// + /// Перемещает перечислитель к левому узлу двоичного дерева . + /// + /// Значение , если перечислитель был успешно перемещен к левому узлу; значение , если перечислитель достиг конца поддерева. + public bool MoveLeft() + { + _currentNode = _leftNode; + if (_currentNode == null) + return false; + _leftNode = _currentNode.Left; + _rightNode = _currentNode.Right; + return true; + } + + /// + /// Перемещает перечислитель к правому узлу двоичного дерева . + /// + /// Значение , если перечислитель был успешно перемещен к правому узлу; значение , если перечислитель достиг конца поддерева. + public bool MoveRight() + { + _currentNode = _rightNode; + if (_currentNode == null) + return false; + _leftNode = _currentNode.Left; + _rightNode = _currentNode.Right; + return true; + } + + /// + /// Устанавливает перечислитель в его начальное положение, т. е. перед первым элементом односвязного списка. + /// + public void Reset() + { + _currentNode = null; + _leftNode = _rightNode = _tree._root; + } + + /// + /// Освобождает все ресурсы, занятые модулем . + /// + public void Dispose() + { + _tree = null; + _currentNode = _leftNode = _rightNode = null; + } + + #endregion + + } + + #endregion + + } +} diff --git a/ASDC/Collections/Deque.cs b/ASDC/Collections/Deque.cs new file mode 100644 index 0000000..1a774f7 --- /dev/null +++ b/ASDC/Collections/Deque.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ASDC.Collections +{ + /// + /// Представляет двустороннюю очередь объектов, основанную на принципе "первым поступил — первым обслужен (FIFO)". + /// + /// Тип элементов в двусторонней очереди. + public class Deque : ICollection, ICollection, ICloneable, IReadOnlyCollection + { + + #region ~Fields~ + + // Внутренний список, на базе которого строится двусторонняя очередь + DoublyLinkedList _list; + + #endregion + + #region ~Properties~ + + /// + /// Получает число элементов, содержащихся в двусторонней очереди . + /// + public int Count => _list.Count; + + /// + /// Получает значение, указывающее, является ли объект доступным только для чтения. + /// + /// Значение , если объект доступен только для чтения; в противном случае — значение . + public bool IsReadOnly => false; + + /// + /// Получает объект, с помощью которого можно синхронизировать доступ к двусторонней очереди . + /// + /// Объект , который может использоваться для синхронизации доступа к двусторонней очереди . + public object SyncRoot { get; } + + /// + /// Возвращает значение, показывающее, является ли доступ к двусторонней очереди синхронизированным (потокобезопасным). + /// + /// , если доступ к двусторонней очереди является синхронизированным (потокобезопасным); в противном случае — . Значение по умолчанию — . + public bool IsSynchronized => false; + + #endregion + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public Deque() + { + SyncRoot = new object(); + _list = new DoublyLinkedList(); + } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Коллекция, элементы которой копируются в двустороннюю очередь. + /// Свойство имеет значение . + public Deque(IEnumerable collection) + { + if (collection == null) + throw new ArgumentNullException(nameof(collection)); + SyncRoot = new object(); + _list = new DoublyLinkedList(collection); + } + + #endregion + + #region ~Methods~ + + /// + /// Добавляет объект в конец очереди . + /// + /// Объект, добавляемый в конец очереди . Для ссылочных типов допускается значение . + public void PushBack(T item) => _list.PushFront(item); + + /// + /// Добавляет объект в начало очереди . + /// + /// Объект, добавляемый в начало очереди . Для ссылочных типов допускается значение . + public void PushFront(T item) => _list.PushBack(item); + + /// + /// Удаляет объект из конца очереди и возвращает его. + /// + /// Объект, удаляемый из конца очереди . + /// Очередь является пустой. + public T PopBack() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Очередь пуста."); + var result = _list._head.Value; + _list.Remove(result); + return result; + } + + /// + /// Удаляет объект из начала очереди и возвращает его. + /// + /// Объект, удаляемый из начала очереди . + /// Очередь является пустой. + public T PopFront() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Очередь пуста."); + var result = _list._tail.Value; + _list.Remove(result); + return result; + } + + /// + /// Возвращает объект, находящийся в начале очереди , но не удаляет его. + /// + /// Объект, находящийся в начале очереди . + /// Очередь является пустой. + public T PeekFront() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Очередь пуста."); + return _list._head.Value; + } + + /// + /// Возвращает объект, находящийся в конце очереди , но не удаляет его. + /// + /// Объект, находящийся в конце очереди . + /// Очередь является пустой. + public T PeekBack() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Очередь пуста."); + return _list._tail.Value; + } + + /// + /// Добавляет объект в конец очереди . + /// + /// Объект, добавляемый в конец очереди . Для ссылочных типов допускается значение . + void ICollection.Add(T item) => PushBack(item); + + /// + /// Удаляет все элементы двусторонней очереди . + /// + public void Clear() => _list.Clear(); + + /// + /// Создает неполную копию . + /// + /// Неполная копия . + public object Clone() => new Deque(this); + + /// Операция не поддерживается данным типом коллекций. + public bool Contains(T item) => throw new NotSupportedException(); + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из двусторонней очереди . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходной двусторонней очереди больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(T[] array, int arrayIndex) => _list.CopyTo(array, arrayIndex); + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из двусторонней очереди . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходной двусторонней очереди больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(Array array, int index) => _list.CopyTo(array, index); + + /// Операция не поддерживается данным типом коллекций. + bool ICollection.Remove(T item) => throw new NotSupportedException(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов двусторонней очереди . + /// + /// Новый объект для . + IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов двусторонней очереди . + /// + /// Новый объект для . + IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator(); + + #endregion + + } +} diff --git a/ASDC/Collections/DoublyLinkedList.cs b/ASDC/Collections/DoublyLinkedList.cs new file mode 100644 index 0000000..ca316dc --- /dev/null +++ b/ASDC/Collections/DoublyLinkedList.cs @@ -0,0 +1,476 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ASDC.Collections +{ + /// + /// Представляет строго типизированный двусвязный список объектов. + /// + /// Тип элементов в списке. + public class DoublyLinkedList : ICollection, ICollection, ICloneable, IReadOnlyCollection + { + + #region ~Fields~ + + // Голова двусвязного списка. + internal DoublyNode _head; + + // Хвост двусвязного списка. + internal DoublyNode _tail; + + // Количество элементов в двусвязном списке. + int count; + + #endregion + + #region ~Contructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public DoublyLinkedList() + { + SyncRoot = new object(); + } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Последовательность, элементы которой копируются в новый список. + /// Свойство имеет значение . + public DoublyLinkedList(IEnumerable collection) : this() + { + foreach (var item in collection) + PushBack(item); + } + + #endregion + + #region ~Properties~ + + /// + /// Получает число элементов, содержащихся в двусвязном списке . + /// + public int Count => count; + + /// + /// Получает значение, указывающее, является ли объект доступным только для чтения. + /// + /// Значение , если объект доступен только для чтения; в противном случае — значение . + public bool IsReadOnly => false; + + /// + /// Получает объект, с помощью которого можно синхронизировать доступ к двусвязному списку . + /// + /// Объект , который может использоваться для синхронизации доступа к двусвязному списку . + public object SyncRoot { get; } + + /// + /// Возвращает значение, показывающее, является ли доступ к двусвязному списку синхронизированным (потокобезопасным). + /// + /// , если доступ к является синхронизированным (потокобезопасным); в противном случае — . Значение по умолчанию — . + public bool IsSynchronized { get; } + + #endregion + + #region ~Methods~ + + /// + /// Добавляет объект в конец двусвязного списка . + /// + /// Объект, добавляемый в конец двусвязного списка . Для ссылочных типов допускается значение . + void ICollection.Add(T item) => PushBack(item); + + /// + /// Добавляет объект в конец двусвязного списка . + /// + /// Объект, добавляемый в конец двусвязного списка . Для ссылочных типов допускается значение . + public void PushBack(T item) + { + DoublyNode itemNode = new DoublyNode(item) + { + Back = _tail + }; + if (_head == null) + _head = itemNode; + else + _tail.Next = itemNode; + _tail = itemNode; + count++; + } + + /// + /// Добавляет объект в начало двусвязного списка . + /// + /// Объект, добавляемый в начало двусвязного списка . Для ссылочных типов допускается значение . + public void PushFront(T item) + { + DoublyNode itemNode = new DoublyNode(item) + { + Next = _head + }; + if (_tail == null) + _tail = itemNode; + else + _head.Back = itemNode; + _head = itemNode; + count++; + } + + /// + /// Удаляет все элементы из двусвязного списка . + /// + public void Clear() + { + // Молитва сборщику мусора + _head = _tail = null; + count = 0; + } + + /// + /// Создает неполную копию . + /// + /// Неполная копия . + public object Clone() + { + return new DoublyLinkedList(this); + } + + /// + /// Определяет, входит ли элемент в двусвязный список . + /// + /// Объект для поиска в . Для ссылочных типов допускается значение . + /// Значение , если параметр найден в двусвязном списке ; в противном случае — значение . + public bool Contains(T item) + { + DoublyNode current = _head; + while (current != null && !current.Value.Equals(item)) + current = current.Next; + return current != null; + } + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из двусвязного списка . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходном двусвязном списке больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(T[] array, int arrayIndex) + { + if (array == null) + throw new ArgumentNullException(nameof(array)); + if (arrayIndex < 0) + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + if (array.Length - arrayIndex < count) + throw new ArgumentException("Длина результирующего массива недостаточна.", nameof(arrayIndex)); + using (var enumerator = GetDoublyEnumerator()) + for (int i = arrayIndex; enumerator.MoveNext(); i++) + array[i] = enumerator.Current; + } + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из двусвязного списка . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходном двусвязном списке больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(Array array, int index) + { + if (array == null) + throw new ArgumentNullException(nameof(array)); + if (index < 0) + throw new ArgumentOutOfRangeException(nameof(index)); + if (array.Length - index < count) + throw new ArgumentException("Длина результирующего массива недостаточна.", nameof(index)); + using (var enumerator = GetEnumerator()) + for (int i = index; enumerator.MoveNext(); i++) + array.SetValue(enumerator.Current, i); + } + + /// + /// Вставляет элемент в двусвязный список после элемента, удовлетворяющего условиям указанного предиката. + /// + /// Делегат , определяющий условия поиска элемента. + /// Вставляемый объект. Для ссылочных типов допускается значение . + /// Значение , если элемент успешно вставлен, в противном случае — значение . Этот метод также возвращает , если элемент, удовлетворяющий условиям указанного предиката , не найден в двусвязном списке . + /// Свойство имеет значение . + public bool InsertAfter(Predicate predicate, T item) + { + if (predicate == null) + throw new ArgumentNullException(nameof(predicate)); + DoublyNode current = _head; + while (current != null && !predicate(current.Value)) + current = current.Next; + if (current == null) + return false; + var next = current.Next; + next.Back = current.Next = new DoublyNode(item) + { + Back = current, + Next = current.Next + }; + if (current == _tail) + _tail = current.Next; + count++; + return true; + } + + /// + /// Вставляет элемент в двусвязный список перед элементом, удовлетворяющим условиям указанного предиката. + /// + /// Делегат , определяющий условия поиска элемента. + /// Вставляемый объект. Для ссылочных типов допускается значение . + /// Значение , если элемент успешно вставлен, в противном случае — значение . Этот метод также возвращает , если элемент, удовлетворяющий условиям указанного предиката , не найден в двусвязном списке . + /// Свойство имеет значение . + public bool InsertBefore(Predicate predicate, T item) + { + if (predicate == null) + throw new ArgumentNullException(nameof(predicate)); + DoublyNode current = _tail; + while (current != null && !predicate(current.Value)) + current = current.Back; + if (current == null) + return false; + var back = current.Back; + back.Next = current.Back = new DoublyNode(item) + { + Next = current, + Back = current.Back + }; + if (current == _head) + _head = current.Back; + count++; + return true; + } + + /// + /// Удаляет первое вхождение указанного объекта из двусвязного списка . + /// + /// Объект, который необходимо удалить из двусвязного списка . Для ссылочных типов допускается значение . + /// Значение , если элемент успешно удален, в противном случае — значение . Этот метод также возвращает , если элемент не найден в двусвязном списке . + public bool Remove(T item) + { + var result = false; + if (_head == null || _tail == null) + return result; + DoublyNode current = _head; + if (item.Equals(_head.Value)) + { + _head = _head.Next; + if (_head != null) + _head.Back = null; + else + _tail = null; + result = true; + count--; + } + else if(item.Equals(_tail.Value)) + { + _tail = _tail.Back; + if (_tail != null) + _tail.Next = null; + else + _head = null; + result = true; + count--; + } + else + { + while (current.Next != null && !current.Next.Value.Equals(item)) + current = current.Next; + (current.Next = current.Next.Next).Back = current; + result = true; + count--; + } + return result; + } + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов двусвязного списка . + /// + /// Новый объект для . + public IEnumerator GetEnumerator() => new DoublyEnumerator(this); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов двусвязного списка . + /// + /// Новый объект для . + IEnumerator IEnumerable.GetEnumerator() => new DoublyEnumerator(this); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов двусвязного списка . + /// + /// Новый объект для . + public DoublyEnumerator GetDoublyEnumerator() => new DoublyEnumerator(this); + + #endregion + + #region ~Classes~ + + /// + /// Представляет узел строго типизированного двусвязного списка объектов . + /// + internal class DoublyNode + { + + #region ~Properties~ + + /// + /// Получает следующий узел двусвязного списка . + /// + public DoublyNode Next { get; set; } + + /// + /// Получает предыдущий узел двусвязного списка . + /// + public DoublyNode Back { get; set; } + + /// + /// Получает значение текущего узла двусвязного списка . + /// + public T Value { get; } + + #endregion + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса с указанным в значением. + /// + /// Значение, которое хранится в текущем узле. + public DoublyNode(T value) => Value = value; + + #endregion + + } + + /// + /// Выполняет перечисление элементов двусвязного списка . + /// + public struct DoublyEnumerator : IEnumerator, IDisposable + { + + #region ~Fields~ + + // Односвязный список. + internal DoublyLinkedList _list; + + // Текущий узел двусвязного списка. + internal DoublyNode _currentNode; + + // Следующий узел двусвязного списка. + internal DoublyNode _nextNode; + + // Предыдущий узел двусвязного списка. + internal DoublyNode _backNode; + + #endregion + + #region ~Properties~ + + /// + /// Возвращает элемент, расположенный в текущей позиции перечислителя. + /// + /// Элемент двусвязного списка , находящийся в текущей позиции перечислителя. + /// Перечеслитель находится в начальном положении, т. е. перед первым или после последнего элемента двусвязного списка. + public T Current + { + get + { + if (_currentNode == null) + throw new InvalidOperationException(); + return _currentNode.Value; + } + } + + object IEnumerator.Current => Current; + + #endregion + + #region ~Constructors~ + + internal DoublyEnumerator(DoublyLinkedList list) + { + _list = list; + _currentNode = null; + _nextNode = _list._head; + _backNode = _list._tail; + } + + #endregion + + #region ~Methods~ + + /// + /// Перемещает перечислитель к следующему элементу двусвязного списка . + /// + /// Значение , если перечислитель был успешно перемещен к следующему элементу; значение , если перечислитель достиг конца двусвязного списка. + public bool MoveNext() + { + _backNode = _currentNode; + _currentNode = _nextNode; + if (_currentNode == null) + return false; + _nextNode = _nextNode.Next; + return true; + } + + /// + /// Перемещает перечислитель к предыдущему элементу двусвязного списка . + /// + /// Значение , если перечислитель был успешно перемещен к предыдущему элементу; значение , если перечислитель достиг начала двусвязного списка. + public bool MoveBack() + { + _nextNode = _currentNode; + _currentNode = _backNode; + if (_currentNode == null) + return false; + _backNode = _backNode.Back; + return true; + } + + /// + /// Устанавливает перечислитель в его начальное положение, т. е. перед первым элементом двусвязного списка. + /// + void IEnumerator.Reset() => ResetFront(); + + /// + /// Устанавливает перечислитель в его начальное положение, т. е. перед первым элементом двусвязного списка. + /// + public void ResetFront() + { + _backNode = _currentNode = null; + _nextNode = _list._head; + } + + /// + /// Устанавливает перечислитель в его конечное положение, т. е. после последнего элемента двусвязного списка. + /// + public void ResetBack() + { + _currentNode = _nextNode = null; + _nextNode = _list._head; + } + + /// + /// Освобождает все ресурсы, занятые перечеслителем . + /// + public void Dispose() + { + _list = null; + _backNode = _currentNode = _nextNode = null; + } + + #endregion + + } + + #endregion + + } +} diff --git a/ASDC/Collections/ObservableDeque.cs b/ASDC/Collections/ObservableDeque.cs new file mode 100644 index 0000000..0368295 --- /dev/null +++ b/ASDC/Collections/ObservableDeque.cs @@ -0,0 +1,105 @@ +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; + +namespace ASDC.Collections +{ + /// + /// Представляет двустороннюю очередь объектов, основанную на принципе "первым поступил — первым обслужен (FIFO)", которая выдает уведомления при добавлении и удалении элементов, а также при обновлении очереди. + /// + /// Тип элементов в двусторонней очереди. + public class ObservableDeque : Deque, INotifyCollectionChanged, INotifyPropertyChanged + { + + #region ~Constructors~ + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public ObservableDeque() : base() { } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Коллекция, элементы которой копируются в двустороннюю очередь. + /// Свойство имеет значение . + public ObservableDeque(IEnumerable collection) : base(collection) { } + + #endregion + + #region ~Properties~ + + /// + /// Добавляет объект в конец очереди . + /// + /// Объект, добавляемый в конец очереди . Для ссылочных типов допускается значение . + public new void PushBack(T item) + { + base.PushBack(item); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, Count - 1)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + } + + /// + /// Добавляет объект в начало очереди . + /// + /// Объект, добавляемый в начало очереди . Для ссылочных типов допускается значение . + public new void PushFront(T item) + { + base.PushFront(item); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, 0)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + } + + /// + /// Удаляет объект из конца очереди и возвращает его. + /// + /// Объект, удаляемый из конца очереди . + /// Очередь является пустой. + public new T PopBack() + { + var result = base.PopBack(); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, result, Count)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + return result; + } + + /// + /// Удаляет объект из начала очереди и возвращает его. + /// + /// Объект, удаляемый из начала очереди . + /// Очередь является пустой. + public new T PopFront() + { + var result = base.PopFront(); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, result, 0)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + return result; + } + + /// + /// Удаляет все элементы двусторонней очереди . + /// + public new void Clear() + { + base.Clear(); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + } + + #endregion + + #region ~Events~ + + /// + /// Событие происходит при изменении очереди. + /// + public event NotifyCollectionChangedEventHandler CollectionChanged; + + /// + /// Событие происходит при изменении значения свойства. + /// + public event PropertyChangedEventHandler PropertyChanged; + + #endregion + } +} diff --git a/ASDC/Collections/ObservableQueue.cs b/ASDC/Collections/ObservableQueue.cs new file mode 100644 index 0000000..778a549 --- /dev/null +++ b/ASDC/Collections/ObservableQueue.cs @@ -0,0 +1,83 @@ +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; + +namespace ASDC.Collections +{ + /// + /// Представляет очередь объектов, основанную на принципе "первым поступил — первым обслужен (FIFO)", которая выдает уведомления при добавлении и удалении элементов, а также при обновлении очереди. + /// + /// Тип элементов в очереди. + public class ObservableQueue : Queue, INotifyCollectionChanged, INotifyPropertyChanged + { + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public ObservableQueue() : base() { } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Коллекция, элементы которой копируются в очередь. + /// Свойство имеет значение . + public ObservableQueue(IEnumerable collection) : base(collection) { } + + #endregion + + #region ~Methods~ + + /// + /// Добавляет объект в конец очереди . + /// + /// Объект, добавляемый в коллекцию . Для ссылочных типов допускается значение . + public new void Enqueue(T item) + { + base.Enqueue(item); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, Count)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + } + + /// + /// Удаляет объект из начала очереди и возвращает его. + /// + /// Объект, удаляемый из начала очереди . + /// Очередь является пустой. + public new T Dequeue() + { + var result = base.Dequeue(); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, result, 0)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + return result; + } + + /// + /// Удаляет все элементы очереди . + /// + public new void Clear() + { + base.Clear(); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + } + + #endregion + + #region ~Events~ + + /// + /// Событие происходит при изменении очереди. + /// + public event NotifyCollectionChangedEventHandler CollectionChanged; + + /// + /// Событие происходит при изменении значения свойства. + /// + public event PropertyChangedEventHandler PropertyChanged; + + #endregion + + } +} diff --git a/ASDC/Collections/ObservableStack.cs b/ASDC/Collections/ObservableStack.cs new file mode 100644 index 0000000..e44ad64 --- /dev/null +++ b/ASDC/Collections/ObservableStack.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Text; + +namespace ASDC.Collections +{ + /// + /// Представляет строго типизированный стек объектов, основанный на принципе "последним поступил — первым обслужен (LIFO), который выдает уведомления при добавлении и удалении элементов, а также при обновлении стека. + /// + /// Тип элементов стека. + public class ObservableStack : Stack, INotifyCollectionChanged, INotifyPropertyChanged + { + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public ObservableStack() : base() { } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Последовательность, элементы которой копируются в новый стек. + /// Свойство имеет значение . + public ObservableStack(IEnumerable collection) : base(collection) { } + + #endregion + + #region ~Methods~ + + /// + /// Вставляет объект как верхний элемент стека . + /// + /// Объект, вставляемый в . Для ссылочных типов допускается значение null. + public new void Push(T item) + { + base.Push(item); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, 0)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + } + + /// + /// Удаляет и возвращает объект в начале . + /// + /// Объект, удаляемый из начала . + /// Стек является пустым. + public new T Pop() + { + var result = base.Pop(); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, result, 0)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + return result; + } + + /// + /// Удаляет все элементы стека . + /// + public new void Clear() + { + base.Clear(); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); + } + + #endregion + + #region ~Events~ + + /// + /// Событие происходит при изменении очереди. + /// + public event NotifyCollectionChangedEventHandler CollectionChanged; + + /// + /// Событие происходит при изменении значения свойства. + /// + public event PropertyChangedEventHandler PropertyChanged; + + #endregion + + } +} diff --git a/ASDC/Collections/Queue.cs b/ASDC/Collections/Queue.cs new file mode 100644 index 0000000..38ac829 --- /dev/null +++ b/ASDC/Collections/Queue.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Linq; + +namespace ASDC.Collections +{ + /// + /// Представляет очередь объектов, основанную на принципе "первым поступил — первым обслужен (FIFO)". + /// + /// Тип элементов в очереди. + public class Queue : ICollection, ICollection, ICloneable, IReadOnlyCollection + { + + #region ~Fields~ + + // Внутренний односвязный список, на котором основывается очередь + SinglyLinkedList _list; + + #endregion + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public Queue() + { + _list = new SinglyLinkedList(); + } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Коллекция, элементы которой копируются в очередь. + /// Свойство имеет значение . + public Queue(IEnumerable collection) + { + if (collection == null) + throw new ArgumentNullException(nameof(collection)); + _list = new SinglyLinkedList(collection); + } + + #endregion + + #region ~Properties~ + + /// + /// Получает число элементов, содержащихся в очереди . + /// + public int Count => _list.Count; + + /// + /// Получает значение, указывающее, является ли объект доступным только для чтения. + /// + /// Значение , если объект доступен только для чтения; в противном случае — значение . + public bool IsReadOnly => false; + + /// + /// Получает объект, с помощью которого можно синхронизировать доступ к очереди . + /// + /// Объект , который может использоваться для синхронизации доступа к односвязному списку . + public object SyncRoot => _list.SyncRoot; + + /// + /// Возвращает значение, показывающее, является ли доступ к очереди синхронизированным (потокобезопасным). + /// + /// , если доступ к является синхронизированным (потокобезопасным); в противном случае — . Значение по умолчанию — . + public bool IsSynchronized => _list.IsSynchronized; + + #endregion + + #region ~Methods~ + + /// + /// Добавляет объект в конец очереди . + /// + /// Объект, добавляемый в очередь . Для ссылочных типов допускается значение . + + void ICollection.Add(T item) => Enqueue(item); + + /// + /// Добавляет объект в конец очереди . + /// + /// Объект, добавляемый в очередь . Для ссылочных типов допускается значение . + public void Enqueue(T item) + { + _list.Add(item); + } + + /// + /// Удаляет объект из начала очереди и возвращает его. + /// + /// Объект, удаляемый из начала очереди . + /// Очередь является пустой. + public T Dequeue() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Очередь пуста."); + var result = _list.First(); + _list.Remove(_list.First()); + return result; + } + + /// + /// Возвращает объект, находящийся в начале очереди , но не удаляет его. + /// + /// Объект, находящийся в начале очереди . + /// Очередь является пустой. + public T Peek() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Очередь пуста."); + return _list.First(); + } + + /// + /// Удаляет все элементы очереди . + /// + public void Clear() => _list.Clear(); + + /// + /// Создает неполную копию . + /// + /// Неполная копия . + public object Clone() + { + return new Queue(_list); + } + + /// Операция не поддерживается данным типом коллекций. + public bool Contains(T item) => throw new NotSupportedException(); + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из очереди . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходной очереди больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(T[] array, int arrayIndex) => _list.CopyTo(array, arrayIndex); + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из очереди . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходной очереди больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(Array array, int index) => _list.CopyTo(array, index); + + /// Операция не поддерживается данным типом коллекций. + bool ICollection.Remove(T item) => throw new NotSupportedException(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов очереди . + /// + /// Новый объект для . + public IEnumerator GetEnumerator() => _list.GetEnumerator(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов очереди . + /// + /// Новый объект для . + IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator(); + + #endregion + + } +} diff --git a/ASDC/Collections/SinglyLinkedList.cs b/ASDC/Collections/SinglyLinkedList.cs new file mode 100644 index 0000000..f355a10 --- /dev/null +++ b/ASDC/Collections/SinglyLinkedList.cs @@ -0,0 +1,368 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ASDC.Collections +{ + /// + /// Представляет строго типизированный односвязный список объектов. + /// + /// Тип элементов в списке. + public class SinglyLinkedList : ICollection, ICollection, ICloneable, IReadOnlyCollection + { + + #region ~Fields~ + + // Голова односвязного списка. + private SinglyNode _head; + + // Количество элементов в односвязном списке. + int count; + + #endregion + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public SinglyLinkedList() + { + SyncRoot = new object(); + } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Последовательность, элементы которой копируются в новый список. + /// Свойство имеет значение . + public SinglyLinkedList(IEnumerable collection) : this() + { + if (collection == null) + throw new ArgumentNullException(nameof(collection)); + foreach (var item in collection) + Add(item); + } + + #endregion + + #region ~Properties~ + + /// + /// Получает число элементов, содержащихся в односвязном списке . + /// + public int Count => count; + + /// + /// Получает значение, указывающее, является ли объект доступным только для чтения. + /// + /// Значение , если объект доступен только для чтения; в противном случае — значение . + public bool IsReadOnly => false; + + /// + /// Получает объект, с помощью которого можно синхронизировать доступ к односвязному списку . + /// + /// Объект , который может использоваться для синхронизации доступа к односвязному списку . + public object SyncRoot { get; } + + /// + /// Возвращает значение, показывающее, является ли доступ к односвязному списку синхронизированным (потокобезопасным). + /// + /// , если доступ к является синхронизированным (потокобезопасным); в противном случае — . Значение по умолчанию — . + public bool IsSynchronized => false; + + #endregion + + #region ~Methods~ + + /// + /// Добавляет объект в конец односвязного списка . + /// + /// Объект, добавляемый в конец односвязного списка . Для ссылочных типов допускается значение . + public void Add(T item) + { + SinglyNode itemNode = new SinglyNode(item); + if (_head == null) + _head = itemNode; + else + { + SinglyNode current = _head; + while (current.Next != null) + current = current.Next; + current.Next = itemNode; + } + count++; + } + + /// + /// Удаляет все элементы из односвязного списка . + /// + public void Clear() + { + // Молитва сборщику мусора + _head = null; + count = 0; + } + + /// + /// Создает неполную копию . + /// + /// Неполная копия . + public object Clone() + { + return new SinglyLinkedList(this); + } + + /// + /// Определяет, входит ли элемент в односвязный список . + /// + /// Объект для поиска в . Для ссылочных типов допускается значение . + /// Значение , если параметр найден в односвязном списке ; в противном случае — значение . + public bool Contains(T item) + { + SinglyNode current = _head; + while (current != null && !current.Value.Equals(item)) + current = current.Next; + return current != null; + } + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из односвязного списка . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходном односвязном списке больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(T[] array, int arrayIndex) + { + if (array == null) + throw new ArgumentNullException(nameof(array)); + if (arrayIndex < 0) + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + if (array.Length - arrayIndex < count) + throw new ArgumentException("Длина результирующего массива недостаточна.", nameof(arrayIndex)); + using (var enumerator = GetSinglyEnumerator()) + for (int i = arrayIndex; enumerator.MoveNext(); i++) + array[i] = enumerator.Current; + } + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из односвязного списка . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходном односвязном списке больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(Array array, int index) + { + if (array == null) + throw new ArgumentNullException(nameof(array)); + if (index < 0) + throw new ArgumentOutOfRangeException(nameof(index)); + if (array.Length - index < count) + throw new ArgumentException("Длина результирующего массива недостаточна.", nameof(index)); + using (var enumerator = GetSinglyEnumerator()) + for (int i = index; enumerator.MoveNext(); i++) + array.SetValue(enumerator.Current, i); + } + + /// + /// Вставляет элемент в односвязный список после элемента, удовлетворяющего условиям указанного предиката. + /// + /// Делегат , определяющий условия поиска элемента. + /// Вставляемый объект. Для ссылочных типов допускается значение . + /// Значение , если элемент успешно вставлен, в противном случае — значение . Этот метод также возвращает , если элемент, удовлетворяющий условиям указанного предиката , не найден в односвязном списке . + /// Свойство имеет значение . + public bool Insert(Predicate predicate, T item) + { + if (predicate == null) + throw new ArgumentNullException(nameof(predicate)); + SinglyNode current = _head; + while (current != null && !predicate(current.Value)) + current = current.Next; + if (current == null) + return false; + current.Next = new SinglyNode(item) + { + Next = current.Next + }; + count++; + return true; + } + + /// + /// Удаляет первое вхождение указанного объекта из односвязного списка . + /// + /// Объект, который необходимо удалить из односвязного списка . Для ссылочных типов допускается значение . + /// Значение , если элемент успешно удален, в противном случае — значение . Этот метод также возвращает , если элемент не найден в односвязном списке . + public bool Remove(T item) + { + var result = false; + if (_head == null) + return result; + SinglyNode current = _head; + if (current.Value.Equals(item)) + { + _head = current.Next; + result = true; + count--; + } + else + { + while (current.Next != null && !current.Next.Value.Equals(item)) + current = current.Next; + current.Next = current.Next.Next; + result = true; + count--; + } + return result; + } + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов односвязного списка . + /// + /// Новый объект для . + public IEnumerator GetEnumerator() => new SinglyEnumerator(this); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов односвязного списка . + /// + /// Новый объект для . + IEnumerator IEnumerable.GetEnumerator() => new SinglyEnumerator(this); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов односвязного списка . + /// + /// Новый объект для . + public SinglyEnumerator GetSinglyEnumerator() => new SinglyEnumerator(this); + + #endregion + + #region ~Classes~ + + /// + /// Представляет узел строго типизированного односвязного списка объектов . + /// + internal class SinglyNode + { + + #region ~Properties~ + + /// + /// Получает следующий узел односвязного списка . + /// + public SinglyNode Next { get; set; } + + /// + /// Получает значение текущего узла односвязного списка . + /// + public T Value { get; } + + #endregion + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса с указанным в значением. + /// + /// Значение, которое хранится в текущем узле. + public SinglyNode(T value) => Value = value; + + #endregion + + } + + /// + /// Выполняет перечисление элементов односвязного списка . + /// + public struct SinglyEnumerator : IEnumerator, IDisposable + { + + #region ~Fields~ + + // Односвязный список. + SinglyLinkedList _list; + + // Текущий узел односвязного списка. + internal SinglyNode _currentNode; + + // Следующий узел односвязного списка. + internal SinglyNode _nextNode; + + #endregion + + #region ~Properties~ + + /// + /// Возвращает элемент, расположенный в текущей позиции перечислителя. + /// + /// Элемент односвязного списка , находящийся в текущей позиции перечислителя. + /// Перечеслитель находится в начальном положении, т. е. перед первым элементом коллекции. + public T Current + { + get + { + if (_currentNode == null) + throw new InvalidOperationException(); + return _currentNode.Value; + } + } + + object IEnumerator.Current => Current; + + #endregion + + #region ~Constructors~ + + internal SinglyEnumerator(SinglyLinkedList list) + { + _list = list; + _currentNode = null; + _nextNode = _list._head; + } + + #endregion + + #region ~Methods~ + + /// + /// Перемещает перечислитель к следующему элементу односвязного списка . + /// + /// Значение , если перечислитель был успешно перемещен к следующему элементу; значение , если перечислитель достиг конца односвязного списка. + public bool MoveNext() + { + _currentNode = _nextNode; + if (_currentNode == null) + return false; + _nextNode = _nextNode.Next; + return true; + } + + /// + /// Устанавливает перечислитель в его начальное положение, т. е. перед первым элементом односвязного списка. + /// + public void Reset() + { + _currentNode = null; + _nextNode = _list._head; + } + + /// + /// Освобождает все ресурсы, занятые модулем . + /// + public void Dispose() + { + _list = null; + _currentNode = _nextNode = null; + } + + #endregion + + } + + #endregion + + } +} diff --git a/ASDC/Collections/Stack.cs b/ASDC/Collections/Stack.cs new file mode 100644 index 0000000..fdc51ad --- /dev/null +++ b/ASDC/Collections/Stack.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ASDC.Collections +{ + /// + /// Представляет строго типизированный стек объектов, основанный на принципе "последним поступил — первым обслужен (LIFO). + /// + /// Тип элементов стека. + public class Stack : ICollection, ICollection, ICloneable, IReadOnlyCollection + { + + #region ~Fields~ + + // Двусвязный список, на котором основывается стек + DoublyLinkedList _list; + + #endregion + + #region ~Constructors~ + + /// + /// Инициализирует новый экземпляр класса , который является пустым. + /// + public Stack() + { + _list = new DoublyLinkedList(); + } + + /// + /// Инициализирует новый экземпляр , который содержит элементы, скопированные из указанной коллекции. + /// + /// Последовательность, элементы которой копируются в новый стек. + /// Свойство имеет значение . + public Stack(IEnumerable collection) + { + _list = new DoublyLinkedList(collection); + } + + #endregion + + #region ~Properties~ + + /// + /// Получает число элементов, содержащихся в стеке . + /// + public int Count => _list.Count; + + /// + /// Получает значение, указывающее, является ли объект доступным только для чтения. + /// + /// Значение , если объект доступен только для чтения; в противном случае — значение . + public bool IsReadOnly => false; + + /// + /// Получает объект, с помощью которого можно синхронизировать доступ к стеку . + /// + /// Объект , который может использоваться для синхронизации доступа к стеку . + public object SyncRoot => _list.SyncRoot; + + /// + /// Возвращает значение, показывающее, является ли доступ к стеку синхронизированным (потокобезопасным). + /// + /// , если доступ к является синхронизированным (потокобезопасным); в противном случае — . Значение по умолчанию — . + public bool IsSynchronized => _list.IsSynchronized; + + #endregion + + #region ~Methods~ + + /// + /// Вставляет объект как верхний элемент стека . + /// + /// Объект, вставляемый в . Для ссылочных типов допускается значение null. + public void Push(T item) + { + _list.PushFront(item); + } + + /// + /// Удаляет и возвращает объект в начале . + /// + /// Объект, удаляемый из начала . + /// Стек является пустым. + public T Pop() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Стек пуст."); + var result = _list.First(); + _list.Remove(_list.First()); + return result; + } + + /// + /// Возвращает объект в начале стека , но не удаляет его. + /// + /// Объект, находящийся в начале стека . + /// Стек является пустым. + public T Peek() + { + if (_list.Count <= 0) + throw new InvalidOperationException("Стек пуст."); + return _list.First(); + } + + /// + /// Удаляет все элементы стека . + /// + public void Clear() => _list.Clear(); + + /// + /// Создает неполную копию . + /// + /// Неполная копия . + public object Clone() + { + return new Stack(_list); + } + + /// + /// Вставляет объект как верхний элемент стека . + /// + /// Объект, вставляемый в . Для ссылочных типов допускается значение null. + void ICollection.Add(T item) => Push(item); + + /// Операция не поддерживается данным типом коллекций. + public bool Contains(T item) => throw new NotSupportedException(); + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из стека . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходном стеке больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(T[] array, int arrayIndex) => _list.CopyTo(array, arrayIndex); + + /// + /// Копирует целиком в совместимый одномерный массив, начиная с указанного индекса конечного массива. + /// + /// Одномерный массив , в который копируются элементы из стека . Массив должен иметь индексацию, начинающуюся с нуля. + /// Отсчитываемый от нуля индекс в массиве array, указывающий начало копирования. + /// Свойство имеет значение . + /// Значение параметра меньше 0. + /// Число элементов в исходном стеке больше доступного места от положения, заданного значением параметра , до конца массива назначения . + public void CopyTo(Array array, int index) => _list.CopyTo(array, index); + + /// Операция не поддерживается данным типом коллекций. + bool ICollection.Remove(T item) => throw new NotSupportedException(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов стека . + /// + /// Новый объект для . + public IEnumerator GetEnumerator() => _list.GetEnumerator(); + + /// + /// Возвращает перечислитель, осуществляющий перебор элементов стека . + /// + /// Новый объект для . + IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator(); + + #endregion + + + } +} diff --git a/ASDC/Extensions.cs b/ASDC/Extensions.cs new file mode 100644 index 0000000..ee9474b --- /dev/null +++ b/ASDC/Extensions.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; + +namespace ASDC +{ + /// + /// Общие методы расширения. + /// + public static class Extensions + { + #region ~IList~ + + /// + /// Меняет два элемента списка местами. + /// + /// Тип элементов в списке. + /// Список, в котором будет осуществленна перестановка. + /// Индекс первого из переставляемых объектов. + /// Индекс второго из переставляемых объектов. + internal static void Swap(this IList source, int indexA, int indexB) + { + T temp = source[indexA]; + source[indexA] = source[indexB]; + source[indexB] = temp; + } + + #endregion + + #region ~SearchAlgorithm~ + + /// + /// Получает понятное имя элемента перечислителя. + /// + public static string GetName(this SearchAlgorithm searchAlgorithm) + { + switch (searchAlgorithm) + { + case SearchAlgorithm.Linear: + return "Линейный"; + case SearchAlgorithm.Binary: + return "Бинарный"; + case SearchAlgorithm.BinaryTree: + return "Двоичное дерево"; + case SearchAlgorithm.HashTable: + return "Хэш-таблица"; + default: + return null; + } + } + + #endregion + + #region ~SortAlgorithm~ + + /// + /// Получает понятное имя элемента перечислителя. + /// + public static string GetName(this SortAlgorithm sortAlgorithm) + { + switch (sortAlgorithm) + { + case SortAlgorithm.Bubble: + return "Пузырьковая сортировка"; + case SortAlgorithm.Quick: + return "Быстрая сортировка"; + case SortAlgorithm.Selection: + return "Cортировка выбором"; + case SortAlgorithm.Heap: + return "Пирамидальная сортировка"; + case SortAlgorithm.Insert: + return "Сортировка вставками"; + case SortAlgorithm.Shell: + return "Сортировка Шелла"; + default: + return null; + } + } + + #endregion + + } +} diff --git a/ASDC/IHashTable.cs b/ASDC/IHashTable.cs new file mode 100644 index 0000000..302368f --- /dev/null +++ b/ASDC/IHashTable.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace ASDC +{ + /// + /// Предоставляет структуру хэш-таблицы. + /// + /// Тип элементов . + /// Тип ключа элементов . + public interface IHashTable + { + /// + /// Массив записей хэш-таблицы. + /// + IList[] Entries { get; set; } + + /// + /// Функция распределения хэш-таблицы. + /// + Func HashFunction { get; } + } +} diff --git a/ASDC/ITable.cs b/ASDC/ITable.cs new file mode 100644 index 0000000..3277fc7 --- /dev/null +++ b/ASDC/ITable.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace ASDC +{ + /// + /// Предоставляет структуру таблицы. + /// + /// Тип строк в таблице. + public interface ITable + { + /// + /// Строки таблицы. + /// + IList Rows { get; set; } + } +} diff --git a/ASDC/ITreeTable.cs b/ASDC/ITreeTable.cs new file mode 100644 index 0000000..4df1ba2 --- /dev/null +++ b/ASDC/ITreeTable.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace ASDC +{ + /// + /// Предоставляет структуру древовидной таблицы. + /// + /// Тип строк в таблице. + public interface ITreeTable + { + /// + /// Строки древовидной таблицы. + /// + IList> Rows { get; set; } + } +} diff --git a/ASDC/Properties/AssemblyInfo.cs b/ASDC/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9c2de05 --- /dev/null +++ b/ASDC/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Общие сведения об этой сборке предоставляются следующим набором +// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, +// связанные со сборкой. +[assembly: AssemblyTitle("ASDC")] +[assembly: AssemblyDescription("Лаборатоные работы №1-3")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("USM I1602")] +[assembly: AssemblyProduct("ASDC")] +[assembly: AssemblyCopyright("Copyright Козлович Артём © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми +// для компонентов COM. Если необходимо обратиться к типу в этой сборке через +// COM, задайте атрибуту ComVisible значение TRUE для этого типа. +[assembly: ComVisible(true)] + +// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM +[assembly: Guid("6b1f81b6-002f-467e-bac5-007e0f8304d6")] + +// Сведения о версии сборки состоят из следующих четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер сборки +// Редакция +// +// Можно задать все значения или принять номер сборки и номер редакции по умолчанию. +// используя "*", как показано ниже: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] diff --git a/ASDC/Search/Extensions.cs b/ASDC/Search/Extensions.cs new file mode 100644 index 0000000..0ba464e --- /dev/null +++ b/ASDC/Search/Extensions.cs @@ -0,0 +1,401 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using ASDC.Collections; + +namespace ASDC.Search +{ + /// + /// Методы расширения поиска. + /// + public static class Extensions + { + + #region ~ITable~ + + /// + /// Выполняет линейный поиск в таблице . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Таблица, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static (IEnumerable result, int comparisonsCount) LinearSearch(this ITable source, Func keySelector, TKey keyValue) where TKey : IComparable + { + // Кто переделает все методы поиска для нахождения ВСЕХ элементов, сохраняя технологию поиска, тот... молодец! + // P.S.: Имено для этого все методы возвращают перечисление элементов, а не один элемент. + List result = new List(); + int comparisonsCount = 0; + + foreach (var row in source.Rows) + { + comparisonsCount++; + if (keyValue.CompareTo(keySelector(row)) == 0) + { + result.Add(row); + break; + } + } + return (result, comparisonsCount); + } + + /// + /// Асинхронно выполняет линейный поиск в таблице . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Таблица, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static async Task<(IEnumerable result, int comparisonsCount)> LinearSearchAsync(this ITable source, Func keySelector, TKey keyValue) where TKey : IComparable + { + return await Task.Run(() => source.LinearSearch(keySelector, keyValue)); + } + + /// + /// Выполняет двоичный поиск в отсортированной таблице . + /// + /// Сортировка будет произведена автоматически. + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Таблица, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + /// Параметр или имеет значение . + public static (IEnumerable result, int comparisonsCount) BinarySearch(this ITable source, Func keySelector, TKey keyValue) where TKey : IComparable + { + List result = new List(); + int comparisonsCount = 0; + + IList searchingArea = new List(source.Rows.OrderBy(keySelector)); + int startIndex = 0; + int endIndex = source.Rows.Count; + int i = 0; + do + { + i = startIndex + (endIndex - startIndex) / 2; + comparisonsCount++; + switch (keyValue.CompareTo(keySelector(searchingArea[i]))) + { + case -1: + endIndex = i; + break; + case 0: + result.Add(searchingArea[i]); + startIndex = endIndex; + break; + case 1: + startIndex = i + 1; + break; + } + } while (endIndex - startIndex > 0); + return (result, comparisonsCount); + } + + /// + /// Асинхронно выполняет двоичный поиск в отсортированной таблице . + /// + /// Сортировка будет произведена автоматически. + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Таблица, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + /// Параметр или имеет значение . + public static async Task<(IEnumerable result, int comparisonsCount)> BinarySearchAsync(this ITable source, Func keySelector, TKey keyValue) where TKey : IComparable + { + return await Task.Run(() => source.BinarySearch(keySelector, keyValue)); + } + + #endregion + + #region ~IHashTable~ + + /// + /// Выполняет вставку элемента в хэш таблицу . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Хэш-таблица, в которой следует произвести вставку. + /// Функция, извлекающая ключ из элемента. + /// Вставляемый объект. Для ссылочных типов допускается значение . + public static void Insert(this IHashTable source, Func keySelector, TSource item) where TKey : IComparable + { + int hash = Math.Abs(source.HashFunction(keySelector(item))) % source.Entries.Length; + if (source.Entries[hash] == null) + source.Entries[hash] = new List(); + source.Entries[hash].Add(item); + } + + /// + /// Асинхронно выполняет вставку элемента в хэш таблицу . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Хэш-таблица, в которой следует произвести вставку. + /// Функция, извлекающая ключ из элемента. + /// Вставляемый объект. Для ссылочных типов допускается значение . + public static async Task InsertAsync(this IHashTable source, Func keySelector, TSource item) where TKey : IComparable => await Task.Run(() => source.Insert(keySelector, item)); + + /// + /// Выполняет поиск в хэш таблице . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Хэш-таблица, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static (IEnumerable result, int comparisonsCount) HashSearch(this IHashTable source, Func keySelector, TKey keyValue) where TKey : IComparable + { + int comparisonsCount = 0; + + foreach (var item in source.Entries[Math.Abs(source.HashFunction(keyValue)) % source.Entries.Length]) + if (keySelector(item).CompareTo(keyValue) == 0) + return (new List { item }, ++comparisonsCount); + else + comparisonsCount++; + return default((IEnumerable, int)); + } + + /// + /// Асинхронно выполняет поиск в хэш таблице . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Хэш-таблица, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static async Task<(IEnumerable result, int comparisonsCount)> HashSearchAsync(this IHashTable source, Func keySelector, TKey keyValue) where TKey : IComparable => await Task.Run(() => source.HashSearch(keySelector, keyValue)); + + #endregion + + #region ~ITreeTable~ + + /// + /// Выполняет вставку элемента в древовидную таблицу . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Древовидная таблица, в которой следует произвести вставку. + /// Функция, извлекающая ключ из элемента. + /// Вставляемый объект. Для ссылочных типов допускается значение . + /// Элемент с таким ключом уже существует в . + public static void Insert(this ITreeTable source, Func keySelector, TSource item) where TKey : IComparable + { + if (source.Rows.Count > 0) + { + int index = 0; + do + { + switch (keySelector(item).CompareTo(keySelector(source.Rows[index].Value))) + { + case -1: + if (source.Rows[index].Left == -1) + { + source.Rows[index].Left = source.Rows.Count; + source.Rows.Add(new TreeTableRow(item)); + return; + } + else + index = source.Rows[index].Left; + break; + case 0: + throw new ArgumentException("Элемент с таким ключом уже существует!", nameof(item)); + case 1: + if (source.Rows[index].Right == -1) + { + source.Rows[index].Right = source.Rows.Count; + source.Rows.Add(new TreeTableRow(item)); + return; + } + else + index = source.Rows[index].Right; + break; + default: + throw new Exception("Если вы видите эту ошибку, срочно напишите об этом на адрес kozakovi4@yandex.ru!"); + } + } while (true); + } + else + source.Rows.Add(new TreeTableRow(item)); + } + + /// + /// Выполняет поиск в древовидной таблице . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static (IEnumerable result, int comparisonsCount) TreeSearch(this ITreeTable source, Func keySelector, TKey keyValue) where TKey : IComparable + { + var result = new List(); + var comparisonsCount = 0; + + if (source.Rows.Count > 0) + { + int index = 0; + do + { + comparisonsCount++; + switch (keyValue.CompareTo(keySelector(source.Rows[index].Value))) + { + case -1: + index = source.Rows[index].Left; + break; + case 0: + result.Add(source.Rows[index].Value); + return (result, comparisonsCount); + case 1: + index = source.Rows[index].Right; + break; + } + } while (index != -1); + } + return (result, comparisonsCount); + } + + /// + /// Асинхронно выполняет поиск в древовидной таблице . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Древовидная таблица, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static async Task<(IEnumerable result, int comparisonsCount)> TreeSearchAsync(this ITreeTable source, Func keySelector, TKey keyValue) where TKey : IComparable => await Task.Run(() => source.TreeSearch(keySelector, keyValue)); + + #endregion + + #region ~SinglyLinkedList~ + + /// + /// Выполняет поиск в односвязном списке . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Односвязный список, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static (IEnumerable result, int comparisonsCount) Search(this SinglyLinkedList source, Func keySelector, TKey keyValue) where TKey : IComparable + { + int comparisonsCount = 0; + foreach (var item in source) + { + comparisonsCount++; + if (keySelector(item).CompareTo(keyValue) == 0) + return (new List { item }, comparisonsCount); + } + return default((IEnumerable, int)); + } + + /// + /// Асинхронно выполняет поиск в односвязном списке . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Односвязный список, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static async Task<(IEnumerable result, int comparisonsCount)> SearchAsync(this SinglyLinkedList source, Func keySelector, TKey keyValue) where TKey : IComparable => await Task.Run(() => source.Search(keySelector, keyValue)); + + #endregion + + #region ~DoublyLinkedList~ + + /// + /// Выполняет поиск в двусвязном списке . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Двусвязный список, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static (IEnumerable result, int comparisonsCount) Search(this DoublyLinkedList source, Func keySelector, TKey keyValue) where TKey : IComparable + { + int comparisonsCount = 0; + foreach (var item in source) + { + comparisonsCount++; + if (keySelector(item).CompareTo(keyValue) == 0) + return (new List { item }, comparisonsCount); + } + return default((IEnumerable, int)); + } + + /// + /// Асинхронно выполняет поиск в двусвязном списке . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Двусвязный список, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static async Task<(IEnumerable result, int comparisonsCount)> SearchAsync(this DoublyLinkedList source, Func keySelector, TKey keyValue) where TKey : IComparable => await Task.Run(() => source.Search(keySelector, keyValue)); + + #endregion + + #region ~BinarySearchTree~ + + /// + /// Выполняет поиск в двоичном дереве поиска . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Двоичное дерево поиска, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static (IEnumerable result, int comparisonsCount) Search(this BinarySearchTree source, Func keySelector, TKey keyValue) where TSource : IComparable where TKey : IComparable + { + int comparisonsCount = 0; + using (var enumerator = source.GetBinaryEnumerator()) + if (enumerator.MoveLeft()) + while (enumerator.Current.CompareTo(default(TSource)) != 0) + { + comparisonsCount++; + switch (keySelector(enumerator.Current).CompareTo(keyValue)) + { + case -1: + enumerator.MoveLeft(); + break; + case 0: + return (new List { enumerator.Current }, comparisonsCount); + case 1: + enumerator.MoveRight(); + break; + } + } + return default((IEnumerable, int)); + } + + /// + /// Асинхронно выполняет поиск в двоичном дереве поиска . + /// + /// Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Двоичное дерево поиска, в которой следует произвести поиск. + /// Функция, извлекающая ключ из элемента. + /// Значение ключа для поиска. + /// Кортеж, содержащий последовательность элементов, удовлетворяющих критериям поиска и количество сравнений. + public static async Task<(IEnumerable result, int comparisonsCount)> SearchAsync(this BinarySearchTree source, Func keySelector, TKey keyValue) where TSource : IComparable where TKey : IComparable => await Task.Run(() => source.Search(keySelector, keyValue)); + + #endregion + + } +} diff --git a/ASDC/SearchAlgorithm.cs b/ASDC/SearchAlgorithm.cs new file mode 100644 index 0000000..1ab8d9d --- /dev/null +++ b/ASDC/SearchAlgorithm.cs @@ -0,0 +1,29 @@ +namespace ASDC +{ + /// + /// Задаёт алгоритм поиска. + /// + public enum SearchAlgorithm + { + /// + /// Последовательный поиск. + /// + Linear, + + /// + /// Двоичный поиск. + /// + /// Поиск методом деления пополам. + Binary, + + /// + /// Поиск по двоичному дереву. + /// + BinaryTree, + + /// + /// Поиск в хэш таблице. + /// + HashTable + } +} diff --git a/ASDC/Sort/Extensions.cs b/ASDC/Sort/Extensions.cs new file mode 100644 index 0000000..6f9e96a --- /dev/null +++ b/ASDC/Sort/Extensions.cs @@ -0,0 +1,314 @@ +using System; +using System.Collections.Generic; + +namespace ASDC.Sort +{ + /// + /// Методы расширения сортировки. + /// + public static class Extensions + { + /// + /// Выполняет сортировку пузырьком в списке . + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Кортеж, содержащий последовательность отсортированных элементов, количество сравнений и количество перестановок. + public static (IEnumerable result, int comparisonsCount, int swapsCount) BubbleSort(this ITable source, Func keySelector) where TKey : IComparable + { + List result = new List(source.Rows); + int comparisonsCount = 0; + int swapsCount = 0; + + bool changed; + for (int i = 1; i < result.Count; i++) + { + changed = false; + for (int j = 0; j < result.Count - i; j++) + { + comparisonsCount++; + if (keySelector(result[j]).CompareTo(keySelector(result[j + 1])) == 1) + { + swapsCount++; + result.Swap(j, j + 1); + changed = true; + } + } + if (!changed) + break; + } + return (result, comparisonsCount, swapsCount); + } + + /// + /// Выполняет быструю сортировку в списке . + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Кортеж, содержащий последовательность отсортированных элементов, количество сравнений и количество перестановок. + public static (IEnumerable result, int comparisonsCount, int swapsCount) QuickSort(this ITable source, Func keySelector) where TKey : IComparable + { + // Кто сделает быструю сортировку без рекурсии, тот... молодец! + List result = new List(source.Rows); + result.QuickSort(keySelector, 0, result.Count - 1).ToTuple().Deconstruct(out int comparisonsCount, out int swapsCount); + return (result, comparisonsCount, swapsCount); + } + + /// + /// Выполняет быструю сортировку в списке на интервале и включительно. + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Нижняя грацница интервала, в которой будет произведена сортировка. + /// Верхняя грацница интервала, в которой будет произведена сортировка. + /// Кортеж, содержащий количество сравнений и количество перестановок. + private static (int comparisonsCount, int swapsCount) QuickSort(this IList source, Func keySelector, int indexA, int indexB) where TKey : IComparable + { + int comparisonsCount = 0; + int swapsCount = 0; + + if (indexB - indexA > 1) + { + source.GetPivotKey(keySelector, indexA, indexB).ToTuple().Deconstruct(out TKey pivotKey, out comparisonsCount); + int i = indexA; + int j = indexB; + while (i <= j) + { + while (true) + { + comparisonsCount++; + if (keySelector(source[i]).CompareTo(pivotKey) < 0) + i++; + else + break; + } + while (true) + { + comparisonsCount++; + if (keySelector(source[j]).CompareTo(pivotKey) > 0) + j--; + else + break; + } + + if (i <= j) + { + swapsCount++; + source.Swap(i++, j--); + } + } + var left = source.QuickSort(keySelector, indexA, i - 1); + comparisonsCount += left.comparisonsCount; + swapsCount += left.swapsCount; + var right = source.QuickSort(keySelector, i, indexB); + comparisonsCount += right.comparisonsCount; + swapsCount += right.swapsCount; + } + else + { + comparisonsCount++; + if (keySelector(source[indexA]).CompareTo(keySelector(source[indexB])) > 0) + { + swapsCount++; + source.Swap(indexA, indexB); + } + } + return (comparisonsCount, swapsCount); + } + + /// + /// Возвращает опорный элемент на интервале и включительно. + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Нижняя грацница интервала, в которой будет произведён поиск опорного элемента. + /// Верхняя грацница интервала, в которой будет произведён поиск опорного элемента. + /// Опорный элемент на указанном интервале. + private static (TKey result, int comparisonsCount) GetPivotKey(this IList source, Func keySelector, int indexA, int indexB) where TKey : IComparable + { + TKey keyA = keySelector(source[indexA]); + TKey keyB = keySelector(source[indexB]); + + if ((indexB - indexA) > 1) + { + TKey keyAB = keySelector(source[(indexB + indexA) / 2]); + + if (keyB.CompareTo(keyA) > 0) + if (keyB.CompareTo(keyAB) < 0) + return (keyB, 2); + else if (keyA.CompareTo(keyAB) < 0) + return (keyAB, 3); + else + return (keyA, 3); + else if (keyB.CompareTo(keyAB) > 0) + return (keyB, 2); + else if (keyA.CompareTo(keyAB) > 0) + return (keyAB, 3); + else + return (keyA, 3); + } + return (keyB, 0); + } + + /// + /// Выполняет сортировку простыми выборками в списке . + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Кортеж, содержащий последовательность отсортированных элементов, количество сравнений и количество перестановок. + public static (IEnumerable result, int comparisonsCount, int swapsCount) SelectionSort(this ITable source, Func keySelector) where TKey : IComparable + { + List result = new List(source.Rows); + int comparisonsCount = 0; + int swapsCount = 0; + + int min; + for (int i = 0; i < result.Count - 1; i++) + { + min = i; + for (int j = i + 1; j < result.Count; j++) + { + comparisonsCount++; + if (keySelector(result[j]).CompareTo(keySelector(result[min])) == -1) + min = j; + } + swapsCount++; + result.Swap(i, min); + } + return (result, comparisonsCount, swapsCount); + } + + /// + /// Выполняет пирамидальную сортировку (сортировку кучей) в списке . + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Кортеж, содержащий последовательность отсортированных элементов, количество сравнений и количество перестановок. + public static (IEnumerable result, int comparisonsCount, int swapsCount) HeapSort(this ITable source, Func keySelector) where TKey : IComparable + { + List result = new List(source.Rows); + int comparisonsCount = 0; + int swapsCount = 0; + + for (var i = 0; i < result.Count; i++) + { + var index = i; + var item = result[i]; + while (index > 0 && keySelector(result[(index - 1) / 2]).CompareTo(keySelector(item)) < 0) + { + var top = (index - 1) / 2; + swapsCount++; + result[index] = result[top]; + index = top; + } + result[index] = item; + } + for (var i = result.Count - 1; i > 0; i--) + { + var last = result[i]; + result[i] = result[0]; + var index = 0; + while (index * 2 + 1 < i) + { + int left = index * 2 + 1, right = left + 1; + if (right < i && ++comparisonsCount > 0 && keySelector(result[left]).CompareTo(keySelector(result[right])) < 0) + { + comparisonsCount++; + if (keySelector(last).CompareTo(keySelector(result[right])) > 0) + break; + swapsCount++; + result[index] = result[right]; + index = right; + } + else + { + comparisonsCount++; + if (keySelector(last).CompareTo(keySelector(result[left])) > 0) + break; + swapsCount++; + result[index] = result[left]; + index = left; + } + } + swapsCount++; + result[index] = last; + } + return (result, comparisonsCount, swapsCount); + } + + /// + /// Выполняет сортировку простыми вставками в списке . + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Кортеж, содержащий последовательность отсортированных элементов, количество сравнений и количество перестановок. + public static (IEnumerable result, int comparisonsCount, int swapsCount) InsertSort(this ITable source, Func keySelector) where TKey : IComparable + { + List result = new List(source.Rows); + int comparisonsCount = 0; + int swapsCount = 0; + + for (int i, j = 0; j < result.Count; j++) + { + TSource temp = result[j]; + i = j; + while (i > 0 && keySelector(result[i - 1]).CompareTo(keySelector(temp)) > 0) + { + comparisonsCount++; + result[i] = result[i - 1]; + i--; + } + swapsCount++; + result[i] = temp; + } + return (result, comparisonsCount, swapsCount); + } + + /// + /// Выполняет сортировку Шелла в списке . + /// + /// >Тип элементов . + /// Тип ключа, возвращаемого функцией . + /// Список в котором следует произвести сортировку. + /// Функция, извлекающая ключ из элемента. + /// Кортеж, содержащий последовательность отсортированных элементов, количество сравнений и количество перестановок. + public static (IEnumerable result, int comparisonsCount, int swapsCount) ShellSort(this ITable source, Func keySelector) where TKey : IComparable + { + List result = new List(source.Rows); + int comparisonsCount = 0; + int swapsCount = 0; + for (int k = result.Count / 2; k > 0; k /= 2) + for (int i = k, j; i < result.Count; i++) + { + TSource temp = result[i]; + for (j = i; j >= k; j -= k) + { + comparisonsCount++; + if (keySelector(temp).CompareTo(keySelector(result[j - k])) < 0) + { + swapsCount++; + result[j] = result[j - k]; + } + else + break; + } + result[j] = temp; + } + return (result, comparisonsCount, swapsCount); + } + } +} diff --git a/ASDC/SortAlgorithm.cs b/ASDC/SortAlgorithm.cs new file mode 100644 index 0000000..e9a3178 --- /dev/null +++ b/ASDC/SortAlgorithm.cs @@ -0,0 +1,38 @@ +namespace ASDC +{ + /// + /// Задаёт алгоритм сортировки. + /// + public enum SortAlgorithm + { + /// + /// Cортировка пузырьком. + /// + Bubble, + + /// + /// + /// + Quick, + + /// + /// Сортировка выбором. + /// + Selection, + + /// + /// Пирамидальная сортировка. + /// + Heap, + + /// + /// Сортировка вставками. + /// + Insert, + + /// + /// Сортировка Шелла. + /// + Shell + } +} diff --git a/ASDC/TreeTableRow.cs b/ASDC/TreeTableRow.cs new file mode 100644 index 0000000..224b0c1 --- /dev/null +++ b/ASDC/TreeTableRow.cs @@ -0,0 +1,35 @@ +namespace ASDC +{ + /// + /// Предоставляет строку древовидной таблицы. + /// + /// Тип данных в строке. + public class TreeTableRow + { + /// + /// Инициализирует новый класс со значением . + /// + /// + public TreeTableRow(T value) + { + Value = value; + Left = -1; + Right = -1; + } + + /// + /// Индекс левой строки. + /// + public int Left { get; set; } + + /// + /// Индекс правой строки. + /// + public int Right { get; set; } + + /// + /// Данные, хранящиеся в текущей строке. + /// + public T Value { get; set; } + } +} diff --git a/citizens.min.xml b/citizens.min.xml new file mode 100644 index 0000000..1235190 --- /dev/null +++ b/citizens.min.xml @@ -0,0 +1,3 @@ + + +6680555580477ReynoldsMatijevic26.09.200714556069557552JudithaPredohl17.03.200911330624443255BerteKennington28.01.200811470920908082MargetteChrichton16.03.201707296729439930ChrissyJoannet21.02.199802101632835707TorrHulance24.08.199815970070725143TerriBorg-Bartolo23.11.201312477352778215LeonelleFreund17.11.199901692972680699LambertWhaley18.03.200406649300533274MaybelleTeissier02.06.200314768561563957UtaClayton12.07.199608398446129736FranciskusShevell20.09.198312769319358036Barbara-anneMorshead28.11.199311037859718077IngmarCowley23.09.198818342959945040GeordieBichard21.02.201507543593210681ArdeliaWiggans25.07.198213016382668404PearlaStringer09.08.199918348448766808EugeneMartyn20.05.199514345246235277BettineWallbanks12.06.199301723155530879JanCreenan06.10.199815453315650874RollieHessing28.05.201416641515575043IvanClassen15.04.198017900088922468QuintinDolbey21.02.201514607559384372TiffyWeatherburn03.06.200019379264696679KarnaFrancescoccio07.08.200306977213376738HarveyBernollet09.04.200406919860187000PavlovFayerman30.06.198308523284055053CoretteJoyner12.06.199611186716005179CorinaVondrys02.05.201001294805154930CathleenDrew27.06.198005617915585948EalasaidScrivener06.10.200812716012453508CairistionaSharratt15.05.199809809983856646WangOxton29.09.200308781435481823WillaminaDomeney19.06.201119336473411973NormyFranck13.01.199506068796078320NedDalgleish11.07.201718047406329359CoryUrch17.12.199512974890962652FerdinandeLucio17.11.198318098076575922ErminaBentz07.06.198606142932701232IngamarCathel10.02.199615199305359305DianSteger20.10.199005193803997043KayleHessay11.10.198604118763547933FaydraGiotto10.12.201113263168819647RiccardoPassy19.04.198019125187970935MaryjoMackriell05.08.199304965119553224PercivalStenbridge05.05.198609125936047647CallidaIcom07.11.199316032856992279DyannaSisse12.06.198118171755955630TaffyTuting07.01.199908207652979211GenoFetherstonhaugh25.05.201104202071989574JoshRoggers11.02.200809493570474990JoannaIacovino10.05.200912099535967067PhilomenaCruden04.08.200118174119709876MattyKindle20.09.198213666217489520JasenTrunkfield25.09.201207987524544035Anna-dianeFrankis15.12.201401292029303998TommieWillmore07.09.199905864817963648NatkaSoldner12.03.198205062217192573FidelityLeEstut04.07.198104795669122543BernieBazley20.07.198019457943077284MickiCridge27.11.199712093612300858CaritaLiversley16.08.200416029875605983JoneMounfield17.09.201003494420969773RupertaRaveau11.11.198103560931241444SadellaLewsey02.04.200404529012826613BeauEllerman26.04.201511693862121214SaraannGladhill23.06.200204082456043170KristoforoDonnelly26.07.201715144232613453OssieIglesias05.11.201015970043714714ZolliePoizer05.01.199319715250568191FlorenceDe Coursey23.03.201517348706873835MireielleDuprey30.09.198313017934922737LoyStent31.03.198413885023057801CornellHuikerby09.02.201114984134139142FlemingMcKimmie10.04.198107166674966948RianonCowgill25.03.198112822186018493ArminBellocht22.10.201219809255945126WyeGreener05.04.200613072271925174SteffaneRanahan02.04.198403497119751318PhillippBiggadyke19.04.198414438576499503JolineMayoral31.08.198708381724403512SariDorcey08.05.200206898919219701IolantheBoyne28.07.199419212208800450DanellaGoodhay21.12.198304531292087328VirgilioHaglington15.09.199317351608036098MariaJosuweit31.01.201806818713454536FitzgeraldVan Arsdall09.06.198403395747859389YolantheFawcett02.08.200902441901534822JulieFroggatt12.08.198402907636432745EphrayimGrierson30.12.201306041150970654AindreaGilham03.04.198004576699678586TailorKyteley25.02.198703147925989998NevsaFilkin26.06.201515399022785541AlexNeasham03.06.198008340998005081ChasCarette04.09.201314464759283796DamaraFenn15.06.199517654889792501LudwigPartrick26.05.199902402125703735SorchaRops05.06.200405792336066888ArnuadBridden23.09.200001377088025735GeryPresdie24.07.200519898308690909VanyaPietruszka02.01.198503271778645639TherineSinkings18.07.198703122862686816JonisPryde03.07.201615621706839785BenClewlowe21.04.200301056462858579ConcettinaWeymouth04.01.198408427895273839SibylleOakeby22.06.200011465290251180KingHaskur31.01.201808480968602623PauleRubica08.10.198909560120972823RomondaLowey05.05.199417140289569411MarielWylder14.06.20121 \ No newline at end of file diff --git a/citizens.schema.json b/citizens.schema.json new file mode 100644 index 0000000..b07ee6b --- /dev/null +++ b/citizens.schema.json @@ -0,0 +1,43 @@ +{ + "id": 113232, + "num_rows": 1000, + "file_format": "xml", + "name": "citizens", + "xml_root_element": "dataset", + "xml_record_element": "record", + "columns": [ + { + "name": "PIN", + "null_percentage": 0, + "type": "EIN", + "formula": "random(1000000000000,9999999999999)" + }, + { + "name": "FirstName", + "null_percentage": 0, + "type": "First Name", + "formula": "" + }, + { + "name": "LastName", + "null_percentage": 0, + "type": "Last Name", + "formula": "" + }, + { + "name": "Birth", + "null_percentage": 0, + "type": "Date", + "min": "1/2/1980", + "max": "5/2/2018", + "format": "%d.%m.%Y", + "formula": "" + }, + { + "name": "Gender", + "null_percentage": 0, + "type": "Gender", + "formula": "random(0, 1)" + } + ] +} \ No newline at end of file diff --git a/citizens.xml b/citizens.xml new file mode 100644 index 0000000..cae9d2b --- /dev/null +++ b/citizens.xml @@ -0,0 +1,3 @@ + + +3346034402217GretalChadwell19.08.199016080037967680GasparoSatteford22.06.199007036690339123FordPaolone26.11.199307403840323975AdoraChamberlen23.08.201406290185467577MerrelPanner24.02.198618620684199619EbaNaldrett23.02.199207667434942663JarridEdgeon30.03.199604209232571472AudieLafaye27.11.200212680347026536ArabelleTudbald22.05.198301559119333423FinleyOlufsen25.07.200211649725381495ElanaFereday15.11.199813922895996708TorrinBennellick13.06.198207304984538023SalvidorBeinisch20.11.198607089301296463LanaeSwaffield06.10.201704055371660961ArmstrongMetzing08.02.198303923134780917AlysTidmarsh17.05.201701675429749049TallyFarron19.12.200804426582084583GenoYerbury03.07.200519457263964721MicheilPeeters31.03.198804390809866171NorthrupD'Alessio03.12.200002446468726159HuldaChell30.05.201006393565759665JodiBolwell12.03.200709316776627258MauriseHawkwood31.10.199612490705955695AnabelleClemendot30.01.198712055586400538BrantBlind01.01.198508977238118781RourkeSpurriar07.02.200206671209432346ShayneGritten09.06.200612286142154829MichealLiddicoat28.06.200917293504641782DronaFrise23.01.200617222582300654PepitaClayworth21.06.199407870987679011MignonBewlie12.04.199016257854796240HanaHeap23.01.198712349147160482HughWorrell29.12.201416772087172305ReadPitcock26.11.200014912168577099OreliaDonke30.10.200304870604331392GillSimoneau26.02.199605736100633809SharylCuruclis12.05.200308167765078554DruZanni07.06.201304909679067031MerrileFranzini28.03.198719198124709487CatherinDedmam14.04.200305325713420149NettieBridgen01.05.198813353194394569CordiGoodbanne02.03.201501665906131268UrbanAttenbrough10.12.201517456655800106DominiElliston10.04.198711695084725466RubiaAubin23.01.198403888439620966MeierSings02.04.201319916932817223AlmedaBain17.06.199711013569790005SerenaEskrigg25.03.200313916368612737KirstiKeaton09.06.198812141941024601TeodorKlousner08.08.199811634166493913LenoraBlabie27.01.201501371179343357ZaneAndrault17.07.199303827444586701GeorgeSouthwell18.03.198312784221638914LucienIshaki21.08.200508048371244258AddiCisec10.11.198703965398489365TobitTickel07.07.200402722272662792LottyRemmers24.12.201605559806262131ConstantineSummersett26.10.200614473397824287CarlynnThickett19.12.198908164628893011FrazierPlomer24.08.199306294636514041SelaDuester14.08.201109195437449621GunnerMeigh18.07.201106380452661971AymerKeenlayside15.10.201008473756157185KaraSappy15.04.201511538607072332GilbertinaHazle08.02.200116615915361083StormieCervantes24.10.200707554202837224EstellUghelli19.10.200602239551352581AvaLympenie13.02.199608032389738299ArvyLaugheran23.05.199812087087621462ShainaPittet19.11.198211172169865049AmandyDa Costa24.09.201404780525184838PoohChettoe24.08.201003071663875511LonHulland14.01.199916285970338757CodiCastard20.09.200706832246306363KimmiDurrington11.12.201518212006265886LoganHursthouse12.08.200216624224897370MaurieSimmers16.02.200609385591770475MaisonEssam14.01.198101833979478157JoyNewson30.07.200404354750483374CamPesterfield15.10.201404021305175335BevVerbeke09.08.199018616563418054LizziePie19.11.199912433462508096JulissaHawkridge07.03.200107804179588907LisleRodenburg14.07.200901630122257596MinniSalvadore07.04.199319393303315888CaseyLasham25.01.199007276824445450GordyFerenczi30.09.200314536304271059TracyAvrashin12.02.200615058613770545DoralinOvington19.09.200516361018019457LariFlaherty09.06.199812169511361428CarrolJardein11.07.198512703883546044SheereeGreenhaugh10.09.201514615321412826FarlieMillichap07.08.199603416969972282MicheilLyttle05.07.198512232465452897AngelArmatys07.12.198715669115743819NannetteMee01.01.198603460340282511DoniaDuguid11.12.200503781445603453QuillanShyres25.12.200703475929321865LyBridgeland05.10.198012684820516917JosselynLeyburn13.05.198011460205335626CobJohanssen21.09.199704456793855813SydneyWearne28.04.201805953070397048LaureeFalla12.09.198306110203349061ArabellaEdinburough24.03.201218166447689499ZekeWilprecht05.08.200012355788918099EmmettSellner17.11.201603362268161347PaulineMacTrustram17.12.198011404567628587MariusDallender27.04.198115859817994242MaximKlug02.10.200704418297218626IreneLacasa14.04.199401111269937073GunnerTruse24.06.199112072614968336CristiRippingall06.03.199508096848924450ElvaPaolillo18.05.200304189261636307ReinaMangon09.05.201604063214276818BarriJentle15.06.198717680868125902KathrynRosnau04.05.200911627224493716AlickMorit26.07.199007121349734636VidaSymson29.10.198102226367393175JimBaxill04.12.201004176699218230NelieKitney19.09.200613393295208098KathBeadnall10.10.199817701734591245PercevalSaintsbury19.12.201112585782954181JoscelinBalmforth22.02.201403420319924074SianaOloshin28.03.199416015581060763BethKeepence28.12.198716991292127503GabriellaBlayney06.03.198011049873148626WakefieldStenners09.01.199306228416937649GustavBradford13.01.199306626743783643LaylaKynoch12.07.201115191604482617CaroleeFossord03.02.201608858515072837GeorginaFreckleton22.07.201612716652040801KasparTutsell15.08.201508032378126737MerrilyGlaves31.07.201014261861661268DonnyIssit26.08.199104308213687891CindyGrunwald28.04.201717106835780833ElTidgewell29.12.198701335309732333LivHeller11.12.199616443303292704MerwynHebborne11.04.201719895976984179WalyBonifazio10.07.198414692312275892GingerMountlow12.05.200912835374559401GinniPurdom01.05.199407869931554074TorrinWorters26.06.201303248269840618TyneGaywood19.02.199518923783323880MechelleMcNeachtain20.11.200614337108042628GalvinSchach12.03.201503244105373508HilaryAnmore31.01.198805947964298300CordeyMackett14.09.199017292411936159TeresaSamples22.07.200803557242620991SinclareAntrum30.09.201703279842333004GrisIvankovic14.01.200013695740663584CorriEnderlein19.06.200707001520820750NertyKegan05.12.199604485512477626VergilKeysall01.08.200406511325749607MelGatchell22.01.201511713365118414HindaDyzart31.10.198712330929281620NiccoloSpyby22.12.199914892111801140NikolosBadcock13.04.201714773323293064PatricaCatenot16.05.198402075232429990CharminePioli07.03.200313062355845799MabelleCrowdy27.06.200709341505447811VirgieStrettell13.01.201719157177530864NewtonCottisford09.08.199014064653502212RutterMcSweeney02.09.200819505158456735KinnieClemenceau04.10.199414682978608649DoloresBounde27.06.199002199603118398ErichMcKiernan09.11.200618104173027122GretalBlethyn04.04.199908263105409501HenriChristophers15.09.200804192251711680GoldiRumens20.02.199506533542659099AllxOwlner19.05.198515606791041077KalliDunnion27.10.198904137202726914IsadorLomond21.08.200004594692336773ShellyMugglestone25.02.201009075040973830RubettaMumford25.12.201016111398695781HastingsThickens06.10.199412649392900795ElonoreKassidy02.08.200905489900007019StaciPlastow05.08.199119377827255464RodaGrissett02.03.199111491359348531RaimundNolli08.01.198417827279276901RonaMingaye17.12.199614244431403471HermionePentelow13.11.200601531008647916KrishnaPurdom27.04.198701394261183945AbeuDjurevic23.08.198316025399737554JodyTyt14.06.201616255169853999ArdineNewbury01.02.198513513326811095CassiFerguson17.09.199712171293519542MerseyWimp09.03.200001830849401899MarigoldDonoher08.11.199008728749971840AlfredaWilkisson22.12.201013401959693326JustineMcIntosh04.06.198911608134614035LauritzPessolt05.05.198201452829555569FarrandMcVie19.08.199119395799706269LydiaGoldie16.03.198315974122441190SusieDarleston12.04.198613623850025305DarcieCarlan01.06.198004505979588613BirgittaHearns13.08.201112800283537635PebrookGumm01.11.198002821085123165BrnabyO'Brogane16.11.199818651686867517ClarettaAlpine12.12.201406789099835327WilfridAndrock17.03.200215185548027991LuellaSkyme19.12.198506453982873147EarthaTeather26.09.200605629788376568DacieHeazel17.01.198301312996436089MeredithRicard21.03.199407113297365515GilbertineBoutcher22.03.198911810883692527AlveraLydster30.04.198517634277873463LilaMcCourt17.07.199315567159035770DinnieLynn14.08.201319105183448005VincentsWillimont28.02.201418303022546121EmmerichFardon30.03.200917510029075377RawleyBurlingame12.11.198802784569603502UlaBeedell04.06.200915696716523603BrettMenham15.10.201519206112009208VikkyDrance18.11.199005603051864432TawnyaMohammad06.01.200413324484513044TorinEspley24.06.198815549810834545NikolettaEykelhof09.03.200207198154589138ErnestineCuddy04.08.201615436315583552WallyGuiness10.02.200302377054110801VirgieBrodie02.01.198811470993394587ChristalMackison30.10.201408933010836100GreteSerraillier08.10.199509956637532526VinsonAbazi03.05.199316876564671574InessaHernik18.04.201406311092778652RafaelPoultney28.01.199217029751788763KerrillMatveyev05.09.200718551275890109KimmiJimpson12.08.199009065047254729LeonidasO'Kennavain26.09.201302836866863463GiovannaLockner09.07.199115710976366647NoelleDecker24.07.199319795886944666NicolaLouch27.03.198004629644692561AdriaensMessage18.10.200817334010585916DemeterGeorge19.10.199702526711534561ElveraHousden22.04.199216488732299106CatrinaClaire22.07.198505088783071450EmmerichLintot27.02.200409004685869548ShannonDeware14.11.199002155318686017GaryStook05.12.200104485592215647PaulyBuyers21.12.201508222511727740HannaHonywill05.07.198306727675100233KeeferBrickell24.06.201701299348108308BethAlmon01.04.199403709216213607CeliaPetrillo24.02.200416317737020969HeidaPilgram26.06.198803340694157166KirbyIsaksen08.12.200012290500046728CarmineKirkup07.12.201116754347031107RosabelHagstone02.09.199615284635480088LyndellSatchel14.12.199118918168897550TymonArtiss05.08.198019386899463444TessyLuna05.07.199113878339377625LorrayneSharp02.06.201713855675062101WillabellaTomsett05.11.199416235215244064LibTidbury19.12.200115196624803803MaurineBuddleigh02.11.201604002751170921KristienGowenlock12.03.199716919770469397AndieLeckey18.12.201115094834904791MinettaFitzsymonds23.07.200917351509108966KinsleyTongs19.03.200405573692107736MadlenLinde27.04.198702997459922203GardenerDundin03.05.199407322745795629ManonShopcott30.09.199212496087781402BrucieBea05.01.201301935268823745DavinGannicleff06.03.199601976828544288CherishParamor01.07.200518158451326359GertrudaTrelease16.12.200911428438763711JanetYakovich12.11.200217224998473196ShirlineShugg23.08.200515131358841280IngerGulland11.05.198303040139905903MalvaCullingworth15.02.201702677253368452ValMachel27.03.201804082091330961RobbyJosum09.11.201002998909751014OlvanSheehan20.07.199202931910467413RobinettaFarryn07.05.199302395017701005GregorioCiotto07.03.199211512702773239AbbeyFerry18.11.200906153647112097CleaLook25.01.199419339156486808BradenPeert07.01.198319717756354142JeremiahMylan10.12.199608274635176256TaitBrattell17.03.201803536061222328LammondMacArthur02.12.199908080195993193ChrysaKalberer07.01.198017368599166057BlakeleyEingerfield16.08.201403653236597149LorilynRenac12.09.201401118225194115RosannaBlomfield16.08.199516186203131101LorenzoGrodden29.11.199713174346840057BernadinaCuttle14.01.199413987782054912AuroraLinke16.03.200117737348918393NadaPfiffer15.01.200312279452739643SamuelKingston16.06.201219876120191736SeligCroote29.05.200501482370287481FairleighKlageman29.11.200311037952520410MirillaCaslane02.05.198705488930644377JessiTavinor12.12.200106210533152091YulmaRafe20.09.200101982430410425MarisaShakespeare26.11.200517585900418129JaninaArnholtz30.05.199312468637793831WaylandBelamy21.04.200708461887221776HerveWash06.02.199517582709834884DaronLenney14.09.200316034240141111TanitansyKlemt26.10.200014431708936823KatieRadmore13.12.199603790774547834AllissaMcTrustram06.04.201216704600658677MagdalenaMacAulay13.11.198303969684072125LiseForton20.08.200904315238428935AstrixRuggles12.03.198006327861608492RudolphLeipelt29.06.198603372417071936DieterUff10.09.200607731177297946BetseyAasaf10.02.198105439423814261MyrvynFormilli03.01.200518388902291181DaciePoultney22.02.200401404668348554MerlAllport20.06.201412391003935668ReadeGoodson22.02.201309286165124327BartholomewAbramovici08.09.200617409052002622LemmieDugdale02.11.201619743919652250HarrisonMation09.12.199115319349132451BerriTombleson01.04.199819898839862360DulcyEliesco25.12.198809257259680820Anne-marieFlemming10.03.199311910374732707JamesLeal19.06.200407646615991139ArdeenMcNea25.11.200605865248655958AudraMilburne23.01.198907726825507205KristofferWaldie07.01.201708114401436737ImogenBorgnet15.06.200006371321779168ErinnaNellies27.09.199804179664996500RenaldoMacGebenay09.02.199104711936244272RoseBeecham23.04.198204947704600538BabsDawe25.02.201507000061264054JennineHalwell02.10.200813930898807411ElfridaCicullo28.07.198505734168490261ZebulenOlander19.10.199501018159308285MargyShama25.11.199612008727581427SabraSevers20.05.198219534918244172TabbathaLeith05.11.200819099040770652DerrilCreak05.07.199513108495608577SuzanneEdmeads15.02.201104971863091211KarleeSloy30.11.199209255479114946GerrieTrood25.04.201306043417678019EvanneKobiera23.05.200005466968507056AntoineCapeloff21.06.200513588733185581HumfriedAlsina08.04.200802094602038897QuintonTummond05.08.199909765556651922HildegaardButteris08.07.199701710274649873Helen-elizabethDoberer05.03.201216503731987333DeweyPetrolli02.11.199415461713384408DoryBentjens07.03.199405214446504282TodAllchin22.07.201417420103575567OliviaMcNabb21.03.201511284558886345ClariceIngry10.09.201503774735230761KariaBattrum24.05.199819807284312323ShaneKinder25.06.198006728428326806RoxiMartonfi12.08.201311468394932240PincasHansmann07.12.201615020500652273AubrieGullen12.04.199919232362486432FernandeFasey17.10.201615630203968352EmmanuelRycroft29.02.200407676118906331ChristianBagby01.01.198402857528612325RosalieMoylane11.10.199914004544188075SilvesterCowley25.10.198619333254716331RaffertySherwin09.07.201616406516470739HeinrikRobotham15.12.199307653648253316ElisabettaFernie14.10.199614691581661950AgostoCorneljes02.05.198313259940093010LineaOxtoby07.02.199917915001753836DrudJagson25.01.200008200904085138MarileeMacCafferky27.06.200716399706660936IrenaAlcoran01.03.199013459095383313RosieBritt07.05.198615154300718969KeanEmsley11.03.199904436704289473KorenPettus31.08.198613205822905749AbbeLorroway19.10.201602842674409243KirstinBritton10.06.200103422936985400GaraldCutchey29.07.200103727372000909VannaShepheard11.06.200206636265795207MarionMaffione15.11.199214117243249722AllanAldgate16.12.200913129406444105NikolettaDunk22.11.199219375689528195KylieMoorcraft26.03.199417752849392888FloreMcDermid26.10.198605598035926543BrandiHankey03.04.199104092830402305IsidorGatus23.05.199804623944856614PatrickChapiro13.07.200504936586575864BirgittaWehnerr16.07.201016489013535650FanLoughan06.07.198616193326282337JulianePantin16.04.200909882969794159JillPeter04.12.198717934778511949NikitaRutley28.11.198913453994202832TaliaKrahl28.06.200802913554826857CarneyBaldack19.04.200108834328172684UmekoCopcutt28.01.200017556728700184LaceeHarvison14.08.198403557439059007FloydPablo26.06.200003855620184183JankaLoughton04.04.199019284950107311KalaHayland14.03.198219977703712136MaxieSargeant06.07.198104425390943597DaffyDallin19.09.198805682739416883LorainDe Bruyn16.07.201608643591898911TobyAlexsandrovich08.04.201507870729623430JamesonSiddall26.10.199013603387329831KellyannSleite26.02.200907991517163555ArdineLarkkem18.08.200202451507954171KorieDorrell28.08.201004879743042902ShaylynnJohnys01.05.200515032744833913CissyTee19.02.201107874502963545LeontineHorsell24.04.200306607326570832JannaStrahan02.08.200919221268557576TitoLockett14.02.201717232567640569ValmaMacVanamy20.06.201705273575843697AbieLovejoy09.07.201315022147040384SandersonWandtke19.09.201405139368260509ShawCornelis25.12.201305134579750916LynnetteDomenico17.02.199417722415651169HildagardRudham20.02.198509957681585399JaradTwiddle18.10.200605311627034166TybiAskwith14.05.201707707336260225TheoMacConchie09.09.199319440856670761KamekoRugieri31.12.199819678674431311WilleySwate31.07.201609837337737980KrystalleArnholtz14.06.201406401359383993AmilFilson28.12.199603493694150109MyraPhizacklea05.07.199213634541922014MarylBenjafield14.02.201702987310105968MegRolles29.06.201709798423456618GwenethBarneville27.02.201314032851909435GriffieDymidowski16.02.201603575321934633LairdRamsted06.09.199115958061906833LemLortz17.12.200611763990160627NertaKeggin25.05.201309838198627090GianinaTappington22.07.200318364198813559HollyHrinchishin19.02.201517599846752347DemetreSpeck23.04.200713078136344425YuriHudghton31.05.199415639570840732TiertzaRampley16.03.200702183378039187RianonTeasey03.08.198005198539799133JerryShipsey31.12.198913735860828849WittieCouttes23.05.200115433846245774JulianeTritten06.12.199618950529042692BernhardLugsdin25.03.199518911410428531EmmeryMcIlhatton27.03.198408444880476549GavanYglesia23.07.199416213953231167DioneLegging21.05.200619447781135302BartholomeoLongstreet25.01.199903067314968934PhyllidaCranefield12.03.199001576361068186BradleyCallis30.08.199517959924409741RobinsonGirhard19.02.201104569806396798CheHugonneau20.08.199514241533536780GrettaWerny30.11.198314136228887468CassandryBortolomei11.10.198707097774900636MorgunBirkinshaw06.02.199505465839881773JoannChafer24.04.198005647773944252CarenDe Few14.12.198718897042329279EvyClever18.08.201001237108968893CorbiePerel17.04.199219831119638422ThedrickBraim08.12.199513940831102770EadieMowday01.06.201413060561678776NicolWapol02.03.201503051384057180OzzieJirus15.07.199702958007185822SosannaPrescote13.12.198915398681749629BrianHoulworth16.09.199006234581459329LekTschersich11.10.198313797050698942WinonahSciusscietto08.11.199007754013618403BrigDienes21.04.201802553770842672KaiaIohananof21.02.200017346684238570CassondraClipson05.09.200406544160643794CasandraCopestake11.01.201212572050305730FranklynPhilippon03.07.198217041462797783SamariaDuckers01.06.199413236949216484HeddiGoodere20.10.198809467446413288FrazerSweetsur11.11.201112195759442355EarlyGrayley01.05.200006705910720181BaxyFrany03.03.198606007583818817GregoireSarjent19.03.200315973921912230ChadBramhill15.03.200316127504972208BrunoSerjeantson20.02.198704789907898944ValeraMcSporon12.12.199005408707120391BirgittaMcDougal26.02.198516037051950832ConneyMully07.07.198102278795922963IngunnaLargen12.07.200216503228688821FrediRostron06.07.198715314701341398ReubenSanney11.08.200201372077431699HarmonBeard26.11.199708256300350839EldredgeCufflin27.02.199218896010490645MortCowpertwait27.08.201201341497125953HaleighSalaman11.11.199518069203113406AlfyStrasse22.06.201214936553634982MeadBosher23.08.199816004177185260MarnieGildersleeve05.12.200307828643100501PrescottCramb28.05.200519515116070443GiustinaShearsby19.03.201112708284711883RhiannaMoulden02.12.198203912082340993MarshalPetranek03.12.199001297182212430ClercFrany03.03.201503591112711299EditheSegrave16.05.199017031611205650DalliPires15.01.200417598190604145KorrySisselot30.07.200016704395678175MeiOwthwaite28.10.199013201433314866PederOrwin15.03.198317794725324416MalcolmKike06.06.199902622128356045NormieSultana01.11.200211701487317956BekkiTimewell12.08.200109793433307076KieleDeathridge23.04.198308103340962129ScarlettBabin24.05.200417620046637706LexyMusto02.05.199709348381031921MarieannBraddock18.06.199204895964130351MallissaRussell26.01.199308140371089023IlseAinscough04.10.201218896619826030BeckyChrichton13.01.200302840055890834SybilaVenable04.11.198107608375806463AnnMcGarrie13.11.198201240144782430TanaCliburn25.07.201019765581902596LemmieCongreve06.11.200209925400270783LudovikaClemas19.05.198502430515883396FriederikeCrookall17.06.200204112199201422TheodoricFortie01.02.199916308234903640CristiRounce01.09.200504042677684521EvelynKubek11.04.198105840662424979AdrianaKlesse30.10.198603123202544341RosalieVallens02.06.201505006706115102GaylorNettleship30.01.201702640123288175ShaunRudolfer04.06.198407275866537018RansomLardner16.04.198814643923323247DrugiHazelgreave16.08.200807143201735499JorganPhalp18.10.198515515115273654DannyeGribbon25.05.201202902410622032CheryMerrill22.02.199712939103781261AtlanteGuyet16.10.199409371777965577CamMandel17.09.199302174681411612EvDaniellot16.05.199606996527023790BeatriceMorphet18.12.198106423176052228KaterineBellamy04.06.200511856376098401ArianaBerrey20.03.198506800445140498JensVan Velden26.10.199111809049947040VinDaniells30.07.199815986268812302CamalaKeilty11.10.201512109077324765KataWaith05.05.198913460238646651JunetteTowne15.08.201312047159476054EmmieCowp06.07.200518567593794975AngelaMitchel02.09.198714498726754692TabbiSarjeant22.11.200907865665415907CortTremblay08.02.198115806789650739FlossiMathias22.11.198215400812997632Barthelde Keep27.12.198316402336864449MoritzAce30.12.198705287326865485KatiWaldrum25.08.201202736758510393MorieMor09.03.198818239222664250CorissaGregoletti16.02.200513704735999576NanceeGrewar05.02.201706090859882857VergilCardwell20.04.199114052489831527HettiMcKeand03.09.199617107403590279PoppyAlyokhin29.05.200305976092487752JewellePendell19.05.200818445820532668KimGwatkins24.06.198915330342645805TracieShyres03.01.198015585182535427FabienPumphrey30.04.201603402697526376AriellePritchett06.05.198703409369609914MellieBillingsley30.03.201419120241756061WaiteBreddy24.03.199611523999058358FrediSkelhorne12.10.201402203301302948RollinMoreno14.08.198618018770388119SileClarke-Williams07.03.198807608904373281EttieLeport14.02.198013507944750020TuckyBountiff28.08.200913124415033132BunnieNewbold02.03.200311748677409823NormanMcLae31.03.199813504321219783AlyceHeartfield10.04.198919650139431784SilvanusCrosfield03.05.200015022342881424DunnStoyle25.11.198405385064469944LlewellynGoodered07.12.200513175172906996PierretteLordon01.02.199204696321946928ChrisLongbothom17.08.198212153813243258EditheRizzardini17.09.199401488164248593PeirceTomblings17.12.198519545164770508ColettePerle12.09.199113133098848073GuillermoCutbirth13.03.199603754079204553MagdaleneStoffer07.01.201809385925934309BroseRalfe21.10.200409446875337705RenaeTabary10.09.199804420260689161TwylaStannas06.02.200211164811438996PheliaSimonetti25.08.198606507864461225RivyHurche05.07.201015563436568997LishaLestrange01.01.200908909774963085HarcourtBootyman24.10.200404506361571028CthrineBunhill18.09.200216898665620933KathiMcCleverty30.12.200103986201968525JaniferDanskine08.03.198903504775186621GretelSpirritt26.11.198419429713828644JonathonCansfield03.06.199908021182289411ChicAttenbrow08.06.199401081673800561ColasO'Currigan18.08.200408238277307303AnniKliment08.06.198817939156906134SigBibbie06.04.200809882106629596TandyWhyler10.11.199706721271143373BrodieBuesden30.07.198115921504409846MaisieOddey23.09.201011049194926976NorbyTebbutt27.08.200508758574762816EvangelinaWallman25.06.198707143021446608DoeBeggin06.05.201107588390609561JakieBattams22.01.201711672561838736GayleenShotboulte22.05.201211257295937533RenaldoPlum05.09.199902275347097994PerkinCarrick12.09.198115847139796803TrixieVeltmann03.09.198304962723211376PaolinaHenbury30.03.198307935948045960TimotheusLibbis01.05.201315407312509360KylilaHowse26.02.201701426239921505ToddHoggan22.03.198913687295735178RodaElcock21.06.198604151158418837JasperSurmeyer03.03.199013668104553092TraversChisnell26.11.201307625978076845ClioDemsey22.11.201118090254150685LorenzaMilesap02.01.200114438452463015CosetteClines13.02.198907998331132918MalorySandiland06.09.199103920977976735JacquiCleiment03.03.199913406756811321LaneyMay19.03.199809170246193806HarperWetherell24.06.199619483164241341PhipBelloch12.09.199118449784492128ModestyPetchey01.03.200811543938365891CordellEnglishby15.12.199415155378428582KylaOxborrow30.04.201207710190594203BudClayal31.08.200414981899286622CarmelleFagge30.01.199118402054963817TomasoGormally24.03.199206419802342627TannieCoatham26.06.201409271590208567VereWaterson27.11.198314137446247546DesiriPoupard21.07.198019690731898788SkyeLampen02.11.200102948413032076BogeySyfax29.12.198819662793140584StellaBasketfield28.08.201113377172293784OrrinThomason14.04.198504099228457370DeliaCruddas20.08.199919869819176552ElinoreHocking21.01.200709231120952220MaigaCallan06.10.198118986923027420ValleAymes30.06.201711068251911632OrrinLitster22.06.201209740000098323DienaHutcheon22.12.200116099637570213NolaLonghi25.07.201113192407888781GabrielleShillito06.01.198416034292798664MahmoudHaggar28.11.199303663364326634UtaTeasdale14.08.200908600078135917CyndiaJacketts20.06.200808015102936788GillyLeathart27.09.200911918899419643LinaPavlik05.07.200703604859174907BartyMitrovic30.09.198604757413196068AlveraLegonidec31.12.198815185810580617HiramAbson01.02.201507771931065636BabetteGorick03.01.198311485827983573JocelineRickert24.10.201301326291712577TammaraWhittam16.04.198002650781709219LorriGosenell09.02.200219694765673729FarrahBollands17.01.199119136248106150FiliaCockarill28.03.198403563789054528ReenaHartfield11.02.200218934029220385MarinaGreatbach11.10.200505017742684772HollyanneBruggen06.06.200518014345304386TatianaKiera10.08.201108737744487478KizzieRuilton20.06.199506406910132825KaraGeockle11.06.201503654539437913HarrisonColliss04.03.198217441655401948ByrleWealleans03.01.200006964436885100EranCorten28.04.201114899119774919LevPre16.09.200613797471138141JedediahGorden10.07.201509676427137816LolitaBatchley03.01.198005072411645247SerenaManeylaws24.06.199811242734315547TracieGrinov27.10.201503929447908632CorneliusCulmer11.12.200704368932034297ValeGladbeck01.06.201502149173256456KimmyCurado26.11.200714362756334547HeinrickSibun14.09.198617367131450341HollieInseal21.03.198903116731528442LivTrowell18.12.198606732272526832AmmamariaLighterness26.08.198504847937190977MilicentTurpin09.12.200803474006571665AnsticeScohier22.11.200611584983943733SadieRyves06.09.201415511750281361HeinrickCusted24.09.198716413378340197ConsolataWaldocke24.09.198307307558218704EthelredWarrick17.06.201206626372072263RomaBilling12.04.201204577667673363BarnieClemens10.08.198608344680351393KatrinaHerrema25.06.200718035621694616TracyHaversham23.03.199417999841187350BrandiSperling29.10.198911288490259901TabbBradman31.10.201115372932462702BertySweetmore24.06.198404830172374200GiraldoGaitskell08.06.199107898077689938GilbertaBette13.01.201805343478393149FerdinandeCaudrelier06.04.201407337506394633SonnyEva09.07.200909956770950710LettieBramwell06.10.199717737513116572BonifaceSearchwell12.01.201004383559116680MaryellenDowbekin29.02.199217983831031079RivaleeHinstock04.02.199508262624850050PenBengtsen05.02.198416164552885098NevinAplin22.09.200309196484924794HelsaBallinger17.03.201801583678777652FranSkaife d'Ingerthorpe20.09.201317527692434351RagnarSeddon02.01.201302108776419727AraldoRopp15.06.199019800522398006TamarahIbotson27.06.200714943942245968CathleneStuddert31.05.198002875091798024FerdinandaBeetham26.12.199402884999093979MureilRicart28.02.198013834340485205GiuliettaArgont05.11.200207850960332974RowlandCleen12.03.200702806976941200SheriePoley23.05.199808478830269561EloraUmfrey07.03.201006740023156508LonStanistreet26.01.198316173127066076PattyHerculson05.07.199812488681038512BabaraOfficer04.02.198619347616098238MerryWannes24.07.201219746701106523LawCowely27.04.199812824390777100DorothyStentiford10.11.199708889395516566TrinaAbdee03.07.199715403533013818BriggsPaulon01.12.198113631477920961MaliaAbell05.05.199104294448756878AlonzoFugere26.08.201406640787692097TineKingaby27.07.198202511315316738FrancklynTofpik26.04.200902430042077407SylvesterChiverstone26.07.199815971625893988MandyFeedome05.05.200609080301932422NicolasArntzen24.10.200415589785616834UlickDeverell01.04.198007190911454858BertGriffin28.04.200907471406172042CorillaPiatkowski03.11.200112818483688233AuriaAzema31.03.198014501074215354AndrisClausius08.01.201113262267680022BenyaminVamplus20.01.200118748249899256PenelopaScandred22.04.199302694549193419AlbieWoofenden09.05.201512126926997086JulianLoisi21.12.198703484342044818KelcySt. John31.03.200307973494183569EveyLimpkin19.02.201607522826295481EtienneKinsett17.11.201606810391542695NoveliaFeldman17.05.198504471090999873AndrusSlessor12.06.199407108554474004GiuliaIvankovic14.08.199714514260317755HugoIngrey19.01.199511577964545296ChaddieBroader18.06.198115381547906258DulceaPlayer31.07.198311629388200296ReinhardFormby20.11.199319695660823191SaschaPetcher10.09.200906859818433569NikiIggo19.07.201112466328284015ShandieCheake27.03.199909031962117304AlvyDoag17.06.199707170171880558CozmoJeanequin16.04.200208071450716035MariamMalletratt20.10.199011707937411586AguistinCisland31.10.199013814136978817KareemEggerton14.01.198416589603304555HenriettaChuck12.01.201317100394733422TreyNoe12.01.200718187315606304DonaughBernholt05.10.200901851048086192JohnathGrieve10.03.201819326166246000AdianaLardnar14.06.199602572712538062LivvieBealton30.09.201019359162466428MarshalBassam28.12.198109914993514346AurelieOffer03.07.199003632612911029KamilaAlastair15.12.199908531731787540JoliJahns04.09.201003443492347319AnnadianaMilberry08.03.200415341861974515ConnPulfer21.04.200014300914144054ClarkDanielsky11.12.200008766356996654NapHaberfield19.05.200502532758589690GladysRoebuck30.11.200914994326065186SekaOsman25.07.198112019764185955ShirlReap08.12.200114065081656285KarolaFrounks23.02.198313560751869052AngelBlyth16.05.199612831292947428NathanHeyburn12.07.200712768436624750ErwinLambird23.01.201413890811632766TuesdayGaliero09.01.199214991931280855ShaylaBulfield22.11.200707905177827468ArnieThornebarrow25.08.201415959462994012KayleyFleming03.01.198612097934117659BlakeleyPittwood23.12.201408216612896264OsmundTidcombe15.12.201203286326813453LoriKienzle26.08.200019729974042246OdeleSappy12.02.198411918330065441FarliePettiford17.08.201615218393176183CarinaMitchelhill16.04.199713262437154775FranciskusNucciotti05.06.199014144263808510BooneHinsche19.05.198614413716882473ElsaChase19.02.201016980581034578LucineCouling30.04.201819744371753831AlleyBlunsom10.12.199409317499443043MireielleCorhard19.08.200716999713305402BarbeCallicott29.04.199512993134289720MelamieDavidovitch15.03.200114312773721681EgbertKaminski09.08.198805730846234503CatlinLulham18.05.199201184792256195SosannaBradley18.06.200612843025620539KennanKenrat15.09.198312795883027486ChaddyIlymanov27.02.198515147249805554StandfordPettigrew26.03.198903782124371255LizabethTesyro08.10.198405404139829525AnniBlenkin15.01.199207978359557489WandieMcGinley10.05.200213573491261735TeddSkeldinge10.02.198111269870344727LynseyWind11.05.199417847889283765ElinorMeineck05.07.201009201460449423JustinoFaloon29.09.201318123260735820AudraMeckiff12.08.201609016095302649PansiePoole26.01.198303525105645029DorrieRuselin15.07.201005845686268810RorieLeward12.03.200705175880359906FredrickDrife14.06.201004457067954494OsmondBumford05.05.199012845990187574LorneSimkovich31.05.200211312338836991AnaMoodie17.03.198118815916099909SaundersonPawle18.09.201502169988534758JermayneRiping18.09.198212764079702790TandiColam22.01.198105562585157377TildiAlen21.03.201117801943370719DierdreJacquemot12.12.201601897829361789GriffieGoundsy11.07.201412251855461246QuintaSall24.07.199917084017726391AnjelaFotitt17.12.199316301404766758IanBeswick11.12.199309667722858159RafiFolini02.04.198616053992391137WinnifredSpragg12.07.200102879144497737TheoLammerich10.04.198319656457330853FrannieBuzza26.09.199415757795043278DonaltGuille23.04.199007009567685416MoniqueRoath29.09.199504256369694390KonstantineGoudman26.07.199913119344621816WiltonWolfart31.05.199611433327762404MalinaSkrzynski12.04.201513991432220180MauritsThomesson17.11.199815681304944898UmekoGoby25.04.200904475919130237BentleyStanners06.07.201703865384947670JudithaGajownik25.09.199618582367787135LolitaL'Episcopio21.02.200414663759770598TaborDevigne03.07.200113466692369512JoycelinHarpin13.08.201307865502649031SunnyMonckman12.06.201415432447545488GilburtLincoln25.03.199406186857534818SaschaGodar12.06.199806281044683371WorthingtonCrippes02.03.200711570787406039GusellaReinbeck16.12.199116803913508553KilianFaires18.06.201106691101317450GlorianeBranney09.04.199209770647539112LauraGraffin23.08.200016337190897813AndeeeMcGarrahan24.06.201619977038086720BethanneCassie17.11.201709517000846933JaquelinGreiswood10.10.199517988180624740MalvaPoles24.07.199506041160558346KaronWheowall20.10.198203647687624334PaolinaOxlee19.04.200114587623576654LynseyVaan11.06.200606155302628389RozanneMcGuffog01.06.199104722385759531JorgeMallord03.07.199706489957487429ReeseFierro21.11.199307845584199249TamikoWestover22.06.200102924814855630GonzaloWattinham31.07.200104373586787678GrettaParkman13.12.200611813055568441AraTabbernor05.07.199707763583631111AlinaKeepin17.11.199714892800313781MarjWulfinger09.12.200715234515431668ThorinTattoo13.04.200808204167262655NannetteBrighouse30.11.199006893253965344LissyRanking03.05.200507274134541637IgnazPlanke21.09.198119584042134163OfeliaWhodcoat09.07.200802240464195700WiniBlandford25.08.199507920624620401IngrimFoulds01.12.200701223815349679MegenGrebner21.01.201114923367461562MortonPizey07.05.198818938982190030SybilWegener30.05.198305885103197998RaniaGawthrope09.04.201705702090263928ThacherGomby08.07.198605465268763587DenyseKingwell27.04.198103305789251663AleeceMcQuaid20.12.200711028172944272EdikStothard27.10.200811927866012875HaleighIzkovici02.10.199818264650270805MycaKeach14.03.201406246630955817ElyshaBurr15.06.200706325478360176SternHoltaway12.11.201501018610902517CaryWrathmall27.07.199515567164624456ClerissaMcDermott-Row03.10.198417325030995758WilmaBaldoni23.04.199405849488465750TadesPlaskitt06.03.199301305732337565ArdineBarraclough09.09.198308049526898615EthelinBlinman10.02.198402551007066112JacquiMcGroarty12.05.200003003487164529GayleGirton01.11.198817016959198918CelestiaGatchel07.04.199004321587486199AngelleLadell25.08.201102266640670359DiannneSimla13.03.199012293598933828MorseFildes26.10.198215018088241565AdianaLambirth02.03.198804949213916214VitoriaLavington07.06.198507014864406811IleaneSnalom23.10.199711004771680129GwynethOlechnowicz04.11.198314104963182933HediSavoury02.07.199015476112096254MaceMcKennan31.03.199916534062787507NorthropBarhems21.11.198513372361821111BarclayKenrack14.06.200718325143409715SalScipsey03.07.199303843547491410MiltonDuignan11.06.200314765223258868RemingtonVivien07.12.201703691961760513HiltonVan de Velde03.05.201409013798497893LeaHenrichs09.07.198115952388144196JerromeChatan03.04.198917793629839779BirchBurney11.11.199511804738308947StarlinElger22.06.199316961895210740CelindaWessel28.07.200506782821206282EricKnoble06.12.201706720939825376GennyCollard07.03.200014747695163888ElbertCoburn10.04.199502057150355068CyndiaHurle31.10.201418272970578718BairdFurmage25.07.199307111011975757AnaliesePaslow25.01.201612338683403633FaeCornes17.10.198506788942232406ShepForkan07.11.201211268417622236KoryConnow20.05.201101427337709932RoleyKobpal26.11.201202298781861873TimmieDowderswell06.06.201519466685757703ParkerDisley21.01.199509556295334071ErickBaison23.06.201407391412357370CarmelitaTumasian31.08.200518154707619885MeganEgdal21.01.199703572150683969AlainKettley05.11.200415438809114867RustinPhillput09.05.199402084204189601IngaBriskey04.09.201019374457424282AtalantaDevany22.03.198215493573228033AllardBrilleman24.08.200106563637369655CorabelleFoston16.06.199617304910958155LianneBodycote01.02.198915369281524932RodolfoPiper03.03.199716132026224408DeanBirtwisle27.01.199208122026385111BurgNesterov06.01.201419371055016955JanineStredder01.12.201101314066791810DemetriusPhidgin18.11.201107936021439625SusetteNelthorp07.01.198204945109693223ModestyRamsell18.08.200515821040669652GaelanMelton25.05.198703469581856809MadelaineLomond02.08.198112753751559489DarcyDuck15.12.199804308853894345AnthiathiaKneale23.12.199505056633002815JeffereyMattacks22.01.201105690803923864OnidaNevitt21.02.198214606503144790BernettaEdwardes24.04.199302660388367644TitoTweedle06.10.199507085914441634MalvinChallace04.04.199609683198571439PatrickGermaine18.12.199213819169853999CoreyGrzegorzewski10.02.200308227023046919RenateAberchirder17.12.199918533864987097MarillinBattersby31.07.199416198908308715MelisseHargate13.03.198315956327459815KatrinaDedam09.04.198402448603180755AlicaKubis08.11.200901529411336704MolleeOurry16.09.201211099162051031MarieannWilbraham15.04.198808627681540752NanineMcIlveen03.10.198717997118748487HonorChaffyn05.05.199116849571408562BastianGanter22.03.199713668275478868AnnmarieGerold03.06.199204629149970399SuttonMcCarle24.07.198814529603425708AntoninoPaulley26.05.200404551999154127PhaidraFlagg16.06.199909520053727605BenjieLagadu15.06.201213940152976916DoryToon02.07.201303712349782388AlasterPuleque07.09.199915830757412629GiselbertLeitche19.04.201616126634551489AlidiaMacGaughie24.05.199817233079119607ConnyQuinnelly07.07.198511467271296959ArlyVasenkov29.09.199914532063277982ArioEphson09.12.201303512867098386DevanGillooly21.06.200619485386189996EarlKinsell06.05.199602632077398700DulciePetyankin21.02.198805293787980753JudithPlan01.04.199209718125172439GerianneMurrie16.03.199814911307344999AllinPithcock31.03.200819161159579107ElnarCornelisse20.11.198905357808831578WylmaLoble04.12.198808644335700205FreelandNuttey03.01.200502477647789132SteshaPavitt17.05.198316916863806787GeorgiJinks18.10.201308904105531727BlaneLAbbet23.07.198816964134511896SiobhanBineham29.10.198203521103235751RhiamonHuntly11.01.198918460687766606KendallPowers04.07.200107995140411029OlympiaBrehaut17.05.201401671893531452DorineMcKevitt23.12.200413355501866751CorrineManoelli07.04.198819150357201895KallyChelnam25.01.200402081133742693EstellEastmond15.12.200703807082184252AlaineJacqueminot03.02.201614884123973170TracieTeanby15.02.200516130770667705JoyannGowrie29.06.199318982134924182OlivieroLayzell26.06.198011478411024869QuinlanMcLauchlin17.01.201102272478058595AllinaFromont06.07.200218522906772752MaggeeL'Amie02.01.199411537809378548LinnTillot22.10.199308093736603838AndiSemon09.03.199608128704455226VeronicaCorps17.01.198104125041971252LayneyDraper16.07.200905776042565907JemmieErangey23.12.20021 \ No newline at end of file