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

Динамическая память - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
student-zki09
0 / 0 / 0
Регистрация: 11.02.2010
Сообщений: 4
11.02.2010, 07:13     Динамическая память #1
Кто сможет помочь?
Дана матрица А[N][M]. Упорядочить элементы каждой строки в порядке не убывания.
(нужно составить 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
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
/*Дана матрица А[N,M]. Упорядочить элементы каждой строки в порядке неубывания*/
#include <conio.h>
#include<iostream>
#include<cstdlib>                               //использование индексов
using namespace std;
int main()
{
    
    int n,m,  //число строк и число столбцов
        i,j, //индексы
        d,    //вспомогательная переменная перестановки
        fl; //флаг перестановки
    int    **a;  //указатель на массив А[][]
    
        
    cout<<"Sozdaem matricu A[n,m]\n"<<"Vvedite chislo strok: n = ";cin>>n;
    cout<<"\n"<<"Vvedite chislo stolbcov: m = "; cin >> m; cout<<"\n";
 
    a=new int *[n]; //выделение памяти по двумерный массив
 
    for(i=0;i<n;i++)
    {
        a[i]=new int[m]; //выделение памяти под строку матрицы
        for(j=0;j<m;j++)
            a[i][j]=(-40 + rand()%90);//присвоение матрице случайных чисел
    }
                                                   //cin>>a[i][j];
    cout<<"Sformirovannaja matrica A[N,M]:\n";
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
           cout<<" "<<a[i][j];
           cout<<"\n";
    }
    do
    {
        fl=1;  //флаг поднят
    for(i=0;i<n;i++)
        {
            for(j=0;j<m-1;j++)
                if(a[i][j]>a[i][j+1])
                {
                    fl=0; //флаг опущен
                    d=a[i][j];
                    a[i][j]=a[i][j+1];
                    a[i][j+1]=d;
 
                }
        }
    }
    while(!fl); //пока флаг поднят делаем цикл
        
    cout<<"\n"<<"Posle perestanovki elementov v strokah massiv = \n";
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
           cout<<" "<<a[i][j];
           cout<<"\n";
    }
 
    //освобождение памяти
 
    for(i=0;i<n;i++)
    delete a[i];
    delete []a;
    
    getch();
  
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2010, 07:13     Динамическая память
Посмотрите здесь:

C++ Динамическая память
Динамическая память C++
Динамическая память C++
C++ Динамическая память
C++ Динамическая память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
11.02.2010, 13:40     Динамическая память #2
Цитата Сообщение от student-zki09 Посмотреть сообщение
Одна с индексами, а другая через указатели
Это как?
Во втором случае требуется использовать int* вместо int**? Тогда вместо a[i][j] нужно будет написать a[i*n + j].

Или же вместо a[i][j] требуется использовать что-то наподобие:
C++
1
2
3
d=*(*(a+i)+j);
*(*(a+i)+j)=*(*(a+i)+(j+1));
*(*(a+i)+(j+1))=d;
student-zki09
0 / 0 / 0
Регистрация: 11.02.2010
Сообщений: 4
11.02.2010, 17:58  [ТС]     Динамическая память #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
*Дана матрица А[N,M]. Упорядочить элементы каждой строки в порядке неубывания*/
#include <conio.h>
#include<iostream>
#include<cstdlib>
 
using namespace std;
void main()
{
    
    int n,m, //число строк и число столбцов
        i, //индексы
        d,    //вспомогательная переменная перестановки
        fl; //флаг перестановки
    int *a,*ptr;  //указатель на массив А[][]
    
        
    cout<<"Sozdaem matricu A[n,m]\n"<<"Vvedite chislo strok: n = ";cin>>n;
    cout<<"Sozdaem matricu A[n,m]\n"<<"Vvedite chislo stolbcov: m = ";cin>>m;
 
    a=new int[n*m]; //выделение памяти по двумерный массив
   
    for(i=0,ptr=a;i<n*m;ptr++,i++)
    {
            *ptr=(-3 + rand()%10);
            
        
                                                        
    }
 
                                       
    
    cout<<"Sformirovannaja matrica A[N,M]:\n";
    for(i=0,ptr=a;i<n*m;ptr++,i++)
    {
       if(i%m==0)
           cout<<"\n"; 
       cout<<"  "<<*ptr;
    }
    
    do
    {
        fl=1;  //флаг поднят
    for(i=1,ptr=a;i<n*m;ptr++,i++)
        {
                        
            if(*ptr > *(ptr+1))
                {
                    fl=0; //флаг опущен
                    d=*ptr;
                    *ptr=*(ptr+1);
                    *(ptr+1)=d;
 
                }
            
            
        }
     }
    
    while(!fl); //пока флаг поднят делаем цикл
        
    cout<<"\n"<<"Posle perestanovki elementov v strokah massiv = \n";
    for(i=0,ptr=a;i<n*m;ptr++,i++)
    {if(i%m==0)
           cout<<"\n";
           cout<<"  "<<*ptr;
    }
 
    //освобождение памяти
 
 
 
    delete []a;
getch();
  
    }
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
12.02.2010, 06:49     Динамическая память #4
Это условие нужно немного усложнить:
C++
1
if((*ptr > *(ptr+1)) && (i%m!=0))
Вроде бы так.
student-zki09
0 / 0 / 0
Регистрация: 11.02.2010
Сообщений: 4
12.02.2010, 07:03  [ТС]     Динамическая память #5
блин....вот я тупил....оказывается все просто....а я думал код неправильно составил, а надо было только добавить (i%m!=0).... все заработало....
не подскажите ...какие помимо этого метода еще есть методы работы с указателями?
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
12.02.2010, 07:23     Динамическая память #6
Указатель - это всего лишь адрес памяти, ссылка на место хранения данных (либо ссылка на массив ссылок на ... и т. д.). Методы работы - использование трех операций: *, +, -. Обычно используются так, чтобы все было относительно просто и понятно (в данном примере использование еще одного указателя - далеко не очевидный метод работы). Используются в тех случаях, когда стека может не хватить или когда не известен размер используемых данных (что, в принципе, одно и то же). Используются при создании большинства интересных структур: списков, деревьев, графов и т. п. Чрезвычайно полезная вещь при попытке реализовать очень глубокую рекурсию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2010, 07:53     Динамическая память
Еще ссылки по теме:

C++ Динамическая память [new]
C++ Динамическая память с++
Динамическая память C++

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

Или воспользуйтесь поиском по форуму:
student-zki09
0 / 0 / 0
Регистрация: 11.02.2010
Сообщений: 4
12.02.2010, 07:53  [ТС]     Динамическая память #7
спасибо вам вы мне очень помогли
Yandex
Объявления
12.02.2010, 07:53     Динамическая память
Ответ Создать тему
Опции темы

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