• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

snis

Comparar datas

33 mensagens neste tópico

precisava de uma ajuda

tendo a seguinte estrutura:

struct Data{

int dia, mes, ano;

  };

struct Data dia1;
struct Data dia2;

alguem sabe como posso comprar a data do dia1 com dia 2

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vais precisar de comparar os campos um a um.

O mais simples será criar uma função que receba duas structs e as compare.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vais precisar de comparar os campos um a um.

O mais simples será criar uma função que receba duas structs e as compare.

O melhor é criar uma função que receba dois apontadores, um para cada estrutura, e não as estruturas em si. Aceder aos membros dessas estruturas e fazer as devidas comparações deve ser straightforward.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

merlin3000 hehe eu conheço-te

nun tens um primo andre? q estuda em felgas?

lol Yah.. não tou a ver quem sejas.

O melhor é criar uma função que receba dois apontadores, um para cada estrutura, e não as estruturas em si. Aceder aos membros dessas estruturas e fazer as devidas comparações deve ser straightforward.

Quando referi receber as estruturas estava-me a referir a passar os apontadores. Acho que não há maneira de as passar por valor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas

se só quiseres saber se uma data é menor do que outra, podes compará-las como se fossem uma string.

1) Colocas cada data numa string no formato  AAAA-MM-DD

2) if ( strcmp( data1 , data2 ) < 0)  // data 1 é menor que data 2

simples ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O melhor é criar uma função que receba dois apontadores, um para cada estrutura, e não as estruturas em si. Aceder aos membros dessas estruturas e fazer as devidas comparações deve ser straightforward.

Quando referi receber as estruturas estava-me a referir a passar os apontadores. Acho que não há maneira de as passar por valor.

Claro que podes passar por valor. Até o recomendo, tens uma penalização em performance (irrelevante) mas tens um ganho de segurança.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol Yah.. não tou a ver quem sejas.

yep, eu morava c ele em felgueiras.. ou tu ou o teu irmao, ainda me ajudaram em trabalhos ..

se só quiseres saber se uma data é menor do que outra, podes compará-las como se fossem uma string.

1) Colocas cada data numa string no formato  AAAA-MM-DD

2) if ( strcmp( data1 , data2 ) < 0)  // data 1 é menor que data 2

simples :)

sim, so precisava mesmo de saber de o dia2 era depois do dia1.. para executar uma função, q apagava os registos do dia2

o dia 1 corresponde ao dia d hoje..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Claro que podes passar por valor. Até o recomendo, tens uma penalização em performance (irrelevante) mas tens um ganho de segurança.

Isto é um grande erro !

Já tive ganhos de muitos segundos ao mudar uma passagem por valor para uma passagem por referencia. Basta experimentares chamar uma função muitas vezes (dezenas ou centenas de milhar) passando uma estrutura um pco maior do que os tipos primitivos... tipo acima de 100 bytes já deve chegar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo, obviamente que o irrelevante era em relação ao caso corrente.

Um produto de 3 ints. E a função certamente não irá ser chamada milhar de vezes.

Se o que se quizesse era o máximo de performance o uso de uma função também seria descartado e sim o uso de um macro fazendo a comparação no local, da mesma forma como o uso de strings só iria prejudir a performance...

Tudo é relativo e neste caso o ganho/perca de performance é insignificante.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo, obviamente que o irrelevante era em relação ao caso corrente.

Um produto de 3 ints. E a função certamente não irá ser chamada milhar de vezes.

Se o que se quizesse era o máximo de performance o uso de uma função também seria descartado e sim o uso de um macro fazendo a comparação no local, da mesma forma como o uso de strings só iria prejudir a performance...

Tudo é relativo e neste caso o ganho/perca de performance é insignificante.

Concordo contigo. É óbvio e acho que neste caso específico é irrelevante supor que fazer passagens por referência vão dar ganhos de performance enormes. Nao vão. Mas penso que é uma boa prática e foi por isso que o referi. Se quisessemos falar de optimização de código e até mesmo de elegância tinha que se modificar várias coisas, mas não é isso que está em causa aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(Se isto não tiver no sítio certo, paciência.)

