Ordenar uma estrutura pela data(dia, mes, ano) (em C ),

Spy_br

Membro
Eu tenho que fazer uma agenda de compromissos e eles devem ser ordenados pela data e hora. Declarei a strutura data e hora.

typedef struct{
int dia;
int mes;
int ano;
}data;
typedef struct{
int hora;
int minuto;
}hora;


Agora declarei uma estrutura para armazenar os dados do compromissos. Que podem ter caracteristicas (dados) diferentes. Exemplo o primeiro é aula o outro é para reuniao.

typedef struct{
char tipo; //aula
int identificador;
data data1;
hora hora1;
int duracao;
char nome[50];
int prioridade;
}dados_a;
typedef struct{
char tipo; //reuniao
int identificador;
data data1;
hora hora1;
int duracao;
int prioridade;
}dados_r;


Depois fiz um union desses dados.
typedef union {
dados_a dados_a1;
dados_r dados_r1;
}evento;


Agora deve ser feita a leitura desses dados e os mesmos devem ser armazenados. Devo armazenar-los como lista? Como devo fazer depois pra ordenar-las pela data?
 
Boas!

Antes de mais bem vindo ao fórum :)

De facto recomendo-te mesmo que os armazenes numa lista, com a lista podes inserir logo os dados ordenadamente sem teres de te preocupar com ordenações posteriores.

Para os ordenares pela data, basta fazeres as ordenações primeiro por dia, depois por mês e por fim por ano. Desta forma ficas logo com os dados todos bem ordenados.

No caso de a hora também interessar para a ordenação, esta deve ser ANTES da ordenação que referi antes e deve ser primeiro os minutos e só depois as horas.

Já agora, começa a colocares os blocos de código usando a respectiva tag, facilita mais quem está a ajudar.

(code)código(/code) <- Substituir os parentesis pelos respectivos rectos.
 
é suposto ajudar..., não dar o trabalho feito. O código de ordenação não é nada do outro mundo, um bublesort faz isso. O que importa é a ordem com que as coisas são ordenadas e isso eu disse.

abraços, HecKel
 
Boas. está aqui um método de sort para este tipo de coisas (idealizado por mim, não sei se alguém o tem efectivamente implementado...):

ANO MES DIA
2006 01 05
2006 01 04
2005 12 22

Ok se ordenares as cenas por ano, mes e dia, consegues logo "catar" os que são diferentes. Por exemplo: 2005 é anterior a 2006, logo essa data é anterior. Se forem iguais, passa para o mes, aplica-se a mesma lógica.

Claro que comparar as datas assim é algo trabalhoso e complicado demais.
Por isso, podes "unir" os números assim:

20060105
20060104
20050122

Isto são inteiros, agora é só fazer sort... os maiores são os mais recentes.

Para isto funcionar, assegura-te que os anos têm 4 dígitos, e os meses e os dias têm 2.

Para juntar num inteiro é só:
ano * 10000 + mes * 100 + dia

Se calhar seria util guardar o resultado, para não andares sempre a fazer multiplicações...


Já agora, pq é que divides os eventos em dados_a e dados_r, tendo estes a mesma estrutura? Um dos princípios da programação é a re-utilizabilidade do código :D
 
Pois eu estou com um problema semelhante e tava a pensar em fazer assim,so ainda nao consegui descurar como faço o processo inverso,ou ser reconverter o inteiro em datas separadas:\

cumps
 
Back
Topo