Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string.h>
- #include <fstream>
- using namespace std;
- const int
- MIN_MAT = 1,
- MAX_MAT = 10,
- YES = 1,
- NO = 2;
- void printTask()
- {
- std::cout << " Данная программа находит количество хорошистов в группе (оценки не ниже шестерки, но не все выше восьмерки).\n\n";
- }
- bool chooseFileInput()
- {
- int isFileInput;
- bool isCorrect, choose;
- do {
- std::cout << "Вы хотите вводить матрицу через файл? (Да - " << YES << " / Нет - " << NO << ")\n";
- isCorrect = true;
- std::cin >> isFileInput;
- if (std::cin.fail())
- {
- isCorrect = false;
- std::cout << "Некорректный выбор!\n";
- std::cin.clear();
- while (std::cin.get() != '\n');
- }
- if (isCorrect && std::cin.get() != '\n')
- {
- isCorrect = false;
- std::cout << "Некорректный выбор!\n";
- while (std::cin.get() != '\n');
- }
- if (isCorrect)
- {
- if (isFileInput == 1)
- choose = true;
- else if (isFileInput == 2)
- choose = false;
- else
- {
- isCorrect = false;
- std::cout << "Некорректный выбор!\n";
- }
- }
- } while (!isCorrect);
- return choose;
- }
- bool chooseFileOutput()
- {
- int isFileInput;
- bool isCorrect, choose;
- do
- {
- std::cout << "Вы хотите выводить матрицу через файл? (Да - " << YES << " / Нет - " << NO << ")\n";
- isCorrect = true;
- std::cin >> isFileInput;
- if (std::cin.fail())
- {
- isCorrect = false;
- std::cout << "Некорректный выбор!\n";
- std::cin.clear();
- while (std::cin.get() != '\n');
- }
- if (isCorrect && std::cin.get() != '\n')
- {
- isCorrect = false;
- std::cout << "Некорректный выбор!\n";
- while (std::cin.get() != '\n');
- }
- if (isCorrect)
- {
- if (isFileInput == 1)
- choose = true;
- else if (isFileInput == 2)
- choose = false;
- else
- {
- isCorrect = false;
- std::cout << "Некорректный выбор!\n";
- }
- }
- } while (!isCorrect);
- return choose;
- }
- string fileInputPath(bool isFileForRead)
- {
- bool isNotCorrect;
- string path;
- fstream file;
- if (isFileForRead)
- {
- cout << "Введите путь к файлу для чтения: ";
- }
- else
- {
- cout << "Введите путь к файлу для записи: ";
- }
- do
- {
- isNotCorrect = false;
- cin >> path;
- file.open(path);
- if (!file.is_open())
- {
- cout << "Файл не найден. Повторите попытку.\n";
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- file.close();
- return path;
- }
- int** readFileMatrix(string pathToFile)
- {
- ifstream file(pathToFile);
- int rows, cols;
- bool isNotCorrect = false;
- if (!isNotCorrect)
- {
- file >> rows >> cols;
- file.ignore(numeric_limits<streamsize>::max(), '\n');
- }
- if (!isNotCorrect)
- {
- int** matrix = new int* [rows];
- for (int i = 0; i < rows; i++)
- {
- matrix[i] = new int[cols];
- }
- for (int row = 0; row < rows; row++)
- {
- for (int col = 0; col < cols; col++)
- file >> matrix[row][col];
- file.ignore(numeric_limits<streamsize>::max(), '\n');
- }
- file.close();
- return matrix;
- }
- }
- void printMatrix(int** matrix,int*Student,int sum)
- {
- int rows = _msize(matrix) / sizeof(matrix[0]);
- int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
- for (int row = 0; row < rows; row++)
- {
- for (int col = 0; col < cols; col++)
- {
- cout << matrix[row][col] << " ";
- }
- cout << endl;
- }
- cout << "Номера хорошистов: ";
- for (int i = 0; i < sum; i++)
- {
- cout << Student[i]<<" ";
- }
- cout << endl;
- cout << "Сумма хорошистов:" << sum << endl;
- }
- bool isRightNums(std::string pathToFile)
- {
- int k;
- bool isCorrect;
- std::ifstream file(pathToFile);
- file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
- isCorrect = true;
- while (isCorrect && !file.eof())
- {
- while (isCorrect && file.peek() != '\n' && !file.eof())
- {
- file >> k;
- if (file.fail())
- {
- isCorrect = false;
- std::cout << "Некорректный тип данных внутри файла!\n";
- file.clear();
- }
- }
- file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
- }
- file.close();
- return isCorrect;
- }
- int** consoleFillMatrix()
- {
- const int MIN_ELEMENT = 1;
- const int MAX_ELEMENT = 10;
- int rows, cols;
- bool isNotCorrect;
- do
- {
- cout << "Введите строки матрицы: ";
- isNotCorrect = false;
- cin >> rows;
- if (cin.fail() || rows==0)
- {
- cin.clear();
- while (cin.get() != '\n');
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- }
- if ((!isNotCorrect) && (cin.get() != '\n'))
- {
- cin.clear();
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- do
- {
- cout << "Введите столбцы матрицы: ";
- isNotCorrect = false;
- cin >> cols;
- if (cin.fail() or cols==0)
- {
- cin.clear();
- while (cin.get() != '\n');
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- }
- if ((!isNotCorrect) && (cin.get() != '\n'))
- {
- cin.clear();
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- int** matrix = new int* [rows];
- for (int i = 0; i < rows; i++)
- {
- matrix[i] = new int[cols];
- }
- for (int i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- {
- do
- {
- isNotCorrect = false;
- cout << "Введите " << j + 1 << " элемент " << i + 1 << " строки: ";
- cin >> matrix[i][j];
- if (cin.fail())
- {
- cin.clear();
- while (cin.get() != '\n');
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- }
- if ((!isNotCorrect) && (cin.get() != '\n'))
- {
- cin.clear();
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- }
- if ((!isNotCorrect) && ((matrix[i][j] < MIN_ELEMENT) || (matrix[i][j] > MAX_ELEMENT)))
- {
- cout << "Ошибка ввода! Введено число неверного диапазона." << endl;
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- }
- }
- return matrix;
- }
- int* SearchGoodStudent(int** matrix)
- {
- int rows = _msize(matrix) / sizeof(matrix[0]);
- int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
- int* GoodStudents = nullptr;
- int Search = 0;
- for (int I = 0; I < rows; I++)
- {
- int EightGradeCounter = 0;
- int SixGradeCounter = 0;
- int CheckGradeCounter = 0;
- for (int J = 0; J < cols; J++)
- {
- if (matrix[I][J] > 5)
- {
- SixGradeCounter++;
- }
- if (matrix[I][J] < 9)
- {
- EightGradeCounter++;
- }
- if (matrix[I][J] < 6)
- {
- CheckGradeCounter++;
- }
- }
- if (SixGradeCounter > 0 && EightGradeCounter > 0 && CheckGradeCounter==0)
- {
- Search++;
- int* temp = new int[Search];
- for (int k = 0; k < Search - 1; k++)
- {
- temp[k] = GoodStudents[k];
- }
- temp[Search - 1] = I+1;
- delete[] GoodStudents;
- GoodStudents = temp;
- }
- }
- return GoodStudents;
- }
- int SearchGoodSumStudent(int** matrix)
- {
- int rows = _msize(matrix) / sizeof(matrix[0]);
- int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
- int Search = 0;
- for (int I = 0; I < rows; I++)
- {
- int EightGradeCounter = 0;
- int SixGradeCounter = 0;
- int CheckGradeCounter = 0;
- for (int J = 0; J < cols; J++)
- {
- if (matrix[I][J] > 5)
- {
- SixGradeCounter++;
- }
- if (matrix[I][J] < 9)
- {
- EightGradeCounter++;
- }
- if (matrix[I][J] < 6)
- {
- CheckGradeCounter++;
- }
- }
- if (SixGradeCounter > 0 && EightGradeCounter > 0&& CheckGradeCounter==0)
- {
- Search++;
- }
- }
- return Search;
- }
- void SaveMatrixToFile(int** matrix,string filePath,int* Student,int sum)
- {
- int rows = _msize(matrix) / sizeof(matrix[0]);
- int cols = _msize(matrix[0]) / sizeof(matrix[0][0]);
- std::ifstream file(filePath);
- if (file)
- {
- std::cout << "Файл уже существует. Перезаписать? (y/n): ";
- char choice;
- std::cin >> choice;
- if (choice != 'y' && choice != 'Y')
- {
- std::cout << "Запись в файл отменена." << std::endl;
- return;
- }
- }
- file.close();
- std::ofstream outputFile(filePath);
- if (!outputFile)
- {
- std::cout << "Не удалось открыть файл для записи." << std::endl;
- return;
- }
- outputFile << rows << " " << cols << std::endl;
- for (int i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- {
- outputFile << matrix[i][j] << " ";
- }
- outputFile << std::endl;
- }
- outputFile << "Номера хорошистов:";
- for ( int i = 0; i < sum; i++)
- {
- outputFile << Student[i]<<" ";
- }
- outputFile << endl;
- outputFile << "Сумма хорошистов:" << sum;
- outputFile.close();
- std::cout << "Матрица успешно записана в файл." << std::endl;
- }
- void choiseInput()
- {
- string FilePathInput;
- string FilePathOutput;
- bool input;
- bool output;
- bool isInCorrect;
- int sum;
- int** Matrix;
- int* Student;
- input = chooseFileInput();
- if (input == true) {
- do {
- FilePathInput = fileInputPath(input);
- isInCorrect = isRightNums(FilePathInput);
- if (isInCorrect)
- {
- Matrix = readFileMatrix(FilePathInput);
- Student = SearchGoodStudent(Matrix);
- sum = SearchGoodSumStudent(Matrix);
- output = chooseFileOutput();
- if (output == true)
- {
- FilePathOutput = fileInputPath(false);
- SaveMatrixToFile(Matrix, FilePathInput, Student, sum);
- }
- if (output == false)
- {
- printMatrix(Matrix, Student, sum);
- }
- }
- else
- {
- std::cout << "Введен некорректный путь к файлу. Пожалуйста, введите заново." << std::endl;
- FilePathInput = fileInputPath(input);
- isInCorrect = isRightNums(FilePathInput);
- if (isInCorrect)
- {
- Matrix = readFileMatrix(FilePathInput);
- Student = SearchGoodStudent(Matrix);
- sum = SearchGoodSumStudent(Matrix);
- output = chooseFileOutput();
- if (output == true)
- {
- FilePathOutput = fileInputPath(false);
- SaveMatrixToFile(Matrix, FilePathInput, Student, sum);
- }
- if (output == false)
- {
- printMatrix(Matrix, Student, sum);
- }
- }
- }
- } while (!isInCorrect);
- }
- if (input == false)
- {
- Matrix = consoleFillMatrix();
- Student = SearchGoodStudent(Matrix);
- sum = SearchGoodSumStudent(Matrix);
- output = chooseFileOutput();
- if (output == true)
- {
- FilePathOutput = fileInputPath(false);
- SaveMatrixToFile(Matrix, FilePathInput, Student, sum);
- }
- if (output == false)
- {
- printMatrix(Matrix, Student, sum);
- }
- }
- }
- int main()
- {
- setlocale(LC_ALL, "rus");
- printTask();
- choiseInput();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement