#include #include #include const int MIN_SIZE = 2; const int MAX_SIZE = 10; const int MIN_VALUE = -1000; const int MAX_VALUE = 1000; void outputOfTaskInfo() { std::cout << "Данная программа выполняет «прямой ход» в решении СЛАУ методом Гаусса. \n" << "Диапазон ввода значений количества уравнений в системе: " << MIN_SIZE << "..." << MAX_SIZE << ". \n" << "Диапазон ввода значений коэффициентов при переменных: " << MIN_VALUE << "..." << MAX_VALUE << ". \n"; } int getVerificationOfChoice() { int choice; bool isIncorrect; do { isIncorrect = false; std::cin >> choice; if (std::cin.fail()) { std::cin.clear(); while (std::cin.get() != '\n'); isIncorrect = true; std::cout << "Проверьте корректность ввода данных! \n"; } if (!isIncorrect && std::cin.get() != '\n') { std::cin.clear(); while (std::cin.get() != '\n'); std::cout << "Проверьте корректность ввода данных! \n"; isIncorrect = true; } if (isIncorrect || (choice != 0 && choice != 1)) { isIncorrect = true; std::cout << "Для выбора введите 0 или 1! \n"; } } while (isIncorrect); return choice; } std::string inputPathToFile() { std::string path; bool isIncorrect; std::cout << "Укажите путь к файлу: "; do { isIncorrect = false; std::cin >> path; std::ifstream file(path); if (!file.is_open()) { std::cout << "По указанному пути файл не найден! Укажите правильный путь: "; isIncorrect = true; } } while (isIncorrect); return path; } int readSizeFromConsole() { int size; bool isIncorrect; std::cout << "Введите значение количества уравнений системы: "; do { isIncorrect = false; std::cin >> size; if (std::cin.fail()) { isIncorrect = true; std::cout << "Проверьте корректность ввода данных! \n"; std::cin.clear(); while (std::cin.get() != '\n'); } if (!isIncorrect && (size < MIN_SIZE || size >> MAX_SIZE)) { isIncorrect = true; std::cout << "Введите число от " << MIN_SIZE << " до " << MAX_SIZE << "! \n"; } } while (isIncorrect); return size; } int readSizeFromFile(const std::string path) { int size; std::string sizeInp; bool isIncorrect = true; std::ifstream fin(path); std::cout << "Происходит чтение количества уравнений системы... \n"; fin >> sizeInp; try { size = atoi(sizeInp.c_str()); } catch (...) { isIncorrect = false; std::cout << "Ошибка при чтении данных! Введите количество уравнений с консоли! \n"; size = readSizeFromConsole(); } if (!isIncorrect && (size < MIN_SIZE || size > MAX_SIZE)) { std::cout << "Введите значение от " << MIN_SIZE << " до " << MAX_SIZE << "! \n"; size = readSizeFromConsole(); } fin.close(); return size; } int readSize(const int choice, const std::string path) { int size = -1; if (choice == 0) size = readSizeFromConsole(); if (choice == 1) size = readSizeFromFile(path); return size; } void outputSize(const int choice, std::string path, const int size) { std::ofstream fout(path); bool isIncorrect; if (choice == 0) std::cout << "Количество уравнений в системе равно: " << size << ". \n"; if (choice == 1) { std::cout << "Вывод количества уравнений в файл... \n"; do { isIncorrect = false; std::ofstream fout(path); try { fout << size << "\n"; } catch (...) { std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n"; isIncorrect = true; path = inputPathToFile(); } fout.close(); } while (isIncorrect); std::cout << "Данные успешно записаны в файл! \n"; } } float** fillMatrixFromConsole(const int size) { float** matrix = new float* [size]; bool isIncorrect; int finalPos = size + 1; for (int i = 0; i < size; i++) matrix[i] = new float[size + 1]; for (int i = 0; i < size; i++) { for (int j = 0; j < finalPos; j++) { std::cout << "Введите значение коэфф-та в " << i + 1 << "-ом уравнении при " << j + 1 << "-ой позиции: "; do { isIncorrect = false; std::cin >> matrix[i][j]; if (std::cin.fail()) { isIncorrect = true; std::cout << "Проверьте корректность ввода данных! \n"; std::cin.clear(); while (std::cin.get() != '\n'); } if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE)) { isIncorrect = true; std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n"; } } while (isIncorrect); } } return matrix; } float** fillMatrixFromFile(const int size, const std::string path) { float** matrix = new float* [size]; int count = 0; int finalPos = size + 1; for (int i = 0; i < size; i++) matrix[i] = new float[size + 1]; bool isIncorrect; std::string matrixInp; std::ifstream fin(path); std::cout << "Происходит чтение системы уравнений... \n"; fin >> matrixInp; while (!fin.eof()) { std::string symbol; fin >> symbol; count++; } if (count > size * (size + 2)) { std::cout << "Ошибка при чтении системы! Введите систему с консоли! \n"; matrix = fillMatrixFromConsole(size); } else { fin.close(); fin.open(path); fin >> matrixInp; for (int i = 0; i < size; i++) { for (int j = 0; j < finalPos; j++) { do { isIncorrect = false; try { fin >> matrix[i][j]; } catch (...) { std::cout << "Ошибка при чтении системы! Введите систему с консоли! \n"; isIncorrect = true; matrix = fillMatrixFromConsole(size); } if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE)) { std::cout << "Ошибка при чтении системы! Введите систему с консоли! \n"; isIncorrect = true; matrix = fillMatrixFromConsole(size); } } while (isIncorrect); } } } fin.close(); return matrix; } float** fillMatrix(const int choice, const std::string path, const int size) { float** matrix = new float* [size]; for (int i = 0; i < size; i++) matrix[i] = new float[size + 1]; if (choice == 0) matrix = fillMatrixFromConsole(size); if (choice == 1) matrix = fillMatrixFromFile(size, path); return matrix; } void outputMatrix(const int choice, std::string path, float** matrix, const int size) { bool isIncorrect; std::ofstream fout; if (choice == 0) { std::cout << "Вывод начальной системы уравнений: \n"; for (int i = 0; i < size; i++) { std::cout << "|"; for (int j = 0; j < size; j++) std::cout << " " << matrix[i][j] << " \t"; std::cout << "| " << matrix[i][size] << "; \n"; } std::cout << "\n"; } if (choice == 1) { std::cout << "Вывод начальной системы уравнений в файл... \n"; fout.open(path, std::ios::app); fout << "\n"; do { isIncorrect = false; try { std::cout << "Вывод начальной системы уравнений: \n"; for (int i = 0; i < size; i++) { fout << "|"; for (int j = 0; j < size; j++) fout << " " << matrix[i][j] << " \t"; fout << "| " << matrix[i][size] << "; \n"; } fout << "\n"; } catch (...) { std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n"; isIncorrect = true; path = inputPathToFile(); } } while (isIncorrect); fout.close(); std::cout << "Данные успешно записаны в файл! \n"; } } float** findTriangleMatrix(const int size, float** matrix) { float** triangleMatrix = new float* [size]; for (int i = 0; i < size; i++) triangleMatrix[i] = new float[size + 1]; int columns = size + 1; for (int i = 0; i < size; i++) { for (int j = 0; j < columns; j++) triangleMatrix[i][j] = matrix[i][j]; } for (int i = 0; i < size; i++) { int startPosJ = i + 1; for (int j = startPosJ; j < size; j++) { float temp = triangleMatrix[j][i] / triangleMatrix[i][i]; for (int k = i; k < size; k++) triangleMatrix[j][k] = triangleMatrix[j][k] - temp * triangleMatrix[i][k]; triangleMatrix[j][size] = triangleMatrix[j][size] - temp * triangleMatrix[i][size]; } } return triangleMatrix; } void outputTriangleMatrix(const int choice, std::string path, float** matrix, const int size) { bool isIncorrect; std::ofstream fout; if (choice == 0) { std::cout << "Вывод преобразованной системы: \n"; for (int i = 0; i < size; i++) { std::cout << "|"; for (int j = 0; j < size; j++) std::cout << " " << matrix[i][j] << " "; std::cout << "| " << matrix[i][size] << "; \n"; } std::cout << "\n"; } if (choice == 1) { std::cout << "Вывод начальной матрицы в файл... \n"; fout.open(path, std::ios::app); fout << "\n"; do { isIncorrect = false; try { for (int i = 0; i < size; i++) { fout << "|"; for (int j = 0; j < size; j++) fout << " " << matrix[i][j] << " "; fout << "| " << matrix[i][size] << "; \n"; } fout << "\n"; } catch (...) { std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n"; isIncorrect = true; path = inputPathToFile(); } } while (isIncorrect); fout.close(); std::cout << "Данные успешно записаны в файл! \n"; } } float* findRoots(const int size, float** triangleMatrix) { float* ansArr = new float[size]; float temp; int pos = size - 1; int k = 1; float dividend = 0; for (int i = 0; i < size; i++) { if (triangleMatrix[pos][pos] != 0) { dividend = triangleMatrix[pos][pos + k]; for (int j = 0; j < i; j++) dividend = dividend - triangleMatrix[pos][pos + i - j] * ansArr[j]; temp = dividend / triangleMatrix[pos][pos]; } else temp = 0; ansArr[i] = temp; k++; pos--; } return ansArr; } void outputAnsArr(const int choice, std::string path, float* ansArr, const int size) { bool isIncorrect; std::ofstream fout; if (choice == 0) { std::cout << "Вывод полученных корней: \n"; for (int i = 0; i < size; i++) std::cout << "Значение " << i + 1 << "-ой переменной равно: " << ansArr[i] << ". \n"; } if (choice == 1) { std::cout << "Вывод полученных корней в файл... \n"; fout.open(path, std::ios::app); fout << "\n"; do { isIncorrect = false; try { for (int i = 0; i < size; i++) fout << "Значение " << i + 1 << "-ой переменной равно: " << ansArr[i] << ". \n"; } catch (...) { std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n"; isIncorrect = true; path = inputPathToFile(); } } while (isIncorrect); fout.close(); std::cout << "Данные успешно записаны в файл! \n"; } } void processUserInput(int& choiceForInput, int& size, std::string& pathToIn) { std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n"; choiceForInput = getVerificationOfChoice(); if (choiceForInput == 1) pathToIn = inputPathToFile(); size = readSize(choiceForInput, pathToIn); } void processUserOutput(int& choiceForOutput, std::string& pathToOut, int& size, float**& matrix, float**& triangleMatrix, float*& ansArr) { std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n"; choiceForOutput = getVerificationOfChoice(); if (choiceForOutput == 1) pathToOut = inputPathToFile(); outputSize(choiceForOutput, pathToOut, size); outputMatrix(choiceForOutput, pathToOut, matrix, size); outputTriangleMatrix(choiceForOutput, pathToOut, triangleMatrix, size); outputAnsArr(choiceForOutput, pathToOut, ansArr, size); } int main() { setlocale(LC_ALL, "Rus"); int choiceForInput, choiceForOutput, size; std::string pathToIn, pathToOut; outputOfTaskInfo(); processUserInput(choiceForInput, size, pathToIn); float** matrix = new float* [size]; for (int i = 0; i < size; i++) matrix[i] = new float[size]; matrix = fillMatrix(choiceForInput, pathToIn, size); float** triangleMatrix = new float* [size]; for (int i = 0; i < size; i++) triangleMatrix[i] = new float[size]; triangleMatrix = findTriangleMatrix(size, matrix); float* ansArr = new float[size]; ansArr = findRoots(size, triangleMatrix); processUserOutput(choiceForOutput, pathToOut, size, matrix, triangleMatrix, ansArr); return 0; }