Advertisement
anticlown

laba.3.3.(C++)

Nov 24th, 2022 (edited)
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. const int MIN_SIZE = 2;
  6. const int MAX_SIZE = 10;
  7. const int MIN_VALUE = -1000;
  8. const int MAX_VALUE = 1000;
  9.  
  10. void outputOfTaskInfo() {
  11.   std::cout << "Данная программа сортирует введенную последовательность методом бинарных вставок. \n"
  12.     << "Диапазон ввода значений размера последовательности: " << MIN_SIZE << "..." << MAX_SIZE << ". \n"
  13.     << "Диапазон для ввода чисел: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
  14. }
  15.  
  16. int getVerificationOfChoice() {
  17.   int choice;
  18.   bool isIncorrect;
  19.  
  20.   do {
  21.     isIncorrect = false;
  22.     std::cin >> choice;
  23.  
  24.     if (std::cin.fail())
  25.     {
  26.       std::cin.clear();
  27.       while (std::cin.get() != '\n');
  28.       isIncorrect = true;
  29.       std::cout << "Проверьте корректность ввода данных! \n";
  30.     }
  31.  
  32.     if (!isIncorrect && std::cin.get() != '\n')
  33.     {
  34.       std::cin.clear();
  35.       while (std::cin.get() != '\n');
  36.  
  37.       std::cout << "Проверьте корректность ввода данных! \n";
  38.       isIncorrect = true;
  39.     }
  40.  
  41.     if (isIncorrect || (choice != 0 && choice != 1))
  42.     {
  43.       isIncorrect = true;
  44.       std::cout << "Для выбора введите 0 или 1! \n";
  45.     }
  46.   } while (isIncorrect);
  47.  
  48.   return choice;
  49. }
  50.  
  51. std::string inputPathToFile() {
  52.   std::string path;
  53.   bool isIncorrect;
  54.  
  55.   std::cout << "Укажите путь к файлу: ";
  56.  
  57.   do
  58.   {
  59.     isIncorrect = false;
  60.     std::cin >> path;
  61.     std::ifstream file(path);
  62.  
  63.     if (!file.is_open())
  64.     {
  65.       std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
  66.       isIncorrect = true;
  67.     }
  68.   } while (isIncorrect);
  69.  
  70.   return path;
  71. }
  72.  
  73. int readSizeFromConsole() {
  74.   int size;
  75.   bool isIncorrect;
  76.  
  77.   std::cout << "Введите количество элементов последовательности: ";
  78.  
  79.   do
  80.   {
  81.     isIncorrect = false;
  82.     std::cin >> size;
  83.     if (std::cin.fail())
  84.     {
  85.       isIncorrect = true;
  86.       std::cout << "Проверьте корректность ввода данных! \n";
  87.       std::cin.clear();
  88.       while (std::cin.get() != '\n');
  89.     }
  90.     if (!isIncorrect && (size < MIN_SIZE || size >> MAX_SIZE))
  91.     {
  92.       isIncorrect = true;
  93.       std::cout << "Введите число от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
  94.     }
  95.   } while (isIncorrect);
  96.  
  97.   return size;
  98. }
  99.  
  100. int readSizeFromFile(const std::string path) {
  101.   int size;
  102.   std::string sizeInp;
  103.   bool isIncorrect = true;
  104.   std::ifstream fin(path);
  105.  
  106.   std::cout << "Происходит чтение количества членов последовательности... \n";
  107.   fin >> sizeInp;
  108.  
  109.   try
  110.   {
  111.     size = atoi(sizeInp.c_str());
  112.   }
  113.   catch (...)
  114.   {
  115.     isIncorrect = false;
  116.     std::cout << "Ошибка при чтении данных! Введите количество с консоли! \n";
  117.     size = readSizeFromConsole();
  118.   }
  119.  
  120.   if (!isIncorrect && (size < MIN_SIZE || size > MAX_SIZE))
  121.   {
  122.     std::cout << "Введите значение от " << MIN_SIZE << " до " << MAX_SIZE << "! \n";
  123.     size = readSizeFromConsole();
  124.   }
  125.  
  126.   fin.close();
  127.  
  128.   return size;
  129. }
  130.  
  131. int readSize(const int choice, const std::string path) {
  132.   int size;
  133.  
  134.   if (choice == 0)
  135.     size = readSizeFromConsole();
  136.   if (choice == 1)
  137.     size = readSizeFromFile(path);
  138.  
  139.   return size;
  140. }
  141.  
  142. void outputSizeInConsole(const int size) {
  143.   std::cout << "Количество членов последовательности равно: " << size << ". \n";
  144. }
  145.  
  146. void outputSizeInFile(std::string path, const int size) {
  147.   std::ofstream fout(path);
  148.   bool isIncorrect;
  149.  
  150.   std::cout << "Вывод количества членов последовательности в файл... \n";
  151.  
  152.   do
  153.   {
  154.     isIncorrect = false;
  155.     std::ofstream fout(path);
  156.  
  157.     try
  158.     {
  159.       fout << size << "\n";
  160.     }
  161.     catch (...)
  162.     {
  163.       std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  164.       isIncorrect = true;
  165.       path = inputPathToFile();
  166.     }
  167.  
  168.     fout.close();
  169.   } while (isIncorrect);
  170.  
  171.   std::cout << "Данные успешно записаны в файл! \n";
  172. }
  173.  
  174. void outputSize(const int choice, const std::string path, const int size) {
  175.  
  176.   if (choice == 0)
  177.     outputSizeInConsole(size);
  178.   if (choice == 1)
  179.     outputSizeInFile(path, size);
  180. }
  181.  
  182. int* fillSequenceFromConsole(const int size) {
  183.   int* sequence = new int [size];
  184.   bool isIncorrect;
  185.  
  186.   for (int i = 0; i < size; i++)
  187.   {
  188.     std::cout << "Введите значение " << i + 1 << "-го элемента последовательности: ";
  189.  
  190.     do
  191.     {
  192.       isIncorrect = false;
  193.       std::cin >> sequence[i];
  194.  
  195.       if (std::cin.fail())
  196.       {
  197.         isIncorrect = true;
  198.         std::cout << "Проверьте корректность ввода данных! \n";
  199.         std::cin.clear();
  200.         while (std::cin.get() != '\n');
  201.       }
  202.  
  203.       if (!isIncorrect && (sequence[i] < MIN_VALUE || sequence[i] >> MAX_VALUE))
  204.       {
  205.         isIncorrect = true;
  206.         std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
  207.       }
  208.     } while (isIncorrect);
  209.   }
  210.  
  211.   return sequence;
  212. }
  213.  
  214. int* fillSequenceFromFile(const int size, const std::string path) {
  215.   int* sequence = new int[size];
  216.   bool isIncorrect;
  217.   std::string matrixInp;
  218.   std::ifstream fin(path);
  219.  
  220.   std::cout << "Чтение последовательности... \n";
  221.   fin >> matrixInp;
  222.  
  223.   for (int i = 0; i < size; i++)
  224.   {
  225.       do
  226.       {
  227.         isIncorrect = false;
  228.  
  229.         try
  230.         {
  231.           fin >> sequence[i];
  232.         }
  233.         catch (...)
  234.         {
  235.           std::cout << "Ошибка при чтении последовательности! Введите последовательность с консоли! \n";
  236.           isIncorrect = true;
  237.           sequence = fillSequenceFromConsole(size);
  238.         }
  239.  
  240.         if (!isIncorrect && (sequence[i] < MIN_VALUE || sequence[i] > MAX_VALUE))
  241.         {
  242.           std::cout << "Ошибка при чтении последовательности! Введите последовательность с консоли! \n";
  243.           isIncorrect = true;
  244.           sequence = fillSequenceFromConsole(size);
  245.         }
  246.       } while (isIncorrect);
  247.   }
  248.  
  249.   fin.close();
  250.  
  251.   return sequence;
  252. }
  253.  
  254. int* fillSequence(const int choice, const std::string path, const int size) {
  255.   int* sequence = new int[size];
  256.  
  257.   if (choice == 0)
  258.     sequence = fillSequenceFromConsole(size);
  259.   if (choice == 1)
  260.     sequence = fillSequenceFromFile(size, path);
  261.  
  262.   return sequence;
  263. }
  264.  
  265. void outputSequenceInConsole(int* sequence, const int size) {
  266.   std::cout << "Вывод начальной последовательности: \n";
  267.  
  268.   for (int i = 0; i < size; i++)
  269.     std::cout << sequence[i] << "\t";
  270.   std::cout << "\n";
  271. }
  272.  
  273. void outputSequenceInFile(std::string path, int* sequence, const int size) {
  274.   bool isIncorrect;
  275.   std::ofstream fout;
  276.  
  277.   std::cout << "Вывод начальной последовательности в файл... \n";
  278.  
  279.   fout.open(path, std::ios::app);
  280.   fout << "\n";
  281.  
  282.   do
  283.   {
  284.     isIncorrect = false;
  285.  
  286.     try
  287.     {
  288.       for (int i = 0; i < size; i++)
  289.       {
  290.         for (int j = 0; j < size; j++)
  291.           fout << sequence[i] << "\t";
  292.         fout << "\n";
  293.       }
  294.  
  295.       fout << "\n";
  296.     }
  297.     catch (...)
  298.     {
  299.       std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  300.       isIncorrect = true;
  301.       path = inputPathToFile();
  302.     }
  303.   } while (isIncorrect);
  304.  
  305.   fout.close();
  306.   std::cout << "Данные успешно записаны в файл! \n";
  307. }
  308.  
  309. void outputSequence(const int choice, const std::string path,const int size, int* sequence) {
  310.  
  311.   if (choice == 0)
  312.     outputSequenceInConsole(sequence, size);
  313.   if (choice == 1)
  314.     outputSequenceInFile(path, sequence, size);
  315. }
  316.  
  317. int** BinaryInsertionSort(const int size, int* sequence) {
  318.   int* newSequence = new int[size];
  319.   int** detailingMatrix = new int* [size];
  320.   for (int i = 0; i < size; i++)
  321.     detailingMatrix[i] = new int[size];
  322.  
  323.   for (int i = 0; i < size; i++)
  324.   {
  325.     newSequence[i] = sequence[i];
  326.     detailingMatrix[0][i] = sequence[i];
  327.   }
  328.  
  329.   for (int i = 1; i < size; i++)
  330.   {
  331.     if (newSequence[i - 1] > newSequence[i])
  332.     {
  333.       int temp = newSequence[i];
  334.       int left = 0;
  335.       int right = i - 1;
  336.       int j;
  337.  
  338.       do
  339.       {
  340.         int middle = (left + right) / 2;
  341.  
  342.         if (newSequence[middle] < temp)
  343.           left = middle + 1;
  344.         else
  345.           right = middle - 1;
  346.       } while (left < right + 1);
  347.  
  348.       for (j = i - 1; j + 1 > left; j--)
  349.         newSequence[j + 1] = newSequence[j];
  350.       newSequence[left] = temp;
  351.     }
  352.  
  353.     for (int j = 0; j < size; j++)
  354.       detailingMatrix[i][j] = newSequence[j];
  355.   }
  356.  
  357.   return detailingMatrix;
  358. }
  359.  
  360. void outputDetailingMatrixInConsole(int** detailingMatrix, const int size) {
  361.   std::cout << "Вывод пошаговой детализации: \n";
  362.  
  363.   for (int i = 0; i < size; i++)
  364.   {
  365.     for (int j = 0; j < size; j++)
  366.       std::cout << detailingMatrix[i][j] << "\t";
  367.     std::cout << "\n";
  368.   }
  369.   std::cout << "\n";
  370. }
  371.  
  372. void outputDetailingMatrixInFile(std::string path, int** detailingMatrix, const int size) {
  373.   bool isIncorrect;
  374.   std::ofstream fout;
  375.  
  376.   std::cout << "Вывод пошаговой детализации в файл... \n";
  377.  
  378.   fout.open(path, std::ios::app);
  379.   fout << "\n";
  380.  
  381.   do
  382.   {
  383.     isIncorrect = false;
  384.  
  385.     try
  386.     {
  387.       for (int i = 0; i < size; i++)
  388.       {
  389.         for (int j = 0; j < size; j++)
  390.           fout << detailingMatrix[i][j] << "\t";
  391.         fout << "\n";
  392.       }
  393.  
  394.       fout << "\n";
  395.     }
  396.     catch (...)
  397.     {
  398.       std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  399.       isIncorrect = true;
  400.       path = inputPathToFile();
  401.     }
  402.   } while (isIncorrect);
  403.  
  404.   fout.close();
  405.   std::cout << "Данные успешно записаны в файл! \n";
  406. }
  407.  
  408. void outputDetailingMatrix(const int choice, const std::string path, const int size, int** detailingMatrix) {
  409.  
  410.   if (choice == 0)
  411.     outputDetailingMatrixInConsole(detailingMatrix, size);
  412.   if (choice == 1)
  413.     outputDetailingMatrixInFile(path, detailingMatrix, size);
  414. }
  415.  
  416. void processUserInput(int& choiceForInput, std::string& pathToIn, int& size) {
  417.   std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
  418.   choiceForInput = getVerificationOfChoice();
  419.   if (choiceForInput == 1)
  420.     pathToIn = inputPathToFile();
  421.  
  422.   size = readSize(choiceForInput, pathToIn);
  423. }
  424.  
  425. void processUserOutput(int& choiceForOutput, std::string& pathToOut, int& size, int*& sequence, int**& detailingMatrix) {
  426.   std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
  427.   choiceForOutput = getVerificationOfChoice();
  428.   if (choiceForOutput == 1)
  429.     pathToOut = inputPathToFile();
  430.  
  431.   outputSize(choiceForOutput, pathToOut, size);
  432.   outputSequence(choiceForOutput, pathToOut, size, sequence);
  433.   outputDetailingMatrix(choiceForOutput, pathToOut, size, detailingMatrix);
  434. }
  435.  
  436. int main() {
  437.   setlocale(LC_ALL, "Rus");
  438.   int choiceForInput, choiceForOutput, size;
  439.   std::string pathToIn, pathToOut;
  440.  
  441.   outputOfTaskInfo();
  442.   processUserInput(choiceForInput, pathToIn, size);
  443.  
  444.   int* sequence = new int[size];
  445.   sequence = fillSequence(choiceForInput, pathToIn, size);
  446.  
  447.   int** detailingMatrix = new int* [size];
  448.   for (int i = 0; i < size; i++)
  449.     detailingMatrix[i] = new int[size];
  450.  
  451.   detailingMatrix = BinaryInsertionSort(size, sequence);
  452.  
  453.   processUserOutput(choiceForOutput, pathToOut, size, sequence, detailingMatrix);
  454.  
  455.   return 0;
  456. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement