Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <string>
- #include <iostream>
- int numberOfLines, numberOfColumns;
- using namespace std;
- string inputPathToFile();
- void checkExtension(string* path);
- int inputNumber(int minNumber, int maxNumber) {
- bool isIncorrect;
- int number;
- string input = "";
- do {
- getline(cin, input);
- isIncorrect = false;
- try {
- number = stoi(input);
- }
- catch (invalid_argument ex) {
- cout << "Нужно ввести целое число.\n";
- isIncorrect = true;
- }
- catch (out_of_range ex) {
- cout << "Нужно ввести число, которое не меньше " << minNumber << " и не больше " << maxNumber << "\n";
- isIncorrect = true;
- }
- if (!isIncorrect && (number < minNumber || number > maxNumber)) {
- cout << "Нужно ввести число, которое не меньше " << minNumber << " и не больше " << maxNumber << "\n";
- isIncorrect = true;
- }
- } while (isIncorrect);
- return number;
- }
- int chooseWayOfInput() {
- int userWay;
- do {
- cout << "Выберите способ ввода: \nНажмите '1', если хотите ввести матрицу через консоль.\nНажмите '2', если хотите считать матрицу из файла.\n";
- userWay = inputNumber(1, 2);
- } while (userWay != 1 && userWay != 2);
- return userWay;
- }
- void checkExtension(string* path)
- {
- bool isIncorrect;
- int lastIndex;
- do {
- isIncorrect = false;
- lastIndex = (*path).length() - 1;
- if ((*path)[lastIndex] != 't' || (*path)[lastIndex - 1] != 'x' || (*path)[lastIndex - 2] != 't' || (*path)[lastIndex - 3] != '.')
- {
- isIncorrect = true;
- cout << "Файл имеет неверное расширение. ";
- *path = inputPathToFile();
- }
- } while (isIncorrect);
- }
- string inputPathToFile() {
- string path;
- bool isIncorrect, isNotCorrect;
- cout << "Введите путь к файлу:\n";
- do {
- isNotCorrect = false;
- do {
- isIncorrect = false;
- cin >> path;
- ifstream fin(path);
- if (!fin.is_open())
- {
- cout << "Файл не найден. ";
- isIncorrect = false;
- }
- else {
- fin.close();
- }
- } while (isIncorrect);
- checkExtension(&path);
- } while (isNotCorrect);
- return path;
- }
- void reveiveNumberOfLinesFromFile(string path)
- {
- bool isIncorrect;
- do {
- isIncorrect = false;
- ifstream fin(path);
- fin >> numberOfLines;
- if (numberOfLines < 1)
- {
- isIncorrect = true;
- cout << "Некорректные данные в файле.";
- path = inputPathToFile();
- }
- fin.close();
- } while (isIncorrect);
- }
- void reveiveNumberOfColumnsFromFile(string path)
- {
- bool isIncorrect;
- do {
- isIncorrect = false;
- ifstream fin(path);
- fin.ignore(2);
- fin >> numberOfColumns;
- if (numberOfColumns < 1)
- {
- isIncorrect = true;
- cout << "Некорректные данные в файле.";
- path = inputPathToFile();
- }
- fin.close();
- } while (isIncorrect);
- }
- int** reveiveMatrixFromFile(string path, int numberOfLines, int numberOfColumns, int** matrix)
- {
- ifstream fin(path);
- fin.ignore(4, '\n');
- for (int i = 0; i < numberOfLines; i++)
- {
- for (int j = 0; j < numberOfColumns; j++)
- {
- fin >> matrix[i][j];
- }
- }
- fin.close();
- return matrix;
- }
- int** matrixCreating(int numberOfLines, int numberOfColumns)
- {
- int** matrix = new int* [numberOfLines];
- for (int i = 0; i < numberOfLines; i++)
- {
- matrix[i] = new int[numberOfColumns];
- }
- return matrix;
- }
- int** inputMatrixFromConsole(int** matrix, int numberOfLines, int numberOfColumns)
- {
- for (int i = 0; i < numberOfLines; i++)
- {
- for (int j = 0; j < numberOfColumns; j++)
- {
- cout << "Введите значение элемента[" << i + 1 << "]" << "[" << j + 1 << "]: ";
- matrix[i][j] = inputNumber(-100, 100);
- }
- }
- return matrix;
- }
- void matrixDelete(int** matrix, int numberOfLines, int numberOfColumns)
- {
- for (int i = 0; i < numberOfLines; i++)
- {
- delete[] matrix[i];
- }
- delete[] matrix;
- }
- int counterOfSortedLines(int** matrix, int numberOfLines, int numberOfColumns)
- {
- int counter, numberOfSortedLines;
- numberOfSortedLines = 0;
- for (int i = 0; i < numberOfLines; i++)
- {
- counter = 0;
- for (int j = 1; j < numberOfColumns; j++)
- {
- if (matrix[i][j - 1] < matrix[i][j])
- {
- counter++;
- }
- }
- if (counter == numberOfColumns - 1)
- {
- numberOfSortedLines++;
- }
- }
- return numberOfSortedLines;
- }
- void resaultOutput(int numberOfSortedLines)
- {
- cout << "Количество строк, отсортированных по возрастанию: " << numberOfSortedLines << endl;
- }
- void InputNumberOfLines()
- {
- bool isIncorrect;
- cout << "Введите количество строк:\n";
- do {
- isIncorrect = false;
- numberOfLines = inputNumber(2, 5);
- if (numberOfLines < 1)
- {
- isIncorrect = true;
- cout << "Количество строк должно быть положительным:\n";
- }
- } while (isIncorrect);
- }
- void InputNumberOfColumns()
- {
- bool isIncorrect;
- cout << "Введите количество столбцов.\n";
- do {
- isIncorrect = false;
- numberOfColumns = inputNumber(2, 5);
- if (numberOfColumns < 1)
- {
- isIncorrect = true;
- cout << "Количество столбцов должно быть положительным.\n";
- }
- } while (isIncorrect);
- }
- int** reveiveMatrix(int userWay)
- {
- string path;
- switch (userWay)
- {
- case 1:
- {
- InputNumberOfLines();
- InputNumberOfColumns();
- break;
- }
- case 2:
- {
- path = inputPathToFile();
- reveiveNumberOfLinesFromFile(path);
- reveiveNumberOfColumnsFromFile(path);
- break;
- }
- }
- int** matrix = matrixCreating(numberOfLines, numberOfColumns);
- switch (userWay)
- {
- case 1:
- matrix = inputMatrixFromConsole(matrix, numberOfLines, numberOfColumns);
- break;
- case 2:
- matrix = reveiveMatrixFromFile(path, numberOfLines, numberOfColumns, matrix);
- break;
- }
- return matrix;
- }
- void printResultInFile(string path, int numberOfSortedLines)
- {
- bool isIncorrect;
- do {
- isIncorrect = false;
- checkExtension(&path);
- ofstream fout(path, ios::trunc);
- if (fout.is_open()) {
- fout << "Количество отсортированных по возрастанию строк: " << numberOfSortedLines << endl;
- fout.close();
- }
- else {
- cout << "Файл закрыт для записи. \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- } while (isIncorrect);
- }
- void userWayOfOutput(int numberOfSortedLines)
- {
- char userWay;
- cout << "Если хотите записать результат в файл, введите '1'. Если не хотите - введите другой символ:\n";
- cin >> userWay;
- if (userWay == '1')
- {
- string path = inputPathToFile();
- printResultInFile(path, numberOfSortedLines);
- cout << "Результат записан в файл. \n";
- }
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- cout << "Программа считает количество строк данной матрицы, которые упорядочены по возрастанию.\n";
- int userWay;
- userWay = chooseWayOfInput();
- int** matrix = reveiveMatrix(userWay);
- int numberOfSortedLines;
- numberOfSortedLines = counterOfSortedLines(matrix, numberOfLines, numberOfColumns);
- matrixDelete(matrix, numberOfLines, numberOfColumns);
- resaultOutput(numberOfSortedLines);
- userWayOfOutput(numberOfSortedLines);
- cout << "Программа завершена";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement