#include <stdio.h>
#define true 1
#define false 0
typedef int bool;
typedef struct daysYears
{
int days;
int years;
} daysYears;
daysYears* getDaysYears(daysYears* dy)
{
int daysInYear = isLeapYear(dy->years) ? 366 : 365;
if (dy->days <= daysInYear)
{
return dy;
}
else
{
dy->days -= daysInYear;
dy->years++;
return getDaysYears(dy);
}
}
daysYears* getDaysYearsBad(daysYears* dy)
{
while (dy->days > 365)
{
if (isLeapYear(dy->years))
{
if (dy->days > 366)
{
dy->days -= 366;
dy->years += 1;
}
}
else
{
dy->days -= 365;
dy->years += 1;
}
}
}
bool isLeapYear(int year)
{
if (year % 400 ==0)
{
return true;
}
else if (year % 100 == 0)
{
return false;
}
else if (year % 4 == 0)
{
return true;
}
else
{
return false;
}
}
int main(int argc, char* argv[])
{
if (argc != 3)
{
fprintf(stderr, "syntax \"days_years <g|b> <days>\"\n");
return 1;
}
char goodBad = *argv[1];
int days = atoi(argv[2]);
const int ORIGIN_YEAR = 1980;
daysYears dy;
dy.days = days;
dy.years = ORIGIN_YEAR;
if (goodBad == 'g')
{
getDaysYears(&dy);
}
else if (goodBad == 'b')
{
getDaysYearsBad(&dy);
}
else
{
fprintf(stderr, "syntax \"days_years <g|b> <days>\"\n");
return 1;
}
printf("years: %d, days: %d\n", dy.years, dy.days);
return 0;
}