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

переделать под использаовние указателей - C++

Восстановить пароль Регистрация
 
Kelheor
1 / 1 / 0
Регистрация: 16.03.2010
Сообщений: 9
09.06.2010, 18:29     переделать под использаовние указателей #1
Здравствуйте, дамы и господа!
Задача программы тривиальна и хрестоматийна:
Дана матрица a(m,n) из 0 и 1. Найти в ней квадратную подматрицу из одних единиц максимального размера
Решил ее следующим путем:
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
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
const int inf=100;
int mx[inf][inf];
int i,j,m,n,maxDim;
int min(int a,int b,int c)
{
    if(a<b && a<c)
        return a;
    else
        if(b<a && b<c)
            return b;
        else
            if(c<a && c<b)
                return c;
}
void gen_m()//рандомно генерим матрицу размера м*н
{
    cout<<"razmer\t";
    cin>>m>>n;
    srand(time(0));
    for (i=0;i<m;i++)
    {
        cout<<endl;
        for(j=0;j<n;j++)
        {
            mx[i][j]=rand()%(-2)+0;
            cout<<mx[i][j]<<"\t";
        }
    }
}
void minor()//находим размер квадратной матрицы макс.размера.
{
    maxDim=0;
    for(i=m-1;i>0;i--)
    {
        for(j=n-1;j>0;j--)
        {
            if (mx[i][j]!=0)
            {
                mx[i][j]=min(mx[i][j+1],mx[i+1][j+1],mx[i+1][j])+1;
                if (mx[i][j]>maxDim) maxDim=mx[i][j];
            }
        }
    }
    cout<<maxDim;
}
void main()
{
    gen_m();
    minor();
    getch();
}
Проблема в том, что лаба идет под темой "указатели" и соответственно нужно использовать именно указатели..
переделывал так но не пашет(плохо тему усваиваю)
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
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;
int **mx,i,j,n,m;
 
 
void inp_mx(int **a)
{
    cout<<"enter number of rows and colunms:\t";
    cin>>n>>m;
    a=new int *[n];
    srand(time(0));
    for(i=0;i<n;i++)
    {
        a[i]=new int [m];
        for(j=0;j<m;j++)
        {
            a[i][j]=rand()%(-2)+0;
        }
    }
    //vuvidm-ci
    for(i=0;i<n;i++)
    {
        cout<<"\n\n";
        for(j=0;j<m;j++)
        {
            cout<<a[i][j]<<"\t";
        }
    }
        int maxDim=0;
    for (i=n-1;i>0;i--)
    {
        for(j=m-1;j>0;j--)
        { 
            if(a[i][j]!=0)
                {
                    a[i][j]=min(a[i+1][j],a[i+1][j+1],a[i][j+1])+1;
                    if (a[i][j]>maxDim)a[i][j]=maxDim;
            }
        }
    }
    cout<<maxDim;
}
int min(int a,int b,int c)
{
if(a<b && a<c)
return a;
else
if(b<c && b<a)
return b;
else if(c<b && c<a)return c;
}
 
void main()
{
    inp_mx(mx);
    getch();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Андрейка
407 / 211 / 22
Регистрация: 25.03.2009
Сообщений: 710
09.06.2010, 20:08     переделать под использаовние указателей #2
Kelheor,
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
#include <iostream>
 
void input(int **arr, const size_t N, const size_t M)
{
    std::cout << "fill the matrix" << std::endl;
 
    for (size_t i = 0 ; i < N ; i++)
        for (size_t j = 0 ; j < M ; j++)
            std::cin >> arr[i][j];
}
 
 
 
void output(int **arr, const size_t N, const size_t M)
{
    std::cout << "the matrix is:" << std::endl;
 
    for (size_t i = 0 ; i < N ; i++)
    {
        for (size_t j = 0 ; j < M ; j++)
            std::cout << arr[i][j] << ' ';
        std::cout << std::endl;
    }
 
}
 
void abrabotka(int **arr, const size_t N, const size_t M)
{
    // на этом месте мог бы быть ваш код...
}
 
int main()
{
    // выделение памяти под двумерный массив, либо статический массив.
    // вызов функций
    return 0;
}
Kelheor
1 / 1 / 0
Регистрация: 16.03.2010
Сообщений: 9
10.06.2010, 00:50  [ТС]     переделать под использаовние указателей #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 <time.h>
using namespace std;
int **mx,i,j,n,m;
 
 
int min(int a,int b,int c)
{
if(a<b && a<c)
    return a;
    else
        if(b<c && b<a)
            return b;
    else 
        if(c<b && c<a)
            return c;
}
 
void input(int **arr)
{
        cout << "fill the matrix" <<endl;
        srand(time(0));
        for (i=0 ; i < n ; i++)
        {
                for ( j = 0 ; j < m ; j++)
                {
                    arr[i][j]=rand()%(-2)+0;
                }
        }
}
 
void minor(int **arr)
{
    int maxDim=0;
        for (i=n-1;i>0;i--)
        {
                for(j=m-1;j>0;j--)
                { 
                        if(arr[i][j]!=0)
                                {
                    arr[i][j]=min(arr[i+1][j], arr[i+1][j+1], arr[i][j+1])+1;
                                        if (arr[i][j]>maxDim)maxDim=arr[i][j];
                        }
                }
        }
        cout<<maxDim;
}
 
 
void output(int **arr)
{
        cout << "the matrix is:" <<endl;
         for (i=0;i<n;i++)
        {
              for ( j=0 ; j < m ; j++)
                        cout << arr[i][j] << '\t';
                        cout << endl;
        }
 
}
 
 
void main()
{
    cout<<"enter rows and colunms\t";
    cin>>m>>n;
    mx=new int *[];
    for(i=0;i<n;i++)mx[i]=new int[n];
    input(mx);
    output(mx);
    minor(mx);
    getch();
}
}
алгоритм взял с http://algolist.manual.ru/maths/linalg/fmaxeminor.php

