Подсчет дней с 1.1.1

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

#include <stdio.h>
int main()

{
    int d, m, r;
    printf("Podaj dzien, miesiac i rok\n");
    scanf("%d %d %d", &d, &m, &r);
    printf("%d", iledni(d, m, r));
    return 0;
}

int iledni(int d, int m, int r)
{
    int dni,x;
    int msc[12]={0,31,59,90,120,151,181,212,243,273,304,334};
    dni=r*365+msc[m-1]+d-1;
    dni=dni+(int)((r-1)/4)-(int)((r-1)/100)+(int)((r-1)/400);
    if (m>2 && r%4 == 0 && r%100 != 0 || r%400 == 0)
        dni=dni+1;
    return dni;
}

Моя следующая задача — написать функцию, которая считает дни с момента моего рождения до текущей даты, я не уверен, как следует вводить данные, поэтому сейчас я предполагаю, что это просто написано в int main(), поэтому мне нужно изменить только iledni функция, но у меня есть некоторые проблемы с ней, а точнее неправильный результат и я не знаю, как это исправить >‹

#include <stdio.h>
int main()
{
    int d=17, m=8, r=2013;
    int du=25, mu=11, ru=1994;
    printf("%d", iledni(d, m, r, du, mu, ru));
    return 0;
}

int iledni(int d, int m, int r, int du, int mu, int ru)
{
    int dni,x;
    int msc[12]={0,31,59,90,120,151,181,212,243,273,304,334};
    int mscdodni[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    dni=(r-ru)*365+msc[m-1]-msc[mu]+d-1+(mscdodni[mu-1]-du);
    for (ru=1994; ru<=r; ru++)
        {
        if (ru%4 == 0 && ru%100 != 0 || ru%400 == 0)
            dni=dni+1;
        }
return dni;
}

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


person deviance    schedule 14.10.2013    source источник
comment
Технический термин — пролептический григорианский календарь. См. en.wikipedia.org/wiki/Proleptic_Gregorian_calendar.   -  person Eric Jablow    schedule 14.10.2013
comment
Спасибо, не знал этого.   -  person deviance    schedule 14.10.2013


Ответы (1)


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

Эта функция вернет количество дней с 1900-1-1:

int countDaysFrom1900(int y, int m, int d) {
    // The sum of days, equivalent to your msc array
    int days[] = {0, 31, days[1] + 28, days[2] + 31, days[3] + 30, days[4] + 31, days[5] + 30, days[6] + 31, days[7] + 31, days[8] + 30, days[9] + 31, days[10] + 30, days[11] + 31};

    // Offset the day value if the year is a leap year 
    // The: "(!(y % 400) || ((y % 100) && !(y % 4)))" thing is checking the leap year
    int offset = m > 2 && (!(y % 400) || ((y % 100) && !(y % 4))) ? 1 : 0;

    // Calculate the number of transcurred days 
    return y -= 1901, ((y + 1) * 365 + (y / 4) - (y / 100) + ((y + 1900) / 400) - 4 + days[m - 1] + offset + d - 1);
}

Вот пример использования:

int main() { 
    std::cout << countDaysFrom1900(1900, 1, 1) << std::endl;
    std::cout << countDaysFrom1900(1900, 1, 2) << std::endl;
    std::cout << countDaysFrom1900(1901, 1, 1) << std::endl;
    std::cout << countDaysFrom1900(2013, 10, 13) << std::endl;

    // Some birthdate
    int daysFromBirthdate = countDaysFrom1900(1982, 4, 27);
    int currentDate = countDaysFrom1900(2013, 10, 13);

    std::cout << "There are " << (currentDate - daysFromBirthdate) << " days from birthdate" << std::endl;
    return 0;
}

Отпечатки:

0
1
365
41558
There are 11492 days from birthdate
person higuaro    schedule 14.10.2013
comment
Спасибо, я много чего не понимаю в вашем коде (это мой второй день программирования), но у меня еще есть несколько дней до того, как я должен подготовить программу, так что я разберусь. - person deviance; 14.10.2013