Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement