Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/37: Рейтинг темы: голосов - 37, средняя оценка - 4.92
fluxx
4 / 4 / 2
Регистрация: 31.03.2011
Сообщений: 34
1

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

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

Динамическое выделение памяти под двумерный массив
Здравствуйте. Как мне правильно и грамотно (!) выделять память под двумерные массивы? Откуда...

Динамическое выделение памяти под двумерный массив
Нужно написать программу, динамически выделяем память под двумерный массив, функции ввода-вывода,...

Двумерный Массив,динамическое выделение памяти-ошибка
Здравствуйте! Не могу найти ошибку в программе, некорректно работает именно с динамическим...

Создать двумерный массив, использовав динамическое выделение памяти
int n=4; double **a = new double* ; for (int i = 0; i &lt; n+1; i++) { a=new double;//ошибка...

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

6
kravam
быдлокодер
1711 / 898 / 105
Регистрация: 04.06.2008
Сообщений: 5,586
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
0
fluxx
4 / 4 / 2
Регистрация: 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

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

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

Вот когда так по всем этим строчкам пробежишься, у тебя будет количество нужных строк и их номера.
Вот и кропай из них новый массив.
0
fluxx
4 / 4 / 2
Регистрация: 31.03.2011
Сообщений: 34
15.04.2011, 13:42  [ТС] 5
А можно на примере пожалуйста.
На словах ничего непонятно что вы имеете ввиду.
0
kravam
быдлокодер
1711 / 898 / 105
Регистрация: 04.06.2008
Сообщений: 5,586
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, не меньше!"
2
fluxx
4 / 4 / 2
Регистрация: 31.03.2011
Сообщений: 34
15.04.2011, 15:02  [ТС] 7
kravam, спасибо за помощь!!!
0
15.04.2011, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2011, 15:02

Динамическое выделение памяти под массив
Я хочу функцию использовать пару раз, количество команд будет уменьшаться, и &quot;n&quot; надо менять. Как...

Динамическое выделение памяти под массив int
плиз хелп Написать функцию getPrimes, которая принимает массив типа int и его размер. Функция...

Динамическое выделение памяти под массив структур (new/delete)
Люди добрые, подскажите пожалуйста, где в моем коде закралась ошибка? Интернет перечитал, во всех...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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