Ir ao conteúdo
  • Cadastre-se
migueldf

RESOLVIDO Matriz com memoria dinâmica! HELPP

Recommended Posts

Escreva uma rotina em C que receba uma matriz de inteiros, X[ ][ ], e dois inteiros n e m que indicam respectivamente o número de linhas e de colunas de X. A rotina deve criar dinamicamente e retornar um vetor que Soma-Colunas, SC[ ] , composto pela soma dos elementos de cada coluna da matriz X.

Exemplo para X (3x4):

                 2        5       1        0

Entra X:     1        2       3        4

                10      20      30      40

 

sai SC:  [  13      27      34      44  ]

 

Fazer um programa para testar a rotina.

#include <stdio.h>int main(){     int X[10][10],j,i,n,m,k,SC[1];   srand(time(NULL));         //SC = (int *) malloc(sizeof(int));   printf("\nValor de Linhas:");   scanf("%d",&n);   printf("\nValor de Colunas");   scanf("%d",&m);//Matriz em formato matricialprintf("\n :: Matriz NxM entre 0 e 9 ::");   for(i=0;i<n;i++)   {      printf("\n\n");      for(j=0;j<m;j++)	  {    		 X[i][j] = (rand()%9 + 1);         printf("\t%d",X[i][j]);         SC[k]+=X[i][j];     	 }   }   printf("\n____________________________________________________________________\n");  //soma coluna  for(j=0;j<m;j++)printf("\t%d",SC[k]);printf("\n\nDigite qualquer TECLA para TERMINAR o PROGRAMA .... ");getch();      return 0;    }

queria ajuda sobre o somatório das colunas.

alguem pode ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Miguel. Tudo beleza?  ;)

 

Este problema é que você colocou é bastante desafiador porque exige de você um conhecimento de alocação dinâmica e também um pouco de "ponteiro de ponteiros" (o popular **matriz) haha. Só em ouvir este nome me dá calafrio.

 

No programa principal - int main(void) - fará o seguinte:

 

Primeiramente você vai requisitar ao usuário a quantidade de linhas e colunas da matriz de inteiros. 

 

Depois você vai alocar com a função malloc a quantidade de linhas (serão os ponteiros para onde será apontado as colunas)

 

Depois você vai alocar cada inteiro num for até a quantidade de linhas um vetor com quantidade de colunas.

 

Para melhor entendimento, eu fiz um desenho de ponteiros e matrizes alocada dinamicamente:
0pcyzw1.jpg

Depois você vai inserir os dados na matriz alocada dinamicamente.

 

Em seguida, nesta função da soma dos elementos da coluna, receberá como parâmetros de entradas o número de linhas, colunas e o ponteiro de ponteiro matriz. Dentro desta função vai alocar um vetor dinamicamente (vetor soma) com a quantidade de elementos de uma coluna, onde vai armazenar o resultado. Logo, o retorno dela é um vetor. Desta maneira a assinatura da função seria esta:

int* SomaColunas(int linhas, int colunas, int **matriz)

Um exemplo só. A partir disso você vai somar as colunas dentro de dois for, assim:
 

int *soma;      int i, j;      soma = (int*) calloc(cols, sizeof(int));      for(j = 0; j < cols; j++){            for(i = 0; i < rows; i++){                *(soma + j) = *(soma + j) + *(*(matriz + i) + j);            }      }      return soma; 
 

A malandragem aqui é ter invertido a ordem do i e j para que assim a matriz seja percorrida coluna por coluna (em vez de linha por linha). Aconselho você a alocar o vetor soma com calloc() porque com ela já vai atribuir 0 a todos os valores (enquanto malloc() deixa lixo).

 

Espero que entenda a explicação. Tenho o programa aqui pronto rodando. Se mesmo assim não funcionar, disponibilizo o código completo. Qualquer coisa, procure sobre "ponteiros e matrizes" e "alocação dinâmica". Acho que vai te ajudar.

 

 

 

==================/======================

Agora que vi seu código...

 

Está errado num fato simples. 

Não posso fazer isto:

int vetor[10];i = 15;vetor[i] = 3;

Isso é um erro fatal. Vetores estáticos tem seu espaço alocado antes do programa ser executado (tempo de copilação). Este valor NÂO pode ser alterado. Se eu fizer esta atribuição que fiz acima, nada me garante que no endereço de memória onde tá armazenado o vetor não seja código do próprio programa ou qualquer outra aplicação do sistema operacional. 

 

