Algorithm to calculate life time in days

2

I wanted to know how many days I've lived, between the date I was born to this day, including leap years. I'm doing the following, but I do not know how to finish:

#include<stdio.h>
#include<locale.h>

int main(){
setlocale(LC_ALL, "portuguese");
 int dia,diaatual,mes,mesatual,ano,anoatual,totaldias,i;

printf("Digite o dia que você nasceu:\n");
scanf("%d",&dia);
printf("Digite o mes que você nasceu:\n");
scanf("%d",&mes);
printf("Digite o ano que você nasceu:\n");
scanf("%d",&ano);
printf("Digite o dia (data de hoje):\n");
scanf("%d",&diaatual);
printf("Digite o mês (data de hoje):\n");
scanf("%d",&mesatual);
printf("Digite o ano (data de hoje):\n");
scanf("%d",&anoatual);

    for(int i = ano; i < anoatual; i++){ 

        // verifica se ano é bissexto ou não
        if(i % 4 == 0){
            totaldias += 366;
        } else {
            totaldias += 365;
        }
    }

    printf("Dias: %d",totaldias);

    return 0;
}
    
asked by anonymous 29.03.2017 / 17:55

2 answers

1

I wrote this response based on in my other answer (there I explain this in more detail). I just translated the relevant part of the algorithm for C.

#include <stdio.h>
#include <locale.h>

int restoSemSinal(int a, int b) {
    return (a >= 0L
            ? a % b // Positivo.
            : (b + (a % b)) % b); // Negativo.
}

int divisaoSemSinal(int a, int b) {
    return a >= 0L
            ? a / b // Positivo.
            : (a / b) - (a % b == 0 ? 0 : 1); // Negativo.
}

int contarDiasDesde1970(int dia, int mes, int ano) {
    // Passo 1.
    int anosDesde1970 = ano - 1970;

    // Passo 2.
    int periodosDe400Anos = divisaoSemSinal(anosDesde1970, 400);
    int anoNoPeriodoDe400Anos = restoSemSinal(anosDesde1970, 400);

    // Passo 3.
    int periodosDe4AnosNos400 = anoNoPeriodoDe400Anos / 4;
    int anoNoPeriodoDe4Anos = anoNoPeriodoDe400Anos % 4;

    // Passo 4.
    int diasNosAnosAnterioresDoPeriodoDe4Anos = 365 * anoNoPeriodoDe4Anos + (anoNoPeriodoDe4Anos == 3 ? 1 : 0);

    // Passo 5.
    int diasNoAno = dia - 1;
    int tabelaDeMeses[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int i;
    for (i = 0; i < mes - 1; i++) {
        diasNoAno += tabelaDeMeses[i];
    }

    // Passo 6.
    int dias = diasNoAno
            + diasNosAnosAnterioresDoPeriodoDe4Anos
            + periodosDe4AnosNos400 * 1461
            + periodosDe400Anos * 146097;

    // Passo 7.
    if (anoNoPeriodoDe4Anos == 2 && mes > 2) dias++;
    if (anoNoPeriodoDe400Anos > 130 || (anoNoPeriodoDe400Anos == 130 && mes > 2)) dias--;
    if (anoNoPeriodoDe400Anos > 230 || (anoNoPeriodoDe400Anos == 230 && mes > 2)) dias--;
    if (anoNoPeriodoDe400Anos > 330 || (anoNoPeriodoDe400Anos == 330 && mes > 2)) dias--;

    return dias;
}

int main() {
    setlocale(LC_ALL, "portuguese");
    int diaNascimento, diaHoje, mesNascimento, mesHoje, anoNascimento, anoHoje;

    printf("Digite o dia que você nasceu:\n");
    scanf("%d", &diaNascimento);
    printf("Digite o mês que você nasceu:\n");
    scanf("%d", &mesNascimento);
    printf("Digite o ano que você nasceu:\n");
    scanf("%d", &anoNascimento);
    printf("Digite o dia (data de hoje):\n");
    scanf("%d", &diaHoje);
    printf("Digite o mês (data de hoje):\n");
    scanf("%d", &mesHoje);
    printf("Digite o ano (data de hoje):\n");
    scanf("%d", &anoHoje);

    int nascimento = contarDiasDesde1970(diaNascimento, mesNascimento, anoNascimento);
    int hoje = contarDiasDesde1970(diaHoje, mesHoje, anoHoje);
    int diasDeVida = hoje - nascimento;

    printf("Dias: %d", diasDeVida);

    return 0;
}
Although this algorithm uses as a reference point the year of 1970, it works for any date from October 15, 1582. It could use any other full year of the Gregorian era (from 1583) as a reference point with only a few small adjustments, but I decided to keep 1970 because that's what was in the original algorithm.

For dates prior to the reform of the calendar in 1582 (which established the Gregorian calendar), the algorithm will produce erroneous results.

    
29.03.2017 / 19:33
0

Would that be it? Any questions comments ...

#include<stdio.h>
#include<locale.h>

int main(){
setlocale(LC_ALL, "portuguese");
 int dia,diaatual,mes,mesatual,ano,anoatual,totaldias;
int anos, meses, dias, diaano, diames;

printf("Digite o dia que você nasceu:\n");
scanf("%d",&dia);
printf("Digite o mes que você nasceu:\n");
scanf("%d",&mes);
printf("Digite o ano que você nasceu:\n");
scanf("%d",&ano);
printf("Digite o dia (data de hoje):\n");
scanf("%d",&diaatual);
printf("Digite o mês (data de hoje):\n");
scanf("%d",&mesatual);
printf("Digite o ano (data de hoje):\n");
scanf("%d",&anoatual); 
//total de anos vividos
anos=anoatual-ano;
// diaano é os anos multiplicados por 365 dias, mais os dias dos anos bissextos, obtido pelo resto a divisao por 4
diaano=(anos%4)+(anos*365);

if(mesatual>mes){
meses=mesatual-mes;
}
else {
meses=mes-mesatual;
}
// meses convertido em dias
diames=meses*30;

if(diaatual>dia){
dias=diaatual-dia;
}
else {
dias=dia-diaatual;
}
totaldias=diames+diaano+dias;
printf("Voce viveu: %d Dias",totaldias);
}
    
29.03.2017 / 19:02