Differenza di giorni tra due date

di il
3 risposte

Differenza di giorni tra due date

Devo svolgere questo esercizio:
trovare numero di giorni tra due date, tra il 1800 e il 3000.

Questo è quello che ho fatto fin'ora, sbaglio di 6 giorni tra il 1800 e il 3000, mentre di 1 giorno tra il 1800 e il 1900 (indipendentemente da giorno e mese)
non so cosa sbaglio, probabilmente nel calcolo degli anni bisestili
se posso darvi altre info chiedete pure..

#include <stdio.h>

void main()
{
// Input
int g1 = 1; // giorno prima data
int m1 = 1; // mese prima data
int a1 = 1800; // anno prima data
int g2 = 11; // giorno seconda data
int m2 = 12; // mese seconda data
int a2 = 3000; // anno seconda data

// Output
int numGiorni;

__asm
{
//trovo il numero di anni bisestili tra le due date e lo salvo in ESI
XOR EDX,EDX
XOR ESI,ESI
XOR EDI,EDI
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
MOV EAX,a2
MOV EDI,a1
SUB EAX,a1
CMP EAX,0
JE Jump
MOV ECX,EAX
MOV EAX,a1
Ciclo1: XOR EDX,EDX
MOV EBX,4
DIV EBX
CMP EDX,0
JNE Salta1
MOV EAX,EDI
MOV EBX,100
DIV EBX
CMP EDX,0
JNE True
MOV EAX,EDI
MOV EBX,400
DIV EBX
CMP EDX,0
JE Salta1
True: INC ESI
Salta1: INC EDI
MOV EAX,EDI
LOOP Ciclo1


Jump: //calcolo i giorni trascorsi nell'anno della data 2
XOR ECX,ECX
XOR EAX,EAX
XOR EBX,EBX
XOR EDX,EDX
XOR EDI,EDI
MOV EAX,m2
CMP EAX,1
JE Genna2
CMP EAX,2
JE Febbr2
CMP EAX,3
JE Marzo2
CMP EAX,4
JE April2
CMP EAX,5
JE Maggi2
CMP EAX,6
JE Giugn2
CMP EAX,7
JE Lugli2
CMP EAX,8
JE Agost2
CMP EAX,9
JE Sette2
CMP EAX,10
JE Ottob2
CMP EAX,11
JE Novem2

ADD ECX,30
Novem2: ADD ECX,31
Ottob2: ADD ECX,30
Sette2: ADD ECX,31
Agost2: ADD ECX,31
Lugli2: ADD ECX,30
Giugn2: ADD ECX,31
Maggi2: ADD ECX,30
April2: ADD ECX,31
Marzo2: ADD ECX,28
Febbr2: ADD ECX,31
Genna2:
ADD ECX,g2 // giorni trascorsi nell'anno della data 2

//calcolo i giorni trascorsi nell'anno della data 1
XOR EDI,EDI
MOV EAX,m1
CMP EAX,1
JE Genna1
CMP EAX,2
JE Febbr1
CMP EAX,3
JE Marzo1
CMP EAX,4
JE April1
CMP EAX,5
JE Maggi1
CMP EAX,6
JE Giugn1
CMP EAX,7
JE Lugli1
CMP EAX,8
JE Agost1
CMP EAX,9
JE Sette1
CMP EAX,10
JE Ottob1
CMP EAX,11
JE Novem1

ADD EDI,30
Novem1: ADD EDI,31
Ottob1: ADD EDI,30
Sette1: ADD EDI,31
Agost1: ADD EDI,31
Lugli1: ADD EDI,30
Giugn1: ADD EDI,31
Maggi1: ADD EDI,30
April1: ADD EDI,31
Marzo1: ADD EDI,28
Febbr1: ADD EDI,31
Genna1:
ADD EDI,g1 //giorni trascorsi nell'anno della data 1


MOV EAX,a2
SUB EAX,a1
CMP EAX,0
JE sameYear
CMP EAX,1
JE nextYear
// calcolo nel caso in cui la differena tra gli anni sia >= 2
//numGiorni = (((diffAnni+1) * 365) +numAnniBisest) - giorniPassatData1) - ggRimanentiData2;
INC EAX
MOV EBX,365
MUL EBX
ADD EAX,ESI
SUB EAX,EDI
SUB EAX,365
ADD EAX,ECX

MOV numGiorni,EAX
JMP Fine

sameYear: MOV EBX,365
ADD EBX,ESI
SUB EBX,EDI
SUB EBX,365
ADD EBX,ECX

MOV numGiorni,EBX
JMP Fine

nextYear: MOV EBX,730
ADD EBX,ESI
SUB EBX,EDI
SUB EBX,365
ADD EBX,ECX
MOV numGiorni,EBX

Fine:
}

//Stampa su video
printf("Numero di giorni fra %02d/%02d/%d e %02d/%02d/%d ==> %d\n",g1,m1,a1,g2,m2,a2,numGiorni);
system("pause");
}

3 Risposte

  • Re: Differenza di giorni tra due date

    Quali regole hai applicato per calcolare i bisestili?
  • Re: Differenza di giorni tra due date

    Ho fatto anno2 - anno1 e in questo arco di tempo all'inizio facevo solo un ciclo in cui per ogni anno facevo diviso 4 e controllavo il resto in EDX, e non funzionava,
    poi però trovato il seguente codice cercando su internet e ho provato a riadattarlo in assembly :
    for (int i=firstYear; i<=secYear; i++){
    if (((i % 4) == 0 && (i % 100) != 0) || (i % 400) == 0) {
    bisYear += 1;
    }
    }
    ma non funziona lo stesso -.-"

    Sbaglio "formula"?
  • Re: Differenza di giorni tra due date

    La formula è corretta, ma controlla la tua "traduzione" in assembly.
Devi accedere o registrarti per scrivere nel forum
3 risposte