Por isto que para este problema, você precisa de conhecimento de ponteiros e alocação dinâmica porque AI sim, este será alocado e armazenado na memória do computador em tempo de execução. 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Miguel,

Já que não conseguiu rodar o programa (você falou por MP), vou colocar aqui o código completo...

#include <stdio.h>#include <stdlib.h>int* SomaElementosColuna(int rows, int cols, int **matriz);void ImprimeMatrizDinamica(int **matriz, int rows, int cols);void ImprimeVetorDinamica(int *vetor, int cols);int main(void){    int i, j, linhas, colunas;    int **matrizDados;    int *resultado;    printf("Entre com o numero de linhas: ");    scanf("%i", &linhas);    printf("\nEntre com o numero de colunas: ");    scanf("%i", &colunas);    matrizDados = (int**)malloc(linhas * sizeof(int*));    if(!matrizDados){        printf("\nNao foi possivel alocar memoria\n");        exit(1);    }    for(i = 0; i < linhas; i++)    {         *(matrizDados + i) = (int*)malloc(colunas * sizeof(int));            if(!(matrizDados + i)){                printf("\nNao foi possivel alocar memoria\n");                exit(1);        }    }    for(i = 0; i < linhas; i++) {        for(j = 0; j < colunas; j++){            printf("\nEntre com a linha %i coluna %i :", i + 1, j + 1);            scanf("%i", *(matrizDados + i) + j);        }    }    ImprimeMatrizDinamica(matrizDados, linhas, colunas);    resultado = SomaElementosColuna(linhas, colunas, matrizDados);    ImprimeVetorDinamica(resultado, colunas);    return 0;}void ImprimeMatrizDinamica(int **matriz, int rows, int cols){    int i, j;    printf("\nMatriz inserida:\n");    for(i = 0; i < rows; i++) {        for(j = 0; j < cols; j++){            printf(" %6i ", *(*(matriz + i) + j));        }        printf("\n");    }}void ImprimeVetorDinamica(int *vetor, int cols){    int i;    printf("\nResultado da soma das colunas:\n");    for(i = 0; i < cols; i++) {       printf(" %6i ", *(vetor + i));    }    printf("\n");}int* SomaElementosColuna(int rows, int cols, int **matriz){      int *soma;      int i, j, m;      soma = (int*) calloc(cols, sizeof(int));      for(j = 0; j < cols; j++){            for(i = 0; i < rows; i++){                *(soma + j) = *(soma + j) + *(*(matriz + i) + j);            }      }      return soma;}

Como falei acima, se não souber ponteiro e alocação dinâmica, vai dançar porque o programa é basicamente isto.

 

Entre as linhas 15 e 18 peço para o usuário que insira a quantidade de linhas e colunas desejadas.

Depois disto, na linha 19, é alocado um vetor de ponteiros em matrizDados, com um teste caso não consiga alocar. Se não conseguiu entender, é só olhar o desenho que pus no meu post acima.

Na linha 26, para cada ponteiro, aloquei um vetor de inteiro com a quantidade de elementos da coluna. Ponteiro para ponteiros é essencial para que seja alocada uma matriz dinamicamente (com m linhas e n colunas). E isto em tempo de execução. Perceba que não aloquei nada antes do programa copilar, como seria o caso do vetor estático que escrevi acima.

Entre as linhas 36 e 41, você insere os dados nesta matriz. Um detalhe interessante:

*(*(matriz + i) + j) ==> retorna valor já que é o conteúdo do conteúdo da matriz[j]. 
*(matriz + i) + j => é equivalente a escrever &matriz[j]. retorna endereço. Da maneira que escrevi, não precisa do "&". 

 

Depois ele vai imprimir os dados da matriz que digitou

E na linha 45 é onde a mágica acontece. Passo linhas e colunas como parâmetros de entrada da função porque preciso de uma condição de parada. E o ponteiro de ponteiro matriz onde está alocado a minha matriz (volte ao desenho se não entendeu). Já expliquei acima como este programa funciona.

E no fim ele imprime o vetor resultado com a soma dos elementos das colunas.

 

Reforçando, sem entender ponteiro e alocação dinâmica, tudo que escrevi parece grego. Copie e cole o código no seu programa de desenvolvimento em C e veja-o rodando. Talvez entenda mais fácil assim.

 

Abraços. 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×