Jump to content

Trabalho com matrizes bi dimensionais


RVPF
 Share

Recommended Posts

Boas pessoal, estou a fazer um trabalho para a escola e preciso da vossa ajuda, o programa é para trabalhar com matrizes (inserir, apagar, testar caminhos) e só consegui criar a matriz com esta notação só que preciso de conseguir usar algo como esta notação tabuleiro[linha][coluna].

Alguem me consegue dar uma ajuda? Desculpem ser tão vago mas estou a começar e este trabalho está a chegar ao fim do prazo e nao arranjo solução, tudo o que tento do outro jeito não funciona por falta de espaço em memória e ao fazer o malloc dá erro.

Este código faz o que pretendo mas com um código diferente:

#include <stdio.h>
#include <stdlib.h>
void imprimirTabuleiro(char* tabuleiro, int linhas, int colunas);
void preencherTabuleiro(char* tabuleiro, int linhas, int colunas);
int main()
{
int linhas=0, colunas=0;
char* tabuleiro=NULL;
printf("Introduza o numero de linhas: ");
scanf("%d",&linhas);
printf("Introduza o numero de colunas: ");
scanf("%d",&colunas);
tabuleiro = malloc(sizeof(char) * linhas * colunas);
preencherTabuleiro(tabuleiro, linhas, colunas);
imprimirTabuleiro(tabuleiro, linhas, colunas);
return 0;
}
void imprimirTabuleiro(char* tabuleiro, int linhas, int colunas)
{
int linha=0, coluna=0;
for(linha=0; linha<linhas; linha++)
{
    for (coluna=0; coluna<colunas; coluna++)
    {
        printf("%d ", *(tabuleiro + (linha * colunas) + coluna));
        /** 0*5=0 -> primeira linha + posição **/
    }
    printf("\n ");
}
}
void preencherTabuleiro(char* tabuleiro, int linhas, int colunas)
{
int linha=0, coluna=0,i=0;
for(linha=0; linha<linhas; linha++)
{
    for (coluna=0; coluna<colunas; coluna++)
    {
        *(tabuleiro+(linha*colunas)+coluna)=i;
        i++;
    }
    printf("\n ");
}
}

Desde já obrigado

Edited by thoga31
GeSHi
Link to comment
Share on other sites

HappyHippyHippo

como deves ter percebido, essa notação não está errada.

no entanto, se realmente pretendes aceder aos elementos da metrix de forma dos dois redireccionamentos, o mais fácil seria (por ventura):

#define NLINHAS 20
#define NCOLUNAS 20

char** tabuleiro;

tabuleiro = malloc(sizeof(char*) * NLINHAS);
for (int linha = 0; linha < NLINHAS; linha++)
{
 tabuleiro[linha] = malloc(sizeof(char) * NCOLUNAS);
}

printf("celula 10(linha)x5(coluna) : %d\n", tabuleiro[10][5]);

// NOTA : não esquecer do ciclo de libertação de memória
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sim eu percebi que a notação estava funcional não tinha era a certeza se era uma linguagem correcta para trabalhar com matrizes.

foi mesmo a única maneira que consegui e a que acho mais simples, o único problema é que não sei utilizar quando preciso de algo do tipo tabuleiro[3][2]=qquercoisa

Nesse método (o que postou) tenho dificuldade em perceber que argumentos tenho de passar para trabalhar a matriz noutra função e mais uma duvida com esse método tendo o limite com o define a matriz continua a ser considerada dinâmica?

Desculpa a noobice e obrigado pela ajuda.

Link to comment
Share on other sites

HappyHippyHippo

O tipo de dados que passas para uma funcao e o tipo de dados da declaracao

Agora, se e dinâmica? Depende

de certa forma, uma estrutura alocada será sempre estática, a não ser que essa memória seja manipulada através do realloc, permitindo fazer o "redimensionamento".

por outro lado, existe aquilo a que se chama de estruturas dinâmicas que fica longe deste tipo de implementação.

por isso, chamar esta implementação de estática ou dinâmica, é quase uma questão de gosto.

para mim, é considerado uma implementação estática caso não seja uma estrutura em que o seu redimensionamento não necessita de passar pelo realloc.

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Muito obrigado pela ajuda,

com o código dado acima e com a matéria que aqui tenho consegui fazer o que queria, deixo aqui o código para se fizer jeito a alguém

#include <stdio.h>
#include <stdlib.h>
void imprimirTabuleiro (char** ppTabuleiro, int linhas, int colunas);
void inserir_na_matriz (char** ppTabuleiro, int linhas, int colunas);
void** criamatrix(int linhas, int colunas);
int main()
{
   char** tabuleiro=NULL;
   int linhas = 0, colunas=0;
   printf("Introduza o numero de linhas: ");
   scanf("%d",&linhas);
   printf("Introduza o numero de colunas: ");
   scanf("%d",&colunas);
   tabuleiro=criamatrix(linhas, colunas);
   inserir_na_matriz(tabuleiro, linhas, colunas);
   imprimirTabuleiro (tabuleiro, linhas, colunas);
   return 0;
}
void** criamatrix(int linhas, int colunas)
{
   char** ppaux = NULL;
   ppaux =(char**) malloc(sizeof(char*) * linhas);
   int i=0,j=0;
   for (i = 0; i < linhas; i++)
   {
    *(ppaux+i)=(char*)malloc(colunas*sizeof(char));
    for(j=0;j<colunas;j++){
	    *(*(ppaux+i)+j)='a';
    }
   }
   return ppaux;
}
void inserir_na_matriz (char** ppTabuleiro, int linhas, int colunas)
{
   int auxLinhas = 0, auxColunas = 0;
   for(auxLinhas=0; auxLinhas<linhas; auxLinhas++)
   {
    for (auxColunas=0; auxColunas<colunas; auxColunas++)
    {
	    ppTabuleiro[auxLinhas][auxColunas]='a';
    }
   }
}
void imprimirTabuleiro (char** ppTabuleiro, int linhas, int colunas)
{
   int auxLinhas = 0, auxColunas = 0;
   printf("\n");
   for (auxLinhas = 0; auxLinhas < linhas; auxLinhas++)
   {
    for (auxColunas = 0; auxColunas < colunas; auxColunas++)
    {
	    printf (" %c", ppTabuleiro[auxLinhas][auxColunas]);
    }
    printf("\n");
   }
}
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.