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

Динамическое выделение памяти под двумерный массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 53, средняя оценка - 4.74
fluxx
4 / 4 / 1
Регистрация: 31.03.2011
Сообщений: 34
15.04.2011, 07:55     Динамическое выделение памяти под двумерный массив #1
1) Ввести построчно элементы двумерного массива чисел. Количество столбцов задается. Количество строк (не менее 1) равно максимальному по модулю числу из введенной нулевой строки.
2) Из строк исходного массива, в которых не содержатся одинаковые числа сформировать столбцы с элементами в порядке обратном их расположению строках. Вывести построчно сформированный массив.

Суть в том что я не могу заполнить массив так как не выделяется память под строки, со вторым заданием можете не писать оно простое.

Вот что получилось, программа запускается но в процессе выдает ошибку так как память не выделяется под массив...

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
#include<iostream>
#include<conio.h>
#include<cmath>
 
int main()
{
 setlocale(LC_ALL,"Russian");
 int i,k,n,stlb,str=1;
 int &max=str;
 std::cout<<"Ââåäèòå ÷èñëî ñòîëáöîâ: ";
 std::cin>>stlb;
 int **M = new int*[str];
 for(i=0; i<str; i++)
     M[i] = new int[stlb];
 std::cout<<"Ââåäèòå Г¬Г*Г±Г±ГЁГў: "<<std::endl;
 for(i=0;i<str;i++)
    {
        for(k=0;k<stlb;k++)
            std::cin>>M[i][k];
        if(i==0) 
            {
                max=int(std::fabs(M[0][0]));
                for(n=1;n<stlb;n++)
                        if(max < int(std::fabs(M[i][n])))
                            max=int(std::fabs(M[i][n]));
            }
    }
 std::cout<<std::endl;
 for(i=0;i<str;i++)
    {
        for(k=0;k<stlb;k++)
            std::cout<<M[i][k]<<" ";
        std::cout<<std::endl;
    }
 for(i=0; i<str; i++)
    {
     delete M[i];
    }
 delete []M; 
 getch();   
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.04.2011, 09:40     Динамическое выделение памяти под двумерный массив #2
У тебя здесь
C++
1
2
3
4
                max=int(std::fabs(M[0][0]));
                for(n=1;n<stlb;n++)
                        if(max < int(std::fabs(M[i][n])))
                            max=int(std::fabs(M[i][n]));
Неправильно что-то.
ПОсле этого кода проверь значение str, оно окажется больше 1 (каким оно и должно быть)
Это потому, что max всегда указывает на одну и ту же область памяти и изменяя max
ты изменяешь (увеличиваешь) srr
fluxx
4 / 4 / 1
Регистрация: 31.03.2011
Сообщений: 34
15.04.2011, 12:12  [ТС]     Динамическое выделение памяти под двумерный массив #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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<iostream>
#include<conio.h>
#include<cmath>
 
bool proverka(int **M, int i,int stlb)
{
        for(int n=stlb-1;n>=1;--n)
            for(int j=0;j<n;j++)
                if(M[i][n]==M[i][j]) return false;   
        return true;
}
 
int main()
{
 setlocale(LC_ALL,"Russian");
 int **M, *masmax, **mas;
 int i,k,n,j,stlb,str,temp;
 std::cout<<"Ââåäèòå ÷èñëî ñòîëáöîâ: ";
 std::cin>>stlb;
 std::cout<<"Ââåäèòå Г¬Г*Г±Г±ГЁГў: "<<std::endl;
 masmax = new int [stlb];
 for(k=0;k<stlb;k++)
    std::cin>>masmax[k];
 str=int(std::fabs(masmax[0]));
 for(n=1;n<stlb;n++)
     if(str < int(std::fabs(masmax[n]))) str=int(std::fabs(masmax[n]));
 M = new int*[str];
 for(i=0; i<str; i++)
     M[i] = new int[stlb];
 for(i=0;i<str;i++)
    {
        for(k=0;k<stlb;k++)
            {
                if(i==0) M[i][k]=masmax[k];
                else std::cin>>M[i][k];
            }
    }
 std::cout<<std::endl;
 for(i=0;i<str;i++)
    {
        for(k=0;k<stlb;k++)
            std::cout<<M[i][k]<<" ";
        std::cout<<std::endl;
    }
 std::cout<<std::endl;
 mas = new int*[str];
 for(i=0;i<str;i++)
    mas[i]=new int[stlb];
 int h=0;
 for(i=0;i<str;i++)
    {
      if(proverka(M,i,stlb)==true)
        {
          for(j=0;j<stlb;j++) mas[h][j]=M[i][j];
          h++;
          std::cout<<"Г‚ "<<i+1<<" ñòðîêå Г*ГҐГІГі îäèГ*Г*êîâûõ Г·ГЁГ±ГҐГ«"<<std::endl;
        }
      else  std::cout<<"Г‚ "<<i+1<<" ñòðîêå ГҐГ±ГІГј îäèГ*Г*êîâûå Г·ГЁГ±Г«Г*"<<std::endl;  
    }
std::cout<<std::endl;   
for(i=0;i<h;i++)
    {
        for(k=0;k<stlb;k++)
            std::cout<<mas[i][k]<<" ";
        std::cout<<std::endl;
    }
std::cout<<std::endl; 
 
 for(i=0; i<str; i++) delete M[i];
 delete []M; 
 delete []masmax;
 for(i=0; i<str; i++) delete mas[i];
 delete []mas;
 getch();   
}
только теперь новая проблема, не могу сообразить как сделать второй пункт задания а именно сформировать столбцы с элементами в порядке обратном их расположению в строках ( у меня это надо сделать с конечным массивом mas[][])

вот например из этого:
4 5 6
8 9 2

надо получить:
6 2
5 9
4 8

не могу сообразить, подскажите кто пойдет
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.04.2011, 13:30     Динамическое выделение памяти под двумерный массив #4
А чё тут сложного? Есть исходный массив. В нём X строк, вот пробегайся ПО КАЖДОЙ строке на предмет наличия в ней двух одинаковых элементов

Если таких элементов нет, то
1) запоминай номер строки как-нибудь. Например заноси его во ВНОВЬ СОЗДАННЫЙ массив номеров ПОДХОДЯЩИХ строк
2) Количество строк, котороые ты ищешь, это количество столбцов будущего массива, так ведь?
Вот это количество (опять-таки НОВАЯ переменная) при каждом нахождении подходящей строки пусть увеличивается на 1

