Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- void outputTask() {
- cout << "Данная программа считает сумму элементов матрицы в форме ''песочные часы''." << endl;
- }
- string inputPath() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cin >> path;
- ifstream fin(path);
- if (fin.is_open() and (size(path) > 4) and ((path[size(path) - 1] == 't') and (path[size(path) - 2] == 'x') and (path[size(path) - 3] == 't') and (path[size(path) - 4] == '.'))) {
- cout << "Файл успешно открыт!" << endl;
- }
- else {
- cout << "Ошибка открытия файла!" << endl;
- isNotCorrect = true;
- }
- fin.close();
- } while (isNotCorrect);
- return path;
- }
- void outputMatrix(int** matrix, int size) {
- cout << "Введенная матрица: " << endl;
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- cout << matrix[i][j];
- cout << " ";
- }
- cout << endl;
- }
- }
- int countSum(int**& matrix, int size) {
- int sum;
- sum = 0;
- for (int i = 0; i < (size / 2); i++) {
- for (int j = i; j < (size - i); j++) {
- sum += matrix[i][j];
- }
- }
- for (int i = (size / 2); i < (size); i++) {
- for (int j = (size - i - 1); j < i + 1; j++) {
- sum += matrix[i][j];
- }
- }
- return sum;
- }
- void outputAnswer(int sum) {
- string path;
- cout << "Сумма элементов матрицы ''песочные часы'': " << sum << endl;
- cout << "Введите путь файла для вывода: " << endl;
- path = inputPath();
- ofstream fout(path);
- fout << "Сумма элементов матрицы ''песочные часы'': " << sum << endl;
- fout.close();
- cout << "Данные успешно записаны в файл." << endl;
- }
- int inputSizeFromConsole() {
- int size;
- bool isNotCorrect;
- do {
- cout << "Введите порядок матрицы: " << endl;
- isNotCorrect = false;
- cin >> size;
- if (cin.fail() or (size < 3)) {
- isNotCorrect = true;
- cout << "Ошибка ввода!" << endl;
- cin.clear();
- while(cin.get() != '\n');
- }
- } while(isNotCorrect);
- return size;
- }
- void fillMatrixFromConsole(int**& matrix, int size) {
- bool isNotCorrect;
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- do {
- isNotCorrect = false;
- cout << "Введите [" << i + 1 << " , " << j + 1 << "] элемент матрицы: " << endl;
- cin >> matrix[i][j];
- if (cin.fail()) {
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- cin.clear();
- while(cin.get() != '\n');
- }
- } while(isNotCorrect);
- }
- }
- }
- int** inputFromConsole(int& size) {
- int** matrix;
- size = inputSizeFromConsole();
- matrix = new int*[size];
- for (int i = 0; i < size; i++) {
- matrix[i] = new int[size];
- }
- fillMatrixFromConsole(matrix, size);
- outputMatrix(matrix, size);
- return matrix;
- }
- void outputSize(int size) {
- cout << "Введенный размер с файла: " << size << endl;
- }
- void inputSizeFromFile(string path, int& size) {
- cout << "Считывание размера..." << endl;
- ifstream fin(path);
- fin >> size;
- if (fin.fail() or (size < 3)) {
- cout << "Ошибка ввода размера! Введите размер с клавиатуры." << endl;
- size = inputSizeFromConsole();
- }
- else {
- outputSize(size);
- }
- fin.close();
- }
- double exceptionRead(int i, int j) {
- bool isNotCorrect;
- double num;
- do{
- isNotCorrect = false;
- cout << "Введите [" << i + 1 << " , " << j + 1 << "] элемент матрицы: " << endl;
- cin >> num;
- if (cin.fail()) {
- cout << "Ошибка ввода!" << endl;
- isNotCorrect = true;
- cin.clear();
- while(cin.get() != '\n');
- }
- } while(isNotCorrect);
- return num;
- }
- void inputMatrixFromFile(string path, int size, int**& matrix) {
- string skipLine;
- cout << "Ввод матрицы.. " << endl;
- ifstream fin(path);
- getline(fin, skipLine);
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- fin >> matrix[i][j];
- if (fin.fail()) {
- cout << "Ошибка ввода элемента с индексами [" << i + 1 << " , " << j + 1 << "]. Введите этот элемент с клавиатуры. " << endl;
- fin.clear();
- fin.ignore(numeric_limits<streamsize>::max(), ' ');
- matrix[i][j] = exceptionRead(i, j);
- }
- }
- }
- fin.close();
- }
- int** inputFromFile(int& size) {
- string path;
- int** matrix;
- cout << "При вводе из файла учтите, что на первой строке написан порядок матрицы, а далее - сама матрица с новой строки." << endl;
- cout << "Введите путь файла с данными: " << endl;
- path = inputPath();
- inputSizeFromFile(path, size);
- matrix = new int*[size];
- for (int i = 0; i < size; i++) {
- matrix[i] = new int[size];
- }
- inputMatrixFromFile(path, size, matrix);
- outputMatrix(matrix, size);
- return matrix;
- }
- bool isFromFile() {
- bool isNotCorrect;
- int chooseNum;
- do {
- isNotCorrect = false;
- cout << "Выберите, откуда вводить данные: 1, если с файла; 0, если с консоли" << endl;
- cin >> chooseNum;
- if (cin.fail() or ((chooseNum != 1) and (chooseNum != 0))) {
- cout << "Ошибка ввода!" << endl;
- isNotCorrect = true;
- cin.clear();
- while(cin.get() != '\n');
- }
- } while(isNotCorrect);
- return (chooseNum == 1);
- }
- int** chooseInput(int& size) {
- int** matrix;
- if (isFromFile()) {
- matrix = inputFromFile(size);
- }
- else {
- matrix = inputFromConsole(size);
- }
- return matrix;
- }
- int main() {
- system("chcp 1251");
- int** matrix;
- int size;
- int amountOfRows;
- int sum;
- outputTask();
- matrix = chooseInput(size);
- sum = countSum(matrix, size);
- outputAnswer(sum);
- for (int i = 0; i < size; ++i) {
- delete[] matrix[i];
- }
- delete[] matrix;
- cin;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement