/// <summary> /// Поиск в хэш-таблице /// </summary> /// <param name="key"></param> /// <returns></returns> public Guest FindGuest(long key) { table = Program.table; long hash = key % size; while (table[hash] != null && table[hash].GetKey() % size != key % size) { hash = (hash + 1) % size; } Guest current = table[hash]; if (current == null) { return(null); } else { while (current.GetKey() != key && current.GetNextNode() != null) { current = current.GetNextNode(); } if (current.GetKey() == key) { return(current); } else { return(null); } } }
/// <summary> /// Поиск в хэш-таблице /// </summary> /// <param name="key"></param> /// <returns></returns> public bool Find(long key) { table = Program.table; long hash = key % size; if (!isEmpty) { while (table[hash] != null && table[hash].GetKey() % size != key % size) { hash = (hash + 1) % size; } Guest current = table[hash]; if (current != null) { while (current.GetKey() != key && current.GetNextNode() != null) { current = current.GetNextNode(); } if (current.GetKey() == key) { return(true); } /*else * { * return false; * }*/ } } return(false); }
// Вставка в хештаблицу public void Insert(Guest guest) { table = Program.table; //Guest newGuest = new Guest(); long hash = guest.GetKey() % Convert.ToInt64(size); while (table[hash] != null && table[hash].GetKey() % size != guest.GetKey() % size) { hash = (hash + 1) % size; } if (table[hash] != null && hash == table[hash].GetKey() % size) { guest.SetNextNode(table[hash].GetNextNode()); table[hash].SetNextNode(guest); isEmpty = false; count++; return; } else { table[hash] = guest; isEmpty = false; count++; return; } }
/// <summary> /// Удаление элемента /// </summary> /// <param name="key"></param> /// <returns></returns> public bool Remove(long key) { table = Program.table; long hash = key % size; if (isEmpty) { return(false); } else { while (table[hash] != null && table[hash].GetKey() % size != key % size) { hash = (hash + 1) % size; } Guest current = table[hash]; Guest previous = null; if (current != null) { while (current.GetKey() != key && current.GetNextNode() != null) { previous = current; current = current.GetNextNode(); } if (current.GetKey() == key) { if (previous != null) { previous.next = current.next; if (current.next == null) { previous.next = null; } } else { table[hash] = null; } count--; if (count == 0) { isEmpty = true; } return(true); } } return(false); } }
/// <summary> /// Ввод нового постояльца /// </summary> /// <param name="newGuest"> Постоялец </param> /// <param name="hashtable"> Хэш-таблица </param> /// <returns></returns> public Guest Input(Guest newGuest, Hashtable hashtable) { bool isPresent; Hashtable ht = hashtable; do { Console.WriteLine("Введите номер паспорта постояльца: "); newGuest.passport_number = InputPassportNumber(); isPresent = ht.Find(newGuest.GetKey()); if (isPresent) { Console.WriteLine("\nПостоялец с таким номером паспорта уже внесен в базу!"); } } while (isPresent); Console.WriteLine("\nВведите ФИО постояльца: "); newGuest.FIO = InputParseNoDigital(); Console.WriteLine("Введите год рождения постояльца: "); newGuest.birth_year = InputParseBirthYear(); Console.WriteLine("\nВведите адрес постояльца: "); newGuest.adress = InputParseNoDigital(); Console.WriteLine("Введите цель визита: "); newGuest.purpose_of_visit = InputParseNoDigital(); return(newGuest); }
static void Main(string[] args) { AVL avl = new AVL(); Hashtable hashtable = new Hashtable(); CircularDoublyLinkedList list = new CircularDoublyLinkedList(); const int size = 10; table = new Guest[size]; for (int i = 0; i < size; i++) { table[i] = null; } int n = -1; while (n != 0) { Console.WriteLine("\n***Регистрация постояльцев в гостинице***"); Console.WriteLine("\n ************ Меню ************\n"); Console.WriteLine("1 - Добавить гостиничный номер"); Console.WriteLine("2 - Вывести список всех номеров"); Console.WriteLine("3 - Зарегистрировать постояльца в гостинице"); Console.WriteLine("4 - Вывести всех постояльцев"); Console.WriteLine("5 - Удалить гостиничный номер"); Console.WriteLine("6 - Удалить запись о постояльце"); Console.WriteLine("7 - Поиск постояльца по № паспорта"); Console.WriteLine("8 - Поиск постояльца по ФИО"); Console.WriteLine("9 - Поиск гостиничного номера по №"); Console.WriteLine("10 - Поиск гостиничного номера по наличию оборудования"); Console.WriteLine("11 - Регистрация вселения постояльца"); Console.WriteLine("12 - Регистрация выселения постояльца"); Console.WriteLine("0 - Выход"); Console.WriteLine("Выберите нужный пункт меню: "); while (true) { if (Int32.TryParse(Console.ReadLine(), out n)) { break; } else { Console.WriteLine("Неверный ввод"); } } switch (n) { case 1: //Добавление гостиничного номера { avl.Add(avl.InputData()); break; } case 2: //Вывод списка номеров { if (avl.IsEmpty()) { Console.WriteLine("Список номеров пуст!"); } else { Console.WriteLine("Список номеров: "); avl.PostOrderTraversal(); } Console.ReadLine(); break; } case 3: //Регистрация постояльца в гостинице { Guest newGuest = new Guest(); hashtable.Insert(newGuest.Input(newGuest, hashtable)); break; } case 4: // Вывод списка постояльцев { if (hashtable.IsEmpty) { Console.WriteLine("База пуста. Заполните ее!"); } else { hashtable.Print(); } Console.ReadLine(); break; } case 5: // Удаление гостиничного номера { if (avl.IsEmpty()) { Console.WriteLine("Список номеров пуст!"); } else { Console.WriteLine("Введите гостиничный номер для удаления (в формате ANNN: где A – буква (Л – люкс, П – полулюкс, О – одноместный, М – многоместный), NNN – цифры): "); string word = avl.InputRoomNumber(); if (list.ContainsRoom(word)) { Console.WriteLine("\nНельзя удалять гостиничный номер с вселенными постояльцами!"); } else { avl.Delete(word); } } Console.ReadLine(); break; } case 6: // Удаление записи о постояльце { Guest current = new Guest(); Registration reg = new Registration(); if (hashtable.IsEmpty) { Console.WriteLine("База пуста. Заполните ее!"); } else { Console.WriteLine("Введите № паспорта постояльца для удаления: "); current.passport_number = current.InputPassportNumber(); if (!list.IsEmpty) { reg = list.FindPassport(current.passport_number); if (reg != null && reg.chekOut == null) { Console.WriteLine("Нельзя удалять вселенных постояльцев!"); } } else { bool isPresent = hashtable.Remove(current.GetKey()); Console.WriteLine(isPresent == true ? "\nЗапись успешно удалена!" : "\nПостоялец с таким номером паспорта не зарегистрирован в гостинице!"); } } Console.ReadLine(); break; } case 7: // Поиск постояльца по номеру паспорта { Guest current = new Guest(); if (hashtable.IsEmpty) { Console.WriteLine("База пуста. Заполните ее!"); } else { Console.WriteLine("Введите № паспорта постояльца для поиска: "); current.passport_number = current.InputPassportNumber(); current = hashtable.FindGuest(current.GetKey()); if (current == null) { Console.WriteLine("Постоялец с таким номером паспорта не зарегистрирован в гостинице!"); } else { if (list.ContainsResident(current.passport_number)) { Console.WriteLine("\nНайден паспорт: {0}", current.passport_number); Console.WriteLine("ФИО постояльца: {0}", current.FIO); Console.WriteLine("Год рождения: {0}", current.birth_year); Console.WriteLine("Адрес проживания: {0}", current.adress); Console.WriteLine("Цель визита: {0}", current.purpose_of_visit); Console.WriteLine("Постоялец живет в номере {0}.", list.FindPassport(current.passport_number).room_num); } else { Console.WriteLine("\nНайден паспорт: {0}", current.passport_number); Console.WriteLine("ФИО постояльца: {0}", current.FIO); Console.WriteLine("Год рождения: {0}", current.birth_year); Console.WriteLine("Адрес проживания: {0}", current.adress); Console.WriteLine("Цель визита: {0}", current.purpose_of_visit); Console.WriteLine("Постоялец не проживает в гостинице!"); } } } Console.ReadLine(); break; } case 8: // Поиск постояльца по ФИО { string FIO; if (hashtable.IsEmpty) { Console.WriteLine("База пуста. Заполните ее!"); } else { Console.WriteLine("Введите ФИО для поиска: "); FIO = Console.ReadLine(); hashtable.SearchString(FIO); Console.WriteLine("\nНайденные постояльцы: "); foreach (var item in guests) { Console.Write("\nФИО постояльца: {0}", item.FIO); Console.Write("\nПаспорт постояльца: {0}\n", item.passport_number); } } Console.ReadLine(); break; } case 9: // Поиск гостиничного номера по его № { AVL.Hotel_room hm = new AVL.Hotel_room(); guests.Clear(); if (avl.IsEmpty()) { Console.WriteLine("Список номеров пуст!"); } else { Console.WriteLine("Введите гостиничный номер для поиска: "); string str = avl.InputRoomNumber(); hm = avl.Find(str); if (hm == null) { Console.WriteLine("\nИскомый номер не обнаружен!"); } else { Console.WriteLine("\nНомер найден:"); Console.WriteLine("\nГостиничный номер: {0}", hm.room_number); Console.WriteLine("Количество комнат: {0}", hm.rooms); Console.WriteLine("Количество мест: {0}", hm.places); Console.WriteLine("Оборудование: {0}", hm.equipment); Console.WriteLine("Санузел: {0}", hm.toilet); if (list.IsEmpty) { Console.WriteLine("В номере никто не проживает."); } else { list.FindRooms(hm.room_number); if (rooms.Count > 0) { foreach (var item in rooms) { guests.Add(hashtable.FindGuest(Convert(item))); } Console.WriteLine("\nВ номере проживают: "); foreach (var item in guests) { Console.Write("ФИО постояльца: {0}", item.FIO); Console.Write("\nПаспорт постояльца: {0}\n", item.passport_number); } } } } } Console.ReadLine(); break; } case 10: // Поиск гостиничных номеров по оборудованию { if (avl.IsEmpty()) { Console.WriteLine("Список номеров пуст!"); } else { Console.WriteLine("Введите оборудование для поиска: "); avl.SearchString(Console.ReadLine()); if (AVL.h_rooms.Count != 0) { Console.WriteLine("\nНайденные номера: "); foreach (var item in AVL.h_rooms) { Console.WriteLine("\nГостиничный номер: {0}", item.room_number); Console.WriteLine("Количество комнат: {0}", item.rooms); Console.WriteLine("Количество мест: {0}", item.places); Console.WriteLine("Оборудование: {0}", item.equipment); Console.WriteLine("Санузел: {0}", item.toilet); } } else { Console.WriteLine("\nИскомое оборудование не встречается в номерах!"); } } Console.ReadLine(); break; } case 11: // Регистрация вселения { Registration reg = new Registration(); Guest newGuest = new Guest(); string date; DateTime dateChekIn = new DateTime(); dateChekIn = DateTime.Now; Console.WriteLine("Введите № паспорта постояльца: "); newGuest.passport_number = newGuest.InputPassportNumber(); bool isPresent = hashtable.Find(newGuest.GetKey()); bool flag = false; bool freeBeds = false; if (!isPresent) { Console.WriteLine("\nПостоялец с таким номером паспорта не зарегистрирован в гостинице! Необходимо пройти регистрацию!"); } else if (list.ContainsResident(newGuest.passport_number) && !list.IsEmpty) { Console.WriteLine("\nПостоялец уже живет в гостинице!"); } else { reg.pass_num = newGuest.passport_number; Console.WriteLine("Введите гостиничный номер для регистрации(в формате ANNN: где A – буква (Л – люкс, П – полулюкс, О – одноместный, М – многоместный), NNN – цифры): "); reg.room_num = reg.InputRoomNumber(); flag = avl.Contains(reg.room_num); if (avl.IsEmpty()) { Console.WriteLine("\nСписок номеров пуст! Сначала заполните его."); } else if (flag) { if (avl.Find(reg.room_num).places > 0) { freeBeds = avl.ChangeFreePlaces(reg.room_num); Console.WriteLine("\nВселить постояльца? (y/n)"); date = InputLetter(); if (date.Equals("y")) { reg.chekIn = dateChekIn.ToString(); Console.WriteLine("Дата: " + reg.chekIn); Console.WriteLine("Успешно!"); list.Add(reg); } else { Console.WriteLine("Отмена."); } } else { Console.WriteLine("\nВ номере нет свободных мест!"); } } else { Console.WriteLine("\nНет такого номера!"); } } /*Console.WriteLine("Введите № паспорта постояльца: "); * newGuest.passport_number = newGuest.InputPassportNumber(); * reg.pass_num = newGuest.passport_number; * Console.WriteLine("Введите гостиничный номер для регистрации(в формате ANNN: где A – буква (Л – люкс, П – полулюкс, О – одноместный, М – многоместный), NNN – цифры): "); * reg.room_num = reg.InputRoomNumber(); * list.Add(reg);*/ Console.ReadLine(); break; } case 12: // Регистрация выселения { AVL.Hotel_room hm = new AVL.Hotel_room(); DateTime checkOutDate = new DateTime(); checkOutDate = DateTime.Now; Registration reg = new Registration(); Guest newGuest = new Guest(); string date; Console.WriteLine("Введите № паспорта постояльца: "); newGuest.passport_number = newGuest.InputPassportNumber(); if (list.IsEmpty) { Console.WriteLine("\nВ гостинице никто не проживает."); } else { reg = list.FindPassport(newGuest.passport_number); if (reg != null) { Console.WriteLine("\nВыселить постояльца? (y/n)"); date = InputLetter(); if (date.Equals("y")) { hm = avl.Find(reg.room_num); hm.places++; reg.chekOut = checkOutDate.ToString(); Console.WriteLine("Дата: " + reg.chekOut); Console.WriteLine("Успешно!"); } else { Console.WriteLine("Отмена."); } } else { Console.WriteLine("Постоялец с таким номером паспорта не проживает в гостинице!"); } } Console.ReadLine(); break; } } } }