From 301c64f2de04a4dc27ed63b8f10c10526b8604ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D0=B7=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Wed, 5 Sep 2018 01:21:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D1=8C=D1=82?= =?UTF-8?q?=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 63 ++ .gitignore | 261 +++++ ASDC.Demo/ASDC.Demo.csproj | 206 ++++ ASDC.Demo/App.config | 6 + ASDC.Demo/App.xaml | 1014 ++++++++++++++++++++ ASDC.Demo/App.xaml.cs | 67 ++ ASDC.Demo/Controls/TabItem.xaml | 10 + ASDC.Demo/Controls/TabItem.xaml.cs | 57 ++ ASDC.Demo/Controls/TabItemType.cs | 13 + ASDC.Demo/Data/Citizen.cs | 28 + ASDC.Demo/Data/CitizenTable.cs | 39 + ASDC.Demo/Data/Gender.cs | 18 + ASDC.Demo/Data/Table.cs | 60 ++ ASDC.Demo/ListWindow.xaml | 98 ++ ASDC.Demo/ListWindow.xaml.cs | 125 +++ ASDC.Demo/MainWindow.xaml | 134 +++ ASDC.Demo/MainWindow.xaml.cs | 388 ++++++++ ASDC.Demo/Properties/AssemblyInfo.cs | 55 ++ ASDC.Demo/Properties/Resources.Designer.cs | 223 +++++ ASDC.Demo/Properties/Resources.resx | 169 ++++ ASDC.Demo/Properties/Settings.Designer.cs | 26 + ASDC.Demo/Properties/Settings.settings | 7 + ASDC.Demo/Resources/AddBack.png | Bin 0 -> 256 bytes ASDC.Demo/Resources/AddFront.png | Bin 0 -> 253 bytes ASDC.Demo/Resources/Clear.png | Bin 0 -> 123 bytes ASDC.Demo/Resources/Deque.png | Bin 0 -> 229 bytes ASDC.Demo/Resources/Exit.png | Bin 0 -> 251 bytes ASDC.Demo/Resources/Icon.ico | Bin 0 -> 22382 bytes ASDC.Demo/Resources/Inorder.png | Bin 0 -> 297 bytes ASDC.Demo/Resources/Open.png | Bin 0 -> 411 bytes ASDC.Demo/Resources/Postorder.png | Bin 0 -> 430 bytes ASDC.Demo/Resources/Preorder.png | Bin 0 -> 449 bytes ASDC.Demo/Resources/Queue.png | Bin 0 -> 332 bytes ASDC.Demo/Resources/RemoveBack.png | Bin 0 -> 248 bytes ASDC.Demo/Resources/RemoveFront.png | Bin 0 -> 246 bytes ASDC.Demo/Resources/Search.png | Bin 0 -> 241 bytes ASDC.Demo/Resources/SearchDisabled.png | Bin 0 -> 240 bytes ASDC.Demo/Resources/Sort.png | Bin 0 -> 224 bytes ASDC.Demo/Resources/SortDisabled.png | Bin 0 -> 227 bytes ASDC.Demo/Resources/Stack.png | Bin 0 -> 328 bytes ASDC.Demo/SearchTestWindow.xaml | 16 + ASDC.Demo/SearchTestWindow.xaml.cs | 43 + ASDC.Demo/SortTestWindow.xaml | 20 + ASDC.Demo/SortTestWindow.xaml.cs | 58 ++ ASDC.Demo/TreeWindow.xaml | 10 + ASDC.Demo/TreeWindow.xaml.cs | 22 + ASDC.Demo/citizens.bin | Bin 0 -> 45079 bytes ASDC.Demo/citizens.min.bin | Bin 0 -> 5011 bytes ASDC.Lab4/ASDC.Lab4.vcxproj | 185 ++++ ASDC.Lab4/ASDC.Lab4.vcxproj.filters | 78 ++ ASDC.Lab4/_matrix4.h | 57 ++ ASDC.Lab4/citizen.cpp | 36 + ASDC.Lab4/citizen.h | 17 + ASDC.Lab4/citizens222.bin | Bin 0 -> 4413 bytes ASDC.Lab4/cmatrix4.h | 135 +++ ASDC.Lab4/cmatrix4m.h | 153 +++ ASDC.Lab4/gender.h | 6 + ASDC.Lab4/icmatrix4.h | 156 +++ ASDC.Lab4/ilmatrix4.h | 189 ++++ ASDC.Lab4/lmatrix4.h | 135 +++ ASDC.Lab4/lmatrix4m.h | 153 +++ ASDC.Lab4/main.cpp | Bin 0 -> 3504 bytes ASDC.Lab4/matrix.h | 10 + ASDC.Lab4/matrix4.h | 220 +++++ ASDC.Lab4/resource.h | 12 + ASDC.Lab4/stdafx.cpp | Bin 0 -> 766 bytes ASDC.Lab4/stdafx.h | Bin 0 -> 998 bytes ASDC.Lab4/targetver.h | Bin 0 -> 686 bytes ASDC.sln | 63 ++ ASDC/ASDC.csproj | 59 ++ ASDC/Collections/BinaryTree.cs | 462 +++++++++ ASDC/Collections/Deque.cs | 199 ++++ ASDC/Collections/DoublyLinkedList.cs | 476 +++++++++ ASDC/Collections/ObservableDeque.cs | 105 ++ ASDC/Collections/ObservableQueue.cs | 83 ++ ASDC/Collections/ObservableStack.cs | 85 ++ ASDC/Collections/Queue.cs | 174 ++++ ASDC/Collections/SinglyLinkedList.cs | 368 +++++++ ASDC/Collections/Stack.cs | 170 ++++ ASDC/Extensions.cs | 81 ++ ASDC/IHashTable.cs | 23 + ASDC/ITable.cs | 16 + ASDC/ITreeTable.cs | 16 + ASDC/Properties/AssemblyInfo.cs | 36 + ASDC/Search/Extensions.cs | 401 ++++++++ ASDC/SearchAlgorithm.cs | 29 + ASDC/Sort/Extensions.cs | 314 ++++++ ASDC/SortAlgorithm.cs | 38 + ASDC/TreeTableRow.cs | 35 + citizens.min.xml | 3 + citizens.schema.json | 43 + citizens.xml | 3 + 92 files changed, 8060 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 ASDC.Demo/ASDC.Demo.csproj create mode 100644 ASDC.Demo/App.config create mode 100644 ASDC.Demo/App.xaml create mode 100644 ASDC.Demo/App.xaml.cs create mode 100644 ASDC.Demo/Controls/TabItem.xaml create mode 100644 ASDC.Demo/Controls/TabItem.xaml.cs create mode 100644 ASDC.Demo/Controls/TabItemType.cs create mode 100644 ASDC.Demo/Data/Citizen.cs create mode 100644 ASDC.Demo/Data/CitizenTable.cs create mode 100644 ASDC.Demo/Data/Gender.cs create mode 100644 ASDC.Demo/Data/Table.cs create mode 100644 ASDC.Demo/ListWindow.xaml create mode 100644 ASDC.Demo/ListWindow.xaml.cs create mode 100644 ASDC.Demo/MainWindow.xaml create mode 100644 ASDC.Demo/MainWindow.xaml.cs create mode 100644 ASDC.Demo/Properties/AssemblyInfo.cs create mode 100644 ASDC.Demo/Properties/Resources.Designer.cs create mode 100644 ASDC.Demo/Properties/Resources.resx create mode 100644 ASDC.Demo/Properties/Settings.Designer.cs create mode 100644 ASDC.Demo/Properties/Settings.settings create mode 100644 ASDC.Demo/Resources/AddBack.png create mode 100644 ASDC.Demo/Resources/AddFront.png create mode 100644 ASDC.Demo/Resources/Clear.png create mode 100644 ASDC.Demo/Resources/Deque.png create mode 100644 ASDC.Demo/Resources/Exit.png create mode 100644 ASDC.Demo/Resources/Icon.ico create mode 100644 ASDC.Demo/Resources/Inorder.png create mode 100644 ASDC.Demo/Resources/Open.png create mode 100644 ASDC.Demo/Resources/Postorder.png create mode 100644 ASDC.Demo/Resources/Preorder.png create mode 100644 ASDC.Demo/Resources/Queue.png create mode 100644 ASDC.Demo/Resources/RemoveBack.png create mode 100644 ASDC.Demo/Resources/RemoveFront.png create mode 100644 ASDC.Demo/Resources/Search.png create mode 100644 ASDC.Demo/Resources/SearchDisabled.png create mode 100644 ASDC.Demo/Resources/Sort.png create mode 100644 ASDC.Demo/Resources/SortDisabled.png create mode 100644 ASDC.Demo/Resources/Stack.png create mode 100644 ASDC.Demo/SearchTestWindow.xaml create mode 100644 ASDC.Demo/SearchTestWindow.xaml.cs create mode 100644 ASDC.Demo/SortTestWindow.xaml create mode 100644 ASDC.Demo/SortTestWindow.xaml.cs create mode 100644 ASDC.Demo/TreeWindow.xaml create mode 100644 ASDC.Demo/TreeWindow.xaml.cs create mode 100644 ASDC.Demo/citizens.bin create mode 100644 ASDC.Demo/citizens.min.bin create mode 100644 ASDC.Lab4/ASDC.Lab4.vcxproj create mode 100644 ASDC.Lab4/ASDC.Lab4.vcxproj.filters create mode 100644 ASDC.Lab4/_matrix4.h create mode 100644 ASDC.Lab4/citizen.cpp create mode 100644 ASDC.Lab4/citizen.h create mode 100644 ASDC.Lab4/citizens222.bin create mode 100644 ASDC.Lab4/cmatrix4.h create mode 100644 ASDC.Lab4/cmatrix4m.h create mode 100644 ASDC.Lab4/gender.h create mode 100644 ASDC.Lab4/icmatrix4.h create mode 100644 ASDC.Lab4/ilmatrix4.h create mode 100644 ASDC.Lab4/lmatrix4.h create mode 100644 ASDC.Lab4/lmatrix4m.h create mode 100644 ASDC.Lab4/main.cpp create mode 100644 ASDC.Lab4/matrix.h create mode 100644 ASDC.Lab4/matrix4.h create mode 100644 ASDC.Lab4/resource.h create mode 100644 ASDC.Lab4/stdafx.cpp create mode 100644 ASDC.Lab4/stdafx.h create mode 100644 ASDC.Lab4/targetver.h create mode 100644 ASDC.sln create mode 100644 ASDC/ASDC.csproj create mode 100644 ASDC/Collections/BinaryTree.cs create mode 100644 ASDC/Collections/Deque.cs create mode 100644 ASDC/Collections/DoublyLinkedList.cs create mode 100644 ASDC/Collections/ObservableDeque.cs create mode 100644 ASDC/Collections/ObservableQueue.cs create mode 100644 ASDC/Collections/ObservableStack.cs create mode 100644 ASDC/Collections/Queue.cs create mode 100644 ASDC/Collections/SinglyLinkedList.cs create mode 100644 ASDC/Collections/Stack.cs create mode 100644 ASDC/Extensions.cs create mode 100644 ASDC/IHashTable.cs create mode 100644 ASDC/ITable.cs create mode 100644 ASDC/ITreeTable.cs create mode 100644 ASDC/Properties/AssemblyInfo.cs create mode 100644 ASDC/Search/Extensions.cs create mode 100644 ASDC/SearchAlgorithm.cs create mode 100644 ASDC/Sort/Extensions.cs create mode 100644 ASDC/SortAlgorithm.cs create mode 100644 ASDC/TreeTableRow.cs create mode 100644 citizens.min.xml create mode 100644 citizens.schema.json create mode 100644 citizens.xml 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 0000000000000000000000000000000000000000..fce67ac00193b1458a7888b8469352dd31ab74ad GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP_o1|q9iy!t)x7$D3zfgF*C13FE6!3!9>qM z&&cqjLgrMUq5@AB#}EtuwHF+@8Vq<`E?Q3F7S~&P{PUirv8$AQE(Qg4XzrPMQoSRH zYp&eZYkOIPywuL+9RC&Ypl$}6iBD}q)PY4u<@O(Cb$dQp=}X*{Ob3h0>~{7SmCX#S vZXcRE=kq6R20K=pB<97&x*r+&8FnzFt$)X1{m<(i&~64#S3j3^P6qM z&&cqjLgrMUqFhfG#}EtuwHFR@H5hO-B+9RJZkIiL{B@;kf1BxXj*kj#@>|;Mg*r|g zJrl*UVATWpW3~I<$O;B)KRBGmza!(uncw;kn(O5}O;}@0B-Z9Xt3B+0hnba^QOW9! rz}lISjMY(0uDy*JXMO4yv^`|hkbB1wxMIE;&|(HpS3j3^P6h> literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Clear.png b/ASDC.Demo/Resources/Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..510b507845e76a2eadddf3ffa56547ed77aadc29 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar*0NgEsOqDDZ4rX8)t@ ze8tl9Kic>=EaJ1fV6{?ZgCmop2OIyRC$AZq4s2bdx6*RvnWbN)-LBj{+ExFQnUPsN Wo}WAFP|*vZX$+pOelF{r5}E+T^(pcI literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Deque.png b/ASDC.Demo/Resources/Deque.png new file mode 100644 index 0000000000000000000000000000000000000000..d53df81dae82d459f7fd55e109299b6ca73c2adc GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP_o1|q9iy!t)x7$D3zfgF*C13FE6!3!9>qM z&&cqjLgrMUqEJs4#}EtuwdWGK7zB9Q9?G7SEc^d>&EKOPLD?T?R!wO5?zRukB&Z)FELEzI%+eTgKi0okDJU*REZpIUW+U~Bdb$$H9Nx_{r=OmdKI;Vst05vya1ONa4 literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Icon.ico b/ASDC.Demo/Resources/Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..08ca7949b56e9e54f3c67524d1f69bda2fe69279 GIT binary patch literal 22382 zcmeI4F>Vw=5Jek7K!y`y9Qp*rmIKbhF*pe^$KXbo#3CDJynbl)w58g@+en4S()jz= zy!l<#Z7;Br8ROM>J+7|Cs@LQ5n=w9)F|Mx<{@Ysry4G%Q5B}zEj8E^!xLKL?*80Su zzRDPHA3tC8)5F8V^4#n0?ru50w!CA%eI3=P|NL>kY}YY+PL1b}*Q?ZE&sl3*!yL~) zcm3|qdtZ*{*}i6<%tiI;^T&K8b7N0k$9eRBiaYhgc#7L^Q-~)pzv@gbvTr|IqFt(0yDD_Cqk%#h}IqFt8)c5Vpu`UX4j=B}Ds?M>m z=2dyGXJ5@b_g{gta=Wa5ZlB$_<>}*J^}T$5y*yq|>u&E;+^*M`_4@NZ#b)-8eFyd( z*mvM*2daPm?ELBXzxRFF_vL^19`N6LtKNH1ect@+yxIAlr|M_-H#@&Nuld>i&Cd5c zRX@AGET8uQBK17o^1Aiw{f^Fsx_QrQZ=Re;&3DV|*01+FIv48ZJ+Hm_s_&N9t>5Z- znD@N)=BvJ2UblX$=V9LS+MDNfBvSL;^1Aiw{f^Fsx_QrQZ=Re;&3DV|*01+FIv48Z zJ+Hm_s_&N9t>5Z-nD@N)=BvJ2UblX$=V9LS+MBQXZh77Mt)7Q@&ueeK>bvE2>$iFy z<~^^y`Ks@h*R9{`d6@US_U5a;TVA(*tLI_f^V*xQ`fhpM`mLUadCzNazUsT>b?di! z9_Br-y?Ne8h}3+RXFl^;Uep(L=R42dJUNk?&+^P?KFf>xqV9a>*_$UPQuA4!`OIf| zQD4-Z?>u|+y zyr?hg&Uc=@d2%8(pXHg)e3lpWMcw(%vo}vpq~^0c^O?``qQ0m*-+A`tt3J!4uSmUK zmS;Zm&a=;+&+cb=(cILXpXHg)yz}g{=d=4+9&<+O{4CFW=ACDsJ)hmr@}jw^J3q@a zpLyra_E|sK{n`D^&d=t{?$7RTc78Trc7Jw%v-7k0vir09yYw$Yb?bMZ|FS!cC>^tz1cYyz=Akvq-HyvhQmisZ@ZKoG$bh3x~Zv$VoR{#J2 literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Inorder.png b/ASDC.Demo/Resources/Inorder.png new file mode 100644 index 0000000000000000000000000000000000000000..0465e46c5fc0346942b24e21ebe6c8d2a01b2175 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAQ1G^= zi(^Pd+|mF;zGed+pT&MYH7qORHH^$ve8!9#3J!xWO0;3+xFbqvzDFQ`~9aQ?-i+E`_6Bi!cot7 zvNYB?_WFfVS()z*F{{$gs(LU@J!IML7xQAx9ao2Z>x8qPc~T=cc?2B(zi&e7&EE?1 zLYN-yt3CMl37=Y@_};|DvxOq29o>?HLpT@l2eD0C?EWY?gm>P?H9dxr tvgc*2uWo9HB-P;NgnEBu;qtP&Ox`|4b!U4>T z`%n*&#LW`{74wt5@OosnnO{JcaPwnw0k!BHjq?D$IWpW`W)9PLA{qq4Gc=1zo-Y=E zE`UpF#x|L{+GS?qDq$K0Se3Z8r;UJmKu>JH%*bSgNWU;fMQYiNDKvse<|2q}Y8h?) z+W!MUJf&7p{4jVi^$+G+*ui|cMdAISJb+3} zHnn!7Nw7oy?y&L#&bq7)!VaHC4tnMsB}&g(0q}|j_yQ+{h>cBBshR))002ovPDHLk FV1kwtv0VTF literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Postorder.png b/ASDC.Demo/Resources/Postorder.png new file mode 100644 index 0000000000000000000000000000000000000000..c9742c4797481eb9ea2977ee0adfa91f8ea433b4 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJtM=93Yk-ZrpkG`IEGmGw+0&e9Wf9%W4z*}=1&Kg*=_TtDVdted(^8tx|jcCbaiq* z&OTwm5=Fs94`f{3H&%pMPfM;TSMJ>t_x{Yfw@I_qZtjYl7e6=Vj*XU}^7Hd`HvV1C zKg#wOecv*5^J;d>y)oK?%I(JaUy_zq#;m{BWT1L3;ZfpM$qhfsK1;R~@-STj?IUA@DPzRn6^r z`8E9mOP2S!Gq0J!wnQ-d-$9-!CMPDoPuQfYBwTjuHy`^!{b%OOAIqC|BsRIkh}3(z WNp}Cc)%g|}oD80>elF{r5}E*u#IB71 literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Preorder.png b/ASDC.Demo/Resources/Preorder.png new file mode 100644 index 0000000000000000000000000000000000000000..0cee8ff6e3246dd774a2c2262f0f2379c6992418 GIT binary patch literal 449 zcmV;y0Y3hTP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00A*cL_t(IPlZykPJ}=ZV7No|p#IAl3YV1TZyVj=Bf2jS+?D rP5RnA=B{}17e6_Vos7@J$E86XR1RO00000NkvXXu0mjfHm$h8 literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Queue.png b/ASDC.Demo/Resources/Queue.png new file mode 100644 index 0000000000000000000000000000000000000000..59b8f49eff91c7cb254accf310e06b9bad342fa6 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~LCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33JtM=93Yk-ZicWgE zIEGmGubp7Xb;v-ZtyRJGC`L23NL(JxaAHob1cmVOi{^@v*(Fxb)B;i{gOIVbfHn1bq~Ja^-Ms|I56lk5x|=r1kE76m^8zV#6MtJ%%l| z=Pn35Vos^3zFqQaKI5j(n^*4XjJnrid{OiX?~~hhTkm$WMP#=hlbB%8;JoJaRA+{i Zd>MO=V-Ja6e!PC{xWt~$(69D+qfwuqv literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/RemoveBack.png b/ASDC.Demo/Resources/RemoveBack.png new file mode 100644 index 0000000000000000000000000000000000000000..1a59d5dd3661df81e60ea795f7eccbf0b1145cbb GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP_o1|q9iy!t)x7$D3zfgF*C13FE6!3!9>qM z&&cqjLgrMUq6|+L#}EtuwHFR@HW=`55zuNoKmg@`<|0 z*05d5Az$Ax3jS=dexD%uVD@r$o9p{#{+K4d;oNeunUQR1JB(|RT=EWBT|PWF=+sAT n20w0>Cv0nsZGSd$FjO$;&w2HMdw)+U&`t(VS3j3^P6qM z&&cqjLgrMUqBKtz#}EtuwHFR@9x&i&O%#72Wn13zXxZJsFBucnEF~9yVv<*B`Qvfo zOkU_$HKp?976za7wGGUoZ$377xBoz~+)7E!2BxVwe+=F+&bMIpZD{C-DLip(%^C+C jj|H3(K-L3hTQB|IKd(O2ojWlFXd{ECtDnm{r-UW|fBRFo literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Search.png b/ASDC.Demo/Resources/Search.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5d30f24ffaa5f64532ccbb836c588de392b4b2 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMpx|Op z7srr_xU&-sxtJA2T)uNyPTtGD;k(YaZ}$!=FZm|t8Ks?TUU`&%k^D4XP8SJ@=f?f( zrI&x-SHH^qfJAXvJ%`2TZ}QAe9GmUgdRU*&x$`mQID@9K#!?SP|6@L^I!`4Y@6ns- z5W+Cs^uK5yo3@tizc1IJn5s~5GL`!)f7*c^ujagNm?ETjh}+@3E7OXtadD2* mHf$|Zb^ft%!pUv<^VDml7sO0bd!++(E`z75pUXO@geCxQH(B)n literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/SearchDisabled.png b/ASDC.Demo/Resources/SearchDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e76c2525c583401d1c13ffab24ce11e8381887 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP_o1|q9iy!t)x7$D3zfgF*C13FE6!3!9>qM z&&cqjLgrMUq6AMD#}EtuWQNAY?*0GN#e?%0CL}nCtFSin2)KZ$1Xja78Ox?nMnxX} z=0@{|7@wVtH&{FmHXmTe})s0{K72DI{zvd3b1WVe57EiV7Ni;6$2X^ ZgU#)i#o~!4ZUOCL@O1TaS?83{1OPYML>T}8 literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Sort.png b/ASDC.Demo/Resources/Sort.png new file mode 100644 index 0000000000000000000000000000000000000000..c3dc69167a30c86ee0bc7e164657cdd9de60a7a5 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMpx`7= z7srr_xUCZoaxyClxCURk_Ta9bj*9x~4cy!}yO*xG&dJ}@)|sO4=urFq&wu@o9e;kk zdVluX>$kg$`8emz=`sGXRAb?_TfvOSc>c1q2rQYR#C4$O4AYq)ugs^p4m}eu1*I_T z^NO-e|9G!oY2M9OZz^&{d*%wpJufjiFo7{(ecqqX+#tOnV=4E|-i Vr@oI;UI26*gQu&X%Q~loCIHzHTDt%M literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/SortDisabled.png b/ASDC.Demo/Resources/SortDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..bd118c511dc938fbadbd667d1e9ffdb12122e39c GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP_o1|q9iy!t)x7$D3zfgF*C13FE6!3!9>qM z&&cqjLgrMUqF_%K#}Etuw>^$r42nF=wU_KJ?%!(resatqHw_bxd3!7bI7)p^yBx_* zR)1+IU>zdB&OMr3Q1>q)IE^;0%Xwk}|waGBZA?m@-Fz=g?d R!a(C0JYD@<);T3K0RRE&NE847 literal 0 HcmV?d00001 diff --git a/ASDC.Demo/Resources/Stack.png b/ASDC.Demo/Resources/Stack.png new file mode 100644 index 0000000000000000000000000000000000000000..8afb0bbae7e615da67bc9a7cfd93989b36849261 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~LCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33JtM=93Yk-ZijI1^ zIEGmGC;#~W-~RCS{QLis58vNk&whD+UEPoTi>XY<6wEwiTI&D&SjcaF;N(e8*7~3S zSl39nDN8r#v|nbJ(6qud@&EaK_J99BKL5Rd*&%0wga_Xew&mgza_5$;m)D-XfYJ21 z)`PB#h8}!J8A|l$>@Sg9lkj!5=>NIPZyh#mx}jh=LFS$T2N&0`|KHw5Z%~>sKQWO> zsCm~GMxYsnI#&|6DVcZkK*Pj + + + + + + + + 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 0000000000000000000000000000000000000000..c3e9975948e1f4e57c5a260407227995e1ef2d85 GIT binary patch literal 45079 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 cw+#5BH$W-{Giyknv;M^Qq&XHdu3SF + + + + 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 0000000000000000000000000000000000000000..9652f595ba7c7a9b5f34e140f3634d72258d4db6 GIT binary patch literal 4413 zcmY+HeUOz^9mg+$qO1j?NN=(tB^B|9nL{?!diUQi?xpQM`bljetRG!&-O(Vuhksg?x0XsI=o1>y9)&sr{&sQSwr$MM|#PD zo;e$21Kz!fU?9^LgcTF(D`m<4BM#ei->KKX?ZoIS2VpP_xUX6m(rNl(S;FWU_T+hM z?WOl_b%fWdau7plwdkoA%Hjj^^T@#+>%KSU$gVL-IWUk|9SAf^kwLy?9&}_6|M|_m zBeKD3SFldUX$@Pnt0>XY$7O{K9$b20!-eAx+#ClgiWK1fU_{5sM`VTJjtVI_OrCl9 zYlwlIt436$STtATDEXKy5ctOqIk@fq{!I>IXZk#*p#Qojs@9glHj;v{p+x3hGYOdPFA+WD_gyb;8Wu_4Wu^g*t6&B#7{E zpQ?s<8zCNbLi}mob1xA`06Ud9k^K(Ite{}y9`l`YME^DL_x<-cY->fwHHhZQI>Ppd z>g}9+X2ITX36T936$jM>s{LX%6^0zTM1J0ZjXmLWI0bN);IwMB#j30-aOda~{E_F} zy(e$>&aNY@+&W0hm&s?Ll6lBMxBq+FVjsrcs-&$e+N%}ujIKc!`vT_BnXAu#4$at? zq({WONevdoSf?Fq>X+fEjRJ$kS{>p7mhC}dsG=f#!0Y1s1X&%hCR&V#Vs5;74K`Wyu)O9QN7Y z`^n7A%+3V=S9MsF-VIUSF&DrjWrR<%gv1Z4D$6GIXn0 za+I%ap-QZt@ba~4;&jKz?E)qE1e%m3z5q*+OH=X=3h1G0C?L=e=w zQNOuOC6~({q5D&(*x~ng^^ly#}P~sJmY)jJV1z%G&v(~rPbBrxL7nBfWqLo zv%~lo?zoxRz^NA`Nxh!PDN`82V#wv=H`jW-Eq+#3>0LH{yQST#>CQz}7kZh7uJ9?+ z82PdloA53AHl0)xq(`7%If--O5lfWUY_S+5^<>D?9EYT$6zR{XLnnvy`6oVInvjJ} zp0fDP`gtIx3^Al&{-+%A$)mFd2_7VtnpUtic)*M@qZBa)Dtcd^JH2JO_eyUe6?zI< zJz9mnvU)Qg_{ye6%#1R9u}%smP2tgOOnneUIA64fj@@$B_m{5<)p|VSM;RJxcmpmz zG#X~?T1kqcfC~+n^c$J5oM|w|F{j|v3yYe3(05R&ix3->NJSh#yXBA2%e>jLd!H}a z?Ln+6HY!Y9QW1g7G2aj;m(8E&JHe`0q=Zg)p`ywr@^y8;7hus1JHR4jz96YD6DXhh z#Cx)24CB*DC&jXb4X;qGVBVslK-*TAQ-O_pjNyZA;?b+#rTU<4HVkDrQ9*qsj)V2< zg9yreJLm-IoOtE?zPL_T%q}eh9=!1LlTL;Q*DSu0jKV@4s-i+Dbm}P5MLX#c7rupl zciy#E-|4Wc5~T{TTtach);Y7mcMQr2 z&(wk8FZm`59cxaeZ6%{+?343Hj_PDX)`kvTMZh9*NR5>!Zx zgSZ%L>xWnuHD!VqWbqz8ykO~+*Q{PMtuOpU}~GM1#$wm8$L z>+!-le=*uUkiC&bWIp$&OaOhU`55&-q}HX|Qa}Z~)b2sXIu@L61E6&|5$7 z13_1{;0Ew^GdvVTwn{_7*O2k0zp-}(h^>k%wyo4>2h2)3`04QYr_S#4cWSBUfpkC! zai^}&U4Zcc&&Dk`Ug%5dTB!qaUqHz&GpxsGDj3R#!T#-;7YPHXbxQTrwmjymsdQv+ z>d++{c*gHqlaS?zOXXs_&6uK0;P`=8G=qF&YttUgz@Dp)aOf|aVm*lohi4r)|Jf~n zq(Xz}Q=!~%?6IICLsS9~Ax=2(nOT?HTPhm$n02A8_bWqFD>4^x&|5cm^8Vv~jLRE$ pY3nvzlDUgvVww-n&g*8{*2?Q(%~WKLW|=SRQ0xGjETcB^{1-}GC9nVh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bcc0264dbad35e57b1138176dafcc3c8d7fb6def GIT binary patch literal 3504 zcmb`KZ%-RX5XR@lzHz0#=_ha;QIVv8F=yf!?8Jr`A^t^8`=)7xOfbO`;K&@MwCY!H z`+Iipe0Ok7>Z&^3-t5lI?lUtxvwMI2xne6;wVu7TZQHVC+qa>eSOoRKKJm2ScHK+& z$~9fYyWx&#`>twz*L6Ft?Y5vB?lry0)uAIVQ?)iD9oM7XaQjeQx5isF&DCP8>(-g6 z1AXL{?Q8oABrEKdxz^?D)886>NVjbQtqld^fu&c@U0NJM7 z^mg=_9Rx`Ay@dncZ!y-wJ8C=LgKc#8aux^NE2YSPu?c=S1;<iRb<9+Y0NA;BT?!704#U zVMOl@a;w&`CT%)fx$F^fh}l1C%k>nuiVeWK58kI>Ipgj4?*z?}M^$4FjG1F>zxk1C zB7aHmitma4)=Y7#;fE926jhi#?CwYGQ$<|Sulsm~-KjY5(C@+1zNp%B_%9h%bYIXf zdNjWxdBI`hEaQ~h)_E- z?7<#3w6H2*E=tMQ^63aqUPH_0SM+ZA7A4>1tazWZbAqK+>`1LTW;V?k=BgtZdYgPR zKZMa|_6%DCu1XHaJLvbx3`G=+_$-a9ysWA)VQu9=#>q##MjYFCLKz+rS^0T~D0j(j zWvRZ(`CZ;V)u~4f(w>n2T5$U0c|ECHd*rvYmFXR~WZUpM%sxQ!$n)Cp>deuj4Jh(i zSC*NIz-3}<>iIENeMwK*CtKEhTla0lw@b;`QX&!g(dWL+VlCY)9+^+es>@T*WD+0o zc8u=1udJ#Tp_WvcQIB?hOg>E6NmbJhkSG4|t*HOIl4;JgR()dCkd?}oa;C>St`!tIAVj<<%M0m{DspDoUs~RJy~29-uX4rkIf-ejX*` zI(;9G_PuoMPdu%-gZ!006{qylNGLPXyi9A9u!Wq=@2q7D(cDM=mbs?ZPimPeSE%gD zU+Hf8>QJWrqrV?~PP>@tW#}4nqicA3g-*KjqRVR+(Up5|ZEk#PGknsW7hhicKE85< z(cB258A9pKi!iVK5Mi2;6;5_N#X7G0NLq`^cBO7AIvYccQ-oEo#z|!xbH~Z{db+~H z+;8~%(gNDLH$D6+<1csuSM{+4>B8U2ikW;$sV2zQUqAr2OVvv!$`QDzp$&KL`| z;22)021SXBq$>OqU-zIXzB}hm6jM!(d38^|ySGxAobGqU)gDUSQ6qGpF3PEfq*X}K z)GcDi-#oWzzvs`PZ3p~W=yu1gpSMPTi04)9IBosNfS#&L7`-3gaDG(qTd~5c`aa^+ z&Hf=?IL)` +/// +/// , . +/// +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 0000000000000000000000000000000000000000..bd8fbed9e68d2815e51f63cb2ab5bccdb3a8cfd9 GIT binary patch literal 766 zcmZ{iPfx-?5XIkNP9}bbjb4pFrBZ22>4Kt>zyS_k{Tnn!Nz}woufDenA&?l-w9M?j z`OTa8{b`^9hYx(>0k?RD$?Y6aC5ErQ~JnauXFM>f&bm|=(k$;M>7 zLz`bqQZATl*?`(9l_PDns@~x{p|&SUZPQTEq07jKr$v>7iWR9+Du}kQigi`Hzq(zL zw`V7O96G$KuRP?Wv?1K~@12Y$4Nz#gNr=(V#7lTIq?AjdNU&bw$D?z$)HVXvhu!YZ z&YYdI=k#k+LJ1aL5MhEbrue`q=5UCW#gT>#Wgur_OH;0-E*37hs}r|S;q3Fld>G+h>p}#jqz(d&DW$}9PxOULm#$r;>kG?3oRlZ zF~@j4VRU77Iofn77FP|qma6pl23;b)sLmyxdUW?_tIXG?3;#!#@b#;s zh!xg+?HQgpTX@D20YY;YpDzsZh*wr6B%{FkjH#J%7vYWb+SI9#(I|5YRjT3vJ>1}q z-&^##zUQvb-4H(K5jxxtamg_tBX#!s=H|9H7Idkd;cYY6@|10<}n?rL={F5DYFfx-)0sw^V$NSsvDBgN z$W5)qdu{{#nB2gc+zKjEVj1@ki?OOxPDWy>b;%iU=KeM0z3pS6j}wU@dF{S6%6^$MEr9QJ+Rh`hq1XwlE%%I%a`KnFKF_NWRwA(q3$b?=eskY%um zi5#!6ySk8wJ1b^W*bQy6LLP8tOo;gX#CO21g7sb_khrau9Ln8pZ#6Q2AlM{qT56>9VuAfXF6wY2bRrmYC7(rS0;mBrP@Z7-`jTjmTGSEs8mgu a|MwTN(WUP7n(IMtsI~xC@=s0bwfq8O*;kDK literal 0 HcmV?d00001 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