Tava agora no IRC, e veio um moço ao #p@p perguntar como poderia comparar duas datas em C.

Ora, eu pus a minha cabeça a pensar, e, vim-me com estas soluções:

Usando logo integers, facilitando a vida e, penso eu, aumentado a performance:

int ano = 2007;
int mes = 10;
int dia = 1;

int data1 = ano*10000+mes*100+dia;

mes--;

int data2 = ano*10000+mes*100+dia;

if(data1 > data2){
    printf("A data1 e' mais recente que a data2");
}else{
    if(data2 > data1){
        printf("A data2 e' mais recente que a data1");
    }else{
        printf("As duas datas sao de facto, a mesma data");
    }
}

Usando strings, "convertendo" depois para integer:

char data1[9] = "20071001";
char data1[9] = "20071002";

for(int i = 0; i < 8; i++) {
    if( (int)data1[i] > (int)data2[i]){
        printf("data1 e' mais recente");
        break;
    }else if( (int)data1[i] < (int)data2[i]){
            printf("data2 e' mais recente");
            break;
    }
}

(Não testei este algoritmo com strings, mas suponho que funcione bem :))

E gostava de ter algum feedback aí dos leets :( Que acham dos algoritmos?

Umas coisas que me tão agora a moer o juízo sobre C:

> Posso fazer var == outravar, se ambas forem int certo?

> Há elseif em C?

> Há var += 3 em C? (sendo var um integer)

> Na declaração do char, tenho de contar com o chr(0) que aparece no final?

Acho que é só. :)

EDIT: Versão "correcta" usando strings:

char data1[9] = "20071001";
char data1[9] = "20071002";