Вот когда так по всем этим строчкам пробежишься, у тебя будет количество нужных строк и их номера.
Вот и кропай из них новый массив.
fluxx
4 / 4 / 1
Регистрация: 31.03.2011
Сообщений: 34
15.04.2011, 13:42  [ТС]     Динамическое выделение памяти под двумерный массив #5
А можно на примере пожалуйста.
На словах ничего непонятно что вы имеете ввиду.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.04.2011, 14:06     Динамическое выделение памяти под двумерный массив #6
Да без базара
Вот у тебя, допустим, массив A.
Вот пусть в нём N столбцов и M строчек, как ты видишь, N== 4, M== 5

1 2 3 4 5
2 3 4 4 6
1 2 4 5 7
6 7 8 9 4

Так, теперь создай массивчик, который будет содержать номера НУЖНЫХ строчек
C++
1
int nuzn_str [M];
Количество элементов должно быть обязательно M, ну то есть 5, не меньше!

Да, поскольку ты кропаешь новый массив, тебе необходимо в нём количество столбцов
C++
1
int kol_vo_stolbtsov= 0;
Всё, погнали наши городских. Пробегаешься по массиву, по каждой строчке (в цикле, естессно). И если она тебе подходит, заносишь её номер в nuzn_str; "подходит" в даннном случае значит, что в ней нет двух одинаковых элементов. Так, сморим, нулевая подходит? Да, заносим её номер в масив.
nuzn_str[0]= 0;
И помня, что каждая нужная строчка превратися в столбец, ага, увеличиваем количество столбцов на 1
C++
1
kol_vo_stolbtsov++;

Вторая НЕ подходит, там две четвёрки, третья и четвёртая подходит, то есть пишем
C++
1
2
nuzn_str[1]= 3;kol_vo_stolbtsov++;
nuzn_str[2]= 4;kol_vo_stolbtsov++;
Вот и всё, в результате получаем три строчки (kol_vo_stolbtsov== 3)
И их номера, ну то есть схематично так: (решётка это ненужная строка)

1 2 3 4 5
# # # # #
1 2 4 5 7
6 7 8 9 4

Вот и всё. Ну вот когда сделаешь так, тогда можно будет и массив формировать.

Добавлено через 2 минуты
В самам начале я перепутал, так должно быть:

"Вот пусть в нём N столбцов и M строчек, как ты видишь, N== 5, M== 4"

Добавлено через 1 минуту
И здесь:
"Количество элементов должно быть обязательно M, ну то есть 4, не меньше!"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2011, 15:02     Динамическое выделение памяти под двумерный массив
Еще ссылки по теме:

Динамическое выделение памяти под массив C++
Динамическое выделение памяти под двумерный массив C++
C++ Динамическое выделение памяти под массив

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

Или воспользуйтесь поиском по форуму:
fluxx
4 / 4 / 1
Регистрация: 31.03.2011
Сообщений: 34
15.04.2011, 15:02  [ТС]     Динамическое выделение памяти под двумерный массив #7
kravam, спасибо за помощь!!!
Yandex
Объявления
15.04.2011, 15:02     Динамическое выделение памяти под двумерный массив
Ответ Создать тему
Опции темы

Текущее время: 06:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru