Prównywanie dat

Prównywanie dat
BA
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 18 lat
0

mam datę w postaci:
int dzien, int miesiac, int rok,

i chciałbym sprawdzić czy mieści się ona w jakimś przedziale zapisanym w tej samej postaci... ifami to mało efektywnie działa;
Czy istnieje funkcja, która rozwiązałaby mój problem? A jak nie to jak to zrobić, żeby działało?
Program musi być w ANSI C.

SA
  • Rejestracja:około 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

Zamień wszystkie (min,max,data) daty na pojedyncze liczby np. zcastowane FILETIME na int64 i porównuj standardowymi operatorami:

Kopiuj
if (data < min) ZaStaraData();
else if (data > min) ZaNowaData();
else DataWZakresie();

Wadą FILETIME jest wysoka rozdzielczość i to, że najniższy rok to 1601, ale zawsze można przyjąć jeden dzień za jednostkę daty, a ilość dni od roku 0 można łatwo obliczyć.

BA
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 18 lat
0

Hmmm chodzi o daty zbliżone do naszych:P

ALe szczerze mówiąc nie bardzo rozumiem tego FILETIME... mieści się to w standardzie ANSI C? Jak tego użyć:P?

dzejo
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>

// Upakuj datę do jednej liczby w kolejności rok , miesiąc , dzień
// za pomocą przesunięć bitowych 
// Otrzymasz liczbę - im większa data tym większa liczba
//

unsigned int fun( unsigned int rok , unsigned int miesiac , unsigned int dzien)
{
    unsigned int temp = rok ;
    temp <<= 4 ;                        // miejsce - 4 bity na miesiąc
    temp = temp + miesiac ;
    temp <<= 8 ;                        // 8 bitów na dzień  ale wystarczy 5 ( temp <<= 5 ; )
    temp = temp + dzien ;
    return temp ;
}


//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char **argv)
{

      unsigned int moja_data = fun(1988,1,14);

      if( (moja_data <= fun(2008,11,14) )&&( moja_data >= fun(1987,3,22) )  )
      {
         printf("Data w zakresie.\n") ;

      }else{
              printf("Data poza zakresem.\n") ;
            }

      getchar();
        return 0;
}

:-)


BA
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 18 lat
0

Szkoda, że uporałem sobie z tym problemem if'ami, bo Twój sposób jest rewelacyjny... Sam chciałem to na stringa przerobić, a wtedy zwykłym strcmp...ale na to nie wpadłem... big thx za pomoc:-)

__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
0

Proponuję małe usprawnienie. Sumowanie bitowe, zamiast normalnego.

Kopiuj
inline unsigned int fun(const unsigned int rok, const unsigned int miesiac, const unsigned int dzien)
{
	return (((rok << 4) | miesiac) << 8) | dzien;
}

Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
dzejo
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

I super , modyfikacja .
Tylko parametry fun nie muszą być deklarowany jako 'const' .
Const oznacza że parametr nie będzie modyfikowany , ale to szczegół .
Parametry przekazywane przez wartość są kopiowane na stos ( ich wartość ),
const czy nie const nie ma żadnego wpływu w tym przypadku.
Co innego wskaźniki lub referencje .
Pozdro :-)

PS ,
Funkcja będzie działać prawidłowo dla int == 4 bajty , dla kompilatorów 16 bitowych trzeba
odpowiednio zmodyfikować typy pobierane przez fun ponieważ tam 'int' ma rozmiar 2 bajtów.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.