for(int i = 0; i < 8; i++) {
    if( (int)data1[i] > (int)data2[i]){
        printf("data1 e' mais recente");
        break;
    }else if( (int)data1[i] < (int)data2[i]){
            printf("data2 e' mais recente");
            break;
    }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

> Há var += 3 em C? (sendo var um integer)

Sim, há.

Existe também o -= *= /= e %=

Se a memória não me falha :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Umas coisas que me tão agora a moer o juízo sobre C:

> Posso fazer var == outravar, se ambas forem int certo?

sim, podes

exemplo (    if(var==var2)    )

> Há elseif em C?

yep

> Há var += 3 em C? (sendo var um integer)

tambem podes

> Na declaração do char, tenho de contar com o chr(0) que aparece no final?

istu n percebi o q queriass

o moço fui eu :(,, brigadao

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

> Na declaração do char, tenho de contar com o chr(0) que aparece no final?

istu n percebi o q queriass

o moço fui eu :(,, brigadao

Em C, uma string é um array de chars que acaba com um \0 (o tal chr(0)). Ou seja, "ola" é, na verdade, isto:

'o'

'l'

'a'

'\0'

O que eu quero saber, é que se eu declaro 3 para "ola" ou 4. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

penso que so precisas de

char ola[3];

pois ja tens a

ola[0] = o

ola[1] = l

ola[2] = a

ola[3] = \0

pens eu..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

> Na declaração do char, tenho de contar com o chr(0) que aparece no final?

istu n percebi o q queriass

o moço fui eu :(,, brigadao

Em C, uma string é um array de chars que acaba com um \0 (o tal chr(0)). Ou seja, "ola" é, na verdade, isto:

'o'

'l'

'a'

'\0'

O que eu quero saber, é que se eu declaro 3 para "ola" ou 4. :)

Declaras 3, porque o C é como o Python

char lol[3] = "ola"

lol[0] = 'o'

lol[1] = 'l'

lol[2] = 'a'

lol[3] = \o

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Output com x[3]:

[djthyrax@dawn ~]$ ./test

ola`!!|Ѓ!

[djthyrax@dawn ~]$

Output com x[4]:

[djthyrax@dawn ~]$ ./test

ola

[djthyrax@dawn ~]$

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

> Posso fazer var == outravar, se ambas forem int certo?

Podes, e nos ifs na versão das Strings não precisas de fazer cast para int. Podes comparar Chars.

> Na declaração do char, tenho de contar com o chr(0) que aparece no final?

Não é obrigatório, mas deves sempre usar. O normal numa função que trabalha com Strings em C pedir como um dos argumentos o tamanho da String. Mas há algumas que lêem sempre até encontrar o '\0', o que nesses casos a String estiver com o tamanho certo, não tendo espaço no fim para acumudar o '\0' irá ler sempre até encontrar um '\0', resultado muito provavelmente num SIGSEGV.

Em relação aos algoritmos apenas 2 sugestões.

Na primeira versão usa unsigned, irão sempre ser positivos e minimizas o risco dos cálculos de fazer overflow.

Na segunda não precisas de fazer aquelas comparações todas, usa antes a função strncmp

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

> Há elseif em C?

yep

????

Existe else e existe if (ou seja, existe else if), mas não elseif...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
char data1[9] = "20071001";

char data1[9] = "20071002";

for(int i = 0; i < 8; i++) {

    if( (int)data1 > (int)data2)

        printf("data1 e' mais recente");

    else{

        if( (int)data1 < (int)data2)

            printf("data2 e' mais recente");

        else

            printf("as datas sao a mesma");

    }

}

Não é muito correcto em C copiar assim uma string. Podes usar o strcpy:

strcpy(data1, "20071002");

Ainda em relação ás strings, não sei o porquê de tanto trabalho em estar a comparar um a um os números. Bastava converter logo tudo para inteiro e comparar as datas.

int d1 = atoi(data1);
int d2 = atoi(data2);

if(d1 > d2){
    printf("Data1 é maior (recente) que Data2");
}
...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

> Há elseif em C?

yep

????

Existe else e existe if (ou seja, existe else if), mas não elseif...

else if eu sei que existe, mas elseif (elif em Python), não sabia.

Ainda em relação ás strings, não sei o porquê de tanto trabalho em estar a comparar um a um os números. Bastava converter logo tudo para inteiro e comparar as datas.

int d1 = atoi(data1);
int d2 = atoi(data2);

if(d1 > d2){
    printf("Data1 é maior (recente) que Data2");
}
...

Isso foi porque eu esqueci-me de escrever uma coisa no algoritmo quando o postei. Ora vê lá o edit agora. :(

Anyway, o eu fazer um loop pela string em vez de fazer atoi(), foi para aumentar a performance, poupando uns nanosegundos caso a data seja muito diferente. :D Como não sabia que podia comparar chars com ==, posso poupar mais uns milisegundos se não fizer (int) var. (isto chama-se cast certo?) :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso foi porque eu esqueci-me de escrever uma coisa no algoritmo quando o postei. Ora vê lá o edit agora. :(

Anyway, o eu fazer um loop pela string em vez de fazer atoi(), foi para aumentar a performance, poupando uns nanosegundos caso a data seja muito diferente. :D Como não sabia que podia comparar chars com ==, posso poupar mais uns milisegundos se não fizer (int) var. (isto chama-se cast certo?) :)

Para isso é que usas o strncmp... Ele também não compara a String toda se não for necessário.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso foi porque eu esqueci-me de escrever uma coisa no algoritmo quando o postei. Ora vê lá o edit agora. :(

Anyway, o eu fazer um loop pela string em vez de fazer atoi(), foi para aumentar a performance, poupando uns nanosegundos caso a data seja muito diferente. :D Como não sabia que podia comparar chars com ==, posso poupar mais uns milisegundos se não fizer (int) var. (isto chama-se cast certo?) :)

Para isso é que usas o strncmp... Ele também não compara a String toda se não for necessário.

strncmp... Qual é a diferença entre a strncmp e a strcmp?
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora