http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Zoniet, leg dan uit waarom J=5,M=3,D=1 < J=5,M=3,D=29
(Het klopt dat BCD de gewone < relatie in stand houdt)
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Ik ben bang dat ik nu te simpel denk, dus probeer mijn redenatie eerst uit op de randgevallen!
stel je voor, een datum is in feite een X aantal dagen vanaf het jaar 0 in een ingewikkeld formaat. Als je dat formaat een beetje versimpelt, kan je al data vergelijken:
1
| approximateDaysFromZero = Years * 365 + Months * 31 + Days * 1 |
Gevolg is dat je een getalletje hebt dat je eenvoudig kan vergelijken.
Mijn redenatie hierachter: de dagen die je moet overslaan (om de maand, februari etc) komen toch niet voor. Je wilt alleen weten of 28 februari tussen 27 februari en 1 maart ligt. 30 februari is geen geldige datum, en je preconditie zal zijn dat je een geldige datum krijgt.
Ook zou je een functie kunnen maken:
1
2
3
4
5
6
7
8
9
| bool date_IsGreaterThan(xDay, xMonth, xYear, yDay, yMonth, yYear)
{
if (xYear > yYear && xMonth > yMonth && xDay > yDay) {
return true;
}
else{
return false;
}
} |
Deze moet je wel een beetje aanpassen natuurlijk, 'k zat even niet na te denken. De volgende hoef je alleen te vergelijken als de vorige gelijk is, maar dat is teveel typen
alsjeblieft voor je huiswerk
[ Voor 9% gewijzigd door MBV op 30-03-2005 22:04 ]
In Binary-coded decimal (BCD) codering is dat hetzelfde.DRAFTER86 schreef op woensdag 30 maart 2005 @ 23:27:
Je bent je er van bewust dat 12 hexadecimaal niet hetzelfde is als 12 decimaal?
Implementatie kan bijvoorbeeld zo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #include <string.h> #include <stdio.h> int main() { char d1[] = {5, 3, 1}; char v[] = {5, 3, 0x29}; char d2[] = {5, 4, 1}; if (strncmp(d1, v, 3) <= 0 && strncmp(v, d2, 3) <= 0) printf("zit er tussen\n"); else printf("zit er niet tussen\n"); return 0; } |
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Niet in deze context. 12 decimaal * 31 = 372, 12 hex * 31 = 18*31 = 558.Daos schreef op woensdag 30 maart 2005 @ 23:51:
[...]
In Binary-coded decimal (BCD) codering is [12hex] hetzelfde [als 12 dec].
Je ziet overigens al dat je het jaar niet met 365 moet vermenigvuldigen.
Anders is 1-1-02 < 31-12-01 ( 762 < 768 )
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
misschien win ik het dit keer wel van MSalters
[ Voor 10% gewijzigd door MBV op 31-03-2005 10:31 ]
Dus helaas, je gaat het niet winnen van MSalters
Aangezien het toch al BCD's zijn kun je ze ook gewoon in een 32 bits int shiften, waarbij je 8 bits gebruikt voor maanden en dagen en 16 bits voor de jaren
1
2
3
4
5
6
7
| int datumWaarde1 = jaar1 << 16 | maand1 << 8 | dag1; int datumWaarde2 = jaar2 << 16 | maand2 << 8 | dag2; if (datumWaarde1 < datumWaarde2) printf ("datum1 is kleiner dan datum2\n"); else printf ("datum1 is groter dan of gelijk aan datum2\n"); |
[ Voor 32% gewijzigd door .oisyn op 31-03-2005 11:11 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
[ Voor 16% gewijzigd door MSalters op 31-03-2005 11:11 ]
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
ik beschik niet over de string library dus stringvergelijking is uitgesloten.
Bij ELKE manier die ik probeer kom ik tot volgende conclusie dat het niet werkt, als ik een datum at random neem is het resultaat van die vergelijking even random, ik kan er ook geen patroon in vinden die me duidelijk maakt van dan niet en dan wel. Wel heb ik de indruk dat de maanden de belanrijkste doorslag hebben op het resultaat (het is net of de dagen en jaren niet meegerekend worden)...
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Overigens is een int tenminste 15 bits, unsigned zelfs 16. Aangezien een maan minder dan 1<<5 dagen heeft, en een jaar minder dan 1<<4 maanden, kun je vrij eenvouding 1<<7 jaar kwijt in een unsigned, maar dan moet je terugrekenen van bcd naar binair. Anders kun je een long gebruiken, daar passen altijd je 3 bytes in.
[ Voor 4% gewijzigd door MSalters op 31-03-2005 18:45 ]
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
*zucht*
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
(yyyy * 10000) + (mm * 100) + (dd)
[ Voor 18% gewijzigd door riezebosch op 31-03-2005 19:33 ]
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Heb ik al geprobeerd werkt ook niet.riezebosch schreef op donderdag 31 maart 2005 @ 19:31:
En als je 'm nou omzet naar een getal yyyymmdd? Dan kan je toch gewoon vergelijken of 20050331 tussen 20050330 en 20050401 ligt?
Ik denk dat ik geen int kan gebruiken die dat bereik aan kan
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Het volgende is enigsinds systeem / compiler afhankelijk en kan je vinden in limits.h, ik heb er even de waardes van mijn compiler bijgezet.
unsigned long loopt van 0 tot 0xFFFFFFFF (4294967295 decimaal) (0 ULONG_MAX)
long int loop van -2147483646 tot 2147483647 (LONG_MIN LONG_MAX)
[ Voor 54% gewijzigd door Werkbouwtuig op 31-03-2005 21:20 ]
Verwijderd
weet alleen niet meer of dat standaard in ansi C zit ....
dagnummer vanaf 1-1-1900 = 0 , 2-1-1900 = 1 en zo verder
maar ik zie zat sources als ik naar juliandate zoek ;-)
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
alvast bedankt, ik hou jullie op de hoogte, en als jullie nog een ide hebben laat het maar weten
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| Public Function JulianDay(Years As Single, Months As Integer, Days As Single) As Double
On Error GoTo JulianErr
'Functie berekent de julianse dag voor de aangegeven datum
'waarbij de variable Days in decimale dagen opgegeven hoort
'te worden.
'ALLEEN VOOR DATA TUSSEN 1 MAART 1900 EN 28 FEBRUARI 2100
'Anders functie aanpassen!!!
Dim A As Integer
Dim B As Integer
If Years < 1901 Or Years > 2099 Then
JulianDay = -1
Else
If Months = 1 Or Months = 2 Then
'Beschouw Januari en Februari als 13e en 14e maand van vorig jaar!!
Years = Years - 1
Months = Months + 12
End If
A = Int(Years / 100)
B = -13
JulianDay = CDbl(Int(365.25 * (Years + 4716)) + Int(30.6001 _
* (Months + 1)) + Days + B - 1524.5)
End If
Exit Function
JulianErr:
Err.Clear
JulianDay = 0
End Function |
Als je de datum om heb gezet naar JD kun je verschillen berekenen door data van elkaar af te trekken. Ik hoop dat je er iets aan hebt
De formules heb ik uit:
Astronomical Algorithms van Jean Meeus
Code komt uit Stars:
http://home.planet.nl/~romme102/
[ Voor 5% gewijzigd door Verwijderd op 31-03-2005 22:02 ]
"Beter geen voorbeeld, dan een slecht voorbeeld"?MBV schreef op woensdag 30 maart 2005 @ 22:03:
Ook zou je een functie kunnen maken:
[...]
Deze moet je wel een beetje aanpassen natuurlijk, 'k zat even niet na te denken. De volgende hoef je alleen te vergelijken als de vorige gelijk is, maar dat is teveel typen
alsjeblieft voor je huiswerk
ik zou iets doen als:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| int date_compare_less(date_t lhs, date_t rhs ) { if (lhs.year == rhs.year) { if (lhs.month == rhs.month) { return lhs.day < rhs.day; } else return lhs.month < rhs.month; } else return lhs.year < rhs.year; } |
Volgens mij kun je die vergelijking gewoon direct als BCD al doen, ik zie niet staan dat het een eis is om ook te weten hoeveel dagen je bent verwijderd van een andere datum.
[ Voor 45% gewijzigd door Elijan9 op 01-04-2005 16:54 . Reden: wrong button (i.p.v. preview submit ) ]
War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic
Het werkt. Ik heb het op de methode van Elijan9 gedaan en die werkt perfect ! thx Eluian9
Elijan9 schreef op vrijdag 01 april 2005 @ 09:41:
[...]
C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 int date_compare_less(date_t lhs, date_t rhs ) { if (lhs.year == rhs.year) { if (lhs.month == rhs.month) { return lhs.day < rhs.day; } else return lhs.month < rhs.month; } else return lhs.year < rhs.year; }
Ik vind het jammer dat ik zoveel tijd verloren ben hiermee. Ik vind het dom van me dat ik niet eerder inzag dat deze methode NIET werkt
wanneer de jaren bijvoorbeeld een true opleveren kunnen de dagen nog een false opleveren met als gevolg dat de hele vergelijking false wordt maar dit niet zo is. De jaren hebben een grotere wegingsfactor die met deze formule niet in rekening gebracht wordt. Je vergelijkt dus 3 afzonderlijke getallen en het resultaat is enkel true als alle afzonderlijke getallen groter zijnMBV schreef op woensdag 30 maart 2005 @ 22:03:
code:
1 2 3 4 5 6 7 8 9bool date_IsGreaterThan(xDay, xMonth, xYear, yDay, yMonth, yYear) { if (xYear > yYear && xMonth > yMonth && xDay > yDay) { return true; } else{ return false; } }
Hier heb ik te lang mee bezig geweest tot ik het doorzag
Ik vraag me nog altijd af waarom de methode met het omvormen naar een int niet werkte
Iedereen hartelijk bedankt !!!
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Sorry voor de onduidelijke uitleg
Maar snap je het nou ook? Kun je nu een struct persoon sorteren op persoon.achternaam, persoon.voornaam en persoon.geboortedatum?LittleWan schreef op maandag 04 april 2005 @ 15:50:
GOED NIEUWS !!!
Het werkt. Ik heb het op de methode van Elijan9 gedaan en die werkt perfect ! thx Eluian9
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
[offtopic]idd, het staat nergens. Het klinkt als een proof-of-concept dat voor een electro- of informaticastudie bedacht had kunnen zijn. 'k moet eens wat minder snel oordelen
[ Voor 47% gewijzigd door MBV op 06-04-2005 23:46 ]
Blijkbaar wel als je zijn verhaal ook verder leest... Dan heeft hij het juist heel goed begrepen.MSalters schreef op maandag 04 april 2005 @ 22:36:
[...]
Maar snap je het nou ook? Kun je nu een struct persoon sorteren op persoon.achternaam, persoon.voornaam en persoon.geboortedatum?
Als .oisyn zijn methode ook had gewerkt, dan weet ik niet of de TS het wel had begrepen...
@.oisyn: Niet zo voor de hand liggend om er blind van uit te gaan dat de grootte voor een int bij een onbekende microcontroller met willekeurige compiler wel 32 bit zal zijn...
Ik lees nergens dat het hier om een schoolopdracht ging hoor... Ik "moet" ook wel eens iets voor elkaar krijgen, zonder dat iemand mij daarvoor de opdracht heeft gegeven.
War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic