webForumDet fria alternativet

Dela upp datum på formen YYYYMMDD

C/C++

2 svar · 858 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Hej,

Jag försöker lösa ett problem med hjälp av C++. Jag vill dela upp ett datum på formen YYYYMMDD med hjälp av / och modulooperatorn. Hur ska jag bära mig åt? Vore trevligt med lite tips i rätt riktning! :)

Medlem sedan aug. 20039 340 inlägg
#2

Det finns bättre sätt att lagra datum, men om du verkligen vill göra så av någon anledning så gör man så här med / och %
Koden är iofs c, inte c++, men metodiken är den samma. (Fast main-funktionen och utskriften blir lite annorlunda)

#include <stdio.h>
int main(void){
        int datum = 520091031;
        int y,m,d;

        y = (datum / 10000) % 10000;
        m = (datum / 100)   % 100;
        d = (datum / 1)     % 100;
        printf("%d-%d-%d\n", y, m, d);
}

Nu har jag varit lite övertydlig för att demonstrera vad jag gör. / motsvarar förflyttning högerut. % motsvarar avklippning på vänstersidan. För dagarna så är inte divisionen nödvändig då datum / 1 ju är lika med datum. % 100 gör, enkelt uttryckt att 100 dras ifrån talet så många gånger det går. (CPU'n gör det givetvis mer effektivt, men det är ett enkelt sätt att beskriva förloppet) Kvar blir 31.

För månaden delas datumet först med 100, kvar blir 5200910. Sedan modulo som gör att 10 blir kvar.

För dagen delas datumet först med 10000 vilket alltså "förskjuter" talet fyra steg åt höger. Kvar blir 52009 nu undrar du säkert vad femman står för. Det är ett nummer jag har lagt till bara för att visa modulo-operatorns princip åter igen. % 10000 begränsar årtalet till intervallet 0-9999. Alltså, alla siffror till vänster om tusentalet i årtalet filtreras bort. Detta är så klart inte egentligen nödvändigt, precis som divisionen med 1 för dagen inte är nödvändigt.

Extrauppgift: Hur fungerar detta för andra nummer än jämna tiotal? Hur relaterar detta till andra talbaser än 10, t ex 16 (hexadecimala tal)?

#include <stdio.h>
int main(void){
        long datum = 0x20091031;
        long y,m,d;

        y = (datum / 0x10000) % 0x10000;
        m = (datum / 0x100)   % 0x100;
        d = (datum / 0x1)     % 0x100;
        printf("%X-%X-%X\n", y, m, d);
}

0x påbörjar ett hexadecimalt tal, %X skriver ut ett tal i hexadecimal notation.
0x20091031 = 537464881 decimalt och 0x10000 = 65536 decimalt. Ändå fungerar koden. Fundera på varför.

Lycka till. :)

Medlem sedan apr. 20041 597 inlägg
#3

Tack för en mycket utförlig förklaring på hur man löser denna typ av problem. Jag fick ordning på programkoden sen :)

256 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)