Jump to content

Crie uma função em C que permita percorrer uma matriz quadrada bidimensional em diagonal


Wesley Araujo Fernandes

Recommended Posts

Crie uma função em C que permita percorrer uma matriz quadrada bidimensional em diagonal. Seu programa não deve impor limitações sobre o tamanho da matriz. Não use a notação de colchetes. Use ponteiros e alocação dinâmica do tamanho da matriz. Apresente um programa de teste e exemplos (quanto mais melhor), mostrando que a sua implementação funciona.

 

estou tendo dificuldades para formar essa questão, não vejo por onde começar e alguns exemplos que busquei não me fez tanto sentido, alguém me ajuda nessa questão!

Link to comment
Share on other sites

Penso que seja para existir um array principal em que cada posição é o apontador para um outro array.

Assim uma matriz de 3x3 necessita de 4 arrays, um principal em que a posição 0 é o apontador para o array1, posição 1 = apontador array2, ...

Sempre que a dimensão da matriz altere tens de redimensionar o array principal e correr todos os restantes arrays (por index do array principal) e redimensiona-los.

 

Link to comment
Share on other sites

O identificador de um vetor em C é o endereço de memória do primeiro elemento desse vetor. Portanto, usado operações com apontadores, podes encontrar cada elemento sem usar os parêntesis retos. Os seguintes são equivalentes:

a[4]      // notação com parêntesis rectos
*(a + 4)  // usando operações com apontadores

Podes, então, ter um vetor com apontadores para os restantes vetores. Considera este exemplo:

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

int main(void) {
    // Matriz 5 x 3
    int size_y = 5;
    int size_x = 3;

    // Alocar 5 apontadores para cada linha da matriz
    int **v = malloc(size_y * sizeof(int *));

    // Alocar 3 células da matriz em cada linha
    for (int y = 0; y < size_y; y++)
        *(v + y) = malloc(size_x * sizeof(int));

    // Preencher cada célula com o valor da multiplicação dos índices
    for (int y = 0; y < size_y; y++)
        for (int x = 0; x < size_x; x++)
            *(*(v + y) + x) = (x + 1) * (y + 1);

    // Mostrar os valores da matriz
    for (int y = 0; y < size_y; y++) {
        printf("[");
        for (int x = 0; x < size_x; x++)
            printf("%3d ", *(*(v + y) + x));
        printf("]\n");
    }

    // Libertar o espaço previamente alocado
    for (int y = size_y - 1; y >= 0; y--)
        free(*(v + y));
    free(v);

    return 0;
}

Este é o respetivo output:

[  1   2   3 ]
[  2   4   6 ]
[  3   6   9 ]
[  4   8  12 ]
[  5  10  15 ]

Espero que este exemplo seja útil.

Cumprimentos.

Knowledge is free!

Link to comment
Share on other sites

estou compilando no dev c++

13    5    C:\Users\Wesley Araujo\Documents\Q_4.c    [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

13    5    C:\Users\Wesley Araujo\Documents\Q_4.c    [Note] use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code

17    14    C:\Users\Wesley Araujo\Documents\Q_4.c    [Error] redefinition of 'y'

 

esses erros ai, sabe o que seria ?

Link to comment
Share on other sites

este pessoal muito gosta de arrays de arrays de arrays de arrays ....
qual o problema de ter só um array ?
 

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

#define matrix_data_pos(d,s,x,y) (int *) ((d) + ((s) * (x)) + (y))
#define matrix_pos(m,x,y) (int *) ((m)->data + ((m)->size * (x)) + (y))

typedef struct {
    int * data;
    size_t size;
} matrix_t;

matrix_t * matrix_resize(matrix_t * matrix, size_t size) {
    if (matrix == NULL) {
        if ((matrix = malloc(sizeof(matrix_t))) == NULL)
            return NULL;
        matrix->data = NULL;
        matrix->size = 0;
    }

    if (matrix->data == NULL) {
        matrix->data = calloc(size * size, sizeof(int));
        matrix->size = size;
    } else {
        int * aux = calloc(size * size, sizeof(int));
        if (aux) {
            for (int x = 0; x < matrix->size; x++)
                for (int y = 0; y < matrix->size; y++)
                    *matrix_data_pos(aux, size, x, y) = *matrix_pos(matrix, x, y);
            matrix->data = aux;
            matrix->size = size;
        }
    }

    return matrix;
}

void matrix_destroy(matrix_t ** matrix) {
    if (matrix != NULL && *matrix != NULL) {
        if ((*matrix)->data != NULL)
            free((*matrix)->data);
        free(*matrix);
        *matrix = NULL;
    }
}

void matrix_print(matrix_t * matrix) {
    for (int x = 0; x < matrix->size; x++) {
        printf("[");
        for (int y = 0; y < matrix->size; y++)
            printf("%3d ", *matrix_pos(matrix, x, y));
        printf("]\n");
    }
}

int main() {
    matrix_t * matrix = matrix_resize(NULL, 2);

    *matrix_pos(matrix, 0, 0) = 1;
    *matrix_pos(matrix, 0, 1) = 2;
    *matrix_pos(matrix, 1, 0) = 3;
    *matrix_pos(matrix, 1, 1) = 4;
    matrix_print(matrix);
    printf("\n");

    matrix = matrix_resize(matrix, 3);
    matrix_print(matrix);
    printf("\n");

    matrix_destroy(&matrix);

    return 0;
}

 

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

qual é o seu compilador, eu uso o dev c++ , fui executar seu codigo ele diz um erro, como esse: 

26    13    C:\Users\hhhhhhh\Desktop\Q_4.c    [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

47    5    C:\Users\hhhhhhhh\Desktop\Q_4.c    [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

sabe como faço pra resolver ?

Link to comment
Share on other sites

Em 13/04/2022 às 02:03, HappyHippyHippo disse:

este pessoal muito gosta de arrays de arrays de arrays de arrays ....
qual o problema de ter só um array ?

Da minha parte não há qualquer problema. Se o Wesley perceber o código que implementaste (e souber defender o trabalho dessa forma), tanto melhor.

Em 13/04/2022 às 02:13, Wesley Araujo Fernandes disse:

[Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

Tens três opções:

  1. Mudas o standard usado pelo Dev-C++ de forma a que seja pelo menos o C99;
  2. Declaras os iteradores fora dos ciclos for;
  3. Mudas de IDE/compilador.

Cumprimentos.

Edited by thoga31

Knowledge is free!

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
×
×
  • 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.