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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 53, средняя оценка - 4.74
fluxx
4 / 4 / 1
Регистрация: 31.03.2011
Сообщений: 34
#1

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

15.04.2011, 07:55. Просмотров 6463. Ответов 6
Метки нет (Все метки)

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();   
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2011, 07:55     Динамическое выделение памяти под двумерный массив
Посмотрите здесь:

C++ Динамическое выделение памяти под объект
Динамическое выделение памяти под двумерный массив C++
Выделение памяти под двумерный массив C++
Выделение памяти под двумерный массив С++ C++
C++ Выделение памяти под двумерный массив
Динамическое выделение памяти под структуру C++
Динамическое выделение памяти под массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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++ Выделение памяти под динамический двумерный массив в структуре
Динамическое выделение памяти под массив структур (new/delete) C++
Двумерный Массив,динамическое выделение памяти-ошибка C++

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

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

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