Jump to content

Vetor estruturas ordenacao...


Recommended Posts

Posted

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 😄

Posted

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!

Posted

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
Posted

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!

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.