Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <conio.h>
- #include <iomanip>
- typedef double elemtype;
- using namespace std;
- enum mistakes
- {
- no_err, load_matr_err, elem_err, file_err, mem_alloc_err, pryam_err, empty_err
- };
- /*elemtype **loadMatr(string filename, int &str1, int &stlb1, elemtype **&arr, mistakes &err, int &pos, int &el_str, int &el_stlb, istringstream &ii)
- {
- ifstream f("D://1//" + filename + ".txt");
- if (!f.is_open())
- {
- f.close();
- err = file_err;
- return NULL;
- }
- int stolb = 0;
- int i = 0;
- string istr;
- bool fail = false;
- while (!f.eof())
- {
- f >> ws;
- getline(f, istr);
- ii.str(istr);
- while (!ii.eof())
- {
- pos = ii.tellg();
- ii >> i;
- if (ii.fail() || ii.peek() != ' ' && ii.peek() != '\t' && ii.peek() != '\n' && ii.peek() != EOF)
- {
- f.close();
- el_str = str1;
- el_stlb = stolb;
- err = elem_err;
- return NULL;
- }
- stolb++;
- ii >> ws;
- }
- ii.ignore(255, '\n'); //для getline()
- ii.clear(); // сброс ii.eof()
- if (str1 == 0)
- stlb1 = stolb;
- if (stlb1 != stolb)
- {
- f.close();
- err = pryam_err;
- return NULL;
- }
- stolb = 0;
- str1++;
- f >> ws;
- }
- if (str1 == 1)
- {
- f.close();
- err = empty_err;
- return NULL;
- }
- arr = new(nothrow)elemtype*[str1];
- if (!arr)
- {
- f.close();
- err = mem_alloc_err;
- return NULL;
- }
- for (int i = 0; i < str1; i++)
- {
- arr[i] = new(nothrow)elemtype[stlb1];
- if (!arr[i])
- {
- f.close();
- err = mem_alloc_err;
- return NULL;
- }
- }
- f.clear();
- f.seekg(0);
- for (int i = 0; i < str1; i++)
- for (int j = 0; j < stlb1; j++)
- f >> arr[i][j];
- f.close();
- return arr;
- }*/
- int load_Matr(ifstream &f, string file_name, int &str, int &stolb, elemtype **&arr, int &pos, int &el_str, int &el_stlb)
- {
- f.open("D://1//" + file_name + ".txt");
- if (!f.is_open())
- {
- f.close();
- return file_err;
- }
- bool cycle = true;
- int i = 0, stlb = 0;
- int k = 0;
- char c = 0;
- while (cycle)
- {
- pos = f.tellg();
- f >> i;
- if (f.fail() || f.peek() != ' ' && f.peek() != '\t' && f.peek() != '\n' && f.peek() != EOF)
- {
- el_str = str;
- el_stlb = stlb;
- return elem_err;
- }
- stlb++;
- k++;
- while (c != EOF)
- {
- c = f.get();
- switch (c)
- {
- case ' ': case '\t':
- break;
- case EOF:
- cycle = false;
- case '\n':
- {
- if (stlb)
- {
- f >> ws;
- str++;
- stolb = stlb;
- stlb = 0;
- }
- break;
- }
- default:
- {
- f.unget();
- c = EOF;
- }
- }
- }
- c = 0;
- }
- if (str == 1)
- {
- f.close();
- return empty_err;
- }
- if (k != str * stolb)
- {
- f.close();
- return pryam_err;
- }
- arr = new(nothrow)elemtype*[str];
- if (!arr)
- {
- f.close();
- return mem_alloc_err;
- }
- for (int i = 0; i < str; i++)
- {
- arr[i] = new(nothrow)elemtype[stolb];
- if (!arr[i])
- {
- f.close();
- return mem_alloc_err;
- }
- }
- f.clear();
- f.seekg(0);
- for (int i = 0; i < str; i++)
- for (int j = 0; j < stolb; j++)
- f >> arr[i][j];
- f.close();
- return no_err;
- }
- int Copy_Matr(elemtype **&arr_copy, elemtype **&arr, int str, int stlb)
- {
- arr_copy = new (nothrow) elemtype*[str];
- if (!arr_copy)
- {
- return mem_alloc_err;
- }
- for (int a = 0; a < str; a++)
- {
- arr_copy[a] = new (nothrow) elemtype[stlb];
- if (!arr_copy[a])
- {
- return mem_alloc_err;
- }
- }
- for (int i = 0; i < str; i++)
- for (int j = 0; j < stlb; j++)
- arr_copy[i][j] = arr[i][j];
- return no_err;
- }
- void cout_Matr(elemtype **&arr, int str, int stlb, int a = 10)
- {
- for (int i = 0; i < str; i++)
- {
- for (int j = 0; j < stlb; j++)
- cout << arr[i][j] << setw(a) << left;
- cout << endl;
- }
- }
- elemtype **procc(elemtype **&arr_copy, int str, int stolb)
- {
- float sar = 0, max = 0;
- cout << "Исходная матрица:" << endl;
- cout_Matr(arr_copy, str, stolb);
- for (int j = 0; j < stolb; j++)
- max += arr_copy[0][j];
- max /= stolb;
- for (int i = 0; i < str; i++)
- {
- for (int j = 0; j < stolb; j++)
- {
- sar += arr_copy[i][j];
- }
- sar /= stolb;
- if (max < sar)
- max = sar;
- sar = 0;
- }
- cout << "Максимальное арифметическое: " << max << endl
- << "Введите номер строки, из которой не нужно вычитать максимальное среднее арифметическое\n";
- int numstr = 0;
- do
- {
- cout << "Номер строки: ";
- cin >> numstr;
- if (numstr < 0 || numstr > str || numstr == 0 || cin.fail() || cin.peek() != '\n')
- {
- cout << "Вы ввели некорректное значение, возможно оно больше числа самих строк или меньше нуля" << endl;
- cin.clear();
- cin.ignore(255, '\n');
- continue;
- }
- else break;
- } while (true);
- numstr--;
- for (int i = 0; i < numstr; i++)
- for (int j = 0; j < stolb; j++)
- arr_copy[i][j] -= max;
- numstr++;
- for (numstr; numstr < str; numstr++)
- for (int j = 0; j < stolb; j++)
- arr_copy[numstr][j] -= max;
- return arr_copy;
- }
- void Matr_Del(elemtype **&arr, elemtype **&arr_copy, int str, int stlb)
- {
- for (int i = 0; i < str; i++)
- {
- delete[] arr[i];
- delete[] arr_copy[i];
- }
- delete[]arr;
- delete[]arr_copy;
- }
- int main()
- {
- setlocale(LC_ALL, "rus");
- system("color 6");
- mistakes error = no_err;
- elemtype **arr = nullptr, **arr_copy = nullptr;
- string fname, el_err, istr;
- istringstream ii1;
- ifstream f;
- int position = 0, str = 0, stolb = 0, str_err = 0, stlb_err = 0;
- cout << "Введите имя файла, из которого хотите загрузить матрицу или завершите программу вводом \"*\"" << endl;
- do
- {
- delete[]arr;
- f.clear();
- str = 0;
- stolb = 0;
- error = no_err;
- cout << "Имя файла: ";
- getline(cin, fname);
- if (fname == "*")
- {
- f.close();
- return 0;
- }
- switch (load_Matr(f, fname, str, stolb, arr, position, str_err, stlb_err))
- {
- case file_err:
- {
- cout << "Ошибка открытия файла. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
- continue;
- }
- case mem_alloc_err:
- {
- cout << "Ошибка выделения памяти. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
- continue;
- }
- case elem_err:
- {
- /*ii1.clear();
- ii1.seekg(position);
- ii1 >> el_err;*/
- f.clear();
- f.seekg(position);
- f >> el_err;
- cout << "Ошибка. Найден некорректный элемент.\nНомер строки: " << str_err + 1 << "\nНомер столбца: " << stlb_err + 1 << endl <<
- "Элемент: " << el_err << "\nПопробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
- f.close();
- continue;
- }
- case pryam_err:
- {
- cout << "Ошибка. Матрица не прямоугольная. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
- continue;
- }
- case empty_err:
- {
- cout << "Ошибка. Данные файла не являются матрицей. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
- continue;
- }
- }
- //Copy_Matr(arr_copy, arr, str, stolb);
- if (Copy_Matr(arr_copy, arr, str, stolb) == mem_alloc_err)
- {
- cout << "Ошибка выделения памяти. Попробуйте выбрать другой файл или завершить программу вводом \"*\"" << endl;
- continue;
- }
- break;
- } while (true);
- procc(arr_copy, str, stolb);
- cout << "Измененная матрица:" << endl;
- cout_Matr(arr_copy, str, stolb);
- _getch();
- Matr_Del(arr, arr_copy, str, stolb);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement