Algorithm to calculate lifetime in days

Asked

Viewed 3,541 times

2

He wanted to know how many days I have lived between the date I was born to this day, including leap years. This is how I’m doing, but I don’t 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;
}
  • Improve your question. Is there an error? What is your question? You did not answer the question...

  • I’m beginner, I’m not getting the right logic to do, I want to know how many days I’ve lived between the date I was born and today including the leap years ps: in C language ( If possible without using vector or matrix)

  • Related: http://answall.com/a/182280/132 and http://answall.com/a/70604/132

2 answers

1

I wrote that answer based on in this my other answer (there I explain it in more detail). I just translated the pertinent part of the algorithm to 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 1970, it works for any date from 15 October 1582. He could use any other full year of the Gregorian era (from 1583) as a point of reference with just a few minor 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 held in 1582 (which instituted the Gregorian calendar), the algorithm will produce wrong results.

  • +1 It is still extensive, but still good.

0

Would that be it? Any doubt comment...

#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);
}
  • Did you know they haven’t had 30 days in months?

  • @I knew, but I didn’t want to give you the full code... I gave you a logic. And since it’s a beginner’s algorithm, probably adopt 30 days as the default.

  • Thank you, that’s basically what I want, I’ll try to put the conditions for the months of different days

  • @Amandasilva resolve, mark as answer and complement if you want... Pleasure Help :)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.