Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <string.h>
- int main(void)
- {
- int *n,**v,i;
- n=(int *)malloc(sizeof(int));
- printf("Introduza o numero de vetores que pretende inserir / limite maximo dos valores de cada vetor: ");
- scanf("%d",n);
- int *limite;
- limite=(int *)malloc((*n)+1 * sizeof(int));
- *limite=*n;
- free(n);
- v=(int **)malloc((*limite) * sizeof(int*));
- AlocaEspaco(v,limite);
- PreencheVetor(v,limite);
- AlocaEspacoSoma(v,limite);
- CalculaSoma(v,limite);
- OrdenaCrescenteSoma(v,limite);
- ApresentaVetores(v,limite);
- LibertaEspaco(v,limite); //Não era suposto eu libertar o espaço "de dentro" primeiro e depois libertar o de fora?
- free(v);
- free(limite);
- return 0;
- }
- void AlocaEspaco(int **vetor, int *limite)
- {
- int i;
- for (i=0;i<*limite;i++)
- {
- *(vetor+i)=(int *)malloc(*limite * sizeof(int));
- }
- }
- void AlocaEspacoSoma(int **vetor, int *limite)
- {
- int i;
- for (i=0;i<*limite;i++)
- {
- *(vetor+i)=realloc((*(vetor+i)),(*(limite+i+1)+1)*sizeof(int));
- }
- }
- void LibertaEspaco(int **vetor, int *limite)
- {
- int i;
- for (i=0;i<*limite;i++)
- {
- free(*(vetor+i));
- }
- }
- void PreencheVetor (int **vetor, int *limite)
- {
- int i,j=0;
- char c;
- for (i=0;i<*limite;i++)
- {
- c=32;
- j=0;
- printf("\nIntroduza os valores (limite: %d) do vetor numero %d, para terminar pressione ENTER: ",*limite,i);
- while (c != 10 && j < *limite || j == 0)
- {
- scanf("%d",(*(vetor+i)+j));
- c=getchar();
- /*if (*(*(vetor+i)+j) > *limite)
- {
- printf("Valor acima do limite permitido!\n");
- printf("Corrija o valor e continue a introduzir os restantes: ");
- c=32;
- }
- else
- {*/
- j++;
- //}
- }
- *(limite+i+1) = j;
- }
- }
- void CalculaSoma (int **vetor, int *limite)
- {
- int i,j;
- for (i=0;i<(*limite);i++)
- {
- for (j=0;j<(*(limite+i+1));j++)
- {
- *(*(vetor+i)+*(limite+i+1)) = (j==0?0:*(*(vetor+i)+*(limite+i+1)));
- *(*(vetor+i)+*(limite+i+1)) += *(*(vetor+i)+j);
- }
- printf(">>>> %d\n",*(*(vetor+i)+*(limite+i+1)));
- }
- }
- void OrdenaCrescenteSoma (int **vetor, int *limite)
- {
- 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...
- for (i=0;i<*limite;i++)
- {
- j=0;
- while (j<(*limite)-1)
- {
- soma1 = *(*(vetor+j)+*(limite+j+1));
- printf("Somazita: %d\n",soma1);
- soma2 = *(*(vetor+j+1)+*(limite+j+1+1));
- printf("Somazita: %d\n",soma2);
- if (soma1 > soma2)
- {
- //tmp = *(vetor+i);
- CopiaVetores(tmp,*(vetor+j),*(limite+j+1));
- CopiaVetores(*(vetor+j),*(vetor+j+1),*(limite+j+1+1));
- //*(vetor+i+1) = tmp
- CopiaVetores(*(vetor+j+1),tmp,*(limite+j+1));
- }
- j++;
- }
- }
- printf("Ordena Vetores Sucess! =)\n");
- }
- void CopiaVetores (int *destino, int *origem, int tamanho)
- {
- int i=0;
- for (i=0;i<=tamanho;i++)
- {
- //printf("%d passa a ser %d\n",*(destino+i),*(origem+i));
- *(destino+i) = *(origem+i);
- }
- //printf("Copia Vetores Sucess! =)\n");
- }
- void ApresentaVetores (int **vetor, int *limite)
- {
- int i,j;
- for (i=0;i<(*limite);i++)
- {
- for (j=0;j<=*(limite+i+1);j++)
- {
- printf("%d ",*(*(vetor+i)+j));
- }
- printf("\n");
- }
- }
Add Comment
Please, Sign In to add comment