Рассчитать возраст, учитывая дату рождения - PullRequest
1 голос
/ 20 апреля 2010

Учитывая дату рождения, как мне рассчитать возраст в C?

Например, если сегодняшняя дата - 20/04/2010, а дата рождения - 12/08/86, возраст будет 23 года, 8 месяцев и 8 дней.

Любые предложения будут оценены. Спасибо!

Ответы [ 8 ]

6 голосов
/ 20 апреля 2010

Только для года (без месяцев / дней):

1) Отформатируйте даты в ггггммдд

2) Вычтите дату рождения из даты

3)Удалите последние 4 цифры

(не зависит от языка)


Так, например,

date 20/04/2010
birth 12/08/1986

конвертируйте

date 20100420
birth 19860812

вычесть

20100420-19860812 = 239608

удалить последние 4 цифры

23
4 голосов
/ 21 апреля 2010

Способ решения такой проблемы - выяснить, как бы вы это сделали, используя карандаш и бумагу, а затем формализовать это в программу.

Для этой конкретной проблемы это означает на высоком уровне «вычесть дату рождения из текущей даты». Для этого вычитания вы используете вариант того же алгоритма, который вы выучили для вычитания в начальной школе - где вы начинаете с вычитания столбца с более низким значением (в данном случае «дней»), заимствуя при необходимости из столбца следующего более высокого значения , Например, чтобы вычесть 1986-09-15 из 2010-04-10, вы должны сделать:

2010-04-10 -
1986-09-15
----------

10 меньше 15, поэтому вы должны позаимствовать из столбца месяцев. Это означает, что столбец месяцев уменьшается на единицу (до 3), а столбец дней увеличивается на количество дней в месяце 3 (март - 31). Теперь вы можете сделать вычитание столбца дней:

2010-03-41 -
1986-09-15
----------
       -26

Теперь мы можем перейти к столбцу месяцев. 3 меньше, чем 9, поэтому мы должны снова занять, на этот раз из года. Возьмите одно в году и добавьте 12 к месяцу (поскольку в году всегда 12 месяцев), затем выполните вычитание:

2009-15-41 -
1986-09-15
----------
    -06-26

Теперь мы можем работать по годам - ​​здесь никогда не нужно брать взаймы (если только вы не пытаетесь подсчитать возраст кого-то, кто родился в будущем!):

2009-15-41 -
1986-09-15
----------
  23-06-26

Это означает, что разница составляет 23 года, 6 месяцев, 26 дней.

Теперь вы можете работать над превращением этого в программу (подсказка: используйте три отдельные целочисленные переменные для лет, месяцев и дней). Самая хитрая часть - это заимствование из столбца месяцев - вам нужно знать, сколько дней в этом месяце, включая високосные годы для февраля.

3 голосов
/ 20 апреля 2010

На основании вашего описания я предполагаю, что вы должны распечатать всю разницу, а не только годы.

Одна часть проблемы состоит в том, чтобы правильно вводить даты и разбивать их на компоненты. Я предполагаю, что вы уже знаете, как это сделать, или получили образец кода для этого.

Что вам нужно сделать сейчас, это рассчитать разницу. Один из способов сделать это - выбрать контрольную дату (например, 1 января 1900 г.) и рассчитать, сколько дней прошло до первой даты и второй даты, а также рассчитать разницу в днях. Затем вы берете разницу в днях и делите ее на годы / месяцы / дни.

Обратите внимание на две вещи:

1) Примите во внимание високосные годы.

2) Узнайте, как перевести число дат в месяцы, поскольку каждый месяц имеет разное количество дней.

3) Если бы вам приходилось вводить время, а не только даты, вы могли бы уйти на день. Аналогично, если введены часовые пояса.

Я бы посоветовался с инструктором, можно ли сделать упрощенное предположение об этом (например, месяцы всегда равны 30, високосные годы игнорируются и т. Д.). Мне трудно поверить, что домашнее задание потребует от вас правильного решения.

2 голосов
/ 20 апреля 2010

Если вам разрешено использовать библиотеки, это не так уж сложно. Посмотрите на strptime , struct tm , time и localtime . Как только вы получите «разбитую» форму (struct tm), легко вычислить разницу (посмотрите на tm_yday, tm_mon и tm_yday).

1 голос
/ 20 апреля 2010

Если сегодняшняя дата выпадает после дня рождения, возраст - это разница между годом рождения и сегодняшним годом. Если сегодняшняя дата выпадает до дня рождения, вычтите 1.

0 голосов
/ 26 июня 2017

Единственная проблема с этим кодом заключается в том, что он не учитывает, родился ли вы в високосный день. хотя может быть другое утверждение if для этого.

// Age Calculator

time_t t = time(NULL);
struct tm tm = *localtime(&t);

int num_day;

if ( month == 1 )
{
        num_day = 31;
}
if ( month == 2 )
{
        num_day = 28;
}
if ( month == 3 )
{
        num_day = 31;
}
if ( month == 4 )
{
        num_day = 30;
}
if ( month == 5 )
{
        num_day = 31;
}
if ( month == 6 )
{
        num_day = 30;
}
if ( month == 7 )
{
        num_day = 31;
}
if ( month == 8 )
{
        num_day = 31;
}
if ( month == 9 )
{
        num_day = 30;
}
if ( month == 10 )
{
        num_day = 31;
}
if ( month == 11 )
{
        num_day = 30;
}
if ( month == 12 )
{
        num_day = 31;
}

int age_year = (tm.tm_year + 1900) - year;
int age_month = (tm.tm_mon + 1) - month;
int age_day = (tm.tm_mday) - day;

if ( age_month <= 0 )
{
        age_year = (tm.tm_year + 1900) - year - 1;
        age_month = 12 + (tm.tm_mon + 1) - month;
}

if ( age_day <= 0 )
{
        age_month = 12 + (tm.tm_mon + 1) - month - 1;
        age_day = num_day + (tm.tm_mday) - day;
}

printf("Your age: %d years %d months %d days\n", age_year, age_month, age_day);
0 голосов
/ 29 октября 2013
//Age calculation. A simple c++ program  
    #include<iostream>
    #include<iostream>
    #include<ctime>
    using namespace std;
    void main()
    {
        system("cls");
        time_t theTime = time(NULL);
        struct tm *aTime = localtime(&theTime);

        int currentday = aTime->tm_mday;
        int currentmonth = aTime->tm_mon + 1; // Month is 0 - 11, add 1 to get a jan-dec 1-12 concept
        int currentyear = aTime->tm_year + 1900; 



        int birthday,birthmonth,birthyear;
        cout<<"Enter birth year: ";
        cin>>birthyear;

        if(birthyear>currentyear)
        {
            cout<<"Current year: "<<currentyear<<endl
                <<"Birht year  : "<<birthyear<<endl
                <<"Invalid...."<<endl<<endl;
            system("pause");
            main();
        }
        else if(birthyear<1900)
        {
            cout<<"Birht year should greater than 1900...."<<endl;
            system("pause");
            main();
        }
        cout<<"Enter birth month: ";
        cin>>birthmonth;
        if(birthmonth<1 || birthmonth>12)
        {
            cout<<"Birth month should be 1-12"<<endl;
            system("pause");
            main();
        }
        else if(birthyear==currentyear && birthmonth>currentmonth)
        {
            cout<<"Current Month/Year: "<<currentmonth<<"/"<<currentyear<<endl
                <<"Birth Month/Year  : "<<birthmonth<<"/"<<birthyear<<endl
                <<"Future Birth Date. Invalid...."<<endl;
            system("pause");
            main();
        }
        cout<<"Enter birth day: ";
        cin>>birthday;
        if(birthday<1 || birthday>31)
        {
            cout<<"Birth day should 1-31"<<endl;
            system("pause");
            main();
        }
        else if(birthyear==currentyear && birthmonth==currentmonth && birthday>currentday)
        {
            cout<<"Current Day/Month/Year: "<<currentday<<"/"<<currentmonth<<"/"<<currentyear<<endl
                <<"Birth Day/Month/Year  : "<<birthday<<"/"<<birthmonth<<"/"<<birthyear<<endl
                <<"Future Birth Date. Invalid...."<<endl;
            system("pause");
            main();
        }
        else if(birthyear%4==0 && birthmonth==2 && birthday>29)
        {
            cout<<"Febuary should be 1-29"<<endl;
            system("pause");
            main();
        }
        else if( (birthmonth==4 || birthmonth==6 || birthmonth==9 || birthmonth==11) && birthday>31)
        {
            cout<<"This month cannot have 31 days...."<<endl;
            system("pause");
            main();
        }


        int ageday,agemonth,ageyear;


        if(birthmonth>currentmonth)
        {
            agemonth=currentmonth;
            ageyear=currentyear-birthyear-1;
            ageday=currentday;
        }
        else
        {
            agemonth=currentmonth-birthmonth;
            ageyear=currentyear-birthyear;
            ageday=currentday-birthday;
        }

        if(ageyear==0 && agemonth==0)
        {
            cout<<"your Date of Birth: "<<birthday<<"/"<<birthmonth<<"/"<<birthyear<<endl;
            cout<<"Current Date      : "<<currentday<<"/"<<currentmonth<<"/"<<currentyear<<endl;
            cout<<"your Age          : "<<ageday<<" days"<<endl;
        }
        else if(ageyear==0)
        {
            cout<<"your Date of Birth: "<<birthday<<"/"<<birthmonth<<"/"<<birthyear<<endl;
            cout<<"Current Date      : "<<currentday<<"/"<<currentmonth<<"/"<<currentyear<<endl;
            cout<<"your Age          : "<<agemonth<<" Months"<<ageday<<" days"<<endl;
        }
        else if(agemonth==0)
        {
            cout<<"your Date of Birth: "<<birthday<<"/"<<birthmonth<<"/"<<birthyear<<endl;
            cout<<"Current Date      : "<<currentday<<"/"<<currentmonth<<"/"<<currentyear<<endl;
            cout<<"your Age          : "<<ageyear<<" years"<<ageday<<" days"<<endl;
        }
        else if(ageday==0)
        {
            cout<<"your Date of Birth: "<<birthday<<"/"<<birthmonth<<"/"<<birthyear<<endl;
            cout<<"Current Date      : "<<currentday<<"/"<<currentmonth<<"/"<<currentyear<<endl;
            cout<<"your Age          : "<<ageyear<<" years"<<agemonth<<" Months"<<endl;
        }
        else
            cout<<"your Date of Birth: "<<birthday<<"/"<<birthmonth<<"/"<<birthyear<<endl;
            cout<<"Current Date      : "<<currentday<<"/"<<currentmonth<<"/"<<currentyear<<endl;
            cout<<"your Age          : "<<ageyear<<" years"<<agemonth<<" Months"<<ageday<<" days"<<endl;
        system("pause");
    }
//AAW
0 голосов
/ 08 июня 2013
/* program for calculating the age */
/* author - nitin kumar pandey */
/* mail - nitindonpandey@gmail.com */ 
#include<stdio.h>
#include<conio.h>
int d1,d2,d3,m1,m2,m3,y1,y2,y3;
void year(int d1,int m1,int y1,int d2,int m2,int y2);
void main()
{
clrscr();
printf("please enter the current date \n");
printf("enter the day");
scanf("%d",&d1);
printf("enter the month");
scanf("%d",&m1);
printf("enter the year");
scanf("%d",&y1);
printf("Now thank you for your cooperation \n now please enter the date of birth");
printf("enter the day");
scanf("%d",&d2);
printf("enter the month");
scanf("%d",&m2);
printf("enter the year");
scanf("%d",&y2);
year(d1,m1,y1,d2,m2,y2);
getch();
}

void year(int d1,int m1,int y1,int d2,int m2,int y2)
{
    if(d2>d1)
    {
    m1=m1-1;
    d1=d1+30;
    }
    if(m2>m1)
    {
    y1=y1-1;
    m1=m1+12;
    }
    if(y2>y1)
    {
    exit(0);
    }
    d3=d1-d2;
    m3=m1-m2;
    y3=y1-y2;
    printf("current age is \n day %d \n month %d \n year %d ",d3,m3,y3);


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...