###実現したいこと
日付を入力して、そのn日後の日付を計算するプログラムを作っています。
###問題点
実行結果が合いません。。一か月ずれてしまいます。
どうすればよいか教えてください。
日付を入力してください 2019 6 16 何日後ですか n: 365 2019年6月16日の365日後は2020年5月16日です
うるう年の処理は合っているでしょうか。
int num_days_year(int y)
のboolの処理があまり自信がありません。
###コード
C++
1#include<iostream> 2 3//y年がうるう年か判定する関数 4bool is_leap_year(int y) 5{ 6 if(y%4==0&&y%100!=0||y%400==0){ //[4で割り切れる]かつ[100で割り切れない、または400で割り切れる] 7 return true; 8 }else{ 9 return false; 10 } 11} 12 13//y年m月に含まれる日数を計算する関数 14int num_days_in_month(int y,int m) 15{ 16 int days=0; 17 if(is_leap_year(y)==true&&m==2){ //うるう年で2月のとき 18 days=28; 19 }else if(is_leap_year(y)==false&&m==2){ //うるう年ではない2月 20 days=29; 21 }else if(m==4||m==6||m==9||m==11){ //4月、6月、9月、11月のとき 22 days=30; 23 }else{ //上記以外 24 days=31; 25 } 26 return days; 27} 28 29//日数を表現するクラス 30struct Date 31{ 32 int years; //年 33 int month; //月 34 int day; //日 35 36 //日付をn日進める関数 37 void advance(int n) 38 { 39 day+=n; 40 while(day>num_days_in_month(years,month)){ //その月の日数よりdayが小さくなるまで繰り返す(dayは減っていく) 41 day-=num_days_in_month(years,month); 42 if(month++>12){ //12月までいったら1月に戻る 43 years++; 44 month=1; 45 } 46 } 47 } 48}; 49 50//Dateに対する入力用の演算子 51std::istream& operator>>(std::istream& in, Date& d) 52{ 53 in>>d.years>>d.month>>d.day; 54 return in; 55} 56 57//Dateに対する出力用の演算子 58std::ostream& operator<<(std::ostream& out, Date d) 59{ 60 out<<d.years<<"年"<<d.month<<"月"<<d.day<<"日"; 61 return out; 62} 63 64int main() 65{ 66 Date d; //日付クラス 67 int n; //n日後 68 Date day; 69 std::cout<<"日付を入力してください\n"; 70 std::cin>>d; 71 std::cout<<"何日後ですか n:\n"; 72 std::cin>>n; 73 74 std::cout<<d<<"の"<<n<<"日後は"; 75 d.advance(n); 76 std::cout<<d<<"です\n"; 77 78 return 0; 79 80}
提示のコードのように地道に計算しないといけないのでしょうか?(という課題?)
シリアル値に変換してから計算とかではダメなんでしょうか?
回答2件
あなたの回答
tips
プレビュー