Advertisement
selebry

dsadasdadasdasda

May 1st, 2022
1,404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.19 KB | None | 0 0
  1. // SiAOD 9.1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <string>
  7. #include <fstream>
  8. #include <cstdlib>
  9. #include <ctime>
  10. #include <cmath>
  11. #include <chrono>
  12. #include <windows.h>
  13. #define UI unsigned int
  14. #define byte unsigned char
  15. using namespace std;
  16. //Задание 1. Разработать программу поиска записи по ключу в таблице записей с применение двух алгоритмов линейного поиска
  17. //1.    Таблица содержит записи, структура которых определена вариантом.Ключи уникальны в пределах таблицы.
  18. //2.    Разработать функцию линейного поиска(метод грубой силы).
  19. //3.    Разработать функцию поиска с барьером.
  20. //4.    Провести практическую оценку времени выполнения алгоритмов на таблицах объемом 100, 1000, 10 000 записей.
  21. //5.    Составить таблицу с указанием : времени выполнения алгоритма, его фактическую и теоретическую вычислительную сложность.
  22. //6.    Сделать выводы об эффективности алгоритмов.
  23. //Регистрация земельного участка в СНТ: кадастровый номер – семизначное число, адрес СНТ
  24. //Horticultural non-profit partnerships - Садоводческие некоммерческие товарищества (СНТ)
  25. class Stopwatch {
  26.     chrono::steady_clock::time_point point;
  27.     chrono::nanoseconds dim;
  28. public:
  29.     void start_countdown() {
  30.         point = chrono::steady_clock::now();
  31.     }
  32.     double get_milliseconds() {
  33.         dim = chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now() - point);
  34.         return (double)dim.count() / 1'000'000;
  35.     }
  36. };
  37. string utf8_to_cp1251(const char* str) {
  38.     std::string res;
  39.     WCHAR* ures = NULL;
  40.     char* cres = NULL;
  41.     int result_u = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0);
  42.     if (result_u != 0)
  43.     {
  44.         ures = new WCHAR[result_u];
  45.         if (MultiByteToWideChar(CP_UTF8, 0, str, -1, ures, result_u))
  46.         {
  47.             int result_c = WideCharToMultiByte(1251, 0, ures, -1, 0, 0, 0, 0);
  48.             if (result_c != 0)
  49.             {
  50.                 cres = new char[result_c];
  51.                 if (WideCharToMultiByte(1251, 0, ures, -1, cres, result_c, 0, 0))
  52.                 {
  53.                     res = cres;
  54.                 }
  55.             }
  56.         }
  57.     }
  58.  
  59.     delete[] ures;
  60.     delete[] cres;
  61.  
  62.     return res;
  63. }
  64. class Table {
  65.     struct HNPrecord {
  66.         UI cadastral_number;
  67.         string adress;  
  68.     };
  69.     vector<HNPrecord> storage;
  70.     vector<string> rand_adresses;
  71. public:
  72.     Table() {
  73.         fill_adresses();
  74.     }
  75.     UI rand_number() {
  76.         int s = 0;
  77.         for (int i = 0; i < 7; i++) {
  78.             s += (1 + rand() % 9) * pow(10, i);
  79.         }
  80.         return s;
  81.     }
  82.     Table(UI cadastral_number, string adress) {
  83.         storage.push_back(convert_2_HNPrecord(cadastral_number, adress));
  84.         fill_adresses();
  85.     }
  86.     void insert(UI cadastral_number, string adress) {
  87.         if (!barrier_search(cadastral_number).empty()){ cerr << "Такое значение уже есть в таблице!\n"; return;}
  88.         storage.push_back(convert_2_HNPrecord(cadastral_number, adress));
  89.     }
  90.     void fill_adresses() {
  91.         fstream f("SNT.txt", ios::in);
  92.         string t;
  93.         while (getline(f, t)) {
  94.             rand_adresses.push_back(utf8_to_cp1251(t.c_str()));
  95.         }
  96.         f.close();  
  97.     }
  98.     void rand_init(size_t size) {
  99.         storage.resize(size);
  100.         for (int i = 0; i < storage.size(); i++) {
  101.             UI t = rand_number();
  102.             while(!barrier_search(t).empty()) t = rand_number();
  103.             storage[i] = convert_2_HNPrecord(t, rand_adresses[rand() % rand_adresses.size()]);
  104.             if (i == 10000) cout << "1";
  105.             if (i == 20000) cout << "1";
  106.             if (i == 30000) cout << "1";
  107.             if (i == 40000) cout << "1";
  108.             if (i == 50000) cout << "1";
  109.             if (i == 60000) cout << "1";
  110.             if (i == 70000) cout << "1";
  111.         }
  112.     }
  113.     void print_table() {
  114.         for (int i = 0; i < storage.size(); i++) {
  115.             cout << "Key: " << storage[i].cadastral_number << " adress:" << storage[i].adress<<'\n';
  116.         }
  117.     }
  118.     string brute_force(UI key) {
  119.         if (storage.empty()) return string();
  120.         for (size_t i = 0; i < storage.size(); i++)
  121.             if (storage[i].cadastral_number == key) return storage[i].adress;
  122.         return string();
  123.     }
  124.     string barrier_search(UI key) {
  125.         if (storage.empty()) return string();
  126.         UI last = storage[storage.size()-1].cadastral_number;
  127.         if (key == last) return storage[storage.size() - 1].adress;
  128.         storage[storage.size() - 1].cadastral_number = key;
  129.         size_t i = 0;
  130.         while (storage[i].cadastral_number != key) i++;
  131.         storage[storage.size() - 1].cadastral_number = last;
  132.         return (i != storage.size() - 1) ? storage[i].adress : string();
  133.     }
  134.     HNPrecord convert_2_HNPrecord(UI cadastral_number, string adress) {
  135.         return HNPrecord{ cadastral_number , adress };
  136.     }
  137. };
  138.  
  139. int main()
  140. {
  141.     SetConsoleCP(1251);
  142.     SetConsoleOutputCP(1251);
  143.     srand(time(NULL));
  144.     Table t;
  145.     Stopwatch s;
  146.     int answer1 = 100;
  147.     while (answer1 != 0) {
  148.         system("cls");
  149.         cout << "Лабораторная работа №8 ИКБО-33-21 Резван М.Б. Вариант 21" << endl << endl;
  150.         cout << "Задание 21" << endl;
  151.         cout << "Условия задачи 1:\n\n\n.";
  152.         cout << "Меню\n";
  153.         cout << "1) Заполнить таблицу рандомными (случайными) значениями\n";
  154.         cout << "2) Заполнить таблицу с клавиатуры\n";
  155.         cout << "3) Brute force (линейный поиск (метод грубой силы)).\n";
  156.         cout << "4) Barrier search (поиск с барьером).\n";
  157.         cout << "5) Вывести таблицу\n";
  158.         cout << "0) Выход\n";
  159.         cout << "Ваш выбор: ";
  160.         cin >> answer1;
  161.         system("cls");
  162.         cout << "Лабораторная работа №8 ИКБО-33-21 Резван М.Б. Вариант 21" << endl << endl;
  163.         switch (answer1)
  164.         {
  165.         case 1:
  166.             cout << "Введите размер таблицы: ";
  167.             cin >> answer1;
  168.             t.rand_init(answer1);
  169.             break;
  170.         case 2:
  171.         {
  172.             UI key;
  173.             string t_s;
  174.             cout << "Введите кадастровый номер: ";
  175.             cin >> key;
  176.             cout << "Введите адрес: ";
  177.             cin.ignore();
  178.             getline(cin, t_s);
  179.             t.insert(key, t_s);
  180.         }
  181.             break;
  182.  
  183.         case 3:
  184.             UI key;
  185.             cout << "Введите ключ: ";
  186.             cin >> key;
  187.             s.start_countdown();
  188.             cout << "Результат поиска (брут): " << t.brute_force(key) << "\n";
  189.             cout << "Время работы: " << s.get_milliseconds() << '\n';
  190.             system("pause");
  191.             break;
  192.         case 4:
  193.         {
  194.             UI key;
  195.             cout << "Введите ключ: ";
  196.             cin >> key;
  197.             s.start_countdown();
  198.             cout << "Результат поиска (барьер): " << t.barrier_search(key) << "\n";
  199.             cout << "Время работы: " << s.get_milliseconds() << '\n';
  200.         }
  201.             system("pause");
  202.             break;
  203.         case 5:
  204.             t.print_table();
  205.             system("pause");
  206.             break;
  207.         }
  208.     }
  209.  
  210. }
  211.    
  212.    
  213.  
  214.  
  215.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement