Wesley Araujo Fernandes Posted April 6, 2022 at 11:20 PM Report Share #625719 Posted April 6, 2022 at 11:20 PM 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 More sharing options...
iznougudpt Posted April 7, 2022 at 05:05 PM Report Share #625727 Posted April 7, 2022 at 05:05 PM 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 More sharing options...
Wesley Araujo Fernandes Posted April 7, 2022 at 06:41 PM Author Report Share #625728 Posted April 7, 2022 at 06:41 PM teria como me mostrar um exemplo, não ficou tão claro, mais creio que esse array que você sugeriu vai servir até pra uma outra questão que estou pra resolver tbm que precisa verificar se duas palavras são iguais em string, vc confirma isso? Link to comment Share on other sites More sharing options...
thoga31 Posted April 9, 2022 at 05:11 PM Report Share #625737 Posted April 9, 2022 at 05:11 PM 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 More sharing options...
Wesley Araujo Fernandes Posted April 9, 2022 at 05:21 PM Author Report Share #625739 Posted April 9, 2022 at 05:21 PM rodei o código, porem diz que tem um erro onde vc aloca a 3º celular da matriz, e não to conseguindo identificar, tem como ver isso ai Link to comment Share on other sites More sharing options...
thoga31 Posted April 9, 2022 at 05:27 PM Report Share #625740 Posted April 9, 2022 at 05:27 PM Voltei a compilar e executar. Não me deu qualquer erro. Qual o erro que te está a dar? Knowledge is free! Link to comment Share on other sites More sharing options...
Wesley Araujo Fernandes Posted April 9, 2022 at 05:33 PM Author Report Share #625741 Posted April 9, 2022 at 05:33 PM 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 More sharing options...
thoga31 Posted April 9, 2022 at 07:10 PM Report Share #625742 Posted April 9, 2022 at 07:10 PM Isso é do standard usado pelo compilador. A linguagem C tem tido várias atualizações que definem os novos standards. O Dev C++ deve estar a assumir o C89, que não permite algumas coisas que uso diariamente. Recomendo que vejas nas definições se consegues mudar o standard, pelo menos para o C99. Knowledge is free! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 13, 2022 at 01:03 AM Report Share #625764 Posted April 13, 2022 at 01:03 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Wesley Araujo Fernandes Posted April 13, 2022 at 01:13 AM Author Report Share #625766 Posted April 13, 2022 at 01:13 AM 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 More sharing options...
HappyHippyHippo Posted April 13, 2022 at 03:52 PM Report Share #625770 Posted April 13, 2022 at 03:52 PM não posso precisar, até porque o dev-c++ é de 2016, mas podes ir a: tools->compiler options->compiler e verificares que se depois do nome do executavel do teu compilador de C (gcc.exe) tens -std=c99 ou -std=c11 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
thoga31 Posted April 17, 2022 at 10:49 PM Report Share #625785 Posted April 17, 2022 at 10:49 PM (edited) 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: Mudas o standard usado pelo Dev-C++ de forma a que seja pelo menos o C99; Declaras os iteradores fora dos ciclos for; Mudas de IDE/compilador. Cumprimentos. Edited April 17, 2022 at 10:49 PM by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now