Добавлено через 54 секунды
Цитата Сообщение от Kelheor Посмотреть сообщение
int maxDim=0;
* * * * for (i=n-1;i>0;i--)
* * * * {
* * * * * * * * for(j=m-1;j>0;j--)
* * * * * * * * {
* * * * * * * * * * * * if(arr[i][j]!=0)
* * * * * * * * * * * * * * * * {
* * * * * * * * * * * * * * * * * * * * arr[i][j]=min(arr[i+1][j], arr[i+1][j+1], arr[i][j+1])+1;
* * * * * * * * * * * * * * * * * * * * if (arr[i][j]>maxDim)maxDim=arr[i][j];
* * * * * * * * * * * * }
* * * * * * * * }
* * * * }
* * * * cout<<maxDim;
здесь говорит об неправильном доступе к памяти
Андрейка
407 / 211 / 22
Регистрация: 25.03.2009
Сообщений: 710
10.06.2010, 00:52     переделать под использаовние указателей #4
Kelheor, размерность передавайте в функцию, а не делайте её глобальной.
Kelheor
1 / 1 / 0
Регистрация: 16.03.2010
Сообщений: 9
10.06.2010, 01:37  [ТС]     переделать под использаовние указателей #5
И тем не менее.вывел глобальные отдельно.ошибка связана не с размерностью, а с тем что алгоритм рассматривает адреса с неверными значениям.
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 <time.h>
using namespace std;
int **mx,i,j,N,M;
 
 
int min(int a,int b,int c)
{
if(a<b && a<c)
    return a;
    else
        if(b<c && b<a)
            return b;
    else 
        if(c<b && c<a)
            return c;
}
 
void input(int **arr,int m,int n)
{
        cout << "fill the matrix" <<endl;
        srand(time(0));
        for (i=0 ; i < n ; i++)
        {
                for ( j = 0 ; j < m ; j++)
                {
                    arr[i][j]=rand()%(-2)+0;
                }
        }
}
 
void minor(int **arr,int m,int n)
{
    int maxDim=0;
        for (i=n-1;i>0;i--)
        {
                for(j=m-1;j>0;j--)
                { 
                        if(arr[i][j]!=0)
                                {
                    arr[i][j]=min(arr[i+1][j], arr[i+1][j+1], arr[i][j+1])+1;
//вот предидущая строка вызывает ошибку
                                        if (arr[i][j]>maxDim)maxDim=arr[i][j];
                        }
                }
        }
        cout<<maxDim;
}
 
 
void output(int **arr,int m,int n)
{
        cout << "the matrix is:" <<endl;
         for (i=0;i<n;i++)
        {
              for ( j=0 ; j < m ; j++)
                        cout << arr[i][j] << '\t';
                        cout << endl;
        }
 
}
 
 
void main()
{
    cout<<"enter rows and colunms\t";
    cin>>M>>N;
    mx=new int *[];
    for(i=0;i<N;i++)mx[i]=new int[N];
    input(mx,M,N);
    output(mx,M,N);
    minor(mx,M,N);
    getch();
}
может рандомом 0 или 1 неправильно задал?
хотя внешне выдает 0 и 1

Добавлено через 12 минут
Все! Спасибо за помощь!нашел ошибку: в массиве во время просмотра елемент берется не n-1 а n-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
70
71
72
73
74
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;
int **mx,i,j,N,M;
 
 
int min(int a,int b,int c)
{
if(a<b && a<c)
    return a;
    else
        if(b<c && b<a)
            return b;
    else 
        if(c<b && c<a)
            return c;
}
 
void input(int **arr,int m,int n)
{
        cout << "fill the matrix" <<endl;
        srand(time(0));
        for (i=0 ; i < n ; i++)
        {
                for ( j = 0 ; j < m ; j++)
                {
                    arr[i][j]=rand()%(-2)+0;
                }
        }
}
 
void minor(int **arr,int m,int n)
{
    int maxDim=0;
        for (i=n-2;i>0;i--)
        {
                for(j=m-2;j>0;j--)
                { 
                       if(arr[i][j]!=0)
                                {
                        arr[i][j]=min(arr[i+1][j], arr[i+1][j+1], arr[i][j+1])+1;
                                    if (arr[i][j]>maxDim)maxDim=arr[i][j];
                }
                }
        }
        cout<<maxDim;
}
 
 
void output(int **arr,int m,int n)
{
        cout << "the matrix is:" <<endl;
         for (i=0;i<n;i++)
        {
              for ( j=0 ; j < m ; j++)
                        cout << arr[i][j] << '\t';
                        cout << endl;
        }
 
}
 
 
void main()
{
    cout<<"enter rows and colunms\t";
    cin>>M>>N;
    mx=new int *[];
    for(i=0;i<N;i++)mx[i]=new int[N];
    input(mx,M,N);
    output(mx,M,N);
    minor(mx,M,N);
    getch();
}
Yandex
Объявления
10.06.2010, 01:37     переделать под использаовние указателей
Ответ Создать тему
Опции темы

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