Advertisement
believe_me

Untitled

Nov 21st, 2021
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4. #include <cstdlib>
  5. #include <fstream>
  6.  
  7. bool checkPermissionForWriting(const std::string& PathToFile) {
  8.     bool Flag;
  9.     std::ofstream FileOut(PathToFile);
  10.     if (FileOut.is_open()) {
  11.         FileOut.close();
  12.         Flag = true;
  13.     }
  14.     else {
  15.         std::cout << "File isn't available for writing.\n";
  16.         Flag = false;
  17.     }
  18.     return Flag;
  19. }
  20.  
  21. bool checkPermissionForReading(const std::string& PathToFile) {
  22.     bool Flag;
  23.     std::ifstream FileIn(PathToFile);
  24.     if (FileIn.is_open()) {
  25.         FileIn.close();
  26.         Flag = true;
  27.     }
  28.     else {
  29.         std::cout << "File isn't available for reading.\n";
  30.         Flag = false;
  31.     }
  32.     return Flag;
  33. }
  34.  
  35. bool checkExtension(const std::string& PathToFile) {
  36.     const std::string extension = "txt";
  37.     bool Flag;
  38.     if (PathToFile.substr(PathToFile.length() - 3) == extension) {
  39.         Flag = true;
  40.     }
  41.     else {
  42.         std::cout << "Wrong extension.\n";
  43.         Flag = false;
  44.     }
  45.     return Flag;
  46. }
  47.  
  48. void printSourceArrayInConsole(int* SourceArray, int NumberOfElements) {
  49.     std::cout << "Source array:\n";
  50.     for (int i = 0; i < NumberOfElements; i++) {
  51.         std::cout << std::setw(6) << SourceArray[i];
  52.     }
  53.     std::cout << "\n";
  54. }
  55.  
  56. int inputIntegerNumber(const int MIN_NUMBER, const int MAX_NUMBER) {
  57.     bool is_incorrect;
  58.     int number;
  59.     std::string input = "";
  60.     do {
  61.         getline(std::cin, input);
  62.         is_incorrect = false;
  63.         try {
  64.             number = std::stoi(input);
  65.         }
  66.         catch (std::invalid_argument ex) {
  67.             std::cout << "Enter a number:\n";
  68.             is_incorrect = true;
  69.         }
  70.         catch (std::out_of_range ex) {
  71.             std::cout << "Number mustn't be less than " << MIN_NUMBER << " and more than "
  72.                 << MAX_NUMBER << "\n";
  73.             is_incorrect = true;
  74.         }
  75.         if (!is_incorrect && (number <  MIN_NUMBER || number > MAX_NUMBER)) {
  76.             std::cout << "Number mustn't be less than " << MIN_NUMBER << " and more than "
  77.                 << MAX_NUMBER << "\n";
  78.             is_incorrect = true;
  79.         }
  80.     } while (is_incorrect);
  81.     return number;
  82. }
  83.  
  84. int chooseWayOfInput() {
  85.     const int CONSOLE_INPUT = 1;
  86.     const int FILE_INPUT = 2;
  87.     const int RANDOM_GENERATION_INPUT = 3;
  88.     int UserWay;
  89.     do {
  90.         UserWay = inputIntegerNumber(1, 3);
  91.     } while (UserWay != CONSOLE_INPUT && UserWay != FILE_INPUT && UserWay !=RANDOM_GENERATION_INPUT);
  92.     return UserWay;
  93. }
  94.  
  95. int chooseWayOfOutput() {
  96.     const int CONSOLE_OUTPUT = 1;
  97.     const int FILE_OUTPUT = 2;
  98.     const int RANDOM_GENERATION_INPUT = 3;
  99.     int UserWay;
  100.     do {
  101.         UserWay = inputIntegerNumber(1, 2);
  102.     } while (UserWay != CONSOLE_OUTPUT && UserWay != FILE_OUTPUT);
  103.     return UserWay;
  104. }
  105.  
  106. int inputNumberOfElements() {
  107.     std::cout << "Input number of elements:\n";
  108.     return inputIntegerNumber(2, 200);
  109. }
  110.  
  111. int inputElement() {
  112.     std::cout << "Input element: ";
  113.     return inputIntegerNumber(-100, 100);
  114. }
  115.  
  116. bool checkFile(const std::string PathToFile) {
  117.     bool Flag = true;
  118.     int IsNumber;
  119.     std::string Text;
  120.     std::ifstream InputFile(PathToFile);
  121.     getline(InputFile, Text);
  122.     int SizeOfText = Text.length();
  123.     for (int i = 0; (i < SizeOfText && Flag); i++) {
  124.         if (Text[i] != ' ' && Text[i] != '-') {
  125.             try {
  126.                 IsNumber = std::stoi(Text.substr(i, 1));
  127.             }
  128.             catch (std::invalid_argument ex) {
  129.                 std::cout << "Received data includes non-integer chars.\n";
  130.                 Flag = false;
  131.             }
  132.         }
  133.     }
  134.     InputFile.close();
  135.     return Flag;
  136. }
  137.  
  138. int receiveNumberOfElementsFromFile(const std::string PathToFile) {
  139.     int NumberOfElements = 0;
  140.     int Element;
  141.     std::ifstream InputFile(PathToFile);
  142.     while (!InputFile.eof()) {
  143.         InputFile >> Element;
  144.         NumberOfElements++;
  145.     }
  146.     InputFile.close();
  147.     return NumberOfElements;
  148. }
  149.  
  150. const std::string inputPathToFileForReading() {
  151.     std::string PathToFile;
  152.     do {
  153.         std::cout << "Input path to file for reading:\n";
  154.         getline(std::cin, PathToFile);
  155.     } while (!checkExtension(PathToFile) || !checkPermissionForReading(PathToFile));
  156.     return PathToFile;
  157. }
  158.  
  159. void receiveSourceArrayFromFile(const std::string PathToFile, int* SourceArray) {
  160.     int i = 0;
  161.     std::string Text;
  162.     std::ifstream InputFile(PathToFile);
  163.     while (!InputFile.eof()) {
  164.         InputFile >> SourceArray[i++];
  165.     }
  166.     InputFile.close();
  167. }
  168.  
  169. int receiveNumberOfElements(int* UserWay, std::string &PathToFile) {
  170.     std::cout << "Choose way of input: \nType '1' if you want to receive sequence from console;\nType '2' if you want to receieve sequence from file;\nType '3' if you want to fill sequence with random numbers:\n";
  171.     int NumberOfElements;
  172.     *UserWay = chooseWayOfInput();
  173.     switch (*UserWay) {
  174.     case 1:
  175.     {
  176.         NumberOfElements = inputNumberOfElements();
  177.         break;
  178.     }
  179.     case 2:
  180.     {
  181.         do {
  182.             PathToFile = inputPathToFileForReading();
  183.         } while (!(checkPermissionForReading(PathToFile) && checkFile(PathToFile)));
  184.         NumberOfElements = receiveNumberOfElementsFromFile(PathToFile);
  185.         break;
  186.     }
  187.     case 3:
  188.     {
  189.         NumberOfElements = inputNumberOfElements();
  190.         break;
  191.     }
  192.     }
  193.     return NumberOfElements;
  194. }
  195.  
  196. void fillingSourceArray(int* SourceArray, int NumberOfElements) {
  197.     for (int i = 0; i < NumberOfElements; i++) {
  198.         std::cout << "Input element: ";
  199.         SourceArray[i] = inputIntegerNumber(-50, 50);
  200.     }
  201. }
  202.  
  203. int* fillingSourceArrayWithRandomNumbers(int* SourceArray, int NumberOfElements)
  204. {
  205.     srand(time(NULL));
  206.     for (int i = 0; i < NumberOfElements; i++)
  207.     {
  208.         SourceArray[i] = rand() % 101 - 50;
  209.     }
  210.     return SourceArray;
  211. }
  212.  
  213. void receiveSourceArray(int NumberOfElements, int* SourceArray, int* UserWay, const std::string &PathToFile){
  214.     switch (*UserWay){
  215.         case 1:
  216.         {
  217.             fillingSourceArray(SourceArray, NumberOfElements);
  218.             break;
  219.         }
  220.         case 2:
  221.         {
  222.             receiveSourceArrayFromFile(PathToFile, SourceArray);
  223.             break;
  224.         }
  225.         case 3:
  226.         {
  227.             fillingSourceArrayWithRandomNumbers(SourceArray, NumberOfElements);
  228.             break;
  229.         }
  230.     }
  231.     printSourceArrayInConsole(SourceArray, NumberOfElements);
  232. }
  233.  
  234. void fillingArrayWithZeros(int* SizesOfIntermediateArray, int NumberOfElements){
  235.     int Counter = NumberOfElements / 2 + 1;
  236.     for (int i = 0; i < Counter; i++){
  237.         SizesOfIntermediateArray[i] = 0;
  238.     }
  239. }
  240.  
  241. int findPositionToWriteSizesOfFirstSortingArray(int* SizesOfFirstSortingArray, int NumberOfElements){
  242.     for (int i = 0; i < NumberOfElements; i++){
  243.         if (SizesOfFirstSortingArray[i] == 0){
  244.             return i;
  245.         }
  246.     }
  247. }
  248.  
  249. int findPositionToWriteSizesOfSecondSortingArray(int* SizesOfFSecondSortingArray, int NumberOfElements){
  250.     for (int i = 0; i < NumberOfElements; i++){
  251.         if (SizesOfFSecondSortingArray[i] == 0){
  252.             return i;
  253.         }
  254.     }
  255. }
  256.  
  257. bool findConditionOfSorted(int* IntermediateArray, int NumberOfElements){
  258.     int Counter = 0;
  259.     for (int i = 1; i < NumberOfElements; i++){
  260.         if (IntermediateArray[i - 1] <= IntermediateArray[i]){
  261.             Counter++;
  262.         }
  263.     }
  264.     return (Counter + 1 == NumberOfElements);
  265. }
  266.  
  267. void creatingFirstF(int* IntermediateArray, int* SourceArray, int NumberOfElements){
  268.     for (int i = 0; i < NumberOfElements; i++){
  269.         IntermediateArray[i] = SourceArray[i];
  270.     }
  271. }
  272.  
  273. void creatingSortedArray(int* SortedArray, int* IntermediateArray, int NumberOfElements){
  274.     for (int i = 0; i < NumberOfElements; i++){
  275.         SortedArray[i] = IntermediateArray[i];
  276.     }
  277. }
  278.  
  279. int findNumberOfPairs(int* SizesOfFirstSortingArray, int NumberOfElements){
  280.     int Counter = NumberOfElements / 2 + 1;
  281.     int NullPosition = Counter;
  282.     for (int i = 0; i < Counter; i++){
  283.         if (SizesOfFirstSortingArray[i] == 0){
  284.             NullPosition = i;
  285.             i = Counter;
  286.         }
  287.     }
  288.     return NullPosition;
  289. }
  290.  
  291. void findSortedPart(int* IntermediateArray, int* sort, int NumberOfElements, int* Index, int* Length){
  292.     int k = 0;
  293.     for (int i = *Index; i < NumberOfElements; i++){
  294.         if (IntermediateArray[i] <= IntermediateArray[i + 1]){
  295.             k++;
  296.         }
  297.         else{
  298.             i = NumberOfElements;
  299.         }
  300.     }
  301.     if (k > 0){
  302.         int j = 0;
  303.         for (int i = *Index; i < *Index + k + 1; i++){
  304.             sort[j] = IntermediateArray[i];
  305.             j++;
  306.         }
  307.     }
  308.     else{
  309.         sort[0] = IntermediateArray[*Index];
  310.     }
  311.     *Length = k + 1;
  312.     *Index += *Length;
  313. }
  314.  
  315. void fillFirstSortingArray(int* FirstSortingArray, int* sort, int* SizesOfFirstSortingArray, int NumberOfElements, int Length, int *IndexOfIntermediateArray){
  316.     for (int i = *IndexOfIntermediateArray; i < *IndexOfIntermediateArray + Length; i++)
  317.     {
  318.         FirstSortingArray[i] = sort[i - *IndexOfIntermediateArray];
  319.     }
  320.     int NumberOfPosition = findPositionToWriteSizesOfFirstSortingArray(SizesOfFirstSortingArray, NumberOfElements);
  321.     SizesOfFirstSortingArray[NumberOfPosition] = Length;
  322.     *IndexOfIntermediateArray += Length;
  323. }
  324.  
  325. void fillingSecondSortingArray(int* SecondSortingArray, int* sort, int* SizesOfFSecondSortingArray, int NumberOfElements, int Length, int *IndexOfIntermediateArray){
  326.     for (int i = *IndexOfIntermediateArray; i < *IndexOfIntermediateArray + Length; i++){
  327.         SecondSortingArray[i] = sort[i - *IndexOfIntermediateArray];
  328.     }
  329.     int NumberOfPosition = findPositionToWriteSizesOfSecondSortingArray(SizesOfFSecondSortingArray, NumberOfElements);
  330.     SizesOfFSecondSortingArray[NumberOfPosition] = Length;
  331.     *IndexOfIntermediateArray += Length;
  332. }
  333.  
  334. void fillingSortingArrays(int* IntermediateArray, int* FirstSortingArray, int* SecondSortingArray, int* SizesOfFirstSortingArray, int* SizesOfFSecondSortingArray, int NumberOfElements){
  335.     int Index = 0;
  336.     int index_f = 0;
  337.     int Length = 0;
  338.     int condition = 0;
  339.     int* sort = new int[NumberOfElements];
  340.     fillingArrayWithZeros(SizesOfFirstSortingArray, NumberOfElements);
  341.     fillingArrayWithZeros(SizesOfFSecondSortingArray, NumberOfElements);
  342.     for (int i = 0; i < NumberOfElements; i += Length)
  343.     {
  344.         findSortedPart(IntermediateArray, sort, NumberOfElements, &Index, &Length);
  345.         if (condition % 2 == 0)
  346.         {
  347.             fillFirstSortingArray(FirstSortingArray, sort, SizesOfFirstSortingArray, NumberOfElements, Length, &index_f);
  348.         }
  349.         else
  350.         {
  351.             fillingSecondSortingArray(SecondSortingArray, sort, SizesOfFSecondSortingArray, NumberOfElements, Length, &index_f);
  352.         }
  353.         condition++;
  354.     }
  355.     delete[] sort;
  356. }
  357.  
  358. void receiveNewSourceArray(int* IntermediateArray, int* FirstSortingArray, int* SecondSortingArray, int* SizesOfFirstSortingArray, int* SizesOfFSecondSortingArray, int NumberOfElements){
  359.     fillingSortingArrays(IntermediateArray, FirstSortingArray, SecondSortingArray, SizesOfFirstSortingArray, SizesOfFSecondSortingArray, NumberOfElements);
  360.     int Counter = findNumberOfPairs(SizesOfFirstSortingArray, NumberOfElements);
  361.     int Index = 0;
  362.     for (int i = 0; i < Counter; i++){
  363.         int SizeOfFirstSortingArray = SizesOfFirstSortingArray[i];
  364.         int SizeOfSecondSortingArray = SizesOfFSecondSortingArray[i];
  365.         int j1 = Index;
  366.         int j2 = Index + SizeOfFirstSortingArray;
  367.         int z = Index;
  368.         while (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray){
  369.             if ((j1 == Index + SizeOfFirstSortingArray) && (j2 != Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)){
  370.                 for (j2; j2 < SizeOfFirstSortingArray + SizeOfSecondSortingArray + Index; j2++){
  371.                     IntermediateArray[z++] = SecondSortingArray[j2];
  372.                 }
  373.             }
  374.             if ((j2 == Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray) && (j1 != Index + SizeOfFirstSortingArray)){
  375.                 for (j1; j1 < SizeOfFirstSortingArray + Index; j1++){
  376.                     IntermediateArray[z++] = FirstSortingArray[j1];
  377.                 }
  378.             }
  379.             if ((FirstSortingArray[j1] < SecondSortingArray[j2]) && (j2 < NumberOfElements) && (j1 < NumberOfElements) && (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)){
  380.                 IntermediateArray[z++] = FirstSortingArray[j1++];
  381.             }
  382.             else{
  383.                 if ((SecondSortingArray[j2] < FirstSortingArray[j1]) && (j2 < NumberOfElements) && (j1 < NumberOfElements) && (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)){
  384.                     IntermediateArray[z++] = SecondSortingArray[j2++];
  385.                 }
  386.                 else{
  387.                     if ((SecondSortingArray[j2] == FirstSortingArray[j1]) && (j2 < NumberOfElements) && (j1 < NumberOfElements) && (z < Index + SizeOfFirstSortingArray + SizeOfSecondSortingArray)){
  388.                         IntermediateArray[z++] = FirstSortingArray[j1++];
  389.                         IntermediateArray[z++] = SecondSortingArray[j2++];
  390.                     }
  391.                 }
  392.             }
  393.         }
  394.         Index += SizeOfFirstSortingArray + SizeOfSecondSortingArray;
  395.     }
  396. }
  397.  
  398. void sorting(int* SourceArray, int* SortedArray, int NumberOfElements){
  399.     int* IntermediateArray = new int[NumberOfElements];
  400.     int* FirstSortingArray = new int[NumberOfElements];
  401.     int* SecondSortingArray = new int[NumberOfElements];
  402.     int* SizesOfFirstSortingArray = new int[NumberOfElements / 2 + 1];
  403.     int* SizesOfFSecondSortingArray = new int[NumberOfElements / 2 + 1];
  404.     creatingFirstF(IntermediateArray, SourceArray, NumberOfElements);
  405.     while (!findConditionOfSorted(IntermediateArray, NumberOfElements)){
  406.         receiveNewSourceArray(IntermediateArray, FirstSortingArray, SecondSortingArray, SizesOfFirstSortingArray, SizesOfFSecondSortingArray, NumberOfElements);
  407.     }
  408.     creatingSortedArray(SortedArray, IntermediateArray, NumberOfElements);
  409.     delete[] IntermediateArray;
  410.     delete[] FirstSortingArray;
  411.     delete[] SecondSortingArray;
  412.     delete[] SizesOfFirstSortingArray;
  413.     delete[] SizesOfFSecondSortingArray;
  414. }
  415.  
  416. void printSortedArrayInConsole(int* SortedArray, int NumberOfElements)
  417. {
  418.     std::cout << "Sorted array:\n";
  419.     for (int i = 0; i < NumberOfElements; i++)
  420.     {
  421.         std::cout << std::setw(6) << SortedArray[i];
  422.     }
  423.     std::cout << "\n";
  424. }
  425.  
  426. void printSortedArrayInFile(int* SortedArray, int NumberOfElements, const std::string PathToFile)
  427. {
  428.     std::ofstream FileOut(PathToFile);
  429.     FileOut << "Sorted array:\n";
  430.     for (int i = 0; i < NumberOfElements; i++)
  431.     {
  432.         FileOut << std::setw(6) << SortedArray[i];
  433.     }
  434.     FileOut.close();
  435.     std::cout << "Result is written in file.\n";
  436. }
  437.  
  438. const std::string inputPathToFileForWriting() {
  439.     std::string PathToFile;
  440.     do {
  441.         std::cout << "Input path to file for writing:  \n";
  442.         getline(std::cin, PathToFile);
  443.     } while (!checkExtension(PathToFile) || !checkPermissionForWriting(PathToFile));
  444.     return PathToFile;
  445. }
  446.  
  447. void printResult(int* SortedArray, int NumberOfElements) {
  448.     std::cout << "Choose way of output:\nType '1' if you want to print sorted array in console.\nType '2' if you want to print sorted array in file.\n";
  449.     int UserWay;
  450.     std::string PathToFile;
  451.     UserWay = chooseWayOfOutput();
  452.     switch (UserWay) {
  453.     case 1:
  454.     {
  455.         printSortedArrayInConsole(SortedArray, NumberOfElements);
  456.         break;
  457.     }
  458.     case 2:
  459.     {
  460.         do {
  461.             PathToFile = inputPathToFileForWriting();
  462.         } while (!checkExtension(PathToFile) && !checkPermissionForWriting(PathToFile));
  463.         printSortedArrayInFile(SortedArray,  NumberOfElements, PathToFile);
  464.         break;
  465.     }
  466.     }
  467.     std::cout << "Program is completed.";
  468. }
  469.  
  470. int main(){
  471.     std::string PathToFile = "";
  472.     int UserWay;
  473.     std::cout << "This program implements natural merge sorting.\n";
  474.     int NumberOfElements = receiveNumberOfElements(&UserWay, PathToFile);
  475.     int* SourceArray = new int[NumberOfElements];
  476.     receiveSourceArray(NumberOfElements, SourceArray, &UserWay, PathToFile);
  477.     int* SortedArray = new int[NumberOfElements];
  478.     sorting(SourceArray, SortedArray, NumberOfElements);
  479.     printResult(SortedArray, NumberOfElements);
  480.     delete[] SourceArray;
  481.     delete[] SortedArray;
  482. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement