Advertisement
kot025

INDEX monday better

Mar 16th, 2015
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 43.55 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. using System.Runtime.Serialization.Formatters.Binary;
  8.  
  9.  
  10. namespace ConsoleApplication2
  11. {
  12.     [Serializable]
  13.     public struct Person
  14.     {
  15.         public bool active;
  16.         public string name;
  17.         public int year;
  18.         public int rank;
  19.         public Person(bool _active, string _name, int _year, int _rank)
  20.         {
  21.             active = _active;
  22.             name = _name;
  23.             year = _year;
  24.             rank = _rank;
  25.         }
  26.         public void Show()
  27.         {
  28.             //if (active)
  29.             //{
  30.             Console.WriteLine("{0,-40} {1,5} {2,3}", name, year, rank);
  31.             //}
  32.         }
  33.     }
  34.     [Serializable]
  35.     public struct IndexEntry
  36.     {
  37.         public string key;
  38.         public int length;
  39.         public int offset;
  40.         public IndexEntry(string _key, int _length, int _offset)
  41.         {
  42.             key = _key;
  43.             length = _length;
  44.             offset = _offset;
  45.         }
  46.         public void Show()
  47.         {
  48.             Console.WriteLine("{0,-40} {1} {2}", key, length, offset);
  49.         }
  50.     }
  51.     class Program
  52.     {
  53.         static string dbPath = Path.Combine(Environment.CurrentDirectory, "contestants.dat");
  54.         static string indexPath = Path.Combine(Environment.CurrentDirectory, "index.dat");
  55.         static IndexEntry[] AddIndexEntryToArray(IndexEntry[] array, IndexEntry entryToAdd)
  56.         {
  57.             var newArray = new IndexEntry[array.Length + 1];
  58.             int i = 0;
  59.             for (i = 0; i < array.Length; i++)
  60.             {
  61.                 newArray[i] = array[i];
  62.             }
  63.             newArray[i] = entryToAdd;
  64.             return newArray;
  65.         }
  66.         static Person[] AddPersonToArray(Person[] array, Person personToAdd)
  67.         {
  68.             var newArray = new Person[array.Length + 1];
  69.             int i = 0;
  70.             for (i = 0; i < array.Length; i++)
  71.             {
  72.                 newArray[i] = array[i];
  73.             }
  74.             newArray[i] = personToAdd;
  75.             return newArray;
  76.         }
  77.         static void AddToEndOfFile(Person person)                               // добавить переданную запись в конец БД
  78.         {
  79.             var formatter = new BinaryFormatter();
  80.             var memoryStream = new MemoryStream();
  81.             var fs = new FileStream(dbPath, FileMode.OpenOrCreate, FileAccess.Write); // добавление записи в файл
  82.             fs.Seek(0, SeekOrigin.End);
  83.             BinaryWriter bw = new BinaryWriter(fs);
  84.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  85.             formatter.Serialize(memoryStream, person);
  86.             memoryStream.Position = 0;
  87.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  88.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  89.             bw.Write(data);                             // запись массива байтов в конец файла
  90.             fs.Close();
  91.         }
  92.         static void AddToEndOfFile(IndexEntry entry)                            // добавить переданную запись в конец индексов
  93.         {
  94.             var formatter = new BinaryFormatter();
  95.             var memoryStream = new MemoryStream();
  96.             var fs = new FileStream(indexPath, FileMode.OpenOrCreate, FileAccess.Write); // добавление записи в файл
  97.             fs.Seek(0, SeekOrigin.End);
  98.             BinaryWriter bw = new BinaryWriter(fs);
  99.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  100.             formatter.Serialize(memoryStream, entry);
  101.             memoryStream.Position = 0;
  102.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  103.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  104.             bw.Write(data);                             // запись массива байтов в конец файла
  105.             fs.Close();
  106.         }
  107.         static void AddToIndexes(IndexEntry entry)
  108.         {
  109.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Read);
  110.             fs.Position = 0;
  111.             if ((int)fs.Length == 255)                                              // если в базе 1 запись -
  112.             {
  113.                 AddToEndOfFile(entry);                                              // пишем в конец индексов;
  114.             }
  115.             else                                                                    // если больше одной  -
  116.             {
  117.                 bool done = false;
  118.                 var entryArray = new IndexEntry[(int)fs.Length / 255];
  119.                 int counter = 0;
  120.                 int i = 0;
  121.                 while (i < fs.Length / 255 - 1)
  122.                 {
  123.                     IndexEntry ejected = EjectEntry(i);
  124.                     int comp = ejected.key.CompareTo(entry.key);                // ej<en= -1 ej=en =0 ej>en=1
  125.                     if (comp == -1 || comp == 0)                                             // ФИО извлеченной записи < ФИО введенной                            
  126.                     {
  127.                         entryArray[counter++] = ejected;
  128.                     }
  129.                     else
  130.                     {
  131.                         if (!done)
  132.                         {
  133.                             entryArray[counter++] = entry;
  134.                             done = true;
  135.                         }
  136.                         entryArray[counter++] = ejected;
  137.                     }
  138.                     i++;
  139.                 }
  140.                 if (!done)
  141.                 {
  142.                     entryArray[counter] = entry;
  143.                 }
  144.  
  145.                 UpdateIndex(entryArray);
  146.             }
  147.             fs.Close();
  148.         }
  149.         static int[] AddToIntArray(int[] array, int toAdd)
  150.         {
  151.             int i = 0;
  152.             int[] newArray = new int[array.Length + 1];
  153.             for (i = 0; i < array.Length; i++)
  154.             {
  155.                 newArray[i] = array[i];
  156.             }
  157.             newArray[i] = toAdd;
  158.             return newArray;
  159.         }
  160.         static byte[] ArrayOfSerialized(Person person)                          // этот массив нужно будет писать в файл БД
  161.         {
  162.             var formatter = new BinaryFormatter();
  163.             var memoryStream = new MemoryStream();
  164.             byte[] data = new byte[255];                            // массив байтов под сериализованную запись (решение проблемы с размером)
  165.             formatter.Serialize(memoryStream, person);
  166.             memoryStream.Position = 0;
  167.             data[0] = (byte)memoryStream.Length;                    // в нулевую ячейку массива - количество байтов в сериализованной записи
  168.             memoryStream.Read(data, 1, (int)memoryStream.Length);   // в массив с первой ячейки все из сериализованной записи из памяти
  169.             return data;                                                    // этот массив нужно будет писать в файл
  170.         }
  171.         static IndexEntry[] ArrayOfEntries()
  172.         {
  173.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  174.             var array = new IndexEntry[fs.Length / 255];
  175.             for (int i = 0; i < fs.Length / 255; i++)
  176.             {
  177.                 array[i] = EjectEntry(i);
  178.             }
  179.             fs.Close();
  180.             return (array);
  181.         }
  182.         static int AskForAction(int qtyOfActions)                               // запросить команду меню с проверкой вводимых значений
  183.         {
  184.             int act;
  185.             bool ok;
  186.             Console.WriteLine();
  187.             do
  188.             {
  189.                 Console.Write("Команда: ");
  190.                 string buf = Console.ReadLine();
  191.                 ok = int.TryParse(buf, out act) && act > 0 && act <= qtyOfActions;
  192.                 if (!ok)
  193.                     RedLn("Доступны команды 1 - " + qtyOfActions + ".");
  194.             } while (!ok);
  195.             Console.WriteLine();
  196.             return act;
  197.         }
  198.         static Person AskForNewPerson()                                         // запросить нового участника, создать и вернуть запись
  199.         {
  200.             Console.Clear();
  201.             string name;
  202.             int year, rank;
  203.             bool ok;
  204.             Console.Write("ФИО: ");                         // ввод ФИО
  205.             name = Console.ReadLine();
  206.             int tempParse;
  207.             do                                              // ввод года
  208.             {
  209.                 Console.Write("Год рождения: ");
  210.                 string buf = Console.ReadLine();
  211.                 ok = int.TryParse(buf, out tempParse) && tempParse > 1900 && tempParse < 2015;
  212.                 if (!ok)
  213.                 {
  214.                     RedLn("Ошибка.");
  215.                     Console.WriteLine("Убедитесь в правильности введенного года рождения и повторите ввод.\n");
  216.                 }
  217.             } while (!ok);
  218.             year = tempParse;
  219.             do                                              // ввод разряда
  220.             {
  221.                 Console.Write("Текущий разряд: ");
  222.                 string buf = Console.ReadLine();
  223.                 ok = int.TryParse(buf, out tempParse) && tempParse >= 0 && tempParse < 10;
  224.                 if (!ok)
  225.                 {
  226.                     RedLn("Ошибка.");
  227.                     Console.WriteLine("Убедитесь в правильности введенного разряда и повторите ввод.\n");
  228.                 }
  229.             } while (!ok);
  230.             rank = tempParse;
  231.             return new Person(true, name, year, rank);      // конец ввода данных и возврат записи
  232.         }
  233.         static void ChangePerson(int number, Person person)
  234.         {
  235.             var formatter = new BinaryFormatter();
  236.             var memoryStream = new MemoryStream();
  237.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Write); // добавление записи в файл
  238.             fs.Position = number * 255;
  239.             BinaryWriter bw = new BinaryWriter(fs);
  240.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  241.             formatter.Serialize(memoryStream, person);
  242.             memoryStream.Position = 0;
  243.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  244.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  245.             bw.Write(data);                             // запись массива байтов в конец файла
  246.             fs.Close();
  247.         }
  248.         static void ChangeIndex(int number, IndexEntry entry)
  249.         {
  250.             var formatter = new BinaryFormatter();
  251.             var memoryStream = new MemoryStream();
  252.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Write); // добавление записи в файл
  253.             fs.Position = number * 255;
  254.             BinaryWriter bw = new BinaryWriter(fs);
  255.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  256.             formatter.Serialize(memoryStream, entry);
  257.             memoryStream.Position = 0;
  258.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  259.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  260.             bw.Write(data);                             // запись массива байтов в конец файла
  261.             fs.Close();
  262.         }
  263.         static Person EjectPerson(int i)                                        // извлечь указанную запись
  264.         {
  265.             var formatter = new BinaryFormatter();
  266.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Read);
  267.             var memoryStream = new MemoryStream();
  268.             fs.Position = i * 255;
  269.             var data = new byte[255];                                       // объявить массив под сериализованную запись
  270.             fs.Read(data, 0, 255);                                          // считать в массив всю запись
  271.             memoryStream.Write(data, 1, data[0]);                           // значимые байты записи - в ОЗУ
  272.             memoryStream.Position = 0;
  273.             Person person = (Person)formatter.Deserialize(memoryStream);    // десериализовать запись из байтов записи
  274.             fs.Close();
  275.             return person;                                                  // вернуть запись
  276.         }
  277.         static IndexEntry EjectEntry(int i)                                     // извлечь указанную запись  
  278.         {
  279.             var formatter = new BinaryFormatter();
  280.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  281.             var memoryStream = new MemoryStream();
  282.             fs.Position = i * 255;
  283.             var data = new byte[255];                                       // объявить массив под сериализованную запись
  284.             fs.Read(data, 0, 255);                                          // считать в массив всю запись
  285.             memoryStream.Write(data, 1, data[0]);                           // значимые байты записи - в ОЗУ
  286.             memoryStream.Position = 0;
  287.             IndexEntry entry = (IndexEntry)formatter.Deserialize(memoryStream);    // десериализовать запись из байтов записи
  288.             fs.Close();
  289.             return entry;                                                  // вернуть запись
  290.         }
  291.         static IndexEntry[] FindEntriesWithRequestedKeys(string request)        // создает массив найденных по ключу-ФИО записей индексов либо возврящает нулевую ссылку
  292.         {
  293.             IndexEntry[] array = new IndexEntry[0];
  294.             int position = PositionOfFirstAskedEntry(ArrayOfEntries(), request);
  295.             IndexEntry entry;
  296.             Person person = new Person();
  297.             if (position != -1)
  298.             {
  299.                 entry = EjectEntry(position);
  300.                 person = EjectPerson(entry.offset / 255);
  301.             }
  302.  
  303.             if (position != -1 && person.active)
  304.             {
  305.                 int currentEjectNumber = position;
  306.                 while (NextEntryOK(currentEjectNumber - 1, request))
  307.                 {
  308.                     array = AddIndexEntryToArray(array, EjectEntry(currentEjectNumber++));
  309.                 }
  310.                 return array;
  311.             }
  312.             else
  313.             {
  314.                 return null;
  315.             }
  316.         }
  317.         static IndexEntry[] FindEntriesWithRequestedKeys(string request, ref int[] arInt)                // создает массив найденных по ключу-ФИО записей индексов либо возврящает нулевую ссылку
  318.         {
  319.             arInt = new int[0];
  320.             IndexEntry[] array = new IndexEntry[0];
  321.             int position = PositionOfFirstAskedEntry(ArrayOfEntries(), request);
  322.             IndexEntry entry;
  323.             Person person = new Person();
  324.             if (position != -1)
  325.             {
  326.                 entry = EjectEntry(position);
  327.  
  328.                 person = EjectPerson(entry.offset / 255);
  329.             }
  330.  
  331.             if (position != -1 && person.active)
  332.             {
  333.                 int currentEjectNumber = position;
  334.                 while (NextEntryOK(currentEjectNumber - 1, request))
  335.                 {
  336.                     array = AddIndexEntryToArray(array, EjectEntry(currentEjectNumber));
  337.                     arInt = AddToIntArray(arInt, currentEjectNumber++);
  338.                 }
  339.                 return array;
  340.             }
  341.             else
  342.             {
  343.                 return null;
  344.             }
  345.         }
  346.         /*static Person[] FindPersonsWithRequestedKeys(string request) // создает массив найденных по ФИО записей БД либо возврящает нулевую ссылку
  347.        {
  348.            Person[] array = new Person[0];
  349.            var entry = new IndexEntry();
  350.            var person = new Person();
  351.            int firstEntryOfRequestedKey = PositionOfFirstAskedEntry(ArrayOfEntries(), request);
  352.            if (firstEntryOfRequestedKey != -1)
  353.            {
  354.                int currentEjectNumber = firstEntryOfRequestedKey;
  355.                entry = EjectEntry(currentEjectNumber);
  356.                int position = entry.offset;
  357.                person = EjectPerson(position / 255);
  358.                array = AddPersonToArray(array, person);
  359.                while (NextEntryOK(currentEjectNumber, request))
  360.                {
  361.                    array = AddPersonToArray(array, EjectPerson(EjectEntry(++currentEjectNumber).offset / 255));
  362.                }
  363.                return array;
  364.            }
  365.            else
  366.            {
  367.                return null;
  368.            }
  369.        }*/
  370.         static bool NextEntryOK(int entryNumber, string request)
  371.         {
  372.             bool flag = false;
  373.             var formatter = new BinaryFormatter();
  374.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  375.             flag = (entryNumber + 1 != fs.Length / 255) && (EjectEntry(entryNumber + 1).key == request) && (EjectPerson(EjectEntry(entryNumber + 1).offset / 255).active == true);
  376.             fs.Close();
  377.             return flag;
  378.         }
  379.         static IndexEntry[] MarkedDeleted()                                     // создает массив индексов удаленных записей
  380.         {
  381.             IndexEntry[] array = new IndexEntry[0];
  382.             var entry = new IndexEntry();
  383.             var person = new Person();
  384.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  385.             int size = (int)fs.Length / 255;
  386.             fs.Close();
  387.             for (int i = 0; i < size; i++)
  388.             {
  389.                 entry = EjectEntry(i);
  390.                 int number = entry.offset / 255;
  391.                 person = EjectPerson(number);
  392.                 if (!person.active)
  393.                 {
  394.                     array = AddIndexEntryToArray(array, entry);
  395.                 }
  396.             }
  397.             if (array.Length != 0)
  398.             {
  399.                 return array;
  400.             }
  401.             else
  402.             {
  403.                 return null;
  404.             }
  405.         }
  406.         static void ListAllRecords() // вывести все записи БД
  407.         {
  408.             Console.Clear();
  409.             var formatter = new BinaryFormatter();
  410.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Read);
  411.             bool unmarkedPersonExists = false;
  412.             for (int i = 0; i < fs.Length / 255; i++)
  413.             {
  414.                 unmarkedPersonExists = unmarkedPersonExists | EjectPerson(i).active;
  415.             }
  416.             if (unmarkedPersonExists)
  417.             {
  418.                 Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  419.                 var ifs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  420.                 int counter = 0;
  421.                 for (int i = 0; i < ifs.Length / 255; i++)
  422.                 {
  423.                     var memoryStream = new MemoryStream();
  424.                     var data = new byte[255];                                               // объявить массив под сериализованную запись
  425.                     ifs.Read(data, 0, 255);                                                 // считать в массив всю запись
  426.                     memoryStream.Write(data, 1, data[0]);                                   // значимые байты записи - в ОЗУ
  427.                     memoryStream.Position = 0;
  428.                     IndexEntry entry = (IndexEntry)formatter.Deserialize(memoryStream);
  429.                     memoryStream = new MemoryStream();
  430.                     data = new byte[255];                                                   // объявить массив под сериализованную запись
  431.                     fs.Position = entry.offset;
  432.                     fs.Read(data, 0, 255);                                                  // считать в массив всю запись
  433.                     memoryStream.Write(data, 1, data[0]);                                   // значимые байты записи - в ОЗУ
  434.                     memoryStream.Position = 0;
  435.                     Person person = (Person)formatter.Deserialize(memoryStream);
  436.                     if (person.active)
  437.                     {
  438.                         Console.Write(++counter + ". ");
  439.                         person.Show();
  440.                     }
  441.                 }
  442.                 ifs.Close();
  443.             }
  444.             else
  445.             {
  446.                 Console.WriteLine("База данных пуста.\n");
  447.             }
  448.             fs.Close();
  449.  
  450.             Console.WriteLine("\nНажмите любую клавишу.");
  451.             Console.ReadKey();
  452.             Console.Clear();
  453.         }
  454.         static int ListAllDeletedRecords()
  455.         {
  456.             int quantity = 0;
  457.             Console.Clear();
  458.             IndexEntry[] array = MarkedDeleted();
  459.             if (array != null)
  460.             {
  461.                 Console.WriteLine("Были удалены следующие записи:\n");
  462.                 Console.WriteLine("{0,-42} {1,5} {2,8}", "№  ФИО", "Год", "Разряд");
  463.                 for (int i = 0; i < array.Length; i++)
  464.                 {
  465.                     Console.Write(i + 1 + ". ");
  466.                     EjectPerson(array[i].offset / 255).Show();
  467.                     quantity++;
  468.                 }
  469.  
  470.             }
  471.             else
  472.             {
  473.                 Console.WriteLine("Ни одной записи не было удалено либо записи были удалены безвозвратно.\n");
  474.             }
  475.             return quantity;
  476.         }
  477.         static int PositionOfFirstAskedEntry(IndexEntry[] array, string key)    // бинарный поиск первого вхождения записи с запрошенным полем в БД
  478.         {
  479.             int left = 0, right = array.Length - 1;
  480.             int middle;
  481.             do
  482.             {
  483.                 middle = (left + right) / 2;
  484.                 if (array[middle].key.CompareTo(key) == -1)
  485.                 {
  486.                     left = middle + 1;
  487.                 }
  488.                 else
  489.                 {
  490.                     right = middle;
  491.                 }
  492.             } while (left != right);
  493.             if (array[left].key == key)
  494.             {
  495.                 return left;
  496.             }
  497.             return (-1);
  498.         }
  499.         static void RearrangeIndexWith(int positionOfOld, IndexEntry newEntry)
  500.         {
  501.            
  502.             IndexEntry[] oldArray;
  503.             oldArray = ArrayOfEntries();
  504.             IndexEntry[] newArray = new IndexEntry[oldArray.Length-1];
  505.             int counter = 0;
  506.             for (int i = 0; i < oldArray.Length; i++)
  507.             {
  508.                 if (i != positionOfOld)
  509.                 {
  510.                     newArray[counter] = oldArray[i];
  511.                     counter++;
  512.                 }
  513.             }
  514.             UpdateIndex(newArray);
  515.             AddToIndexes(newEntry);
  516.         }
  517.         public static void RedLn(string str)                                    // вывести переданную строку красным цветом
  518.         {
  519.             Console.ForegroundColor = ConsoleColor.Red;
  520.             Console.WriteLine(str);
  521.             Console.ResetColor();
  522.         }
  523.         static void UpdateIndex(IndexEntry[] entryArray)                        // обновить файл индексов
  524.         {
  525.             string path = Path.Combine(Environment.CurrentDirectory, "index.dat");
  526.             var fs = new FileStream(path, FileMode.Truncate, FileAccess.Write);
  527.             fs.Close();
  528.             for (int i = 0; i < entryArray.Length; i++)
  529.             {
  530.                 //entryArray[i].Show();
  531.                 AddToEndOfFile(entryArray[i]); // тут можно перезаписать не весь, а только обновленную часть
  532.             }
  533.         }
  534.  
  535.         static void Main()
  536.         {
  537.             int act;
  538.             int exit = 2;
  539.             bool ok;
  540.             int chosenPerson;
  541.             int chosenEntry;
  542.             do
  543.             {
  544.                 IndexEntry entry;
  545.                 Person person;
  546.                 Console.WriteLine("1. Добавить участника");
  547.                 if (File.Exists(dbPath))
  548.                 {
  549.                     Console.WriteLine("2. Вывести список всех участников");
  550.                     Console.WriteLine("3. Найти участника по ФИО");
  551.                     Console.WriteLine("4. Редактировать запись участника");
  552.                     Console.WriteLine("5. Удалить запись участника");
  553.                     Console.WriteLine("6. Показать недавно удаленных участников");
  554.                     exit = 7;
  555.                 }
  556.                 Console.WriteLine(exit + ". Выход");
  557.                 act = AskForAction(exit);
  558.  
  559.                 switch (act)
  560.                 {
  561.                     case 1:
  562.                         person = AskForNewPerson();                                         // запрос новой записи
  563.                         //person = new Person(false, "Анна", 1995, 5);
  564.                         Console.Clear();
  565.                         var fs = new FileStream(dbPath, FileMode.OpenOrCreate, FileAccess.Read);
  566.                         int offset = (int)fs.Length;                                        // offset - номер байта, начиная с которого в файле хранится запись
  567.                         fs.Close();
  568.                         byte[] ar1 = ArrayOfSerialized(person);                             // ar1 - массив с сер. person [255]
  569.                         int length = ar1[0];                                                // length - длина сер. person
  570.                         entry = new IndexEntry(person.name, length, offset);                // entry - запись индексов
  571.                         AddToEndOfFile(person);
  572.                         AddToIndexes(entry);
  573.                         break;
  574.                     case 2:
  575.                         ListAllRecords();
  576.                         break;
  577.                     case 3:
  578.                         Console.Clear();
  579.                         Console.Write("Введите ФИО для поиска: ");
  580.                         string request = Console.ReadLine();
  581.                         var arrayOfFoundEntries = FindEntriesWithRequestedKeys(request);
  582.                         if (arrayOfFoundEntries == null)
  583.                         {
  584.                             Console.Clear();
  585.                             Console.WriteLine("По запросу \"{0}\" ни одной записи не найдено.", request);
  586.                             Console.WriteLine("\nНажмите любую клавишу.");
  587.                             Console.ReadKey();
  588.                             Console.Clear();
  589.                         }
  590.                         else
  591.                         {
  592.                             Console.Clear();
  593.                             Console.WriteLine("По запросу \"{0}\" найдены записи:\n", request);
  594.                             Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  595.                             for (int i = 0; i < arrayOfFoundEntries.Length; i++)
  596.                             {
  597.  
  598.                                 Console.Write(i + 1 + ". ");
  599.                                 EjectPerson(arrayOfFoundEntries[i].offset / 255).Show();
  600.                             }
  601.                             Console.WriteLine("\nНажмите любую клавишу.");
  602.                             Console.ReadKey();
  603.                             Console.Clear();
  604.                         }
  605.                         break;
  606.                     case 4:
  607.                         Console.Clear();
  608.                         Console.Write("Редактировать участника с ФИО: ");
  609.                         string key1 = Console.ReadLine();
  610.                         int[] arrayOfPositions = new int[0];
  611.                         IndexEntry[] array1 = FindEntriesWithRequestedKeys(key1, ref arrayOfPositions);
  612.                         if (array1 == null)
  613.                         {
  614.                             Console.Clear();
  615.                             Console.WriteLine("По запросу \"{0}\" ни одной записи не найдено.", key1);
  616.                             Console.WriteLine("\nНажмите любую клавишу.");
  617.                             Console.ReadKey();
  618.                             Console.Clear();
  619.                         }
  620.                         else
  621.                         {
  622.                             Console.Clear();
  623.                             Console.WriteLine("По запросу \"{0}\" найдены записи:\n", key1);
  624.                             Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  625.                             for (int i = 0; i < array1.Length; i++)
  626.                             {
  627.  
  628.                                 Console.Write(i + 1 + ". ");
  629.                                 //Console.Write(arrayOfPositions[i]);
  630.                                 EjectPerson(array1[i].offset / 255).Show();
  631.                             }
  632.                             do
  633.                             {
  634.                                 Console.Write("\nРедактировать запись № ");
  635.                                 string buf = Console.ReadLine();
  636.                                 ok = int.TryParse(buf, out chosenPerson) && chosenPerson > 0 && chosenPerson <= array1.Length;
  637.                                 if (!ok)
  638.                                 {
  639.                                     RedLn("Ошибка.");
  640.                                     Console.WriteLine("Ожидалось число {0}-{1}.", 1, array1.Length);
  641.                                 }
  642.                             } while (!ok);
  643.                             chosenEntry = arrayOfPositions[chosenPerson - 1];                   // получаем положение удаляемой записи в индексах(порядковый номер в файле)
  644.                             chosenPerson = array1[chosenPerson - 1].offset / 255;               // получаем номер удаляемой записи в БД (порядковый номер в файле)
  645.                             //Console.WriteLine("Alert 616 - " + chosenEntry + chosenPerson);
  646.                             int action=0;
  647.                             Person personToEdit;
  648.                             IndexEntry entryToEdit;
  649.                             do
  650.                             {
  651.                                 Console.Clear();
  652.                                 string newData;
  653.                                 personToEdit = EjectPerson(chosenPerson);
  654.                                 entryToEdit = EjectEntry(chosenEntry);
  655.                                 Console.WriteLine("1. Изменить ФИО ({0})\n2. Изменить год рождения ({1})\n3. Изменить разряд ({2})\n4. В меню\n", personToEdit.name, personToEdit.year, personToEdit.rank);
  656.                                 action = AskForAction(4);
  657.                                 switch (action)
  658.                                 {
  659.                                     case 1:
  660.                                         Console.Clear();
  661.                                         Console.WriteLine("Старые данные: {0}",personToEdit.name);
  662.                                         Console.Write("Новые данные: ");
  663.                                         newData = Console.ReadLine();
  664.                                         personToEdit.name = newData;
  665.                                         entryToEdit.key = newData;
  666.                                         ChangePerson(chosenPerson, personToEdit);
  667.                                         RearrangeIndexWith(chosenEntry, entryToEdit);
  668.                                         //ChangeIndex(chosenEntry, entryToEdit);
  669.                                         Console.WriteLine("\nЗапись изменена. Нажмите любую клавишу.");
  670.                                         Console.ReadKey();
  671.                                         Console.Clear();
  672.                                         break;
  673.                                     case 2:
  674.                                         int newYear;
  675.                                         Console.Clear();
  676.                                         Console.WriteLine("Старые данные: {0}",personToEdit.name);
  677.                                         do
  678.                                         {
  679.                                             Console.Write("Новые данные: ");
  680.                                             newData = Console.ReadLine();
  681.                                             ok = int.TryParse(newData, out newYear) && newYear > 1900 && newYear < 2015;
  682.                                             if (!ok)
  683.                                             {
  684.                                                 RedLn("Ошибка.");
  685.                                                 Console.WriteLine("Убедитесь в правильности введенного года и повторите ввод.\n");
  686.                                             }
  687.                                         } while (!ok);
  688.                                         personToEdit.year = newYear;
  689.                                         ChangePerson(chosenPerson, personToEdit);
  690.                                         Console.WriteLine("\nЗапись изменена. Нажмите любую клавишу.");
  691.                                         Console.ReadKey();
  692.                                         Console.Clear();
  693.                                         break;
  694.                                     case 3:
  695.                                        
  696.                                         Console.Clear();
  697.                                         Console.WriteLine("Старые данные: {0}",personToEdit.name);
  698.                                         do
  699.                                         {
  700.                                             Console.Write("Новые данные: ");
  701.                                             newData = Console.ReadLine();
  702.                                             ok = int.TryParse(newData, out newYear) && newYear >=0 && newYear < 10;
  703.                                             if (!ok)
  704.                                             {
  705.                                                 RedLn("Ошибка.");
  706.                                                 Console.WriteLine("Убедитесь в правильности введенного разряда и повторите ввод.\n");
  707.                                             }
  708.                                         } while (!ok);
  709.                                         personToEdit.rank = newYear;
  710.                                         ChangePerson(chosenPerson, personToEdit);
  711.                                         Console.WriteLine("\nЗапись изменена. Нажмите любую клавишу.");
  712.                                         Console.ReadKey();
  713.                                         Console.Clear();
  714.                                         break;
  715.                                     case 4:
  716.                                         break;
  717.                                 }
  718.                                
  719.                             } while (action != 4);
  720.                             Console.Clear();
  721.                         }
  722.  
  723.                         break;
  724.                     case 5:
  725.                         Console.Clear();
  726.                         Console.Write("Удалить участника с ФИО: ");
  727.                         string key = Console.ReadLine();
  728.                         var array = FindEntriesWithRequestedKeys(key);
  729.                         if (array == null)
  730.                         {
  731.                             Console.Clear();
  732.                             Console.WriteLine("По запросу \"{0}\" ни одной записи не найдено.", key);
  733.                             Console.WriteLine("\nНажмите любую клавишу.");
  734.                             Console.ReadKey();
  735.                             Console.Clear();
  736.                         }
  737.                         else
  738.                         {
  739.                             Console.Clear();
  740.                             Console.WriteLine("По запросу \"{0}\" найдены записи:\n", key);
  741.                             Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  742.                             for (int i = 0; i < array.Length; i++)
  743.                             {
  744.  
  745.                                 Console.Write(i + 1 + ". ");
  746.                                 EjectPerson(array[i].offset / 255).Show();
  747.                             }
  748.                             do
  749.                             {
  750.                                 Console.Write("\nУдалить запись № ");
  751.                                 string buf = Console.ReadLine();
  752.                                 ok = int.TryParse(buf, out chosenPerson) && chosenPerson > 0 && chosenPerson <= array.Length;
  753.                                 if (!ok)
  754.                                 {
  755.                                     RedLn("Ошибка.");
  756.                                     Console.WriteLine("Ожидалось число {0}-{1}.", 1, array.Length);
  757.                                 }
  758.                             } while (!ok);
  759.                             Console.Clear();
  760.                             chosenPerson = array[chosenPerson - 1].offset / 255; // получаем номер подлежащей удалению (пометке об удалении) записи в БД
  761.                             Person personToMark = EjectPerson(chosenPerson);
  762.                             personToMark.active = false;
  763.                             ChangePerson(chosenPerson, personToMark);
  764.                             Console.WriteLine("\nЗапись удалена. Нажмите любую клавишу.");
  765.                             Console.ReadKey();
  766.                             Console.Clear();
  767.                         }
  768.  
  769.                         break;
  770.  
  771.                     case 6:
  772.                         int quantity = ListAllDeletedRecords();                 // вывод удаленных записей и возврат их количества в quantity
  773.                         if (quantity > 0)
  774.                         {
  775.                             Console.WriteLine("\n1. Очистить корзину\n2. Восстановить записи\n3. В меню");
  776.                             int case3act = AskForAction(3);
  777.                             switch (case3act)
  778.                             {
  779.                                 case 1:
  780.  
  781.                                     break;
  782.                                 case 2:
  783.                                     IndexEntry[] arrayOfDeleted = MarkedDeleted();
  784.                                     do
  785.                                     {
  786.                                         Console.Write("Восстановить запись № ");
  787.                                         string buf = Console.ReadLine();
  788.                                         ok = int.TryParse(buf, out chosenPerson) && chosenPerson > 0 && chosenPerson <= arrayOfDeleted.Length;
  789.                                         if (!ok)
  790.                                         {
  791.                                             RedLn("Ошибка.");
  792.                                             Console.WriteLine("Ожидалось число {0}-{1}.\n", 1, arrayOfDeleted.Length);
  793.                                         }
  794.                                     } while (!ok);
  795.                                     int number = arrayOfDeleted[chosenPerson - 1].offset / 255;
  796.                                     person = EjectPerson(number);
  797.                                     person.active = true;
  798.                                     ChangePerson(number, person);
  799.                                     Console.Clear();
  800.                                     Console.Write("\nЗапись восстановлена. Нажмите любую клавишу.");
  801.                                     Console.ReadKey();
  802.                                     Console.Clear();
  803.                                     break;
  804.                                 case 3:
  805.                                     Console.Clear();
  806.                                     break;
  807.                             }
  808.                         }
  809.                         else
  810.                         {
  811.                             Console.WriteLine("\nНажмите любую клавишу.");
  812.                             Console.ReadKey();
  813.                             Console.Clear();
  814.                         }
  815.  
  816.                         break;
  817.                 }
  818.  
  819.             } while (act != exit);
  820.         }
  821.     }
  822.  
  823. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement