Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include "windows.h"
- #include <string>
- #include <fstream>
- #include <iomanip>
- #include <sstream>
- #define outputWidth 10
- using namespace std;
- void menuOutput() {
- cout << "1. Создать файл с исходными данными" << endl
- << "2. Загрузить исходные данные" << endl
- << "3. Вывести исходные данные" << endl
- << "4. Обработать данные" << endl
- << "5. Завершить работу с программой" << endl;
- }
- double** createMatrix(unsigned int rows, unsigned int columns) {
- double** newMatrix = new(std::nothrow) double*[rows];
- if (newMatrix == nullptr)
- return nullptr;
- for (unsigned int i = 0; i < rows; i++) {
- newMatrix[i] = new double[columns];
- if (newMatrix[i] == nullptr || newMatrix == nullptr)
- return nullptr;
- }
- return newMatrix;
- }
- double** createFile(unsigned int &n, unsigned int &m) {
- system("cls");
- string s;
- double a;
- while (true) {
- cin.clear();
- cin.ignore(255, '\n');
- cout << "Введите количество строк матрицы" << endl;
- cin >> s;
- try {
- n = stoi(s);
- a = stod(s);
- if (a == n)
- break;
- cout << "Неверное значение" << endl << endl;
- }
- catch (exception e) {
- cout << "Неверное значение" << endl << endl;
- }
- }
- while (true) {
- cin.clear();
- cin.ignore(255, '\n');
- cout << "Введите количество столбцов матрицы" << endl;
- cin >> s;
- try {
- m = stoi(s);
- a = stod(s);
- if (a == m)
- break;
- cout << "Неверное значение" << endl << endl;
- }
- catch (exception e) {
- cout << "Неверное значение" << endl << endl;
- }
- }
- a = 0;
- double** matr = createMatrix(n, m);
- if (matr == nullptr)
- return nullptr;
- cout << endl;
- bool failed = false;
- for (unsigned int i = 0; i < n; i++) {
- for (unsigned int j = 0; j < m; j++) {
- cout << "Введите значение " << j << " элемента " << i << " строки матрицы: ";
- cin >> s;
- try {
- if (s.at(0) == '.')
- s = '0' + s;
- a = stod(s);
- }
- catch (exception e) {
- failed = true;
- }
- while (failed) {
- cout << "Введите корректное значение " << j << " элемента " << i << " строки матрицы: ";
- cin >> s;
- try {
- if (s.at(0) == '.')
- s = '0' + s;
- a = stod(s);
- failed = false;
- }
- catch (exception e) {
- failed = true;
- }
- }
- matr[i][j] = a;
- }
- cout << endl;
- }
- char c;
- string FNAME;
- ofstream fout;
- while (!fout.is_open()) {
- cout << endl << "Введите имя файла : ";
- cin >> FNAME;
- fout.open(FNAME, ios::_Nocreate);
- if (fout.is_open()) {
- cout << "Обнаружен файл с таким именем, разрешить перезаписать? (y - да, n - нет)" << endl;
- cin >> c;
- while (c != 'y' && c != 'Y' && c != 'у' && c != 'У' && c != 'n' && c != 'N') {
- cout << "Введен неправильный ответ, попробуйте еще раз" << endl;
- cin >> c;
- }
- switch (c) {
- case 'y':
- case 'Y':
- case 'у':
- case 'У':
- fout.close();
- fout.open(FNAME, ios::trunc);
- break;
- case 'n':
- case 'N':
- fout.close();
- break;
- default:
- break;
- }
- }
- else {
- fout.close();
- fout.open(FNAME);
- }
- }
- for (unsigned int i = 0; i < n; i++) {
- for (unsigned int j = 0; j < m; j++)
- fout << matr[i][j] << ' ';
- fout << endl;
- }
- fout.close();
- return matr;
- }
- double** loadFile(unsigned int &n, unsigned int &m) {
- system("cls");
- unsigned int temp = m;
- n = 0;
- m = 0;
- string FNAME, s;
- stringstream buf, res;
- ifstream fin;
- double a;
- while (!fin.is_open()) {
- cout << "Введите имя файла: ";
- cin >> FNAME;
- fin.open(FNAME);
- }
- bool broken = false;
- n = 0;
- while (!fin.eof() && !broken) {
- getline(fin, s);
- while (s.find(" ") != s.npos)
- s.replace(s.find(" "), 2, " ");
- while (s.find(",") != s.npos)
- s.replace(s.find(","), 1, ".");
- if (s.size() > 0) {
- buf.str(string());
- buf.clear();
- buf << s;
- m = 0;
- while (buf >> s) {
- try {
- a = stod(s);
- m++;
- }
- catch (exception e) {
- if (strcmp(e.what(), "invalid stod argument") == 0)
- cout << "Обнаружен недопустимый символ при вводе значения из " << n + 1 << " строки и " << ((m == 0) ? (m + 1) : (m)) << " столбца" << endl
- << "Недопустимый ввод -> " << s << endl;
- if (strcmp(e.what(), "stod argument out of range") == 0)
- cout << "Обнаружено переполнение типа при вводе значения из " << n + 1 << " строки и " << ((m == 0) ? (m + 1) : (m)) << " столбца" << endl;
- broken = true;
- break;
- }
- buf.ignore();
- if (!isdigit((unsigned char)s.at(s.size() - 1))) {
- cout << "Обнаружен недопустимый символ при вводе значения из " << n + 1 << " строки и " << ((m == 0) ? (m + 1) : (m)) << " столбца" << endl
- << "Недопустимый ввод -> " << s << endl;
- broken = true;
- break;
- }
- res << a << ' ';
- }
- if (temp == 0)
- temp = m;
- if (m != temp) {
- cout << "Неверное количество значений в " << n << " строке" << endl;
- broken = true;
- }
- n++;
- }
- }
- fin.close();
- if (!broken) {
- double** matr = createMatrix(n, m);
- if (matr == nullptr)
- return nullptr;
- unsigned int i = 0;
- for (unsigned int i = 0; i < n; i++)
- for (unsigned int j = 0; j < m; j++) {
- res >> a;
- if (!res.fail()) {
- matr[i][j] = a;
- }
- else {
- for (unsigned int i = 0; i < n; i++)
- delete[] matr[i];
- delete[] matr;
- return nullptr;
- }
- }
- return matr;
- }
- return nullptr;
- }
- void printMatrix(double** matr, unsigned int rows, unsigned int columns) {
- cout.precision(3);
- for (unsigned int i = 0; i < rows; i++) {
- for (unsigned int j = 0; j < columns; j++)
- cout << setw(outputWidth) << matr[i][j] << " ";
- cout << endl;
- }
- cout << endl;
- }
- boolean createAndPrintMatrix(double** f, unsigned int rows, unsigned int columns) {
- int t = 0;
- for (int j = 0; j < columns; j++)
- if (f[0][j] > f[1][j])
- t++;
- if (t == 0)
- cout << "Подходящих столбцов не обнаружено" << endl;
- else {
- short *arr = new(std::nothrow) short[t];
- if (arr == nullptr)
- return true;
- else {
- t = 0;
- for (int i = 0; i < columns; i++)
- if (f[0][i] > f[1][i]) {
- arr[t] = i;
- t++;
- }
- double srar;
- for (int j = 0; j < columns; j++) {
- srar = 0;
- for (int i = 0; i < rows; i++)
- srar += f[i][j];
- srar /= rows;
- for (int i = 0; i < rows; i++)
- f[i][j] = srar;
- }
- cout << "Составленные массив" << endl;
- for (int i = 0; i < t; i++)
- cout << arr[i] << ' ';
- cout << endl << "Обработанная матрица" << endl;
- printMatrix(f, rows, columns);
- cout << endl;
- }
- }
- return false;
- }
- int main() {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- double** matr = nullptr;
- unsigned int n = 0, m = 0;
- char c;
- while (true) {
- system("cls");
- menuOutput();
- cin >> c;
- switch (c) {
- case '1':
- matr = createFile(n, m);
- break;
- case '2':
- matr = loadFile(n, m);
- if (n == 0 && m == 0 && matr != nullptr) {
- cout << "Введена пустая матрица" << endl;
- matr = nullptr;
- }
- break;
- case '3':
- if (n > 0 && m > 0) {
- system("cls");
- cout << "Исходная матрица" << endl;
- printMatrix(matr, n, m);
- }
- break;
- case '4':
- if (matr != nullptr) {
- system("cls");
- if (createAndPrintMatrix(matr, n, m))
- matr = nullptr;
- }
- break;
- case '5':
- return 0;
- break;
- default:
- break;
- }
- if (matr == nullptr && n > 0) {
- cout << "Повреждены значения в файле или проблемы с памятью" << endl;
- break;
- }
- if (c == '1' || c == '2' || c == '3' || c == '4' || c == '5')
- cout << endl << "Готово" << endl << endl;
- else
- cout << endl << "Введен неправильный ответ, попробуйте еще раз" << endl << endl;
- if (c == '2' && matr != nullptr) {
- cout << "Загруженная матрица" << endl;
- printMatrix(matr, n, m);
- cout << endl;
- }
- system("pause");
- }
- if (matr != nullptr) {
- for (unsigned int i = 0; i < n; i++) {
- try {
- delete[] matr[i];
- }
- catch (exception e) {
- }
- }
- delete[] matr;
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement