質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

8428閲覧

n日後の日付を計算するプログラムがわからない

langhtorn

総合スコア104

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/06/18 15:20

###実現したいこと
日付を入力して、その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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/06/19 01:49

提示のコードのように地道に計算しないといけないのでしょうか?(という課題?) シリアル値に変換してから計算とかではダメなんでしょうか?
guest

回答2

0

  1. advancemonth++だと、条件式の評価がインクリメントされる前に行なわれてしまうので、++monthにする(あるいはmonth++してからifで評価する)。

C++

1 void advance(int n) 2 { 3 day += n; 4 while (day > num_days_in_month(years, month)) { 5 day -= num_days_in_month(years, month); 6 if (++month > 12) { 7 years++; 8 month = 1; 9 } 10 } 11 }
  1. num_days_in_monthの中の、閏年とそうでない年の2月の日数の設定が逆になっている。閏年の2月は29日あり、そうでない年の2月は28日あるので、正しく設定する。

  2. is_leap_yearはこう書けばいいのでは。

C++

1bool is_leap_year(int y) { 2 return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; 3}

投稿2020/06/18 15:44

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/06/19 02:40

うるう年が逆でしたね、、ご指摘いただきありがとうございました。
guest

0

ベストアンサー

C++

1 while(day>num_days_in_month(years,month)){ //その月の日数よりdayが小さくなるまで繰り返す(dayは減っていく) 2 // monthが12のとき(12月の処理をしたとき 3 day-=num_days_in_month(years,month); 4 if(month++>12){ //12月までいったら1月に戻る // <- これだとmonthと12を比較してからmonth加算なので13に行く(よってずれる 5 years++; 6 month=1; 7 } 8 }

サンプルデータとしては

日付を入力してください 2019 12 1 何日後ですか n: 32 2019年12月1日の32日後は2019年13月2日です

ってなります。

month++>12++month > 12にするか、

day-=num_days_in_month(years,month); month++; if(month>12){

演算子優先がややこしいので2行に分ける。

C++

1 if(is_leap_year(y)==true&&m==2){ //うるう年で2月のとき 2 days=28; 3 }else if(is_leap_year(y)==false&&m==2){ //うるう年ではない2月 4 days=29; 5 }else if(m==4||m==6||m==9||m==11){ //4月、6月、9月、11月のとき 6 days=30; 7 }else{ //上記以外 8 days=31; 9 }

うるう年の2月は29日ですよね

投稿2020/06/18 15:38

rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/06/19 02:39

12月判定のところが間違っていました、、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問