How to turn pointer into matrix

Asked

Viewed 510 times

1

I’m doing a program that transforms a matrix into a transposed matrix. I am using 3 functions because I want to learn how to pass parameters of arrays.

The function main() calls the function mValores that asks the user the number of rows and columns of the matrix and assigns the value of each element of that matrix.

The function mValores in turn passes the parameters matrix, rows, columns; for the function mTransposta that receives the locations of these variables in the pointers *A, *m, *n.

#include <stdio.h>
#include <stdlib.h>

//Tipo de matriz e seus valores
void mValores()
{

    //Declaração de variáveis
    int i, j; // i: Contador de linhas; j: contador de colunas;
    int linhas, colunas;

    //Definindo o tipo de matriz
    printf("\nDigite a quantidade de linhas: \n");
    scanf("%d", &linhas);
    printf("Digite a quantidade de Colunas: \n");
    scanf("%d", &colunas);

    int matriz [linhas] [colunas]; //Declaração do array bidimensional

    //Mostrando o tipo de matriz
    printf("Matriz do tipo: %dx%d ", linhas, colunas);
    if(linhas == colunas){

        printf("(Matriz quadrada).");

    }

    else if(linhas == 1 && colunas > 1){

        printf("(Matriz linha).");

    }

    else if(linhas > 1 && colunas == 1){

        printf("(Matriz coluna).");

    }

    printf("\n");

    for(i = 0; i < linhas; i++){
        for(j = 0; j < colunas; j++){

            printf("a%d%d ", i + 1, j + 1);

        }
        printf("\n");
    }

    //Atribuindo os valores da matriz
    printf("Digite os valores de: \n");
    for(i = 0; i < linhas; i++){
        for(j = 0; j < colunas; j++){

            printf("a%d%d ", i + 1, j + 1);
            scanf("%d", &matriz [i] [j]);

        }
    }

    printf("\n");

    //Mostrando os valores da matriz
    for(i = 0; i < linhas; i++){
        for(j = 0; j < colunas; j++){

                printf("%4d",matriz [i] [j]);

        }
        printf("\n");
    }

    printf("\n");

    mTransposta(matriz , linhas, colunas);

}

void main()
{

    //Declaração de variáveis
    char end;
    printf("\n***CALCULOS DE MATRIZES*** \n");

    do{

        printf("\nMatriz Transposta\n");

        mValores();

        printf("\nDigite 1 para sair ou digite qualquer outro numero para Continuar:\n");
        scanf("%d", &end);

    }while (end != 1);

}

void mTransposta(int *A, int *m, int *n) // A = matriz, m = linhas, n = colunas
{

    int i, j;

    *matrizTransposta [*m] [*n] = A;//Atribuição do local da variável matriz para variável matrizTransposta

    for(i = 0; i < *n; i++){
        for(j = 0; j < *m; j++){

            printf("%4d",matrizTransposta [j] [i]);

        }
        printf("\n");
    }

}

The problem is in the function mTransposta. I wanted to assign the values that are in the matrix variable [rows] [columns] that is in the function mValores() to the variable matrizTransposta [*m] [*n] function mTransposta() through the pointer *A.

1 answer

0


The code has some problems that I fixed. It’s also a little poorly organized so the comments made themselves necessary. I didn’t organize everything, but if you do well organized you don’t need comments.

There is no way to directly convert something like this. You have to receive an array even. Or treat everything as pointer and manually take care of the access.

This transport is not necessary in this function, I left because it can be an exercise. But exercises should focus on one feature only or else do everything right, which does not occur there.

#include <stdio.h>

void Transposta(int linhas, int colunas, int matriz[][colunas]) {
    int matrizTransposta[colunas][colunas];
     for (int i = 0; i < colunas; i++) {
        for (int j = 0; j < linhas; j++) matrizTransposta[i][j] = matriz[j][i];
        printf("\n");
    }
   for (int i = 0; i < linhas; i++) {
        for (int j = 0; j < colunas; j++) printf("%4d", matrizTransposta[i][j]);
        printf("\n");
    }
}

void Valores() {
    int linhas, colunas;
    printf("\nDigite a quantidade de linhas: \n");
    scanf("%d", &linhas);
    printf("Digite a quantidade de Colunas: \n");
    scanf("%d", &colunas);
    int matriz[linhas][colunas];
    printf("Matriz do tipo: %dx%d ", linhas, colunas);
    if (linhas == colunas) printf("(Matriz quadrada).");
    else if (linhas == 1 && colunas > 1) printf("(Matriz linha).");
    else if(linhas > 1 && colunas == 1) printf("(Matriz coluna).");
    printf("\n");
    for (int i = 0; i < linhas; i++) {
        for (int j = 0; j < colunas; j++) printf("a%d%d ", i + 1, j + 1);
        printf("\n");
    }
    printf("Digite os valores de: \n");
    for (int i = 0; i < linhas; i++) {
        for (int j = 0; j < colunas; j++) {
            printf("a%d%d ", i + 1, j + 1);
            scanf("%d", &matriz[i][j]);
        }
    }
    printf("\n");
    for (int i = 0; i < linhas; i++) {
        for (int j = 0; j < colunas; j++) printf("%4d", matriz[i][j]);
        printf("\n");
    }
    printf("\n");
    Transposta(linhas, colunas, matriz);
}

int main() {
    int end;
    printf("\n***CALCULOS DE MATRIZES*** \n");
    do {
        printf("\nMatriz Transposta\n");
        Valores();
        printf("\nDigite 1 para sair ou digite qualquer outro numero para Continuar:\n");
        scanf("%d", &end);
    } while (end != 1);
}

Behold working in the ideone. And in the repl it.. Also put on the Github for future reference.

  • vc could explain to me pq put in mTransput the parameter matrix [] [columns]. pq no matrix [rows] [columns] or matrix [rows] []?

  • 1

    Could have put the linhas also, columns are mandatory for the compiler to be able to account for the element to be accessed, because in fact it is not in memory is not an array is an organized array to look like an array.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.