Advertisement
gguuppyy

лаба2н3

Nov 2nd, 2023 (edited)
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.96 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <string.h>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. const int
  8.  
  9. MIN_MAT = 1,
  10. MAX_MAT = 10,
  11. YES = 1,
  12. NO = 2;
  13.  
  14. void printTask()
  15. {
  16.     std::cout << " Данная программа находит количество хорошистов в группе (оценки не ниже шестерки, но  не все выше восьмерки).\n\n";
  17. }
  18. bool chooseFileInput()
  19. {
  20.     int isFileInput;
  21.     bool isCorrect, choose;
  22.     do {
  23.         std::cout << "Вы хотите вводить матрицу через файл? (Да - " << YES << " / Нет - " << NO << ")\n";
  24.         isCorrect = true;
  25.         std::cin >> isFileInput;
  26.         if (std::cin.fail())
  27.         {
  28.             isCorrect = false;
  29.             std::cout << "Некорректный выбор!\n";
  30.             std::cin.clear();
  31.             while (std::cin.get() != '\n');
  32.         }
  33.         if (isCorrect && std::cin.get() != '\n')
  34.         {
  35.             isCorrect = false;
  36.             std::cout << "Некорректный выбор!\n";
  37.             while (std::cin.get() != '\n');
  38.         }
  39.         if (isCorrect)
  40.         {
  41.             if (isFileInput == 1)
  42.                 choose = true;
  43.             else if (isFileInput == 2)
  44.                 choose = false;
  45.             else
  46.             {
  47.                 isCorrect = false;
  48.                 std::cout << "Некорректный выбор!\n";
  49.             }
  50.         }
  51.     } while (!isCorrect);
  52.     return choose;
  53. }
  54.  
  55. bool chooseFileOutput()
  56. {
  57.     int isFileInput;
  58.     bool isCorrect, choose;
  59.     do
  60.     {
  61.         std::cout << "Вы хотите выводить матрицу через файл? (Да - " << YES << " / Нет - " << NO << ")\n";
  62.         isCorrect = true;
  63.         std::cin >> isFileInput;
  64.         if (std::cin.fail())
  65.         {
  66.             isCorrect = false;
  67.             std::cout << "Некорректный выбор!\n";
  68.             std::cin.clear();
  69.             while (std::cin.get() != '\n');
  70.         }
  71.         if (isCorrect && std::cin.get() != '\n')
  72.         {
  73.             isCorrect = false;
  74.             std::cout << "Некорректный выбор!\n";
  75.             while (std::cin.get() != '\n');
  76.         }
  77.         if (isCorrect)
  78.         {
  79.             if (isFileInput == 1)
  80.                 choose = true;
  81.             else if (isFileInput == 2)
  82.                 choose = false;
  83.             else
  84.             {
  85.                 isCorrect = false;
  86.                 std::cout << "Некорректный выбор!\n";
  87.             }
  88.         }
  89.     } while (!isCorrect);
  90.     return choose;
  91. }
  92.  
  93. string fileInputPath(bool isFileForRead)
  94. {
  95.     bool isNotCorrect;
  96.     string path;
  97.     fstream file;
  98.     if (isFileForRead)
  99.     {
  100.         cout << "Введите путь к файлу для чтения: ";
  101.     }
  102.     else
  103.     {
  104.         cout << "Введите путь к файлу для записи: ";
  105.     }
  106.     do
  107.     {
  108.         isNotCorrect = false;
  109.         cin >> path;
  110.         file.open(path);
  111.         if (!file.is_open())
  112.         {
  113.             cout << "Файл не найден. Повторите попытку.\n";
  114.             isNotCorrect = true;
  115.         }
  116.     } while (isNotCorrect);
  117.     file.close();
  118.     return path;
  119. }
  120.  
  121. int** readFileMatrix(string pathToFile)
  122. {
  123.     ifstream file(pathToFile);
  124.     int rows, cols;
  125.     bool isNotCorrect = false;
  126.  
  127.     if (!isNotCorrect)
  128.     {
  129.         file >> rows >> cols;
  130.         file.ignore(numeric_limits<streamsize>::max(), '\n');
  131.  
  132.     }
  133.  
  134.     if (!isNotCorrect)
  135.     {
  136.         int** matrix = new int* [rows];
  137.         for (int i = 0; i < rows; i++)
  138.         {
  139.             matrix[i] = new int[cols];
  140.         }
  141.  
  142.         for (int row = 0; row < rows; row++)
  143.         {
  144.             for (int col = 0; col < cols; col++)
  145.                 file >> matrix[row][col];
  146.             file.ignore(numeric_limits<streamsize>::max(), '\n');
  147.         }
  148.  
  149.         file.close();
  150.         return matrix;
  151.     }
  152. }
  153.  
  154. void printMatrix(int** matrix,int*Student,int sum)
  155. {
  156.     int rows = _msize(matrix) / sizeof(matrix[0]);
  157.     int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
  158.  
  159.     for (int row = 0; row < rows; row++)
  160.     {
  161.         for (int col = 0; col < cols; col++)
  162.         {
  163.             cout << matrix[row][col] << " ";
  164.         }
  165.         cout << endl;
  166.     }
  167.     cout << "Номера хорошистов: ";
  168.     for (int i = 0; i < sum; i++)
  169.     {
  170.         cout << Student[i]<<" ";
  171.     }
  172.     cout << endl;
  173.     cout << "Сумма хорошистов:" << sum << endl;
  174. }
  175.  
  176. bool isRightNums(std::string pathToFile)
  177. {
  178.     int k;
  179.     bool isCorrect;
  180.     std::ifstream file(pathToFile);
  181.     file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  182.     isCorrect = true;
  183.     while (isCorrect && !file.eof())
  184.     {
  185.         while (isCorrect && file.peek() != '\n' && !file.eof())
  186.         {
  187.             file >> k;
  188.             if (file.fail())
  189.             {
  190.                 isCorrect = false;
  191.                 std::cout << "Некорректный тип данных внутри файла!\n";
  192.                 file.clear();
  193.             }
  194.         }
  195.         file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  196.     }
  197.     file.close();
  198.     return isCorrect;
  199. }
  200.  
  201. int** consoleFillMatrix()
  202. {
  203.     const int MIN_ELEMENT = 1;
  204.     const int MAX_ELEMENT = 10;
  205.     int rows, cols;
  206.     bool isNotCorrect;
  207.  
  208.     do
  209.     {
  210.         cout << "Введите строки матрицы: ";
  211.         isNotCorrect = false;
  212.         cin >> rows;
  213.  
  214.         if (cin.fail() || rows==0)
  215.         {
  216.             cin.clear();
  217.             while (cin.get() != '\n');
  218.             cout << "Ошибка ввода! Повторите попытку." << endl;
  219.             isNotCorrect = true;
  220.         }
  221.         if ((!isNotCorrect) && (cin.get() != '\n'))
  222.         {
  223.             cin.clear();
  224.             cout << "Ошибка ввода! Повторите попытку." << endl;
  225.             isNotCorrect = true;
  226.         }
  227.     } while (isNotCorrect);
  228.  
  229.     do
  230.     {
  231.         cout << "Введите столбцы матрицы: ";
  232.         isNotCorrect = false;
  233.         cin >> cols;
  234.  
  235.         if (cin.fail() or cols==0)
  236.         {
  237.             cin.clear();
  238.             while (cin.get() != '\n');
  239.             cout << "Ошибка ввода! Повторите попытку." << endl;
  240.             isNotCorrect = true;
  241.         }
  242.         if ((!isNotCorrect) && (cin.get() != '\n'))
  243.         {
  244.             cin.clear();
  245.             cout << "Ошибка ввода! Повторите попытку." << endl;
  246.             isNotCorrect = true;
  247.         }
  248.     } while (isNotCorrect);
  249.  
  250.     int** matrix = new int* [rows];
  251.     for (int i = 0; i < rows; i++)
  252.     {
  253.         matrix[i] = new int[cols];
  254.     }
  255.  
  256.     for (int i = 0; i < rows; i++)
  257.     {
  258.         for (int j = 0; j < cols; j++)
  259.         {
  260.             do
  261.             {
  262.                 isNotCorrect = false;
  263.                 cout << "Введите " << j + 1 << " элемент " << i + 1 << " строки: ";
  264.                 cin >> matrix[i][j];
  265.                 if (cin.fail())
  266.                 {
  267.                     cin.clear();
  268.                     while (cin.get() != '\n');
  269.                     cout << "Ошибка ввода! Повторите попытку." << endl;
  270.                     isNotCorrect = true;
  271.                 }
  272.                 if ((!isNotCorrect) && (cin.get() != '\n'))
  273.                 {
  274.                     cin.clear();
  275.                     cout << "Ошибка ввода! Повторите попытку." << endl;
  276.                     isNotCorrect = true;
  277.                 }
  278.                 if ((!isNotCorrect) && ((matrix[i][j] < MIN_ELEMENT) || (matrix[i][j] > MAX_ELEMENT)))
  279.                 {
  280.                     cout << "Ошибка ввода! Введено число неверного диапазона." << endl;
  281.                     isNotCorrect = true;
  282.                 }
  283.             } while (isNotCorrect);
  284.         }
  285.     }
  286.  
  287.     return matrix;
  288. }
  289. int* SearchGoodStudent(int** matrix)
  290. {
  291.     int rows = _msize(matrix) / sizeof(matrix[0]);
  292.     int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
  293.  
  294.     int* GoodStudents = nullptr;
  295.     int Search = 0;
  296.  
  297.     for (int I = 0; I < rows; I++)
  298.     {
  299.         int EightGradeCounter = 0;
  300.         int SixGradeCounter = 0;
  301.         int CheckGradeCounter = 0;
  302.  
  303.         for (int J = 0; J < cols; J++)
  304.         {
  305.             if (matrix[I][J] > 5)
  306.             {
  307.                 SixGradeCounter++;
  308.  
  309.             }
  310.  
  311.             if (matrix[I][J] < 9)
  312.             {
  313.                 EightGradeCounter++;
  314.  
  315.             }
  316.  
  317.  
  318.             if (matrix[I][J] < 6)
  319.             {
  320.                 CheckGradeCounter++;
  321.             }
  322.         }
  323.  
  324.         if (SixGradeCounter > 0 && EightGradeCounter > 0 && CheckGradeCounter==0)
  325.         {
  326.             Search++;
  327.             int* temp = new int[Search];
  328.  
  329.             for (int k = 0; k < Search - 1; k++)
  330.             {
  331.                 temp[k] = GoodStudents[k];
  332.             }
  333.  
  334.             temp[Search - 1] = I+1;
  335.  
  336.             delete[] GoodStudents;
  337.             GoodStudents = temp;
  338.         }
  339.     }
  340.  
  341.     return GoodStudents;
  342. }
  343.  
  344. int SearchGoodSumStudent(int** matrix)
  345. {
  346.     int rows = _msize(matrix) / sizeof(matrix[0]);
  347.     int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
  348.     int Search = 0;
  349.  
  350.     for (int I = 0; I < rows; I++)
  351.     {
  352.         int EightGradeCounter = 0;
  353.         int SixGradeCounter = 0;
  354.         int CheckGradeCounter = 0;
  355.  
  356.         for (int J = 0; J < cols; J++)
  357.         {
  358.             if (matrix[I][J] > 5)
  359.             {
  360.                 SixGradeCounter++;
  361.  
  362.             }
  363.  
  364.             if (matrix[I][J] < 9)
  365.             {
  366.                 EightGradeCounter++;
  367.             }
  368.  
  369.             if (matrix[I][J] < 6)
  370.             {
  371.                 CheckGradeCounter++;
  372.  
  373.             }
  374.         }
  375.  
  376.         if (SixGradeCounter > 0 && EightGradeCounter > 0&& CheckGradeCounter==0)
  377.         {
  378.             Search++;
  379.         }
  380.     }
  381.  
  382.     return Search;
  383. }
  384.  
  385.  
  386. void SaveMatrixToFile(int** matrix,string filePath,int* Student,int sum)
  387. {
  388.     int rows = _msize(matrix) / sizeof(matrix[0]);
  389.     int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
  390.  
  391.     std::ifstream file(filePath);
  392.     if (file)
  393.     {
  394.         std::cout << "Файл уже существует. Перезаписать? (y/n): ";
  395.         char choice;
  396.         std::cin >> choice;
  397.  
  398.         if (choice != 'y' && choice != 'Y')
  399.         {
  400.             std::cout << "Запись в файл отменена." << std::endl;
  401.             return;
  402.         }
  403.     }
  404.     file.close();
  405.  
  406.     std::ofstream outputFile(filePath);
  407.     if (!outputFile)
  408.     {
  409.         std::cout << "Не удалось открыть файл для записи." << std::endl;
  410.         return;
  411.     }
  412.  
  413.     outputFile << rows << " " << cols << std::endl;
  414.     for (int i = 0; i < rows; i++)
  415.     {
  416.         for (int j = 0; j < cols; j++)
  417.         {
  418.             outputFile << matrix[i][j] << " ";
  419.         }
  420.         outputFile << std::endl;
  421.     }
  422.  
  423.     outputFile << "Номера хорошистов:";
  424.     for ( int i = 0; i < sum;  i++)
  425.     {
  426.         outputFile << Student[i]<<" ";
  427.     }
  428.     outputFile << endl;
  429.     outputFile << "Сумма хорошистов:" << sum;
  430.     outputFile.close();
  431.     std::cout << "Матрица успешно записана в файл." << std::endl;
  432. }
  433.  
  434. void choiseInput()
  435. {
  436.     string FilePathInput;
  437.     string FilePathOutput;
  438.     bool  input;
  439.     bool output;
  440.     bool isInCorrect;
  441.     int sum;
  442.     int** Matrix;
  443.     int* Student;
  444.  
  445.     input = chooseFileInput();
  446.  
  447.     if (input == true) {
  448.         do {
  449.  
  450.             FilePathInput = fileInputPath(input);
  451.             isInCorrect = isRightNums(FilePathInput);
  452.  
  453.             if (isInCorrect)
  454.             {
  455.                 Matrix = readFileMatrix(FilePathInput);
  456.                 Student = SearchGoodStudent(Matrix);
  457.                 sum = SearchGoodSumStudent(Matrix);
  458.  
  459.                 output = chooseFileOutput();
  460.  
  461.                 if (output == true)
  462.                 {
  463.                     FilePathOutput = fileInputPath(false);
  464.                     SaveMatrixToFile(Matrix, FilePathInput, Student, sum);
  465.                 }
  466.  
  467.                 if (output == false)
  468.                 {
  469.                     printMatrix(Matrix, Student, sum);
  470.                 }
  471.  
  472.             }
  473.  
  474.             else
  475.             {
  476.                 std::cout << "Введен некорректный путь к файлу. Пожалуйста, введите заново." << std::endl;
  477.                 FilePathInput = fileInputPath(input);
  478.                 isInCorrect = isRightNums(FilePathInput);
  479.  
  480.                 if (isInCorrect)
  481.                 {
  482.                     Matrix = readFileMatrix(FilePathInput);
  483.                     Student = SearchGoodStudent(Matrix);
  484.                     sum = SearchGoodSumStudent(Matrix);
  485.                     output = chooseFileOutput();
  486.  
  487.                     if (output == true)
  488.                     {
  489.                         FilePathOutput = fileInputPath(false);
  490.                         SaveMatrixToFile(Matrix, FilePathInput, Student, sum);
  491.                     }
  492.  
  493.                     if (output == false)
  494.                     {
  495.                         printMatrix(Matrix, Student, sum);
  496.                     }
  497.  
  498.                 }
  499.             }
  500.  
  501.         } while (!isInCorrect);
  502.  
  503.     }
  504.    
  505.     if (input == false)
  506.     {
  507.         Matrix = consoleFillMatrix();
  508.         Student = SearchGoodStudent(Matrix);
  509.         sum = SearchGoodSumStudent(Matrix);
  510.         output = chooseFileOutput();
  511.  
  512.         if (output == true)
  513.         {
  514.             FilePathOutput = fileInputPath(false);
  515.             SaveMatrixToFile(Matrix, FilePathInput, Student, sum);
  516.         }
  517.  
  518.         if (output == false)
  519.         {
  520.             printMatrix(Matrix, Student, sum);
  521.         }
  522.     }
  523.  
  524. }
  525. int main()
  526. {
  527.     setlocale(LC_ALL, "rus");
  528.     printTask();    
  529.     choiseInput();
  530.  }
  531.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement