Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29

дублирование строки с максимальным элементом двумерного динамического массива

11.07.2021, 18:53. Показов 4722. Ответов 21

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите понять.
Ниже приведен код в котором формируется двумерный динамический массив, затем в нем находится максимальный элемент и строка в которой находится этот максимальный элемент дублируется.
Вот текст задачи из источника:"Сформировать динамический двумерный массив (число строк и столбцов запросить у пользователя). Заполнить случайными числами от 1 до 10. Определить номер строки, содержащей максимальный элемент массива. Продублировать эту строку (вставить после данной строки еще одну такую же).
Каждое действие с двумерным массивом оформить отдельной функцией, вызываемой из main".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<iostream>
#include<cstdlib>
using namespace std;
void init(int **mas, int a, int b){
    for(int i=0;i<a;i++){
        for(int j=0;j<b;j++){
            mas[i][j]=rand()%9+1;
        }
    }
}
void print (int **mas, int a, int b){
    for(int i=0;i<a;i++){
        for(int j=0;j<b;j++){
            cout<<mas[i][j]<<' ';
        }
        cout<<endl;
    }
    cout<<endl;
}
int poisk (int **mas, int a, int b){
    int x=0;
    int max=**mas;//назначение ьаксимальным элементом первый элемент массива(нулевой);
    for(int i=0;i<a;i++){
        for(int j=0;j<b;j++){
            if(mas[i][j]>max){
            max=mas[i][j];//нахождение максимуму массива;
            }
        }
    }
    for(int i=0;i<a;i++){//нахождение номера строки максимального элемента;
        for(int j=0;j<b;j++){
            if(mas[i][j]==max){
            x=i;    
            return x;
            }
        }
    }
}
void doobl (int **&mas, int &a, int b, int x){//здесь происходит формирование нового массива, в котором будет продублированна строка с максимальным элемертом(первая строка где он попадется);
    int **mas1=NULL;
    mas1=new int *[a+1];
    for(int i=0;i<a+1;i++){
        mas1[i]=new int [b];
    }
    int j=0;
    for(int i=0;i<=x;i++){
        mas1[j]=mas[i];
        j++;
    }
    for(int i=x+1;i<a+1;i++){
        mas1[j]=mas[i-1];
        j++;
    }
    delete [] mas;//замена старого массива на новый;
    mas=mas1;
    a=a+1;
}
int main(){
    int a, b, c;//а - это строки, b - это столбцы, с - начальное значение генироатора случайных чисел;
    cin>>a>>b>>c;
    srand(c);
    int **mas=NULL;
    mas=new int *[a];
    for(int i=0;i<a;i++){
        mas[i]=new int [b];
    }
    init(mas,a, b);//ф-ция заполнения массива;
    print(mas, a, b);//распечатка
    int x=0;
    x=poisk(mas, a,b);//приравнивание переменной к номеру строки с максимальным элементом массива;
    cout<<x;//распечатка номера строки с максимальным элементом массива;
    cout<<endl;
    doobl(mas, a, b, x);//ф-ция дублирования строки с максимальным элементом;
    print(mas, a, b);//распечатка измененного массива;
    for(int i=0;i<a;i++){//отчистка выделенной памяти
        delete [] mas[i];//очищение памяти i-той строки;
    }
delete [] mas;//очищение памяти массива указателей
}
Мой компилятор DEV C++. При первых запусках программы, происходило аварийное отключение программы и вывод сообщения "процесс завершен с возвращаемым значением 3221226356"(the process is completed with the return value 3221226356).
Но когда я начал коментировать, и попробовал запустить еще раз, все стало нормально: процесс завершен со значением 0.
В чем может быть причина, может ли быть причиной этого глюк в самой среде разработки.
Попробовал в онлайн компиляторе и там выводится результат каким он и должен быть, но ссообщением "*** Ошибка в". /a.out": двойная ошибка или повреждение (fasttop): 0x0000000000786c60 ***".
То есть все таки где то есть ошибка двойного удаления, как я понимаю.0x0000000000786c60 Это ведь 16тиричный адрес ячейки памяти? и как я понимаю, я отчищаю его два раза. В общем помогите разобраться. и подскажите как в среде разработки во время отладки вычислять такие ошибки.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.07.2021, 18:53
Ответы с готовыми решениями:

Заменить минимальный элемент массива А максимальным элементом массива В, а минимум массива В - максимальным элементом массива А.
Заменить минимальный элемент массива А (5х8) максимальным элементом массива В (7х6), а минимум массива В - максимальным элементом массива...

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

Удаление строки из двумерного динамического массива
Написал код который добавляет в массив структур новый элемент. Но не получается написать функцию void del удаляющую из этого массива...

21
1 / 1 / 0
Регистрация: 05.07.2020
Сообщений: 29
16.07.2021, 22:09  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
2) Здесь вы копируете указатели на ваши одномерные массивы, затирая при этом указатели на массивы выделенные в первом пункте. Т.е. создаете утечку памяти.
подскажите такой момент, видимо я не понимаю многого:
Я снова скопировал свой старый неправильный вариант функции doobl, просто хочу научиться распознавать такие ошибки,
я закоментил е строки где мне не понятно, если можете объясните пожалуйста:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void doobl (int **&mas, int &a, int b, int x){//здесь происходит формирование нового массива, в котором будет продублированна строка с максимальным элемертом(первая строка где он попадется);
    int **mas1=NULL;
    mas1=new int *[a+1];
    for(int i=0;i<a+1;i++){
        mas1[i]=new int [b];//здесь я выделяю память под одномерные массивы
    }
    int j=0;
    for(int i=0;i<=x;i++){
        mas1[j]=mas[i];/*здесь я заполняю эти одномерные массивы, копирую в них значения одномерных массивов старого массива(здесь я наверное не прав, Вы написали - "Затираете", но как понять - затираю?, мне кажется я просто заполняю их значениями, а утечка происходит из-за того что я не очищаю память выделенную под одномерные массивы(как посоветовал товарищ выше for (int i = 0; i < a; i++)
        delete[] mas[i];
delete[] mas;
) так вот правильно я думаю или нет?*/
        j++;
    }
    for(int i=x+1;i<a+1;i++){
        mas1[j]=mas[i-1];
        j++;
    }
    delete [] mas;//замена старого массива на новый;
    mas=mas1;
    a=a+1;
}
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
16.07.2021, 23:04
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
так вот правильно я думаю или нет?
Нет.
Я не хочу повторяться, просто прочитайте еще раз мои предыдущие ответы, там все разъяснено по этому поводу.

Добавлено через 31 минуту
Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
mas1[j]
Вы вообще осознаете, что в mas1[0...a+1] лежат указатели, а не массивы?

Цитата Сообщение от Mirashikgsgyrdh Посмотреть сообщение
"Затираете", но как понять - затираю? мне кажется я просто заполняю их значениями
Заполняете значениями других указателей, из mas.

Утечка возникает именно из-за этого. В строках 4-6 вы выделили память в цикле и записали полученные указатели на эту память в mas1[0...a+1], а затем благополучно стерли эти указатели, записав вместо них указатели из mas[]. Вот и готова утечка, память вы выделяли, а адреса этой памяти потеряли. И теперь ее нельзя освободить.

Я так понимаю, что основная проблема вашего (не)понимания в том, что вы по какой-то причине думаете, что указатель - это массив, и что присваивая указатель - вы присваиваете массив целиком. Естественно это все не так.

Указатель - это переменная для хранения адреса. Точно такая же переменная, как, например, переменная int. Только вместо целочисленных значений как у int, указатель хранит адреса. В данном случае у вас хранятся в указателях адреса начал ваших массивов.
Естественно, если вы написали на бумажке адрес вашей квартиры (массива), и положили бумажку в ящик (в указатель), то перекладывая (или копируя) бумажку из одного ящика в другой, вы саму квартиру никуда не копируете. Правда ведь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.07.2021, 23:04

Переписать все элементы массива, расположенные между максимальным элементом массива и максимальным в обратном порядке.
– Переписать все элементы массива, расположенные между максимальным элементом массива и максимальным в обратном порядке. Создание теста...

Как узнать длину строки у двумерного динамического массива
Выделаю память для строк столбцов массива так: int n=11; int **mas = new int *; Потом каждому столбцу выделаю разное...

Поменять местами строки и столбцы двумерного динамического массива
Добрый день! Такая задача: поменять местами строки и столбцы двумерного динамического массива. Соответственно rows и cols пользователь...

Вычислить разницу между максимальным элементом массива А и минимальным элементом массива В
Вычислить Н = (Хмах - умений) / 2, где Хмах - максимальный элемент массива Х (15); Умений - минимальный элемент массива В (10).

Удалить строки из двумерного динамического массива, которые удовлетворяют определенным условиям
Подскажите, пожалуйста, как удалить строки из двумерного динамического массива, которые удовлетворяют определенным условиям??


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru