Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
#1

new , delete (двумерный динамический массив) - C++

03.12.2012, 14:59. Просмотров 3559. Ответов 19
Метки нет (Все метки)

В данном примере рассмотрена задача: в двумерном динамическом массиве , в каждой строке нужно найти максимальное и поменять его знак на противоположный. После чего вывести получившийся массив. Проблем всего 2:
Первая проблема состоит в том, что я не пойму как мне вывести получившийся массив.
А вторая проблема в том , что не могу корректно высвободить память через delete. После 2,3 запусков программа виснет.
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
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <time.h>
using namespace std;
 
int main()
{   
    setlocale(0,"");
    int s=0,m,n, **mas, min, max,d;
    cout<<"Введите количество строк и столбцов матрицы соответственно: "<<endl;
    cin>>m>>n;
    mas = new int * [m];
    for (int i=0; i<n; i++)
        mas[i] = new int [n];
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
        {   
            mas[i][j]= 10 + rand() % 100 ;
            cout<<"\nmassiv["<<i<<"]["<<j<<"] = "<<mas[i][j];     
        }
    }
    
    cout<<"\nВведенный массив:"<<endl;
    cout << "\n";
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
            cout<<mas[i][j]<<"  ";
        cout<<endl;
    }
    
       for (int i=0; i<m; i++) {
        min = max = mas[i][0];
        for (int j=0,s=0; j<n;s++,j++)
        {
            if (max < mas[i][j])
                max = mas[i][j];
            
        }
        
        cout<<" max в стоке "<<i+1<<" = "<<max<<" Обратное: "<< -max<<endl;
 
       }
    
    cout<<"\nПолученный массив массив:"<<endl;
 
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++) 
            cout<<mas[i][j]<<"  ";
            cout<<endl;
        
      
    }
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2012, 14:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос new , delete (двумерный динамический массив) (C++):

Динамический массив структур. Почему данные доступны после выполнения операции delete [] - C++
Всем привет! Выполнил вот такое задание. После того как вывелись данные трех структур, очищаю выделенную область памяти оператором delete...

Двумерный динамический массив - C++
Необходимо ввести с клавиатуры количество строк и столбцов массива(матрица размером N*M), ввести исходные данные. Удалить столбец матрицы,...

Динамический двумерный массив - C++
Если число находится в интервале от 100 до 110, то используя подпрограмму, в матрицах Р(N,M), Q(N1,M1) и R(N2,M2) найти и отпечатать L -...

Двумерный Динамический массив - C++
Здравствуйте, такая проблема: не могу задать int** и char**...проблема в том что в функцию передются их размеры , но они не константы и...

Двумерный динамический массив - C++
Здравствуйте, задание такое: &quot;Описать двумерный массив R целых чисел, размерностью NхM элементов, заполнять массив случайными числами по...

Двумерный динамический массив - C++
Здравствуйте, подскажите пожалуйста где ошибка? реализовал 2 фукнции ввода и вывода массива. #include &lt;iostream&gt; #include &lt;windows.h&gt; ...

19
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.12.2012, 15:33 #2
C++
1
2
3
for (int i = 0; i < M; ++i)
    delete[] arr[i];
delete[] arr;
0
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 15:43  [ТС] #3
Цитата Сообщение от go Посмотреть сообщение
C++
1
2
3
for (int i = 0; i < M; ++i)
    delete[] arr[i];
delete[] arr;
блин все равно виснет и выдает ошибку(цитирую):

<ОС Windows инициировала точку останова в mas.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в mas.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит mas.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки>
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.12.2012, 15:46 #4
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [!!!m!!!];
* * for (int i=0; i<!!!n!!!; i++)
Здесь ошибка, в обоих случаях должна быть одна и тажа переменная. Потом ее и в мой цикл подставте.
0
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 15:56  [ТС] #5
Цитата Сообщение от go Посмотреть сообщение
Здесь ошибка, в обоих случаях должна быть одна и тажа переменная. Потом ее и в мой цикл подставте.
В смысле одна переменная ? подставить m или n ? это имеет значение?
вот так правильно, просто дальше уже идет цикл c m переменной.
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [m];
* * for (int i=0; i<m; i++) (в этой строке заменил n на m)
* * * * mas[i] = new int [n];
* * for (int i=0; i<m; i++)
...

Цитата Сообщение от certykys Посмотреть сообщение
for (int i = 0; i < m; ++i)
* * delete[] mas[i];
delete[] mas;
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
03.12.2012, 16:00 #6
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [m];
* * for (int i=0; i<n; i++)
* * * * mas[i] = new int [n];
Вы создаете массив указателей размером m, а в цикле, при создании уже массивов чисел, идёте от 0 до n.
0
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 16:25  [ТС] #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы создаете массив указателей размером m, а в цикле, при создании уже массивов чисел, идёте от 0 до n.
Правильно ли я понял , что нужно написать от 0 до m? Я создал массив указателей m, соответственно и массив чисел должен идти от 0 до m ? Ни как не догоняю...

Добавлено через 14 минут
Объясни как должно быть , пожалуйста , как мне все таки правильно написать.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
03.12.2012, 16:31 #8
certykys, m это количество указателей на одномерные массивы. То есть, грубо говоря, это количество строк. Вы создаете массив указателей размером m, затем каждому указателю из этого массива, присваиваете уже адрес одномерного массива.
В общем по простому:
**mas - это тип 'указатель на указатель'
Здесь
C++
1
mas = new int * [m];
Вы выделяете память под m элементов типа 'int *', то есть под m элементов типа 'указатель на int'. В итоге у Вас имеется m указателей.
Теперь каждому из этих указателей, нужно присвоить некоторый адрес:
C++
1
2
for (int i=0; i<m; i++)       //проходим по всем указателям, от 0 до m.
        mas[i] = new int [n]; // и присваиваем им адрес выделенной памяти под n элементов типа int.
1
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 16:36  [ТС] #9
Все ясно. Просто я представлял себе это немного иначе. Спасибо.
Но ошибка все равно выходит:
<Необработанное исключение в "0x77c015de" в "mas.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd".>
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
03.12.2012, 16:40 #10
Ваш код рабочий, если исправить описанную Выше ситуацию.
0
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 16:54  [ТС] #11
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
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <time.h>
using namespace std;
 
int main()
{   
    setlocale(0,"");
    int s=0,m,n, **mas, min, max;
    cout<<"Введите количество строк и столбцов матрицы соответственно: "<<endl;
    cin>>m>>n;
    mas = new int * [m];
    for (int i=0; i<m; i++)
        mas[i] = new int [n];
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<n; j++)
        {   
            mas[i][j]= 10 + rand() % 100 ;
            cout<<"\nmassiv["<<i<<"]["<<j<<"] = "<<mas[i][j];     
        }
    }
    
       for (int i=0; i<m; i++) {
        min = max = mas[i][0];
        for (int j=0,s=0; j<n;s++,j++)
        {
            if (max < mas[i][j])
                max = mas[i][j];
        }
        cout<<" max в стоке "<<i+1<<" = "<<max<<" Обратное: "<< -max<<endl;
       }
    cout<<"\nПолученный массив массив:"<<endl;
 
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++) 
            cout<<mas[i][j]<<"  ";
            cout<<endl;
    }
    for (int i = 0; i < m ; ++i) {
    
        delete[] mas[i];
        delete[] mas;
    }
    system("pause");
}
Добавлено через 5 минут
может я чего напутал или это еще от системы зависит , потому что он мне все равно эту ошибку выдает((((((((((((((((((((
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
03.12.2012, 16:58 #12
Строки 16-17
C++
1
2
3
for (int i=0; i<n; i++)
{
    for (int j=0; j<n; j++)
Почему в обоих циклах n?

Добавлено через 1 минуту
Очистку памяти тоже неверно делаешь. Зачем delete[] mas - в цикле?
0
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 17:07  [ТС] #13
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему в обоих циклах n?
так а что там должно стоять?
Понял! Там должно вместо быть в первом цикле m , а во втором n !
или нет?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
03.12.2012, 17:08 #14
Так массив то у тебя не квадратный(n на n), а прямоугольный m на n!!!
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
03.12.2012, 17:11 #15
Ну если у тебя m строк и n столбцов, то ты как думаешь?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2012, 17:11
Привет! Вот еще темы с ответами:

Двумерный динамический массив - C++
Выскакивает ошибка Ошибка C2440 =: невозможно преобразовать &quot;int *&quot; в &quot;int **&quot; ConsoleApplication5 Из-за этого не выполняются...

Двумерный массив (поменять статический массив на динамический) - C++
Нужно поменять статический массив на динамический с выделением памяти #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; ...

Двумерный динамический массив структур - C++
Q **Mas = new Q*; //points for(int i=0; i&lt;size; i++) { Mas = new Q; } while(t&lt;k) { for(double i=0.0; i&lt;q1; i++) ...

Двумерный динамический массив. Разжевать - C++
Для начала. int *array = new int; Инициализируется указатель array - которому присвается адрес переменных типа int, размерностью...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.12.2012, 17:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru