1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por Spy_br, 19 de Maio de 2006. (Respostas: 6; Visualizações: 2817)

  1. 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?
     
  2. guxo

    guxo Power Member

    em c++ e facil para mim... nao sei se é a mesma coisa... :S
     
  3. HecKel

    HecKel The WORM

    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.
     
  4. guxo

    guxo Power Member

    acabas-te por nao indicar o codigo de ordenação :/..
     
  5. HecKel

    HecKel The WORM

    é 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
     
  6. CrazyBomber

    CrazyBomber Power Member

    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
     
  7. bikeman

    bikeman Power Member

    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
     

Partilhar esta Página