SHARE
TWEET

Untitled

a guest Oct 21st, 2019 91 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Библеотеки:
  2. #include "pch.h"
  3.  
  4. #include <iostream>
  5. #include <fstream>
  6. #include <vector>
  7. #include <string>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11.  
  12. // Инициализуем структуру Docyment:
  13. // 1) Фамилия - surname
  14. // 2) Номер телефона - phone
  15. // 3) Дата рождения - date
  16.  
  17. class Docyment {
  18. private:
  19.     string surname;
  20.     string phone;
  21.     int date;
  22.  
  23. public:
  24.     Docyment() {}
  25.     // Конструктор,принимает в себя surname, phone, date
  26.     Docyment(string sur, string ph, int id) :
  27.         surname(sur),
  28.         phone(ph),
  29.         date(id)
  30.     {}
  31.     // Конструктор копирования.
  32.     Docyment(const Docyment  &Doc) :
  33.         surname(Doc.surname),
  34.         phone(Doc.phone),
  35.         date(Doc.date)
  36.     {}
  37.  
  38.     string getsurname() {
  39.         return this->surname;
  40.     }
  41.  
  42.     void setsurname(string d) {
  43.         this->surname = d;
  44.     }
  45.  
  46.     string getphone() {
  47.         return this->phone;
  48.     }
  49.  
  50.     void setphone(string d) {
  51.         this->phone = d;
  52.     }
  53.  
  54.     int getdate() {
  55.         return this->date;
  56.     }
  57.  
  58.     void setdate(int n) {
  59.         this->date = n;
  60.     }
  61.  
  62.     // Перегрузка оператора <<
  63.     friend ostream &operator << (ostream &os, const Docyment  &Doc) {
  64.         os << "Spravka [" << Doc.surname << ", " << Doc.phone << ", " << Doc.date << "]\n";
  65.         return os;
  66.     }
  67.  
  68.     // Перегрузка оператора >>
  69.     friend istream &operator >> (istream &is, Docyment  &Doc) {
  70.         is >> Doc.surname;
  71.         is >> Doc.phone;
  72.         is >> Doc.date;
  73.         return is;
  74.     }
  75. };
  76.  
  77. class Spravka {
  78. private:
  79.     const static int n = 20;
  80.     const static int m = 100;
  81.     int hashTable[m][2];
  82.  
  83.     vector<Docyment > stud = {};
  84.  
  85. public:
  86.     void addDocyment(Docyment& d, const char* binaryFaleName)
  87.     {
  88.         this->stud.push_back(d);
  89.         this->insertHashTable(d, 21);
  90.         this->Write_v_binary(binaryFaleName);
  91.  
  92.     }
  93.  
  94.     friend ostream& operator<<(ostream& os, Spravka & t) {
  95.         for (Docyment x : t.stud) {
  96.             os << x;
  97.         }
  98.         return os;
  99.     }
  100.  
  101.     // Считывание с файла
  102.     friend istream& operator >> (istream& is, Spravka& t) {
  103.         // Пока файл не окончился
  104.         while (is) {
  105.             // Создаем объект, заполняем данными из файла
  106.             Docyment  x;
  107.             is >> x;
  108.             // Добавляем созданный объект в this->stud
  109.             t.stud.push_back(x);
  110.             // Если конец файла, закончить.
  111.             if (is.eof()) {
  112.                 break;
  113.             }
  114.         }
  115.  
  116.         return is;
  117.     }
  118.     //Запись в двочный файл
  119.     void Write_v_binary(const char* filename) {
  120.         ofstream fout(filename, ios::ate | ios::out | ios::binary);
  121.         for (auto& d : this->stud) {
  122.             fout.write((char*)&d, sizeof(Docyment));
  123.         }
  124.         fout.close();
  125.     }
  126.     //Взять из двоичного файла
  127.     Docyment  Take_is_binary(const char* filename, int dateR) {
  128.         ifstream fin(filename, ios::ate | ios::in | ios::binary);
  129.         Docyment  Doc;
  130.         fin.seekg(sizeof(Docyment) * dateR, ios::beg);
  131.         fin.read((char*)&Doc, sizeof(Docyment));
  132.         fin.close();
  133.         return Doc;
  134.     }
  135.     //Удаление и запись
  136.     void Delete_and_burn(const int date, const char* filename) {
  137.         unsigned int index = 0;
  138.  
  139.         // Проходимся по элементам в векторе
  140.         for (auto dir : this->stud) {
  141.             // Если нашолся человек, дата рождения которого одинакова с искомой датой рождения, удаляем
  142.             if (dir.getdate() == date) {
  143.                 // Удаляем через vector.erase(), где:
  144.                 // - this->stud.begin() - указатель на начало,
  145.                 // - index - i-ый элемент от начала
  146.                 this->stud.erase(this->stud.begin() + index);
  147.                 break;
  148.             }
  149.             index++;
  150.         }
  151.         this->Write_v_binary(filename);
  152.     }
  153.  
  154.  
  155.  
  156.  
  157.  
  158.     // Строительство хэш-таблицы
  159.     void HashTable_Build() {
  160.         int i, j, i1, k, s=0;
  161.         cout << "Пожалуйста, выберите способ рехеширования и введите номер соответствующий вашему выбору" << endl;
  162.         cout << "ЛИНЕЙНОЕ РЕХЕШИРОВАНИЕ = 1" << endl;
  163.         cout << "СЛУЧАЙНОЕ РЕХЕШИРОВАНИЕ = 2 " << endl;
  164.         cout << "РЕХЕШИРОВАНИЕ СЛОЖЕНИЕМ = 3" << endl;
  165.         cout << "КВАДРАТИЧНОЕ РЕХЕШИРОВАНИЕ = 4" << endl;
  166.         cout << "КВАДРАТИЧНОЕ РЕХЕШИРОВАНИЕ = 5" << endl;
  167.         int f , a, b, c;
  168.         cout << "Ваш выбор: " ;
  169.         cin >> f;
  170.         cout  << endl;
  171.         for (int i = 0; i < m; i++)
  172.             hashTable[i][0] = -1;
  173.         for (unsigned int i = 0; i < stud.size(); i++) {
  174.             int colizi = 0;
  175.             bool used = false;
  176.             k = this->stud[i].getdate();
  177.             i1 = 0;
  178.             // used - проверка заполниности текущего объекта в таблице
  179.             // colizi используется для проверки на коллизии
  180.             while (colizi <= 5 && !used) {
  181.                 if (f==1){ j = (k % 100 + i1); }
  182.                 if (f==2) { j = rand() % 40; }
  183.                 if (f == 3) { j = (k % 100 * i1); }
  184.                 if (f == 4) {
  185.                     cout << "для данного рехеширование введите a, b, c" << endl;
  186.                     cout << "a = ";
  187.                     cin >> a;
  188.                     cout << endl;
  189.                     cout << "b = ";
  190.                     cin >> b;
  191.                     cout << endl;
  192.                     cout << "c = ";
  193.                     cin >> c;
  194.                     cout << endl;
  195.                     j = (a*i1*i1 + b*i1 + c); }
  196.                 if (f == 5) {
  197.                     j = (k % 100 - i1);
  198.                     if (j < 0) {
  199.                         j = m - s;
  200.                         s++;
  201.                     }
  202.                 }
  203.            
  204.                 if (hashTable[j][0] != -1) {
  205.                     colizi++;
  206.                     i1++;
  207.                     continue;
  208.                 }
  209.  
  210.                 hashTable[j][0] = k;
  211.                 hashTable[j][1] = i;
  212.                 used = true;
  213.             }
  214.         }
  215.     }
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.     /////////////
  225.     void insertHashTable(Docyment& doc, int n) {
  226.         int k;
  227.         k = doc.getdate();
  228.         int i1 = 0;
  229.         int j;
  230.         while (1) {
  231.             j = (k + i1 * i1) % m;
  232.             if (hashTable[j][0] == -1) break;
  233.             i1++;
  234.         }
  235.         hashTable[j][0] = k;
  236.         hashTable[j][1] = n;
  237.     }
  238.  
  239.  
  240.  
  241.  
  242.     //Тест хеш-таблици
  243.     void Test_HashTable() {
  244.         for (unsigned int i = 0; i < m; i++) {
  245.             cout << i << " | "<< hashTable[i][0] ;
  246.             cout << "\n";
  247.         }
  248.     }
  249.  
  250.     // Поиск в хэш-таблице
  251.     int Search_in_HashTable(int k) {
  252.         int temp = 0, key = 0, colizi = 0;
  253.         while (colizi <= 5) {
  254.             key = (k + temp * temp) % m + (colizi * colizi);
  255.             if (hashTable[key][0] == k) return hashTable[key][1];
  256.             temp++;  colizi++;
  257.         }
  258.         return -1;
  259.     }
  260.  
  261.     //Проверка
  262.     void Test(const char* input, const char* binary) {
  263.         this->HashTable_Build();
  264.         this->Write_v_binary(binary);
  265.         this->Test_HashTable(); //Вывод хеш-таблицы
  266.         // Проверяем поиск в хэш-таблице
  267.         const int Date_of_Birth = 30052000;
  268.         int Num = this->Search_in_HashTable(Date_of_Birth);
  269.         cout << Num << "\n";
  270.         // Проверяем поиск в бинарном файле по номеру
  271.         Docyment  search_surname = this->Take_is_binary(binary, 2);
  272.         cout << search_surname;
  273.     }
  274. };
  275.  
  276. int main() {
  277.     setlocale(LC_ALL, "Russian");
  278.     const char *input = R"(G:\yyy\heh-tab\input.txt)";
  279.     const char *binary = R"(G:\yyy\heh-tab\out.bin)";
  280.  
  281.     Spravka  t;
  282.     ifstream fin;
  283.     fin.open(input);
  284.     // Создаем входной поток в объект t. Используется в перегруженном операторе " >> "
  285.     fin >> t;
  286.     fin.close();
  287.     t.Test(input, binary);
  288.  
  289.     Docyment tect("Document", "331283128", 24032000);
  290.     t.addDocyment(tect, binary);
  291.     //t.Test(input, binary);
  292.     //t.Delete_and_burn(2, binary);
  293.  
  294.  
  295.     system("pause");
  296.     return 0;
  297. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top