/* Faça uma função de protótipo void ordenaparte(int A[MMAX][NMAX], int m, int n, int c, int k, int p); que recebe como parâmetros dois inteiros positivos m e n, uma matriz A_{mxn}, o índice c de uma coluna, os índices k e p de duas linhas, e ordena entre as linhas k e p da matriz A segundo a coluna c. Dadas 0 < m <= 100 datas em uma matriz D_{m×3}, onde a primeira coluna corresponde ao dia, a segunda ao mês e a terceira ao ano, coloque essas datas em ordem cronológica crescente, usando a função acima. */ #include #define MMAX 100 #define NMAX 3 /**************/ /* PROTÓTIPOS */ /**************/ /* imprime as datas nas m linhas de uma matriz D_{mx3} */ void imprimedatas (int D[MMAX][NMAX], int m); /* ordenação as linhas de uma matriz A_{mxn} por uma coluna c */ void ordenacoluna (int A[MMAX][NMAX], int m, int n, int c); /* ordena as datas nas m linhas de uma matriz D_{mx3} */ void ordenadatas (int D[MMAX][NMAX], int m); /* ordena linhas k e p da matriz A_{mxn} de acordo com coluna c */ void ordenaparte(int A[MMAX][NMAX], int m, int n, int c, int k, int p); /*****************************/ /* IMPLEMENTAÇÕES DE FUNÇÕES */ /*****************************/ void imprimedatas (int D[MMAX][NMAX], int m) { int i; for (i = 0; i < m; i++) { printf ("%02d/%02d/%04d\n", D[i][0], D[i][1], D[i][2]); } } int main() { int A[MMAX][NMAX]; int m, i, j; scanf("%d", &m); for (i = 0; i < m; i++) { for (j = 0; j < 3; j++) { scanf("%d", &A[i][j]); } } ordenadatas(A, m); imprimedatas(A, m); return 0; } /* PROPRIEDADE CRUCIAL: este algoritmo de ordenação é ESTÁVEL */ /* ou seja, se duas linhas de A "empatam" na coluna c, sua ordem relativa não é trocada durante a ordenação */ void ordenacoluna (int A[MMAX][NMAX], int m, int n, int c) { /* versão do insertion sort com "trocas"; compare com o código comentado do programa anterior (ordenação de n inteiros) */ int i, j; for (i = 1; i < m; i++) { for (j = i-1; j >= 0 && A[j][c] > A[j+1][c]; j--) { /* troca linhas A[j][*] e A[j+1][*] */ ordenaparte (A, m, n, c, j, j+1); } } } void ordenadatas (int D[MMAX][NMAX], int m) { int j; /* corretude depende da "PROPRIEDADE CRUCIAL" do algoritmo usado em ordenacoluna */ for (j = 0; j < 3; j++) { ordenacoluna(D, m, 3, j); /* Descomentar para imprimir ordenações intermediárias (por dia, depois por mês): imprimedatas(D, m); printf("\n"); */ } } void ordenaparte(int A[MMAX][NMAX], int m, int n, int c, int k, int p) { int j, t; /* compare as linhas A[k][*] vs A[p][*], na coluna c */ if (A[k][c] > A[p][c]) { /* troque as linhas A[k][*] e A[p][*] */ for (j = 0; j < n; j++) { /* troque A[k][j] e A[p][j] */ t = A[k][j]; A[k][j] = A[p][j]; A[p][j] = t; } } }