Помогите пожалуйста со вставкой
Всем привет, нужна помощь со вставкой. Программа должна вставить столбец в конец массива, после последнего столбца, аналогичным образом вставить строку. При этом они должны состоять из максимальных элементов той строки или столбца, после которого они стоят. Проблема такова: почему-то отказывается работать функция add_row хотя add column прекрасно работает. А так же не понимаю как сделать что бы вставленные строка или столбец состояли из максимального элемента, и как его найти. Заранее спасибо!
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <stdio.h>
using namespace std;
int** get_empty_array(int n, int m)
{
int **arrDouble;
arrDouble = new int* [n];
for (int i = 0; i < n; i++)
{
arrDouble[i] = new int [m];
}
for (int i = 0; i < n; i++)
{
for (int k = 0; k < m; k++)
{
arrDouble[i][k] = 0;
}
}
return arrDouble;
}
int** get_array(int n, int m)
{
int **arrDouble;
arrDouble = new int* [n];
for (int i = 0; i < n; i++)
{
arrDouble[i] = new int [m];
}
srand(time(0));
for (int i = 0; i < n; i++)
{
for (int k = 0; k < m; k++)
{
arrDouble[i][k] = rand() % 10;
}
}
return arrDouble;
}
void ShowDoubleArray(int** arr,int rows, int cols)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
cout << setw(4) << arr[i][j] << " ";
cout << endl;
}
cout << endl;
}
void add_column(int** &arrDouble, int& rows, int cols, int count = 0)
{
int *temp;
for (int i = 0; i < rows; i++)
{
temp = arrDouble[i];
arrDouble[i] = (int *) malloc((cols+1)*sizeof(int));
for (int k = 0; k < cols; k++)
{
arrDouble[i][k] = temp[k];
}
arrDouble[i][cols] = count;
}
cols++;
}
void add_row(int** &arrDouble, int cols, int& rows, int count = 0)
{
int** temp;
rows++;
temp = arrDouble;
arrDouble = get_empty_array(rows, cols);
for (int i = 0; i < rows-1; i++)
{
for (int k = 0; k < cols; k++)
{
arrDouble[i][k] = temp[i][k];
}
}
for (int i = 0; i < cols; i++)
{
arrDouble[rows-1][i] = count;
}
}
int main()
{
int **arrDouble;
int rows, cols;
cout << "Input rows: "; cin >> rows;
cout << "Input cols: "; cin >> cols;
arrDouble = get_array(rows, cols);
ShowDoubleArray(arrDouble, rows, cols);
add_column(arrDouble, rows, cols);
cols++;
add_row(arrDouble, rows, cols);
rows++;
ShowDoubleArray(arrDouble, rows, cols);
for (int i = 0; i < rows; i++)
{
delete[] arrDouble[i];
}
delete[] arrDouble;
system("pause");
return 0;
}
Ответы (2 шт):
Этот код делает то, что вы хотите. Здесь матрица - это шаблонный класс, параметры шаблона это размер матрицы
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <list>
#include <thread>
#include <vector>
template<int RowSize, int ColumnSize>
class Matrix {
public:
Matrix() {
std::cout << "Please, enter elements for matrix!" << std::endl;
fillMatrix();
}
template<int RowSize2, int ColumnSize2>
bool operator==(Matrix<RowSize2, ColumnSize2> matrix) {
if constexpr (RowSize != RowSize2) {
std::cout << "Row sizes of matrices are different";
return false;
} else if (ColumnSize != ColumnSize2) {
std::cout << "Column sizes of matrices are different";
return false;
} else {
}
}
int getMaxElement() const {
std::vector<int> max_elements_over_all_rows(RowSize);
std::transform(matrix_.begin(), matrix_.end(), max_elements_over_all_rows.begin(), [](const auto& row) {
return *std::max_element(row.begin(), row.end());
});
return *std::max_element(max_elements_over_all_rows.begin(), max_elements_over_all_rows.end());
}
int getMinElement() const {
std::vector<int> max_elements_over_all_rows(RowSize);
std::transform(matrix_.begin(), matrix_.end(), max_elements_over_all_rows.begin(), [](const auto& row) {
return *std::min_element(row.begin(), row.end());
});
return *std::min_element(max_elements_over_all_rows.begin(), max_elements_over_all_rows.end());
}
void addRow() {
const auto &last_row = matrix_.back();
addRowWithValue(*std::max_element(last_row.begin(), last_row.end()));
}
void addColumn() {
std::vector<int> last_column(RowSize);
std::transform(matrix_.begin(), matrix_.end(), last_column.begin(), [](const auto& row) {
return row.back();
});
addColumnWithValue(*std::max_element(last_column.begin(), last_column.end()));
}
private:
std::vector<std::vector<int>> matrix_ = std::vector<std::vector<int>>(RowSize, std::vector<int>(ColumnSize));
void addRowWithValue(int value) {
std::vector<int> addingRow(ColumnSize);
std::fill(addingRow.begin(), addingRow.end(), value);
matrix_.push_back(addingRow);
}
void addColumnWithValue(int value) {
std::for_each(matrix_.begin(), matrix_.end(), [value = value](auto& row) { row.push_back(value); } );
}
void fillMatrix() {
for(int i = 0; i < RowSize; i++) {
for(int j = 0; j < ColumnSize; j++) {
int value;
std::cin >> value;
matrix_.at(i).at(j) = value;
}
}
}
};
int main() {
Matrix<3, 3> matrix;
matrix.addColumn();
matrix.addRow();
return 0;
}
Данное решение прилагается как доработка к коду, представленным автором. К сожалению, полностью сделать код адекватным не удалось да и тем более автор в силу незнания пытается использовать C-style. Пусть так и будет
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <stdio.h>
using namespace std;
int** getZeroFilledMatrix(int n, int m)
{
int **arrDouble;
arrDouble = new int*[n];
for (int i = 0; i < n; i++)
{
arrDouble[i] = new int[m];
}
for (int i = 0; i < n; i++)
{
for (int k = 0; k < m; k++)
{
arrDouble[i][k] = 0;
}
}
return arrDouble;
}
int** getRandomFilledMatrix(int n, int m)
{
int **arrDouble;
arrDouble = new int*[n];
for (int i = 0; i < n; i++)
{
arrDouble[i] = new int[m];
}
srand(time(0));
for (int i = 0; i < n; i++)
{
for (int k = 0; k < m; k++)
{
arrDouble[i][k] = rand() % 10;
}
}
return arrDouble;
}
void printDoubleArray(int** arr, int rows, int cols)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
cout << setw(4) << arr[i][j] << " ";
cout << endl;
}
cout << endl;
}
int getMaxElementOfArray(int* arr, int size) {
if (arr == nullptr || size < 1) {
exit(1);
}
int maxElem = arr[0];
for (int i = 0; i < size; i++) {
if (arr[i] > maxElem) {
maxElem = arr[i];
}
}
return maxElem;
}
int** add_column(int** arrDouble, int rows, int& cols, int count = 0) {
auto extendedByColumnMatrix = getZeroFilledMatrix(rows, cols + 1);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
extendedByColumnMatrix[i][j] = arrDouble[i][j];
}
}
printDoubleArray(extendedByColumnMatrix, rows, cols + 1);
cols++;
for (int i = 0; i < rows; i++) {
extendedByColumnMatrix[i][cols-1] = getMaxElementOfArray(arrDouble[i], cols-1);
}
printDoubleArray(extendedByColumnMatrix, rows, cols);
for (int i = 0; i < rows; i++) {
delete arrDouble[i];
}
delete arrDouble;
arrDouble = nullptr;
return extendedByColumnMatrix;
}
int** add_row(int** arrDouble, int& rows, int cols, int count = 0) {
auto extendedByRowMatrix = getZeroFilledMatrix(rows + 1, cols);
printDoubleArray(arrDouble, rows, cols);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
extendedByRowMatrix[i][j] = arrDouble[i][j];
}
}
printDoubleArray(extendedByRowMatrix, rows + 1, cols);
for (int i = 0; i < cols; i++) {
auto elementOfColumn = new int[cols];
for (int j = 0; j < rows; j++) {
elementOfColumn[i] = arrDouble[j][i];
}
extendedByRowMatrix[rows][i] = getMaxElementOfArray(elementOfColumn, cols);
delete elementOfColumn;
elementOfColumn = nullptr;
}
rows++;
for (int i = 0; i < rows - 1; i++) {
delete arrDouble[i];
}
delete arrDouble;
arrDouble = nullptr;
return extendedByRowMatrix;
}
int main()
{
int **arrDouble;
int rows, cols;
cout << "Input rows: "; cin >> rows;
cout << "Input cols: "; cin >> cols;
arrDouble = getRandomFilledMatrix(rows, cols);
printDoubleArray(arrDouble, rows, cols);
arrDouble = add_column(arrDouble, rows, cols);
arrDouble = add_row(arrDouble, rows, cols);
printDoubleArray(arrDouble, rows, cols);
for (int i = 0; i < rows; i++)
{
delete[] arrDouble[i];
}
delete[] arrDouble;
system("pause");
return 0;
}