たなしょのメモ

日々勉強していることをつらつらと

C++に挑戦してみよう。アルゴリズム編 未完成 11日目

コード

#include <stdio.h>

typedef struct {
int y;
int m;
int d;
} Date;

Date DateOf(int y, int m, int d);

Date After(Date x, int n);

Date Before(Date x, int n);

int isleap(int year);

int main(void)
{
int y, m, d, a, b;
Date test_day;
Date after_day;

y = 2018;
m = 9;
d = 20;

printf("日付を何日にしますか?:");
scanf("%d", &a);

test_day = DateOf(y, m, d);
after_day = After(test_day, a);

printf("%d年%d月%d日ですね。\n", test_day.y, test_day.m, test_day.d);
printf("--- 日付を進めると ---\n");
printf("%d年%d月%d日ですね。\n", after_day.y, after_day.m, after_day.d);

return 0;
}

Date DateOf(int y, int m, int d)
{
Date today;

today.y = y;
today.m = m;
today.d = d;

return today;
}

Date After(Date x, int n)
{
int uru_flg;
x.d += n;

uru_flg = isleap(x.y);

if(x.m == 1 || x.m == 3 || x.m == 5 || x.m == 7 || x.m == 8 || x.m == 10 || x.m == 12)
{
if(x.d > 31){
x.d = x.d - 31;
x.m += 1;
}
}else if(x.m == 4 || x.m == 6 || x.m == 9 || x.m == 11){
if(x.d > 30){
x.d = x.d - 30;
x.m += 1;
}
}else if(x.m == 2){
 
if(uru_flg == 0){
if(x.d > 28){
x.d = x.d - 28;
x.m += 1;
}
}else if(uru_flg == 1){
if(x.d > 29){
x.d = x.d - 29;
x.m += 1;
}
}
 
}

if(x.m == 13){
x.y += 1;
x.m = 1;
}

return x;
}

int isleap(int year)
{
return *1 || (year % 400 == 0);
}

メモ

+200日等の大きい数字に対する対応部分が未完成。

恐らくwhile文でx.d <= 31になるまでループを回し続けるように改修を加えれば実現できそうだ。

*1:year % 4 == 0) && (year % 100 != 0