Advertisement
Vladislav8653

laba_2_4_c++

Nov 17th, 2022 (edited)
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. ifstream fin;
  5. ofstream fout;
  6.  
  7. int choose() {
  8.     int chose;
  9.     bool isIncorrect;
  10.     do{
  11.         cin >> chose;
  12.         isIncorrect = false;
  13.         if (cin.fail() || !(chose == 1 || chose == 0)){
  14.             isIncorrect = true;
  15.             cout << "Please, choose." << endl << "1 is console input/output, 0 is file input/output." << endl;
  16.             cin.clear();
  17.             while (cin.get() != '\n');
  18.         }
  19.     } while (isIncorrect);
  20.     return chose;
  21. }
  22.  
  23. // консольный ввод и вывод
  24.  
  25. int inputData() {
  26.     int n = 0;
  27.     bool isIncorrect;;
  28.     do {
  29.         cin >> n;
  30.         isIncorrect = false;
  31.         if (cin.fail()) {
  32.             cout << "Please, enter a positive integer number:" << endl;
  33.             isIncorrect = true;
  34.             cin.clear();
  35.             while (cin.get() != '\n');
  36.         }
  37.     } while (isIncorrect);
  38.     return n;
  39. }
  40.  
  41. int inputPositiveNumber() {
  42.     int npos;
  43.     const int MIN = 1;
  44.     bool isIncorrect;
  45.     do {
  46.         npos = inputData();
  47.         isIncorrect = false;
  48.         if (npos < MIN) {
  49.             cout << "Please, enter a positive number." << endl;;
  50.             isIncorrect = true;
  51.         }
  52.     } while (isIncorrect);
  53.     return npos;
  54. }
  55.  
  56.  
  57. int inputArraySize() {
  58.     bool isIncorrect;
  59.     int num = 0;
  60.     do {
  61.         num = inputData();
  62.         isIncorrect = false;
  63.         if (num % 2 != 0) {
  64.             cout << "Please, enter an even number:" << endl;
  65.             isIncorrect = true;
  66.             cin.clear();
  67.             while (cin.get() != '\n');
  68.         }
  69.     } while (isIncorrect);
  70.     return num;
  71. }
  72. int** inputArray(int num) {
  73.     int i = 0;
  74.     int j = 0;
  75.     int** arr = new int* [num];
  76.     for (i = 0; i < num; i++)
  77.         arr[i] = new int[num];
  78.     for (i = 0; i < num; i++)
  79.         for (j = 0; j < num; j++)
  80.             arr[i][j] = inputData();
  81.     return arr;
  82. }
  83.  
  84. int* transferMatrixtoVector(int n, int** arr, int starti, int startj) {
  85.     const int MIN = 4;
  86.     int* quarter = new int[(n * n) / MIN];
  87.     int k = 0;
  88.     int i = 0;
  89.     int j = 0;
  90.     int halfn = n / 2;
  91.     for (i = starti; i < starti + halfn; i++) {
  92.         for (j = startj; j < startj + halfn; j++) {
  93.             quarter[k] = arr[i][j];
  94.             k++;
  95.         }
  96.     }
  97.     return quarter;
  98. }
  99.  
  100. void outputArray(int num, int** arr) {
  101.     int i = 0;
  102.     int j = 0;
  103.         for (i = 0; i < num; i++) {
  104.             for (j = 0; j < num; j++)
  105.                 cout << arr[i][j] << ' ';
  106.             cout << '\n';
  107.         }
  108. }
  109.  
  110. //functions for files:
  111.  
  112. string inputFilePath() {
  113.     const int EXTENSION_SIZE = 4;
  114.     string path;
  115.     string ext;
  116.     bool isIncorrect;
  117.     do {
  118.         isIncorrect = false;
  119.         cout << "Input path to file: " << endl;
  120.         cin >> path;
  121.         fin.open(path);
  122.         if (path.size() > EXTENSION_SIZE) {
  123.             ext = path.substr(path.size() - EXTENSION_SIZE, EXTENSION_SIZE);
  124.         }
  125.         else {
  126.             cout << "Incorrect file name." << endl;
  127.             isIncorrect = true;
  128.         } if (!isIncorrect && ext != ".txt") {
  129.             cout << "Must have .txt!" << endl;
  130.             isIncorrect = true;
  131.         }
  132.         else if (!isIncorrect && !fin.is_open()) {
  133.             cout << "Wrong way to file." << endl;
  134.             isIncorrect = true;
  135.         }
  136.     } while (isIncorrect);
  137.     fin.close();
  138.     return path;
  139. }
  140.  
  141.  
  142.  
  143.  
  144. int inputSizeOfMatrixFromFile(string path) {
  145.     int n;
  146.     bool isIncorrect;
  147.     const int MIN = 1;
  148.     const int MAX = 10;
  149.     do
  150.     {
  151.         isIncorrect = false;
  152.         fin.open(path);
  153.         fin >> n;
  154.         if (n < MIN || n > MAX) {
  155.             isIncorrect = true;
  156.             cout << "Incorrect matrix size. Your matrix size must be from " << MIN << " to " << MAX << "." << endl;
  157.             path = inputFilePath();
  158.         }
  159.     } while (isIncorrect);
  160.     return n;
  161. }
  162.  
  163. int** inputMatrixFile(string path, int num)
  164. {
  165.     ifstream fileIn(path);
  166.     bool isIncorrect = false;
  167.     int** arr;
  168.     arr = new int* [num];
  169.     for (int i = 0; i < num; i++)
  170.         arr[i] = new int[num];
  171.     for (int i = 0; (i < num) && (!isIncorrect); i++) {
  172.         for (int j = 0; (j < num) && (!isIncorrect); j++) {
  173.             do
  174.             {
  175.                 isIncorrect = false;
  176.                 try {
  177.                     fin >> arr[i][j];
  178.                 }
  179.                 catch (fstream::failure& e) {
  180.                     cout << "Mistake of reading from file. Code of mistake " << e.code() << "\n";
  181.                     isIncorrect = true;
  182.                 }
  183.             } while (isIncorrect);
  184.         }
  185.     }
  186.     return arr;
  187. }
  188.  
  189. void fileOutput(int n, int** arr) {
  190.     cout << "Input second file path for writing data there:" << endl;
  191.     string path = inputFilePath();
  192.     fout.open(path);
  193.     int prod;
  194.     for (int i = 0; i < n; i++)
  195.     {
  196.         prod = 1;
  197.         for (int j = 0; j < n; j++)
  198.         {
  199.             prod *= arr[i][j];
  200.         }
  201.         if (prod != 0)
  202.         {
  203.             for (int j = 0; j < n; j++)
  204.             {
  205.                 fout << arr[i][j] << ' ';
  206.             }
  207.             fout << '\n';
  208.         }
  209.     }
  210.     cout << "Successful output in file." << endl;
  211.     fout.close();
  212. }
  213.  
  214. int main() {
  215.     int n = 0;
  216.     int** arr;
  217.     cout << "Enter 1 or 0. " << endl << "1 is console input, 0 is file input." << endl;
  218.     int chose = choose();
  219.     if (chose == 1) {
  220.         cout << "Input number of digits : " << endl;
  221.         n = inputArraySize();
  222.         cout << "Enter the numbers one by one: " << endl;
  223.         arr = inputArray(n);
  224.     }
  225.     else {
  226.         string str = inputFilePath();
  227.         n = inputSizeOfMatrixFromFile(str);
  228.         arr = inputMatrixFile(str, n);
  229.     }
  230.  
  231.  
  232.     int starti = 0;
  233.     int startj = starti;
  234.     int* bufferFor1 = transferMatrixtoVector(n, arr, starti, startj);
  235.  
  236.     starti = 0;
  237.     startj = n / 2;;
  238.     int* bufferFor2 = transferMatrixtoVector(n, arr, starti, startj);
  239.  
  240.     starti = n / 2;
  241.     startj = 0;
  242.     int* bufferFor3 = transferMatrixtoVector(n, arr, starti, startj);
  243.  
  244.     starti = n / 2;
  245.     startj = starti;
  246.     int* bufferFor4 = transferMatrixtoVector(n, arr, starti, startj);
  247.  
  248.     int i = 0;
  249.     int j = 0;
  250.     int k = 0;
  251.     int l = 0;
  252.     for (i = 0; i < n; i++) {
  253.         for (j = 0; j < n; j++) {
  254.             if ((i < n / 2) && (j < n / 2)) {
  255.                 arr[i][j] = bufferFor4[k];
  256.             }
  257.             k = 0;
  258.             if ((i < n / 2) && (j > n / 2 - 1)) {
  259.                 arr[i][j] = bufferFor3[k];
  260.             }
  261.             k = 0;
  262.             if ((i > n / 2 - 1) && (j < n / 2)) {
  263.                 arr[i][j] = bufferFor1[k];
  264.             }
  265.             k = 0;
  266.             if ((i > n / 2 - 1) && (j > n / 2 - 1)) {
  267.                 arr[i][j] = bufferFor2[k];
  268.                 k++;
  269.             }
  270.         }
  271.     }
  272.     cout << "Enter 1 or 0. " << endl << "1 is console output, 0 is file output." << endl;
  273.     chose = choose();
  274.     if (chose == 1) {
  275.         outputArray(n, arr);
  276.     }
  277.     else {
  278.         fileOutput(n, arr);
  279.     }
  280.     for (i = 0; i < n; i++)
  281.         delete[] arr[i];
  282.     return 0;
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement