Проблема с обработкой матрицы из текстового файла

240
09 декабря 2021, 16:40

Вообще дано такое задание:

И вроде как я знаю, как записать в другой текстовый файл количество положительных, отрицательных чисел и т.д. Непонятно только то, как начать работать с матрицей из текстового файла. Кто подскажет, буду благодарен.

Вот мой первоначальный код (где, собственно, ничего ещё нет):

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    setlocale(LC_ALL, "");
    ifstream file1("C:\\Это папка\\Матрица.txt");
    ofstream file2("C:\\Это папка\\Готовая матрица.txt", ios::app);
    file1.close();
    file2.close();
    cin.get();
}

P.S.: Ну вот, кстати, как указывать позиции (наибольшего отрицательного и наименьшего положительного значений, к примеру) я тоже не знаю, так что если кто подскажет, как это реализовать, отдельное вам спасибо.

Answer 1

Вот костыльное решение, Тут все кроме вывода в файл результатов.

Это уж сделайте сами

P.S. "наибольшее и наименьшее отрицательное" - минимум то уже есть!

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <numeric>
decltype(auto) get_data(std::string file_name) {
    static std::vector<int> v;
    std::ifstream in{file_name};
    for(std::string line; std::getline(in, line);) {
        std::istringstream ss{line};
        int n{0};
        while(ss >> n) {
            if (ss.fail()) {
                ss.clear();
                abort(); // обработку пилите сами
             }
             v.push_back(n);
        }
    }
    return v;
}

int main() {
    auto v{get_data("m")};
    auto min_max{std::minmax_element(std::begin(v), std::end(v))};
    std::cout << "min : " << *min_max.first  << " min pos : " << std::distance(std::begin(v), min_max.first) << std::endl;
    std::cout << "max : " << *min_max.second << " max pos : " << std::distance(std::begin(v), min_max.second) << std::endl;
    auto average{static_cast<double>(std::accumulate(std::begin(v), std::end(v), 0)) / v.size()};
    std::cout << "average : " << average << std::endl;
    unsigned int neg_count{0}, pos_count{0}, zero_count{0};
    auto f{[&](const int& i){i >= 0 ? (i == 0 ? ++zero_count : ++pos_count) : ++neg_count;}};
    std::for_each(std::begin(v), std::end(v), f);
    std::cout << "pos : " << pos_count << std::endl;
    std::cout << "zero : " << zero_count << std::endl;
    std::cout << "neg : " << neg_count << std::endl;
    return 0;
}
Answer 2

Формат входного файла:

N M
a00 a01 ... a0M
...
aN0 aN1 ... aNM

Пример входного файла input.txt:

5 4
2 2 3 -14
-1 2 3 1
12 0 1 -8
2 2 2 2
5 -3 2 0

Программа:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int findZeros(int** matrix, int n, int m) {
    int s = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matrix[i][j] == 0) {
                s++;
            }
        }
    return s;
}
int findPositive(int** matrix, int n, int m) {
    int s = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matrix[i][j] > 0) {
                s++;
            }
        }
    return s;
}
int findNegative(int** matrix, int n, int m) {
    int s = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matrix[i][j] < 0) {
                s++;
            }
        }
    return s;
}
int summ(int** matrix, int n, int m) {
    int s = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
                s=s+matrix[i][j];
        }
    return s;
}
void findMax(int** matrix, int n, int m, int &x, int &y) {
    x = 0;
    y = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matrix[i][j] > matrix[x][y]) {
                x = i;
                y = j;
            }
        }
}
void findMin(int** matrix, int n, int m, int &x, int &y) {
    x = 0;
    y = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matrix[i][j] < matrix[x][y]) {
                x = i;
                y = j;
            }
        }
}
void findMaxNegative(int** matrix, int n, int m, int &x, int &y) {
    int doWeSeeNegativeBefore = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matrix[i][j] < 0) {
                if (doWeSeeNegativeBefore == 0) {
                    doWeSeeNegativeBefore = 1;
                    x = i;
                    y = j;
                }
                else 
                    if (matrix[i][j] > matrix[x][y]) {
                    x = i;
                    y = j;
                }
            }
        }
}
void findMinPositive(int** matrix, int n, int m, int &x, int &y) {
    int doWeSeePositiveBefore = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matrix[i][j] > 0) {
                if (doWeSeePositiveBefore == 0) {
                    doWeSeePositiveBefore = 1;
                    x = i;
                    y = j;
                }
                else
                    if (matrix[i][j] < matrix[x][y]) {
                        x = i;
                        y = j;
                    }
            }
        }
}

int main()
{
    setlocale(LC_ALL, "");
    string inputFile = "input.txt";
    string outputFile = "output.txt";
    int n, m;
    ifstream file{ inputFile};
    file >> n >> m;

    int **array= new int*[n];
    for (int i = 0; i < n; i++) {
        array[i] = new int[m];
    }
    for (int i=0;i<n;i++)
        for (int j = 0; j < m; j++)
        {
            file >> array[i][j];
        }
    cout << "Массив: " << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
        {
            cout << array[i][j] << " ";
        }
        cout << endl;
    }

    file.close();
    ofstream out{ outputFile };
    out << "Количество положительных= " << findPositive(array, n, m) << endl;
    out << "Количество отрицательных= " << findNegative(array, n, m) << endl;
    out << "Количество нулей= " << findZeros(array, n, m) << endl;
    out << "Среднее арифметическое= " << (float)summ(array, n, m)/(n*m) << endl;
    int rowMax,colMax,rowMin,colMin;
    findMax(array, n, m, rowMax, colMax);
    findMin(array, n, m, rowMin, colMin);
    out << "Максимальный= " << array[rowMax][colMax] << " в строке " << rowMax << " в стролбце " << colMax << endl;
    out << "Минимальный= " << array[rowMin][colMin] << " в строке " << rowMin << " в стролбце " << colMin << endl;
    findMaxNegative(array, n, m, rowMax, colMax);
    findMinPositive(array, n, m, rowMin, colMin);
    out << "Максимальный отрицательный= " << array[rowMax][colMax] << " в строке " << rowMax << " в стролбце " << colMax << endl;
    out << "Минимальный положительный= " << array[rowMin][colMin] << " в строке " << rowMin << " в стролбце " << colMin << endl;

    out.close();
    cin.get();
}

Пример выходного файла output.txt:

Количество положительных= 14
Количество отрицательных= 4
Количество нулей= 2
Среднее арифметическое= 0.75
Максимальный= 12 в строке 2 в стролбце 0
Минимальный= -14 в строке 0 в стролбце 3
Максимальный отрицательный= -1 в строке 1 в стролбце 0
Минимальный положительный= 1 в строке 1 в стролбце 3
Answer 3

Прочитать как текст,потом парсить каждый токен,число или скобку,например с помощью стека-свертки,внести все это в матрицу программы и обработать ее.

READ ALSO
Вызов основного окна после авторизации с точки зрения MVVM паттерна C# WPF

Вызов основного окна после авторизации с точки зрения MVVM паттерна C# WPF

Подскажите пожалуйста, как вызывать после окна авторизации окно с основным функционалом(дочернее окно), при этом нужно использовать mvvm паттерн

213
Организация возвращаемых значений

Организация возвращаемых значений

Как решаются в проф программировании такие моменты ?

199
Интегрирование методом Монте Карло

Интегрирование методом Монте Карло

Пишу программу для интегрирования методом Монте КарлоС моей перспективы код рабочий, а результаты получаются более менее схожие

99
Вставка PDF-файла на форму. Ошибка Visual Studio 2015. C#

Вставка PDF-файла на форму. Ошибка Visual Studio 2015. C#

Помогите найти решение проблемыПосле того как я пытаюсь перенести на форму с панели элементов Adobe PDF Reader, генерируется ошибка "Сбой при импорте...

177