Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <iomanip> // для более красивого вывода матриц используем setw(n) https://docs.microsoft.com/ru-ru/cpp/standard-library/iomanip-functions?view=msvc-170#setw
- #include <vector> // https://ravesli.com/urok-95-vvedenie-v-std-vector-vektory/
- /*
- * Массив нужен, когда мы точно знаем, сколько элементов нам нужно в нём сохранить.
- Вектор же является динамическим массивом по сути, потому что он может расширяться и уменьшаться по мере надобности.
- к тому же двуменый массив нельзя передавать в функцию, нужно что-то "изобретать".Поэтому воспользуемся более удобным
- */
- typedef std::vector<std::vector<int>> DMatrix; // http://www.c-cpp.ru/books/typedef Создали себе новый тип данных вектор векторов
- // теперь вы можете использовать DMatrix каждый раз когда захотите объявить двумерный массив
- // подробнее про объявление и определение
- // https://ravesli.com/urok-19-predvaritelnoe-obyavlenie-i-prototip-funktsii/#toc-3
- void MatrixAdder(DMatrix const& A, DMatrix const& B, DMatrix& res);
- DMatrix MatrixGenerator(int N, int M);
- void MatrixPrinter(DMatrix& A);
- //Объявим и инициализируем глобальные двумерные массивы, пригодятся для отладки
- DMatrix Matrix_1 = {{1,2,3},{4,5,6}};
- DMatrix Matrix_2 = {{4,4},{7,5}};
- // инициализировать можно как обычные массивы. Обратите внимание на то как вложены скобки друг в друга
- /*
- * {
- {1,2,3},
- {4,5,6}
- }
- матрица 2х3
- */
- int main()
- {
- // объявляем А,В и заполняем данными с помощью MatrixGenerator(N,M)
- DMatrix A = MatrixGenerator(2, 2);
- DMatrix B = MatrixGenerator(2, 2);
- // объявляем C, чтобы хранить тут что-то. В нашем случае сумму А+В
- DMatrix C;
- // передаем А,В,С в функцию для суммирования. Обратите внимание она ничего не возвращает!
- // передает АДРЕС, поэтому будет изменен непосредственно С
- MatrixAdder(A, B, C);
- // выводим в консоль
- MatrixPrinter(C);
- }
- DMatrix MatrixGenerator(int N, int M) {
- DMatrix C;
- C.resize(N);
- for (int i = 0; i < C.size(); i++) {
- C[i].resize(M);
- for (int j = 0; j < C[i].size(); j++) {
- C[i][j] = rand() % 10;
- }
- }
- MatrixPrinter(C);
- return C;
- }
- void MatrixPrinter(DMatrix& A) {
- for (int i = 0; i < A.size(); i++) {
- for (int j = 0; j < A[i].size(); j++) {
- std::cout << std::setw(3) << A[i][j];
- }
- std::cout << std::endl;
- }
- std::cout << std::endl;
- }
- /*
- vector очень удобен, потому что мы можем использовать методы/функции заложенные в его реализацию.
- ниже мы используем .resize(n) .size()
- .resize(n) - С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
- • resize(n): оставляет в векторе n первых элементов.
- Если вектор содержит больше элементов, то его размер усекается до n элементов.
- Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
- • resize(n, value): также оставляет в векторе n первых элементов.
- Если размер вектора меньше n, то добавляются недостающие элементы со значением value
- .size() - возвращает количество элементов
- https://en.cppreference.com/w/cpp/container/vector
- https://metanit.com/cpp/tutorial/7.4.php
- Не забывайте про (), это неотъемлемый атрибут функции/методы!
- Функции, определенные внутри класса, называются методами.
- */
- /*
- матрицу с типом данных DMatrix и именем res мы усекаем / расширяем до размера матрицы А.
- Если матрица А выглядит как Matrix_1? т.е. имеет размер 2х3, то A.size() вернет 2 - кол-во строк.
- ведь DMatrix это ВЕКТОР векторов, вот мы и узнаем сколько векторов содежит ВЕКТОР.
- Обратившись А[0].size() мы узнаем какой длины вектор из которых состоит ВЕКТОР, т.е. кол-во столбцов.
- ВЕКТОР векторов из целых чисел с именем
- typedef std::vector <std::vector <int>> DMatrix;
- Обращаться к элементам также как и к массивам с помощью [][]
- */
- // & - оператор адреса https://ravesli.com/urok-80-ukazateli-vvedenie/ Передаем не объект, а ссылку на него!
- void MatrixAdder(DMatrix const& A, DMatrix const& B, DMatrix& res)
- {
- res.resize(A.size()); // меняем размер res до размеров А
- for (int i = 0; i < A.size(); i++)
- {
- res[i].resize(A[i].size()); // меняем размер каждой строки res до размеров строки А
- for (int j = 0; j < A[i].size(); j++)
- res[i][j] = A[i][j] + B[i][j];
- }
- }
Add Comment
Please, Sign In to add comment