Guest User

Untitled

a guest
Jul 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5.  
  6. int main(void)
  7. {
  8.     int *n,**v,i;
  9.     n=(int *)malloc(sizeof(int));
  10.     printf("Introduza o numero de vetores que pretende inserir / limite maximo dos valores de cada vetor: ");
  11.     scanf("%d",n);
  12.     int *limite;
  13.     limite=(int *)malloc((*n)+1 * sizeof(int));
  14.     *limite=*n;
  15.     free(n);
  16.     v=(int **)malloc((*limite) * sizeof(int*));
  17.     AlocaEspaco(v,limite);
  18.     PreencheVetor(v,limite);
  19.     AlocaEspacoSoma(v,limite);
  20.     CalculaSoma(v,limite);
  21.     OrdenaCrescenteSoma(v,limite);
  22.     ApresentaVetores(v,limite);
  23.     LibertaEspaco(v,limite); //Não era suposto eu libertar o espaço "de dentro" primeiro e depois libertar o de fora?
  24.     free(v);
  25.     free(limite);
  26.     return 0;
  27. }
  28.  
  29. void AlocaEspaco(int **vetor, int *limite)
  30. {
  31.     int i;
  32.     for (i=0;i<*limite;i++)
  33.     {
  34.         *(vetor+i)=(int *)malloc(*limite * sizeof(int));
  35.     }
  36. }
  37.  
  38. void AlocaEspacoSoma(int **vetor, int *limite)
  39. {
  40.     int i;
  41.     for (i=0;i<*limite;i++)
  42.     {
  43.         *(vetor+i)=realloc((*(vetor+i)),(*(limite+i+1)+1)*sizeof(int));
  44.     }
  45. }
  46.  
  47. void LibertaEspaco(int **vetor, int *limite)
  48. {
  49.     int i;
  50.     for (i=0;i<*limite;i++)
  51.     {
  52.         free(*(vetor+i));
  53.     }
  54. }
  55.  
  56. void PreencheVetor (int **vetor, int *limite)
  57. {
  58.     int i,j=0;
  59.     char c;
  60.     for (i=0;i<*limite;i++)
  61.     {
  62.         c=32;
  63.         j=0;
  64.         printf("\nIntroduza os valores (limite: %d) do vetor numero %d, para terminar pressione ENTER: ",*limite,i);
  65.         while (c != 10 && j < *limite || j == 0)
  66.         {
  67.             scanf("%d",(*(vetor+i)+j));
  68.             c=getchar();
  69.             /*if (*(*(vetor+i)+j) > *limite)
  70.             {
  71.                 printf("Valor acima do limite permitido!\n");
  72.                 printf("Corrija o valor e continue a introduzir os restantes: ");
  73.                 c=32;
  74.             }
  75.             else
  76.             {*/
  77.             j++;
  78.             //}
  79.         }
  80.         *(limite+i+1) = j;
  81.     }
  82. }
  83.  
  84. void CalculaSoma (int **vetor, int *limite)
  85. {
  86.     int i,j;
  87.     for (i=0;i<(*limite);i++)
  88.     {
  89.         for (j=0;j<(*(limite+i+1));j++)
  90.         {
  91.             *(*(vetor+i)+*(limite+i+1)) = (j==0?0:*(*(vetor+i)+*(limite+i+1)));
  92.             *(*(vetor+i)+*(limite+i+1)) += *(*(vetor+i)+j);
  93.         }
  94.         printf(">>>> %d\n",*(*(vetor+i)+*(limite+i+1)));
  95.     }
  96. }
  97.  
  98. void OrdenaCrescenteSoma (int **vetor, int *limite)
  99. {
  100.     int i,j=0,soma1,soma2,tmp[(*limite)+1]; // O tmp teve de ser um vetor aqui, parece que não me deixam alocar memória dinamicamente dentro de uma função, não sei porque...
  101.     for (i=0;i<*limite;i++)
  102.     {
  103.         j=0;
  104.         while (j<(*limite)-1)
  105.         {
  106.             soma1 = *(*(vetor+j)+*(limite+j+1));
  107.             printf("Somazita: %d\n",soma1);
  108.             soma2 = *(*(vetor+j+1)+*(limite+j+1+1));
  109.             printf("Somazita: %d\n",soma2);
  110.             if (soma1 > soma2)
  111.             {
  112.                 //tmp = *(vetor+i);
  113.                 CopiaVetores(tmp,*(vetor+j),*(limite+j+1));
  114.                 CopiaVetores(*(vetor+j),*(vetor+j+1),*(limite+j+1+1));
  115.                 //*(vetor+i+1) = tmp
  116.                 CopiaVetores(*(vetor+j+1),tmp,*(limite+j+1));
  117.             }
  118.             j++;
  119.         }
  120.     }
  121.     printf("Ordena Vetores Sucess! =)\n");
  122. }
  123.  
  124. void CopiaVetores (int *destino, int *origem, int tamanho)
  125. {
  126.     int i=0;
  127.     for (i=0;i<=tamanho;i++)
  128.     {
  129.         //printf("%d passa a ser %d\n",*(destino+i),*(origem+i));
  130.         *(destino+i) = *(origem+i);
  131.     }
  132.     //printf("Copia Vetores Sucess! =)\n");
  133. }
  134.  
  135. void ApresentaVetores (int **vetor, int *limite)
  136. {
  137.     int i,j;
  138.     for (i=0;i<(*limite);i++)
  139.     {
  140.         for (j=0;j<=*(limite+i+1);j++)
  141.         {
  142.             printf("%d ",*(*(vetor+i)+j));
  143.         }
  144.         printf("\n");
  145.     }
  146. }
Add Comment
Please, Sign In to add comment