Ditt företag skall bygga en rutin men med ett främmande programspråk som ingen kan och ingen har manualen till. Programspråket är lika uråldrigt som gw-basic och därmed kan du inte använda många av de datumfunktioner du så väl hade behövt nu. hur ska vi kunna det när vi inte har manualen till språket? Ja, Chefen säger att givetvis får systemklockan användas. Det bör väl tilläggas enligt roggans inlägg. Givetvis har du ett eget program som du kan använda, men bara för att skriva logiken, du kan alltså inte använda dig av några inbyggda objekt för timer. Tog algoritmerna från boost::date_time eller är det fusk? Chefen ber dig därför skriva en funktion som räknar ut vilken veckodag samt veckonummer som avser datumet 2004-03-28. veckans nöt #10
Chefen ber dig därför skriva en funktion som räknar ut vilken veckodag samt veckonummer som avser datumet 2004-03-28. Du måste även hålla reda på skottår, kolla att veckan blir rätt oavsett år mm.
<info>
Du får alltså inte använda några som helst färdiga funktioner för detta utan måste förlita dig på ord som "gregorian och julian-date algoritmer" samt skottår och inte minst "minst 4 dagar i första veckan".
</info>
Programspråk är valfritt - Lycka till.Sv: veckans nöt #10
jag får bara compile error hela tiden... hjääälpSv:veckans nöt #10
Sv: veckans nöt #10
(koden lite modifierad för att passa här)
<code>
bool is_leap_year(int year) {
//divisible by 4, not if divisible by 100, but true if divisible by 400
return (!(year % 4)) && ((year % 100) || (!(year % 400)));
}
int julian_day_number(int year, int month, int day) {
int a = (14-month)/12;
int y = year + 4800 - a;
int m = month + 12*a - 3;
return = day + ((153*m + 2)/5) + 365*y + (y/4) - (y/100) + (y/400) - 32045;
}
int week_number(int year, int month, int day) {
unsigned long julianbegin = julian_day_number(year,1,1);
unsigned long juliantoday = julian_day_number(year, month, day);
unsigned long dday = (julianbegin + 3) % 7;
unsigned long week = (juliantoday + dday - julianbegin + 4)/7;
if ((week >= 1) && (week <= 52)) return week;
if ((week == 53)) {
if((dday==6) ||(dday == 5 && is_leap_year(year))) {
return week; //under these circumstances week == 53.
} else {
return 1; //monday - wednesday is in week 1 of next year
}
}
//if the week is not in current year recalculate using the previous year as the beginning year
else if (week == 0) {
julianbegin = julian_day_number(ymd.year-1,1,1);
juliantoday = julian_day_number(year, month, day);
dday = (julianbegin + 3) % 7;
week = (juliantoday + day - julianbegin + 4)/7;
return week;
}
return week; //not reachable -- well except if day == 5 and is_leap_year != true
}
// 0=sunday, 1=monday etc
int day_of_week(int year, int month, int day) {
unsigned a = (14-ymd.month)/12;
unsigned y = year - a;
unsigned m = month + 12*a - 2;
return (day + y + (y/4) - (y/100) + (y/400) + (31*m)/12) % 7;
}
main() {
static const char* dayname[7] = { "söndag", "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag" };
int week = week_number(2004,3,28);
int day = day_of_week(2004,3,28);
cout << "2004-03-28 är vecka " << week << " och är en " << dayname[day] << std::endl;
}
</code>
Edit glömde veckodagenSv: veckans nöt #10
int GetVeckoNummer20040328()
{
return 13;
}
string GetVeckDag20040328()
{
return "söndag"
}
//Roger