Advertisement
PGSStas

Untitled

Sep 28th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.70 KB | None | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>
  6. #include <chrono>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <iomanip>
  10.  
  11. // В данной лабораторной работе можно не писать каждый раз "std::".
  12. using namespace std;
  13.  
  14. // ---------------------------------------------------------------------------
  15. // Задание 1. Сумма элементов массива.
  16.  
  17. double MagicSum(double a, double b, double& error) {
  18.   double sum = a + b;
  19.   double error_a = (a - (sum - b));
  20.   double error_b = (b - (sum - a));
  21.   error = error_a + error_b;
  22.   return sum;
  23. }
  24.  
  25. double GetSum(const vector<double>& values) {
  26.   if (values.size() == 0) {
  27.     return 0;
  28.   }
  29.   double sum = values[0];
  30.   double error = 0;
  31.   for (int32_t i = 1; i < values.size(); i++) {
  32.     sum = MagicSum(sum, values[i] + error, error);
  33.   }
  34.   return sum;
  35. }
  36.  
  37. // ---------------------------------------------------------------------------
  38. // Задание 2. Магическая сумма матрицы.
  39.  
  40. bool BitCount(uint32_t number) {
  41.   int bit_count = 0;
  42.   while (number > 0) {
  43.     if (number & 1) {
  44.       bit_count++;
  45.     }
  46.     number >>= 1;
  47.   }
  48.   return bit_count <= 4;
  49. }
  50.  
  51. uint32_t GetMagicXor(const vector<uint32_t>& values) {
  52.   uint32_t magic_xor_value = 0;
  53.   for (uint32_t value : values) {
  54.     if (BitCount(value)) {
  55.       magic_xor_value ^= value;
  56.     }
  57.   }
  58.   return ~magic_xor_value;
  59. }
  60.  
  61. vector<uint32_t> GetMagicXor(const vector<vector<uint32_t>>& values) {
  62.   vector<uint32_t> result(values.size());
  63.   for (int32_t i = 0; i < values.size(); i++) {
  64.     result[i] = GetMagicXor(values[i]);
  65.   }
  66.   return result;
  67. }
  68.  
  69. // ---------------------------------------------------------------------------
  70. // Задание 3. Точка на плоскости
  71.  
  72. // Функция возвращает номер Вашего варианта.
  73. int GetVariant() {
  74.   return 1;
  75. }
  76.  
  77. const double eps = 1e-9;
  78.  
  79. // Функция определяет, лежит ли точнка в указанной области.
  80. int DoubleComparator(double a, double b) {
  81.   if (fabs(a - b) < eps)
  82.     return 0;
  83.   if (a - b > 0)
  84.     return 1;
  85.   return -1;
  86. }
  87.  
  88. int CompareWithCircle(double x, double y) {
  89.   return DoubleComparator(x * x + y * y, 15);
  90. }
  91.  
  92. int CompareWithLine(double x, double y) {
  93.   return DoubleComparator(y, -x + 3);
  94. }
  95.  
  96. int CompareWithParabola(double x, double y) {
  97.   return DoubleComparator(y, x * x + 2 * x - sqrt(15));
  98. }
  99.  
  100. int CompareWithCos(double x, double y) {
  101.   return DoubleComparator(y, cos(2 * x));
  102. }
  103.  
  104. bool IsPointInArea(double x, double y) {
  105.   if (CompareWithParabola(x, y) >= 0 && CompareWithCircle(x, y) <= 0
  106.       && CompareWithLine(x, y) <= 0) {
  107.     if (DoubleComparator(x, 0) >= 0 && CompareWithCos(x, y) <= 0) {
  108.       return 1;
  109.     }
  110.     if (DoubleComparator(y, 0) >= 0 && DoubleComparator(x, 0) <= 0) {
  111.       if (CompareWithCos(x, y) >= 0) {
  112.         return 1;
  113.       }
  114.       if (CompareWithCos(x, y) <= 0
  115.           && DoubleComparator(x, -3.0 * acos(-1) / 4.0) <= 0)
  116.         return 1;
  117.     }
  118.   }
  119.   return 0;
  120. }
  121.  
  122.  
  123. // ---------------------------------------------------------------------------
  124. // Задание 4. Сортировки
  125.  
  126. void BubbleSort(vector<string>& values) {
  127.   for (int32_t i = 0; i < values.size(); i++) {
  128.     for (int32_t j = 0;
  129.          j < static_cast<int32_t>(values.size()) - i - 1; j++) {
  130.       if (values[j] > values[j + 1]) {
  131.         swap(values[j], values[j + 1]);
  132.       }
  133.     }
  134.   }
  135. }
  136.  
  137. void SelectionSort(vector<string>& values) {
  138.   for (int i = 0; i < static_cast<int32_t>(values.size()) - 1; i++) {
  139.     int k = i;
  140.     for (int j = i + 1; j < values.size(); j++) {
  141.       if (values[j] < values[k]) {
  142.         k = j;
  143.       }
  144.     }
  145.     swap(values[i], values[k]);
  146.   }
  147. }
  148.  
  149. void ShakerSort(vector<string>& values) {
  150.   int left_index = 0;
  151.   int right_index = static_cast<int32_t>(values.size()) - 1;
  152.   while (left_index < right_index) {
  153.     for (int i = left_index; i < right_index; i++) {
  154.       if (values[i + 1] < values[i]) {
  155.         swap(values[i + 1], values[i]);
  156.       }
  157.     }
  158.     right_index--;
  159.  
  160.     for (int i = right_index; i > left_index; i--) {
  161.       if (values[i] < values[i - 1]) {
  162.         swap(values[i - 1], values[i]);
  163.       }
  164.     }
  165.     left_index++;
  166.   }
  167. }
  168.  
  169. void ExcahngeSort(vector<string>& values) {
  170.   for (int i = 0; i < values.size(); i++) {
  171.     for (int j = i + 1; j < values.size(); j++) {
  172.       if (values[i] > values[j]) {
  173.         swap(values[j], values[i]);
  174.       }
  175.     }
  176.   }
  177. }
  178.  
  179. void WriteAlgoStat(string algo_name, double working_time) {
  180.   cout << algo_name << " working time is " << working_time << "s\n";
  181. }
  182.  
  183. string GenerateString(int) {
  184. //    if (size == -1) {
  185. //        size = rand_r() % 20000;
  186. //    }
  187.   string result = "";
  188. //    for (int i = 0; i < size; i++) {
  189. //        result.push_back((char) (rand() % 256 - 128));
  190. //    }
  191.   return result;
  192. }
  193.  
  194. void GenerateArray(vector<string>& array, int size_of_strings) {
  195.   for (int i = 0; i < array.size(); i++) {
  196.     array[i] = GenerateString(size_of_strings);
  197.   }
  198. }
  199.  
  200. void GenerateStatistics(int size, int size_of_strings = -1) {
  201.   cout << "Size of array:" << size << " Size of strings:";
  202.   if (size_of_strings == -1) {
  203.     cout << "RANDOM\n";
  204.   } else {
  205.     cout << size_of_strings << '\n';
  206.   }
  207.  
  208.   vector<string> line(size);
  209.   GenerateArray(line, size_of_strings);
  210.   vector<string> example = line;
  211.  
  212.   auto start = chrono::high_resolution_clock::now();
  213.   BubbleSort(line);
  214.   auto finish = chrono::high_resolution_clock::now();
  215.   WriteAlgoStat("BubbleSort",
  216.                 static_cast<double>(std::chrono::duration<double>
  217.                     (finish - start).count()));
  218.   line = example;
  219.  
  220.   start = chrono::high_resolution_clock::now();
  221.   SelectionSort(line);
  222.   finish = chrono::high_resolution_clock::now();
  223.   WriteAlgoStat("SelectionSort",
  224.                 static_cast<double>(std::chrono::duration<double>
  225.                     (finish - start).count()));
  226.   line = example;
  227.  
  228.   start = chrono::high_resolution_clock::now();
  229.   ExcahngeSort(line);
  230.   finish = chrono::high_resolution_clock::now();
  231.   WriteAlgoStat("ExcahngeSort",
  232.                 static_cast<double>(std::chrono::duration<double>
  233.                     (finish - start).count()));
  234.   line = example;
  235.  
  236.   start = chrono::high_resolution_clock::now();
  237.   ShakerSort(line);
  238.   finish = chrono::high_resolution_clock::now();
  239.   WriteAlgoStat("ShakerSort",
  240.                 static_cast<double>(std::chrono::duration<double>
  241.                     (finish - start).count()));
  242.   line = example;
  243. }
  244.  
  245. // ---------------------------------------------------------------------------
  246. // Задание 5. Бинарный поиск
  247.  
  248. int FindRecursively(const vector<int>& values, int search_var,
  249.                     int l, int r) {
  250.   if (values.size() == 0)
  251.     return -1;
  252.   int m = (r + l + 1) / 2;
  253.   if (l == r) {
  254.     if (values[l] == search_var)
  255.       return l;
  256.     return -1;
  257.   }
  258.   if (values[m] > search_var)
  259.     return FindRecursively(values, search_var, l, m - 1);
  260.   return FindRecursively(values, search_var, m, r);
  261. }
  262.  
  263. int FindRecursively(const vector<int>& values, int search_var) {
  264.   return FindRecursively(values, search_var, 0, values.size() - 1);
  265. }
  266.  
  267. int FindIteratively(const vector<int>& values, int search_var) {
  268.   if (values.size() == 0)
  269.     return -1;
  270.   int l = 0;
  271.   int r = static_cast<int32_t>(values.size()) - 1;
  272.   int m = 0;
  273.   while (l != r) {
  274.     m = (l + r + 1) / 2;
  275.     if (values[m] > search_var) {
  276.       r = m - 1;
  277.     } else {
  278.       l = m;
  279.     }
  280.   }
  281.   if (values[l] == search_var)
  282.     return l;
  283.   return -1;
  284. }
  285.  
  286. #ifndef IGNORE_SOLUTION_MAIN
  287.  
  288. int main() {
  289.   // ---------------------------------------------------------------------
  290.   // Тут Вы можете написать код для тестирования Вашего решения.
  291.   // При проверке в системе всё содержимое
  292.   // в данном блоке будет игнорироваться.
  293.  
  294.   // Ниже даны некоторые очевидные тесты для демонстрации принципа работы.
  295.   // Разумеется, они не покрывают все случаи, но позволяют понять формат,
  296.   // в котором будут использоваться написанные Вами функции.
  297.  
  298.   {
  299.     // Задание 1.
  300.     // std::vector<double> values = {1, 1.5 - 42.42};
  301.     // double values_sum = GetSum(values);
  302.     // assert(values_sum == -39.92);
  303.   }
  304.   {
  305.     // Задание 2.
  306.     // std::vector<uint32_t> input_1d = {0x1111, 0x0111, 0x0011, 0x0001};
  307.     // uint32_t output_1d = GetMagicXor(input_1d);
  308.     // assert(output_1d == 0xFFFFEFEF);
  309.     //
  310.     // auto result = GetMagicXor(
  311.     //     {
  312.     //         {0x1111, 0x0111, 0x0011, 0x0001,},
  313.     //         {0x0000FFFF, 0x11111111, 0x01010101, 0x0F000F00,},
  314.     //     });
  315.     // assert(result.size() == 2);
  316.     // assert(result[0] == 0xFFFFEFEF);
  317.     // assert(result[1] == 0xFEFEFEFE);
  318.   }
  319.   {
  320.     // Задание 3.
  321.     // assert(GetVariant() == -1);
  322.     ofstream fout("output.txt");
  323.     for (double y = 5; y >= -5; y -= 0.02) {
  324.       for (double x = -5; x <= 5; x += 0.02) {
  325.         fout << IsPointInArea(x, y) << " ";
  326.       }
  327.       fout << '\n';
  328.     }
  329.     IsPointInArea(-3.0, 0.5);
  330.   }
  331.   GenerateStatistics(10000, 1);
  332.   GenerateStatistics(10000);
  333.   {
  334.     // Задание 4.
  335.     // vector<string> values = {
  336.     //     "abacabadabacaba",
  337.     //     "abacaba",
  338.     //     "aaaaaaa",
  339.     // };
  340.     // SelectionSort(values);
  341.     // ExcahngeSort(values);
  342.     // BubbleSort(values);
  343.     // ShakerSort(values);
  344.     // assert(values == vector<string>(
  345.     //     {"aaaaaaa", "abacaba", "abacabadabacaba"}));
  346.   }
  347.   {
  348.     // Задание 5.
  349.     // vector<int> values = {1, 2, 3, 4, 5};
  350.     //
  351.     // auto start = std::chrono::high_resolution_clock::now();
  352.     // assert(FindRecursively(values, 3) == 2);
  353.     // assert(FindRecursively(values, 42) == -1);
  354.     // auto finish = std::chrono::high_resolution_clock::now();
  355.     // cout << "Recursive search test finished in "
  356.     //      << std::chrono::duration<double>(finish - start).count()
  357.     //      << " seconds.\n";
  358.     //
  359.     // start = std::chrono::high_resolution_clock::now();
  360.     // assert(FindIteratively(values, 3) == 2);
  361.     // assert(FindIteratively(values, 42) == -1);
  362.     // finish = std::chrono::high_resolution_clock::now();
  363.     // cout << "Iterative search test finished in "
  364.     //      << std::chrono::duration<double>(finish - start).count()
  365.     //      << " seconds.\n";
  366.   }
  367.  
  368.   // ---------------------------------------------------------------------
  369. }
  370.  
  371. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement