Stack Overflow на русском Asked on January 24, 2021
Даны N – количество строк матрицы, M – количество столбцов матрицы
и сама матрица целых чисел. Добавить строку со всеми 0 после строки
с максимальным элементом
(массив динамический, дополнительных массивов не использовать)
Написал код, но вместо вставки одной строки, обнуляет значение и добавляет строку.
#include <iostream>
using namespace std;
//инициализация массива
int** memory_init(int n, int m) {
int** arr;
arr = new int* [n];
for (int i = 0; i < n; i++)
arr[i] = new int[m];
return arr;
}
//ввод массива
void input(int** arr, int n, int m) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> arr[i][j];
}
// вывод массива
void output(int** arr, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << arr[i][j] << " ";
cout << endl;
}
}
//добавление линии
int** add_line(int** arr, int *n, int m, int ind) {
(*n)++;
arr = (int**)realloc(arr, (*n) * sizeof(int*));
for (int i = *n; i > ind; i--) {
for (int j = 0; j < m; j++) {
//копируем всю строку
arr[i + 1] = arr[i];
}
}
return arr;
}
int main()
{
int** arr, n, m, temp, max_i=0;
cout << "Inpute size of array" << endl;
cin >> n >> m;
arr = memory_init(n, m);
input(arr, n, m);
output(arr, n, m);
temp = arr[0][0];
//находим максимальный элемент
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[i][j] > temp) {
max_i = i;
temp = arr[i][j];
}
}
}
cout << endl;
cout << endl << " max i =" << max_i;
cout << endl << " temp max =" << temp;
arr = add_line(arr, &n, m, max_i);
/* */
//обнуляем значение
for (int j = 0; j < m; j++) {
arr[max_i+1][j] = 0;
}
cout << endl;
output(arr, n, m);
}
У вас в функции add line
есть несколько ошибок
//добавление линии
int** add_line(int** arr, int *n, int m, int ind) {
(*n)++;
arr = (int**)realloc(arr, (*n) * sizeof(int*));
for (int i = *n; i > ind; i--) {
for (int j = 0; j < m; j++) {
//копируем всю строку
arr[i + 1] = arr[i]; \ не используется индекс j,
\просто происходит копирование указателей
\значит и меняться они будут вместе
\как у вас и произошло (обе строчки стали нулями)
\
\также при i = *n, i = *n - 1 происходит выход за границы массива
}
}
return arr;
}
Так же вы смешиваете алокацию памяти в стиле си с алокацией памяти в стиле c++, что не является правильной практикой. Так же вы не освобождаете память в конце. И также возможна утечка памяти при realloc
.
я бы переписал ваш код так
#include <iostream>
using namespace std;
//инициализация массива
int **memory_init(int n, int m) {
int **arr;
arr = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++)
arr[i] = (int*)malloc(m * sizeof(int));
return arr;
}
//ввод массива
void input(int **arr, int n, int m) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> arr[i][j];
}
// вывод массива
void output(int **arr, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << arr[i][j] << " ";
cout << endl;
}
}
//добавление линии
int **add_line(int **arr, int *n, int m, int ind) {
(*n)++;
int** new_arr = (int **)realloc(arr, (*n) * sizeof(int *));
if (new_arr == nullptr) {
(*n)--;
throw std::exception("no memory");
}
arr = new_arr;
arr[(*n) - 1] = (int *)malloc(m * sizeof(int));
for (int i = (*n) - 2; i > ind; i--) {
for (int j = 0; j < m; j++) {
//копируем всю строку
arr[i + 1][j] = arr[i][j];
}
}
return arr;
}
//освобождение памяти
void memory_free(int ** arr, int n, int m) {
for (int i = 0; i < n; i++)
free(arr[i]);
free(arr);
}
int main()
{
int **arr, n, m, temp, max_i = 0;
cout << "Inpute size of array" << endl;
cin >> n >> m;
arr = memory_init(n, m);
input(arr, n, m);
output(arr, n, m);
temp = arr[0][0];
//находим максимальный элемент
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[i][j] > temp) {
max_i = i;
temp = arr[i][j];
}
}
}
cout << endl;
cout << endl << " max i =" << max_i;
cout << endl << " temp max =" << temp;
try {
arr = add_line(arr, &n, m, max_i);
}
catch (exception e) {
memory_free(arr, n, m);
cout << e.what() << endl;
return 0;
}
/* */
//обнуляем значение
for (int j = 0; j < m; j++) {
arr[max_i + 1][j] = 0;
}
cout << endl;
output(arr, n, m);
memory_free(arr, n, m);
return 0;
}
Правда этот код больше похож на код на си, чем на с++. Удобнее было бы не работать с памятью явно, а использовать std::vector
.
Correct answer by Николай Алексеевич Терехов on January 24, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP