Flames Posted April 13, 2012 at 04:24 AM Report #448899 Posted April 13, 2012 at 04:24 AM Bem pessoal hello hello^^ Eu tenho a seguinte questão que a esta hora esquece não tenho a minima forma de arranjar solução Tenho um programa usando estruturas que vai inserindo dia mes e ano... A minha questão é como ordenar esta "salada" toda. Uma coisa é ordenar um vector com inteiros apenas muito simples usa-se uma variavel auxiliar e tal agora estruturas tenho que alterar sempre tres coisas (dia mes ano) :S Segue-se o codigo: ps: a parte da ordenação não olhem é apenas um devaneio: #include <stdio.h> #include <stdlib.h> #define MAXEMP 2 typedef struct { int mes, dia, ano; }Data; void insere(Data *t); void print_data(Data *t); void ordenar_data(Data *t); int main() { Data vect_data[MAXEMP]; insere(vect_data); print_data(vect_data); } void insere (Data *t){ int i=1; while (i<=MAXEMP){ scanf("%d", &t->dia); if (t->dia==-1) return 0; scanf("%d", &t->mes); scanf("%d", &t->ano); i++; t++; } } void print_data(Data *t) { int i; for (i = 1; i <= MAXEMP; i++) { printf( "Dia: %d\n", t->dia); t++; } } void ordenar_data(Data *t) { int i,j; int aux1,aux2,aux3; for(i=0;i<MAXEMP;i++)/*Executa o for abaixo por 5 vezes para que ordene todo o vetor*/ for(j=0;j<MAXEMP-1;j++)/*Troca a posição x pela posição x+1 até o x ser o penultimo elemento do vetor para trocar com o ultimo*/ { if(t->ano>(t->ano)+1 && t->mes>(t->mes)+1 && t->mes>(t->mes)+1 )/*se a posição atual for maior que a posição posterior*/ { aux1=(t->ano)+1; aux2=(t->mes)+1; aux3=(t->dia)+1; (t->ano)+1=t->ano; (t->mes)+1=t->mes; (t->dia)+1=t->dia; vetnum[j]=aux; } } } Só quero uma ideia de algoritmo para ordenar... Thanks 😄
pmg Posted April 13, 2012 at 08:04 AM Report #448904 Posted April 13, 2012 at 08:04 AM Para comparar duas struct's faz assim: Se o ano for diferente, a data mais pequena é a que tiver o ano mais pequeno senão (ano igual) se o mês for diferente, a data mais pequena é a que tiver o mês mais pequeno senão (ano e mês igual) se o dia for diferente, a data mais pequena é a que tiver o dia mais pequeno senão (tudo igual) as datas são iguais What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
HappyHippyHippo Posted April 13, 2012 at 08:46 AM Report #448906 Posted April 13, 2012 at 08:46 AM segunda ideia: time_t getDatetime(Date d) { tm time; time.tm_year = d.year; time.tm_mon = d.month; time.tm_mday = d.day; // retornar o numero de segundos que passaram desde "epoch" return mktime(&time); } int getDateDiff(Date d1, Date d2) { // se retornar > 0 então d1 e maior que d2 // se retornar < 0 então d1 e menor que d2 // se retornar 0 então d1 é igual a d2 return getDateTime(d1) - getDateTime(d2); } void ordDates(Date list[]) { // o teu algoritmo de ordenação usando a diferença das duas datas } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted April 13, 2012 at 08:57 AM Report #448907 Posted April 13, 2012 at 08:57 AM Murphy Law :-) time_t getDatetime(Date d) { tm time; time.tm_year = d.year; time.tm_mon = d.month; time.tm_mday = d.day; // retornar o numero de segundos que passaram desde "epoch" return mktime(&time); } É preferível subtrair 1900 ao ano, subtrair 1 ao mes e inicializar a variavel a zero. time_t getDatetime(Date d) { struct tm t = {0}; t.tm_year = d.year - 1900; t.tm_mon = d.month - 1; t.tm_mday = d.day; // retornar o numero de segundos que passaram desde "epoch" return mktime(&t); } Sem subtrair 1 ao mês, o valor devolvido para "XXX-01-31" é maior que para "XXX-02-01" (o mktime considera a primeira data como 3 de Março e a segunda como 1 de Março). What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
bsccara Posted April 13, 2012 at 03:16 PM Report #448979 Posted April 13, 2012 at 03:16 PM Porque é que não usas a função 'qsort' para ordenar o array ? Nesta (http://www.anyexample.com/programming/c/qsort__sorting_array_of_strings__integers_and_structs.xml) página tens um exemplo de ordenação dum array de estruturas.
HappyHippyHippo Posted April 13, 2012 at 03:18 PM Report #448981 Posted April 13, 2012 at 03:18 PM acho que o problema dele é o último parâmetro dessa função : algo que respondi no meu post 😄 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
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