Advertisement
LisunovaMaryna

lab2.3 c++

Nov 5th, 2023 (edited)
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. void PrintCondition()
  6. {
  7.     std::cout << "Goal: Input Matrix And add Rows into position 0 And n+1 with elements equal To 1 (use shift Rows).\n";
  8. }
  9.  
  10. void PrintMatrix(std::ostream& outStream, int** matrix, int rows, int columns, std::string header)
  11. {
  12.     outStream << header;
  13.  
  14.     for (int row = 0; row < rows; row++)
  15.     {
  16.         for (int column = 0; column < columns; column++)
  17.         {
  18.             outStream << matrix[row][column];
  19.             outStream << ' ';
  20.         }
  21.         outStream << '\n';
  22.     }
  23. }
  24.  
  25. int InputNumUnlimited()
  26. {
  27.     int number;
  28.     bool isCorrect = false;
  29.     do
  30.     {
  31.         std::cin >> number;
  32.  
  33.         if (std::cin.fail())
  34.         {
  35.             std::cin.clear();
  36.             std::cerr << "\nUnexpected symbol entered\n";
  37.  
  38.             while (std::cin.get() != '\n');
  39.         }
  40.         else if (std::cin.get() != '\n')
  41.         {
  42.             std::cout << "\nIncorrect value\n";
  43.  
  44.             while (std::cin.get() != '\n');
  45.         }
  46.         else
  47.         {
  48.             isCorrect = true;
  49.         }
  50.  
  51.     } while (!isCorrect);
  52.  
  53.     return number;
  54. }
  55.  
  56. int InputNumber(int min, int max)
  57. {
  58.     int number;
  59.     bool isCorrect = false;
  60.     do
  61.     {
  62.         number = InputNumUnlimited();
  63.  
  64.         if (number < min)
  65.         {
  66.             std::cerr << "\nMinimal allowed value is " << min << "\n";
  67.         }
  68.         else if (number > max)
  69.         {
  70.             std::cerr << "\nMaximum allowed value is " << max << "\n";
  71.         }
  72.         else
  73.         {
  74.             isCorrect = true;
  75.         }
  76.  
  77.     } while (!isCorrect);
  78.  
  79.     return number;
  80. }
  81.  
  82. int** CreateMatrix(int rows, int columns, int defaultValue = 0)
  83. {
  84.     int** matrix;
  85.     matrix = new int* [rows];
  86.     for (int row = 0; row < rows; row++)
  87.     {
  88.         matrix[row] = new int[columns];
  89.         for (int column = 0; column < columns; column++)
  90.         {
  91.             matrix[row][column] = defaultValue;
  92.         }
  93.     }
  94.     return matrix;
  95. }
  96.  
  97. void CopyRow(int* sourceRow, int* destRow, int columns)
  98. {
  99.     for (int column = 0; column < columns; column++)
  100.     {
  101.         destRow[column] = sourceRow[column];
  102.     }
  103. }
  104.  
  105. void CopyMatrix(int** sourceMatrix, int** destMatrix, int rows, int columns)
  106. {
  107.     for (int row = 0; row < rows; row++)
  108.     {
  109.         CopyRow(sourceMatrix[row], destMatrix[row], columns);
  110.     }
  111. }
  112.  
  113. void DeleteMatrix(int** matrix, int rows)
  114. {
  115.     for (int row = 0; row < rows; row++)
  116.     {
  117.         delete[] matrix[row];
  118.     }
  119.     delete[] matrix;
  120. }
  121.  
  122. void ResizeMatrix(int**& matrix, int rows, int columns, int etraRows, int defaultValue)
  123. {
  124.     int** outMatrix;
  125.     int matrixRange;
  126.     int outMatrixRows;
  127.  
  128.     outMatrixRows = rows + 2;
  129.     outMatrix = CreateMatrix(outMatrixRows, columns, defaultValue);
  130.     CopyMatrix(matrix, outMatrix, rows, columns);
  131.     DeleteMatrix(matrix, rows);
  132.     matrix = outMatrix;
  133. }
  134.  
  135. char ReadCondition()
  136. {
  137.     char condition;
  138.     std::cout << "\nWould you like to enter matrix manually [m] or get from file [f]?\n";
  139.     bool selected = false;
  140.     do
  141.     {
  142.         std::cin >> condition;
  143.         if (condition != 'm' && condition != 'f')
  144.         {
  145.             while (std::cin.get() != '\n');
  146.             std::cout << "\nPlease type [m] or [f]\n";
  147.         }
  148.         else
  149.         {
  150.             if (std::cin.get() != '\n')
  151.             {
  152.                 while (std::cin.get() != '\n');
  153.                 std::cout << "\nPlease type [m] or [f]\n";
  154.             }
  155.             else
  156.             {
  157.                 selected = true;
  158.             }
  159.         }
  160.  
  161.     } while (!selected);
  162.  
  163.     return condition;
  164. }
  165.  
  166. int InputMatrixRange()
  167. {
  168.     int matrixRange;
  169.     std::cout << "\nInput matrix range (1...5): ";
  170.     matrixRange = InputNumber(1, 5);
  171.     return matrixRange;
  172. }
  173.  
  174. int** InputSourceMatrixManually(int& matrixRange)
  175. {
  176.     int** matrix;
  177.     constexpr int imin = std::numeric_limits<int>::min();
  178.     constexpr int imax = std::numeric_limits<int>::max();
  179.     matrixRange = InputMatrixRange();
  180.     matrix = CreateMatrix(matrixRange, matrixRange);
  181.  
  182.     std::cout << "\nInput matrix values:\n";
  183.     for (int row = 0; row < matrixRange; row++)
  184.     {
  185.         for (int column = 0; column < matrixRange; column++)
  186.         {
  187.             std::cout << "\nInput value for row: " << row << " column: " << column << "\n";
  188.             matrix[row][column] = InputNumUnlimited();
  189.         }
  190.     }
  191.  
  192.     return matrix;
  193. }
  194.  
  195. bool IsFileExist(std::string fileName)
  196. {
  197.     std::ifstream in(fileName);
  198.     return in.good();
  199. }
  200.  
  201. bool HasTxtExtension(std::string fileName)
  202. {
  203.     int length = fileName.length();
  204.  
  205.     if (length < 5)
  206.     {
  207.         return false;
  208.     }
  209.     if (fileName[length - 4] != '.')
  210.     {
  211.         return false;
  212.     }
  213.     if (fileName[length - 3] != 't')
  214.     {
  215.         return false;
  216.     }
  217.     if (fileName[length - 2] != 'x')
  218.     {
  219.         return false;
  220.     }
  221.     if (fileName[length - 1] != 't')
  222.     {
  223.         return false;
  224.     }
  225.  
  226. }
  227.  
  228. std::string InputFilePath(bool checkExistence)
  229. {
  230.     std::string fileName;
  231.     bool isCorrect = false;
  232.     do
  233.     {
  234.         std::cout << "\nInput file path (*.txt):\n";
  235.         std::getline(std::cin, fileName);
  236.         if (fileName.length() < 5)
  237.         {
  238.             std::cerr << '\n' << "invalid file name\n";
  239.         }
  240.         else if (!HasTxtExtension(fileName))
  241.         {
  242.             std::cerr << '\n' << "invalid file extension \n";
  243.         }
  244.         else if (checkExistence && !IsFileExist(fileName))
  245.         {
  246.             std::cerr << '\n' << fileName << " is not found \n";
  247.         }
  248.         else
  249.         {
  250.             isCorrect = true;
  251.         }
  252.     } while (!isCorrect);
  253.  
  254.     return fileName;
  255. }
  256.  
  257. int GetMatrixRange(std::ifstream& inStream)
  258. {
  259.     int matrixWidth = 0;
  260.     try
  261.     {
  262.         inStream >> matrixWidth;
  263.         if (inStream.fail())
  264.         {
  265.             return 0;
  266.         }
  267.         else
  268.         {
  269.             return matrixWidth;
  270.         }
  271.     }
  272.     catch (...)
  273.     {
  274.         return 0;
  275.     }
  276. }
  277.  
  278. bool ReadRow(std::ifstream& inStream, int* row, int matrixWidth)
  279. {
  280.     try
  281.     {
  282.         int divider;
  283.  
  284.         for (int index = 0; index < matrixWidth; index++)
  285.         {
  286.             inStream >> row[index];
  287.             if (inStream.fail())
  288.             {
  289.                 return false;
  290.             }
  291.         }
  292.  
  293.         if (inStream.eof())
  294.         {
  295.             return true;
  296.         }
  297.  
  298.         divider = inStream.get();
  299.         if (divider != '\n')
  300.         {
  301.             return false;
  302.         }
  303.  
  304.         return true;
  305.  
  306.     }
  307.     catch (const std::exception&)
  308.     {
  309.  
  310.         return false;
  311.     }
  312.    
  313. }
  314.  
  315. int** ReadMatrix(std::ifstream& in, int matrixRange)
  316. {
  317.     int** matrix = nullptr;
  318.  
  319.     matrix = CreateMatrix(matrixRange, matrixRange);
  320.     bool isValid = true;
  321.     for (int rowIndex = 0; rowIndex < matrixRange && isValid == true; rowIndex++)
  322.     {
  323.         bool isValid = ReadRow(in, matrix[rowIndex], matrixRange);
  324.         if (!isValid)
  325.         {
  326.             std::cerr << "Fail to read row:" << rowIndex + 1 << "\n";
  327.  
  328.             DeleteMatrix(matrix, matrixRange);
  329.             matrix = nullptr;
  330.             return matrix;
  331.         }
  332.     }
  333.  
  334.     return matrix;
  335. }
  336.  
  337. int** GetSourceMatrixFromFile(int& matrixRange)
  338. {
  339.     int** matrix;
  340.     std::string filename;
  341.     filename = InputFilePath(true);
  342.     try
  343.     {
  344.         std::ifstream in(filename);
  345.         if (in.is_open())
  346.         {
  347.  
  348.             matrixRange = GetMatrixRange(in);
  349.             if (matrixRange == 0)
  350.             {
  351.                 std::cerr << "\nMatrix size error";
  352.                 in.close();
  353.                 return nullptr;
  354.             }
  355.  
  356.             std::cout << "\nMatrix dimension: " << matrixRange << "x" << matrixRange << "\n";
  357.  
  358.             matrix = ReadMatrix(in, matrixRange);
  359.             return matrix;
  360.             in.close();
  361.         }
  362.     }
  363.     catch (...)
  364.     {
  365.         std::cerr << "Matrix read error";
  366.         return nullptr;
  367.     }
  368. }
  369.  
  370. int** GetSourceMatrix(int& matrixRange)
  371. {
  372.     char condition = ReadCondition();
  373.  
  374.     if (condition == 'm')
  375.     {
  376.         return InputSourceMatrixManually(matrixRange);
  377.     }
  378.     else
  379.     {
  380.         return GetSourceMatrixFromFile(matrixRange);
  381.     }
  382. }
  383.  
  384. void ShiftMatrix(int** matrix, int rows, int columns)
  385. {
  386.     int* tempRow = new int[columns];
  387.     CopyRow(matrix[rows - 1], tempRow, columns);
  388.  
  389.     for (int row = rows - 1; row > 0; row--)
  390.     {
  391.         CopyRow(matrix[row - 1], matrix[row], columns);
  392.     }
  393.  
  394.     CopyRow(tempRow, matrix[0], columns);
  395.     delete[] tempRow;
  396. }
  397.  
  398. bool SaveMatrix(std::string filename, int** matrix, int rows, int columns)
  399. {
  400.     std::ofstream outf(filename);
  401.  
  402.     if (!outf)
  403.     {
  404.         std::cerr << filename << " could not be opened for writing!\n";
  405.         return false;
  406.     }
  407.     PrintMatrix(outf, matrix, rows, columns, "");
  408.  
  409.     outf.close();
  410.     return true;
  411. }
  412.  
  413. void InputFilePathAndSaveMatrix(int** matrix, int rows, int columns)
  414. {
  415.     std::string path;
  416.     bool isCorrect = false;
  417.     do
  418.     {
  419.         path = InputFilePath(false);
  420.         isCorrect = SaveMatrix(path, matrix, rows, columns);
  421.  
  422.     } while (!isCorrect);
  423.  
  424.     std::cout << "\nCompleted!\n";
  425. }
  426.  
  427. int main()
  428. {
  429.     int** inMatrix;
  430.     int matrixRange;
  431.     int extraRows;
  432.     int defaultValue;
  433.     defaultValue = 1;
  434.     extraRows = 2;
  435.  
  436.     std::string outFilename;
  437.  
  438.     PrintCondition();
  439.  
  440.     inMatrix = GetSourceMatrix(matrixRange);
  441.     if (inMatrix == nullptr)
  442.     {
  443.         return 0;
  444.     }
  445.  
  446.     PrintMatrix(std::cout, inMatrix, matrixRange, matrixRange, "\nSource Matrix:\n");
  447.  
  448.     ResizeMatrix(inMatrix, matrixRange, matrixRange, extraRows, defaultValue);
  449.  
  450.     ShiftMatrix(inMatrix, matrixRange + extraRows, matrixRange);
  451.  
  452.     PrintMatrix(std::cout, inMatrix, matrixRange + extraRows, matrixRange, "\nShifted Matrix:\n");
  453.  
  454.     InputFilePathAndSaveMatrix(inMatrix, matrixRange + extraRows, matrixRange);
  455.  
  456.     DeleteMatrix(inMatrix, matrixRange + extraRows);
  457. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement