C++で経過日の計算

このQ&Aのポイント
  • C++を使用して、指定した日付間の日数を計算するプログラムが正しい値を出力しない問題についての質問です。
  • プログラムの中のint month_day()関数の処理に問題があり、具体的な箇所が特定できず困っています。
  • 質問者は、1月1日から5月1日までの日数を計算するプログラムを作成していますが、正しい値が出力されません。
回答を見る
  • ベストアンサー

C++で経過日の計算

1月1日から5月1日までの日数を計算するプログラムで、 途中までできたんですけど、正しい値が出ません。 何がダメかもわかりません。 ご教授お願いします。 #include <stdio.h> struct Date{ int month; //月 int day; //日 }; int month_day(struct Date date) { int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //月毎の日数 int i = 0; int days = 0; for(i = 1; i <= date.month - 1; i++){ days = days + md[i]; i = i + 1; } days = days + date.day; return 0; } int main(int, char **) { struct Date date; int days; date.month = 5; date.day = 1; days = month_day(date); printf("%d Days\n", days); return 0; } という感じです。 int month_day()の中の処理を書くだけなんですが、 特にエラーも出ないので、何かがおかしいのはわかってるんですが、具体的な所がどこかわからず 困っています。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //月毎の日数 前月までの日数を累計していくので、 int md[12] = {0,31,28,31,30,31,30,31,31,30,31,30}; //12月の分を使うことはない for(i = 1; i <= date.month - 1; i++){ days = days + md[i]; i = i + 1; } forの中のi++かループ中のi=i+1のどちらか片方だけでよい

CHAMPloock
質問者

お礼

なるほど わかりやすいです(^u^) ありがとうございました。

その他の回答 (8)

回答No.9

No.6 です。 「直接の回答では無い」とか書いておいたし、「配列じゃ無いからなんか変なもの」と思って、No.6 は無視したんだろうな。 > でも値を返して、ってエラーが出てくるので > どうにかしなきゃと思った結果がこれでしたorz この部分は、しっかり書いてあるのにね。

CHAMPloock
質問者

お礼

お礼が遅れて申し訳ありません。 ただすぐに確認できる状態でないので、詳しくわかってからお礼をしようと思っていました。 納得してからでないと、生返事みたいな感じになってしまうのでお礼していませんでした。 回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

Java も C++ も「配列の添字」については C の仕様を受け継いでるから同じこと....

CHAMPloock
質問者

お礼

…一から勉強し直しますね。^_^; ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.7

仮に日数の計算が正しいとしても、month_day関数で >return 0; していることですべてを台無しにしていますね。

CHAMPloock
質問者

お礼

やっぱりそうですよね でも値を返して、ってエラーが出てくるので どうにかしなきゃと思った結果がこれでしたorz 値を返すってのがよくわからないんですよね 回答ありがとうございました。

回答No.6

直接の回答ではないのですが、 こういうのもいいかなと思うのです。 ※ただし、未確認。 int month_day(strcut Date date) { int days = 0; for(int i = 1; i < date.month; i++) { switch(i) { case 2: days += 28; break; case 4: case 6: case 9: case 11: days += 30; break; defalut : days += 31; break; } } days += date.day; return days; } int md[12] = {31,28,31,30,31,30,30,31,30,31,30,31}; //月毎の日数 で、間違っているのが一目でわかりますか?(私がわざと間違えて書きました) それより、「西むく士」を知っていたら、こっちの方が確認が楽かなと。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>正しい値が出ません。 常に「0 Days」と表示される…とか。 >int month_day(struct Date date) >{ >     : >return 0; >} なので、month_day()内でどんな処理をしようとも >days = month_day(date); でdaysに入るのは常に0…となっていますが。 配列に関しては既に指摘されてますね。

CHAMPloock
質問者

お礼

まさにその通りで、0daysって出ちゃうんですよ!! 自分でもダメだろこれって思いつつも 値を返すってのがよくわかんなくて^_^; 回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

配列を使えてませんね. なぜ i は 1 からなの? C における配列の添え字はいくつからか知ってる? NULL って何>#2.

CHAMPloock
質問者

お礼

C++初めてで、多分javaならわかるんですけど、 検索してみます。 回答ありがとうございました。

  • oihsigus
  • ベストアンサー率0% (0/1)
回答No.2

配列の個数は12ですが最後にNULLがあるので、md[12]ではなく12にNULLをプラスしたmd[13]です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

配列の使い方は OK?

CHAMPloock
質問者

お礼

回答ありがとうございます 配列使えてないですかf^_^; int md~ の行だけじゃだめですか??

関連するQ&A

  • C言語

    #include <stdio.h> int main(void) { int month, days; puts("月を入力してください:"); scanf("%d",&month); // if(month == 2) days = 28; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12); days = 31; else days=30; printf("%d月は%d日あります。\n", month, days); return(0); } // 月と日数の場合わけをしたいのですがうまくいきません。どこをなおせばいいのか誰か教えてください!

  • C言語

    #include <stdio.h> int main(void) { int month, days; puts(\"月を入力してください:\"); scanf(\"%d\",&month); // if(month == 2) days = 28; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12); days = 31; else days=30; printf(\"%d月は%d日あります。\\n\", month, days); return(0); } // 月と日数の場合わけをしたいのですがうまくいきません。どこをなおせばいいのか誰か教えてください!

  • C言語の穴埋め問題なのですが

    ???の中身を教えてください #include <stdio.h> #define N 3 //構造体の宣言 typedef struct date{ char *nengou; int year; int month; int day; }DATE; //関数のプロトタイプ宣言 void disp(DATE data); int main(void) { DATE birthday; char buff[80]; ???= buff; printf("年号:"); scanf("%s" , birthday.nengou); printf("年:"); scanf("%d" ,&birthday.year ); printf("月:"); scanf("%d" , &birthday.month); printf("日:"); scanf("%d" ,&birthday.day ); disp(birthday ); } void disp(DATE data) { printf("%s%d年%d月%d日\n" , data.nengou , data.year , data.month , data.day); }

  • c++

    /* char03*/ #include<stdio.h> int main() { char i; for(i='!';i<='~';i++){ printf(%3d(0x%2X)--%c",i,i,i); if((1-'!'+1)%4==0 printf("\n") } printf("\n") return("\n") return 0; } if((1-'!'+1)%4==0はどういう意味でしょうか

  • c

    /* char03*/ #include<stdio.h> int main() { char i; for(i='!';i<='~';i++){ printf(%3d(0x%2X)--%c",i,i,i); if((1-'!'+1)%4==0 printf("\n") } printf("\n") return("\n") return 0; } (0x%2X)数字でしょうかなんでしょうか わかりません 助けて下さい

  • C言語について

    #include <stdio.h> #include <string.h> #include <time.h> typedef struct { int day; double dist; char comment[32]; } diary; void writeData(char datafile[]); void viewData(char datafile[]); char datadir[] = "dat/"; int year, month, day; int main(int argc, char* argv[]) { char datafile[11]; struct tm *date; time_t now; now = time(NULL); date = localtime(&now); year = date->tm_year + 1900; month = date->tm_mon + 1; day = date->tm_mday; sprintf(datafile, "walk%04d%02d", year, month); if ((argc > 1) && (strcmp(argv[1], "-view")==0)) { viewData(datafile); } else { writeData(datafile); } return 0; } void writeData(char datafile[]) { diary today_data; FILE *outfp; //出力ファイルのファイルポインタ char y_n = 'n'; char filename[15]; char input_str[12]; printf("%d/%d/%dの記録をしますか? (y/n) > ", year , month, day); scanf("%c", &y_n); while (getchar() != '\n') { } if(y_n != 'y') { printf("記録する日付は?(例:%d %d %d) > ", year, month, day); year = 0; month = 0; day = 0; gets(input_str); sscanf(input_str, "%d %d %d", &year, &month, &day); if((year > 9999) || (month > 12) || (month < 1) || (day > 31) || (day < 1)) { printf("日付が正しくありません\n"); return; } sprintf(datafile, "walk%04d%02d.txt", year, month); } today_data.day = day; printf("距離は? > "); scanf("%lf", &today_data.dist); while (getchar() != '\n') { } printf("コメントは?(30文字以内) > "); fgets(today_data.comment, 32, stdin); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { while (getchar() != '\n') { } } sprintf(filename, "%s%s", datadir, datafile); if((outfp = fopen(filename, "a+")) == NULL) { printf("ファイルオープンエラー\n"); return; } fprintf(outfp, "%d %.2lf ", today_data.day, today_data.dist); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { today_data.comment[30] = '\n'; today_data.comment[31] = '\0'; } fprintf(outfp, "%s", today_data.comment); fclose(outfp); printf("記録しました"); } void viewData(char datafile[]){ } このソースの char datadir[] = "dat/";この宣言はディレクトリを指しているんですよね? この場合の/はどおいう意味ですか? 教えてください

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語を学習していてつまづいたので、皆さんの意見を聞きたいと思います。 現在、カレンダーを表示するプログラムをつくっています。 Yearとmonthをユーザが入力すると、その年その月のカレンダーが出るという算段です。(画像貼っておきます。ソースコードは下) これはできました。 これをいじって、Yearをユーザから受け取ると、その年の1月から12月までのカレンダーがば~っと表示されるようにしろ、と言われました。 Yearとmonthを受け取って書くやつは友人の助けを得ながらなんとかかけましたが、もう無理です。多分、for文を使うんだと思うんですが……助けてください! #include <stdio.h> int dayofweek(int year, int month); int daysinmonth(int year, int month); int daysinyear(int year); void showcal(int dow, int days); int main(void) { int year, month; int dow; int dim; printf ("Year?: "); scanf ("%d", &year); printf ("Month?: "); scanf ("%d", &month); dow = dayofweek(year, month); dim = daysinmonth(year, month); showcal(dow, dim); return 0; } void showcal (int dow, int days) { int i, j, d; printf ("Su Mo Tu We Th Fr Sa\n"); d = 1; for (i = 0; i < dow; i++) { printf (" "); } for (; i < 7; i++) { printf (" %d ", d); d++; } printf("\n"); for (j = 0; d <= days; j++) { for (i = 0; i < 7 && d <= days; i++) { if (d < 10) printf (" %d ", d); else printf ("%d ", d); d++; } printf("\n"); } } int daysinmonth( int year, int month) { int dim; dim = 31; if (month == 4 || month == 6 || month == 9 || month == 11) dim = 30; if (month == 2) { if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) dim = 29; else dim = 28; } return dim; } int daysinyear( int year) { int diy; if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) diy = 366; else diy = 365; return diy; } int dayofweek (int year, int month) { int dow; int days; int y, m; if (year >= 2000) { days = 0; for ( y = 2000; y < year; y++ ) { days = days + daysinyear(y); } for ( m = 1; m < month; m++ ) { days = days + daysinmonth(year, m); } dow = (6 + days) % 7; } else { days = 0; for ( m = month; m <= 12; m++ ) { days = days + daysinmo

  • C言語 実行エラー 10000日先が表示されない 

    今10000日先後の年、月、日を求めていて下のプログラムを 考えたんですけど、コンパイルは通るんですが結果がうまくいきません↓ どこがおかしいですか? #include<stdio.h> int leapYear(int); int Date(int,int,int,int); int main(void){ int year,i=0,month,date,date2=10000,emp=0; printf("年>>"); scanf("%d",&year); printf("月>>"); scanf("%d",&month); printf("日>>"); scanf("%d",&date); Date(year,month,date,date2);//date2から各月の日数を引いていく printf("year=%d month=%d date=%d date2=%d \n",year,month,date,date2); return 0; } int leapYear(int year){ //うるう年を求める if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } else return 0; } int Date(int y,int m,int d,int d2){ for(;;y++){ if(d2<0) return y,m,d,d2; for(;m<=12 || d2>=0;m++){ if(leapYear(y)==1){ if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(29-d); else d2-(31-d); } else if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(28-d); else d2-(31-d); } } }

  • C++で日付のプログラミング

    前回も同じ質問をして、自分なりに直してみたのですが、どうもうまく動作しません。 長くなりますが、教えてください。 日付のエラー処理を完全にするというもので、 次のような仕様を満たすようにMyDateクラスを修正せよ。というものです。 1.月、日共に初期値は1とする。 2.月、日の状態を出力するメンバ関数print()を追加する。 3.changeDay関数において、monthに入っている値に対応して適切なエラー処理を行う。    4月の時は日は30まで、5月の時は31まで、みたいな感じです。 4.changeMonth関数において、変更しようとする月に対しdayに入っている値が大きすぎる場合、dayを変更後の最後の日に修正するようにする。例えば、5月31日に設定されている時に、changeMonth(2)が呼ばれた時、monthに2を、dayに28を代入する。 5.うるう年は考慮しなくていい。 #include <stdio.h> class MyDate{ private: int month, day; public: void Date(int, int); void changeMonth(int); //「月」変更用関数 void changeDay(int); //「日」変更用関数 void print(); }; void MyDate::Date(int argMonth,int argDay) { argMonth = 1; argDay = 1; } void MyDate::changeMonth(int argMonth)//メンバ関数(changeMonth)の定義 { if(argMonth >= 1 && argMonth <= 12){ //1~12のときだけ値を更新 month = argMonth; } } void MyDate::changeDay(int argDay)//メンバ関数(changeDay)の定義 { //1~31が入力された場合のみ値を更新 if(argDay >= 1 && argDay <= 31){ day = argDay; } if(month == 1,day > 31){ printf("DATE = %d/%d\n",1,31); }else if(month == 2,day > 28){ printf("DATE = %d/%d\n",2,28); }else if(month == 3,day > 31){ printf("DATE = %d/%d\n",3,31); }else if(month == 4,day > 30){ printf("DATE = %d/%d\n",4,30); }else if(month == 5,day > 31){ printf("DATE = %d/%d\n",5,31); }else if(month == 6,day > 30){ printf("DATE = %d/%d\n",6,30); }else if(month == 7,day > 31){ printf("DATE = %d/%d\n",7,31); }else if(month == 8,day > 31){ printf("DATE = %d/%d\n",8,31); }else if(month == 9,day > 30){ printf("DATE = %d/%d\n",9,30); }else if(month == 10,day > 31){ printf("DATE = %d/%d\n",10,31); }else if(month == 11,day > 30){ printf("DATE = %d/%d\n",11,30); }else if(month == 12,day > 31){ printf("DATE = %d/%d\n",12,31); }else{ printf("DATE = %d/%d\n",month,day); } } int main(int, char **){ MyDate today; today.changeMonth(12); today.changeDay(35); return 0; } それで、 初期化するコンストラクタなんですが、 void MyDate::Date~ のような感じでいいのでしょうか? argMonthとかargDayとかいらないですか?ただMonthとDayだけでいいでしょうか? print()のメンバ関数なんですが、条件式の中に組込むとメンバ関数がいらないんじゃないか、と思ってしまうのですが、条件式の最後のelse{~}の中身を入れればいいでしょうか? あと、today.changeMonth(12); today.changeDay(35); と入れると、12/-858993460とでてしまうのですが、 条件式が間違ってるんでしょうか? 質問が多くてすみません。 よろしければ、回答よろしくお願いします。

  • C++で、日付をプログラミング

    C++勉強中です。課題が出たので質問したいです。よろしくお願いします。 日付のエラー処理を完全にするというもので、 次のような仕様を満たすようにMyDateクラスを修正せよ。というものです。 1.月、日共に初期値は1とする。 2.月、日の状態を出力するメンバ関数print()を追加する。 3.changeDay関数において、monthに入っている値に対応して適切なエラー処理を行う。    4月の時は日は30まで、5月の時は31まで、みたいな感じです。 4.changeMonth関数において、変更しようとする月に対しdayに入っている値が大きすぎる場合、dayを変更後の最後の日に修正するようにする。例えば、5月31日に設定されている時に、changeMonth(2)が呼ばれた時、monthに2を、dayに28を代入する。 5.うるう年は考慮しなくていい。 #include <stdio.h> class MyDate{ private: int day, month; public: MyDate(int =1, int = 1); void changeMonth(int); //「月」変更用関数 void changeDay(int); //「日」変更用関数 void print(); }; void MyDate::changeMonth(int argMonth)//メンバ関数(changeMonth)の定義 { if(argMonth >= 1 && argMonth <= 12){ //1~12のときだけ値を更新 month = argMonth; } } void MyDate::changeDay(int argDay)//メンバ関数(changeDay)の定義 { //1~31が入力された場合のみ値を更新 if(argDay >= 1 && argDay <= 31){ day = argDay; } } void MyDate::print() { if(month = 2 && day > 28){ printf("DATE = %d/%d\n",1,31); }else if(month = 4,6,9,11 && day > 30){ printf("DATE = %d/%d\n",month-1,31); }else{ printf("DATE = %d/%d\n",month,day); } } int main(int, char **){ MyDate today; today.changeDay(30); today.changeMonth(9); return 0; } 途中まで考えたのですが、煮詰まってしまってうまくいきません。 ifは使いますよね? void MyDate::print() の所はこれでいいのでしょうか? よろしくお願いします。

専門家に質問してみよう