• ベストアンサー

入力した日は何曜日か

入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします #include<stdio.h> int main() { int iyear,imonths,iday; int sum,i; int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; char*cweek[7] = {"日","月","火","水","木","金","土"}; sum =0; printf ("input (e.g. ****/**/**)\n>>"); scanf ("%d/%d/%d",&iyear,&imonths,&iday); /*閏年の判定*/ for(i=1;i<year;i++){ if((year%4==0)&&((year%100!=0))||(year%400==0)){ sum++; i++; } year--; /*前月までの日数*/ for (i =0; i < imonths-1; i++) { sum += m_array[i]; } year++; sum=sum+day; //曜日の出力 printf("%s曜日",cweek[sum%7]); return 0; } }

noname#53915
noname#53915

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

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

私も Zeller の公式をお勧めしますが, このプログラムだと「少なくとも閏年の 2月28日までか 3月1日以降かのいずれかはおかしくなる」はずです. 曜日を出力する直前で sum の値を見てみればわかると思いますが, 例えば 2008/2/29 と 2008/3/1 が同じ値になりますね.

noname#53915
質問者

補足

やっぱりsumに問題があるんですかね?

その他の回答 (5)

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

お~, よく見たらこのプログラム, いろいろ変だ.... ・最初の for が最後までかかっているので無限ループになってそう. ・year をデクリメントしてからインクリメントしてる (しかもその間で year は使われていない) のはなぜ? ・そもそも sum の値は全く正しくないような気がする. 2009年か 2010年くらいにおかしい感じ.

noname#53915
質問者

お礼

矛盾だらけでした、よく見たらわかることでしたね ありがとうございます。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.5

やりたいことはこういうことですか? #include<stdio.h> int main() { int iyear,imonths,iday; int sum,i; int year; int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; char*cweek[7] = {"日","月","火","水","木","金","土"}; sum =0; printf ("input (e.g. ****/**/**)\n>>"); scanf ("%d/%d/%d",&iyear,&imonths,&iday); /*閏年の判定*/ for(year=1;year<iyear;year++){ if((year%4==0)&&((year%100!=0))||(year%400==0)){ sum+=366; }else{ sum+=365; } } printf( "year sum = %d\n", sum ); if((year%4==0)&&((year%100!=0))||(year%400==0)){ m_array[1] = 29; }else{ m_array[1] = 28; } /*前月までの日数*/ for (i =0; i < imonths-1; i++) { sum += m_array[i]; } printf( "months sum = %d\n", sum ); sum=sum+iday; //曜日の出力 printf("%s曜日",cweek[sum%7]); return 0; }

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

.... 「曜日がずれる」のは「sum に問題があるから」に決まってますが.... ちなみに 2008/2/29 と 2008/3/1 で実行してみましたか? 同じ曜日になりませんでしたか?

noname#53915
質問者

お礼

おっしゃるとおりsumに問題ありました 無事解決できました ありがとうございました

回答No.2

曜日を求めるなら「Zellerの公式」を使うのが良いでしょう。

noname#53915
質問者

補足

スイマセン、ツェラーの公式は使わずに出したいので・・・ そっちの方が楽なんですけどね。よく使われてるみたいですし。

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

iyear と year が使われています。

noname#53915
質問者

補足

失礼しました、あのままだとコンパイラできませんね。 #include<stdio.h> int main() { int year,months,day; int sum,i; int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; char*cweek[7] = {"日","月","火","水","木","金","土"}; sum =0; printf ("input (e.g. ****/**/**)\n>>"); scanf ("%d/%d/%d",&year,&months,&day); /*閏年の判定*/ for(i=1;i<year;i++){ if((year%4==0)&&((year%100!=0))||(year%400==0)){ sum++; i++; } year--; /*前月までの日数*/ for (i =0; i < months-1; i++) { sum += m_array[i]; } year++; sum=sum+day; //曜日の出力 printf("%s曜日",cweek[sum%7]); return 0; } }

関連するQ&A

  • C言語でわからないところががあります。

    入力された年月日で曜日を求める問題で このサイトでも似たような質問がいくつかあり(他のサイトでも) 参考になりました、閏年とか日数とか特に助かりました。 (参考と言うよりパクった感じですが #include<stdio.h> int main() { int ,months,day,year,sum,i;  //「変数 月 日 年 sum iを宣言」 int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//「その月の最後の日 char*cweek[7] = {"日","月","火","水","木","金","土"};//曜日(1週間) sum =0;// 「sumを0で初期化」 printf ("input (e.g. ****/**/**)\n>>");//ここで入力 scanf ("%d/%d/%d",&year,&months,&day);//「年 月 日を10進数で出力」 for(i=1;i<year;i++){//「1からユーザーが入力した年までループ」 sum++; if((i%4==0)&&((i%100!=0))||(i%400==0)){//「閏年かどうか判定し、閏年なら1(29日)を足す」 sum++; } } for (i =0; i < months-1; i++) { sum += m_array[i]; } if((i%4==0)&&((i%100!=0))||(i%400==0))//「年が閏年で月が3月以降なら閏年分の1を足す」 if(months>=3){ sum++; } } sum=sum+day-1; printf("%s曜日",cweek[sum%7]);//曜日の計算と出力// return 0;   } このソースの意味で質問なんですけど このソースでいう前年度の総日数は最初の方に出ているループでだされてますよね?あと最後に出ているfor分、これは前月?までの総日数を求めてる・・・と思います。あと最後のsum=sum+day-1;なんですがこれはdayがその月の日数って事なんですよね?sumは前月で。 ちょっとわかりにくり質問で申し訳ないです。

  • 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); } } }

  • 西暦・月からカレンダーを表示

    問題文 西暦・月を入力してカレンダーを表示するプログラムを作成せよ。 プログラム全体のことを考える。プログラムの流れとしては、つぎのようになるであろう。  (1)変数の宣言: プログラムの中で使う変数や配列等をすべてここに集めておく。          (2)入力: キーボードから、西暦年の値を読み取る ← scanf( ) 関数  1月から12月まで、以下を繰り返す。  (3)カレンダーの年・月の表示: (例えば、2008年1月 と表示)  (4)各曜日名の表示: 「日 月 火 水 木 金 土」と表示  (5)月の日数の算出: 月の最後の日を計算しておく。(*1~12月以外では誤りとすること)  (6)曜日の算出: 月の初めの日(ついたち)の曜日をツェラー公式で計算しておく。  (7)空列の表示: ついたちの前の空白部分を表示する ← for文 を利用。  (8)各日の表示: 月の各日を順に表示していく ← for文を利用          (土曜の後に改行を入れる) #include <stdio.h> int leapYear(int year) { if (year%400==0||(year%4==0 && year%100!=0)) { return 1; } else { return 0; } } int main(void) { int d,year,m,i; int day[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; /*1~12月までの各月の日数*/ printf("西暦を入力してください:"); scanf("%d",&year); printf("月を入力してください:"); scanf("%d",&m); if(m!=1 & m!=2 & m!=3 & m!=4 & m!=5 & m!=6 & m!=7 & m!=8 & m!=9 & m!=10 & m!=11 & m!=12)/*1~12月以外で日数を出そうとした場合*/ { printf("入力が誤っています。やりなおしてください。\n"); } else{ if (leapYear(year)==1)/*閏年の場合*/ { printf("%d年は閏年です。\n",year); day[1] +=1; } else/*閏年でない場合*/ { printf("%d年は閏年ではありません。\n",year); } i = (year+year/4 -year/100 +year/400 + ( 13*m+8 )/5 + 1) % 7; /*西暦~年・1~12月の1日の曜日について考える*/ printf("日 月 火 水 木 金 土\n"); (7)・・・ (8)・・・ } return 0; } 手順に沿ってやっていく課題なのですが(7)、(8)の部分の表現の仕方が良く分かりません。(求めた月の日数をカレンダー形式に表示する方法・1日の前に空白を入れる等) 過去の質問も見たのですが、いまいち理解できず・・・orz どなたかご教授お願いできないでしょうか・・・。

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • C言語でのカレンダープログラミングについて。

    今、C言語でカレンダーについてのプログラミングを行っています。 まず月を入力し表示させる。 その年がうるう年かどうか判定させる。 日曜~土曜を表示し、指定した月の日数を曜日に合わせて表示させる。 2008年1月1日は火曜日。 という事実を利用してよい。 という条件で、うるう年かの判定はあるものの年は2008年で固定です。 曜日、指定した月の日数を出すところまでいきましたが。 曜日に合わせて出す事ができません。 今は1月に合わせて、1日が火曜日のところに出るように配置してます。 が、次の週になったときにどのように改行指定すればいぃのかわりません。 また、来月以降の月初めの曜日指定もわからないです。 途中までのプログラムはこれです。 醜いかもしれませんが。 #include <stdio.h> int main(void) { int year=2008; int month,hantei=0,a,b,c; int uru[12]={31,29,31.30,31,30,31,31,30,31,30,31};/*うるう年の時の各月ごとの日数*/ int normal[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*通常の年の各月ごとの日数*/ printf("表示させる月を入力してください。:"); scanf("%d",&month); if(year%4==0||year%100==0||year%400==0) { hantei=1;/*その年がうるう年かどうかを判定し、うるう年なら「hantei」に「1」が代入*/ } if(hantei==1)/*うるう年の場合。*/ { printf("%d年 %d月\n",year,month); printf("%d日\n",uru[month-1]); } else/*通常の年の場合。*/ { printf("%d年 %d月\n",year,normal[month-1]); printf("%d\n",normal[month-1]); } printf("日 月 火 水 木 金 土\n");/*曜日*/ if(hantei==1)/*うるう年の場合*/ { for(b=0;b<=7;b++) { printf(" ");/*火曜日のところまでスペースを空ける*/ } for(c=1;c<=uru[month-1];c++)/*日数表示*/ { printf("%2d ",c); } } return(0); } まだあまりC言語に詳しくないので、簡単に説明できる範囲で御願いします。 説明がわかりにくいかもしれませんが、すいません。

  • C言語でmからnまでの合計を求めるプログラム

    これで動かないのですが、何が違っているのか、教えていただけますか。 #include <stdio.h> int main(void) { int m, n, sum, i, w ; printf("mからnまでの合計を求めます\n\n"); printf("m >> "); scanf(" %d", &m); printf("n >> "); scanf(" %d", &n); sum=0; if(m>n){ w=m; m=n; n=w; } sum=0; i=m; while(i<=n){ sum=sum+i; i=i+1; } printf("%d から %d の合計 = %d\n",m,n,sum); return 0; }

  • わかる人 フローチャート

    このプログラムをフローチャートに直しなさい void main() { int i, n; int sum = 0; printf("n?\n"); scanf("%d",&n); for (i=0; i<=10; i++) { sum = sum + i; } printf("sum = %d\n",sum); }

  • C言語 関数問題

    西暦年yearを引数として受け取り,閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し,そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく,メイン関数main()も含む下記プログラムを完成させる形で作成する #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */

  • 閏年のプログラム

    C言語(閏年)の質問です。 任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成で途中まではわかって修正・追加する箇所があったら一緒に教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。) なお、閏年の判定方法は以下のとおりである。 条件1 西暦年が4で割り切れる年は閏年である 条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない 条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である 実行例1 西暦を入力:2000 西暦を入力:2009 2000年 2004年 2008年 閏年は3回あります。 実行例2 西暦を入力:2100 西暦を入力:2000 2000年 2004年 2008年 2012年 2016年 2020年 (省略) 2096年 閏年は25回あります。 実行例3 西暦を入力:2090 西暦を入力:2110 2092年 2096年 2104年 2108年 閏年は4回あります。 #include <iostream> bool checkYear(int year); int main() { int year; int year2; printf("西暦を入力:"); scanf("%d",year); printf("西暦を入力:"); scanf("%d",year2); int count = 0; for (int i = year; i < year2; i++) { if (checkYear(i)) { printf("%d年\n"); count++; } } printf("閏年は%d回です。\n"); return 0; } bool checkYear(int year) { return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); }

  • (C言語)西暦年月日を入力して、その日の曜日を表示させるプログラムを試したのですが…

    西暦年月日を入力して、その日の曜日を表示させるプログラムを作りたいのですが、とりあえず、やってみましたが… int main(void) { int i,y,m,d,dy,dw; int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; printf("Year?"); scanf("%d",&y); printf("Month?"); scanf("%d",&m); printf("Day?"); scanf("%d",&d); for(i=0;i<=m-1;i++){ dy = d + D[i] ; } if(m>=3){ if(y % 4 == 0){ if(y % 400 == 0){ dy = dy + 1 ; } else if(y % 100 ==0){ dy = dy ; } else{ dy = dy + 1 ; } } else if(y % 4 == 1 || y % 4 == 2 || y % 4 == 3 ){ dy = dy ; } } dw = (dy -1 + ( y + ( y - 1 )/4 - ( y - 1 )/100 + ( y - 1 )/400))%7 ; if (dw == 0) printf("Sunday\n"); else if (dw == 1) printf("Monday\n"); else if (dw == 2) printf("Tuesday\n"); else if (dw == 3) printf("Wednesday\n"); else if (dw == 4) printf("Thursday\n"); else if (dw == 5) printf("Friday\n"); else if (dw == 6) printf("Saturday\n"); return 0 ; } このプログラムを各年の1月1日~2月28日で試してみると、うまくいくのですが、3月1日に入るとなぜかうまく働いてくれません。(ちなみに2005年の11月では偶然うまくいっています。)その理由が分からないのでどなたか教えてください。ちなみに、この一連のプログラムを行うにはもっと簡単に行える関数というかコマンド?みたいなものがあるようですが、基本的に各年の1月1日を、 (y+(y-1)/4-(y-1)/100+(y-1)/400)%7で(0:Sunday~)、同年の○月○日は1月1日から△日経過しているという考え方で、曜日を割り出すプログラムにしなければならないといけないので、注文が多いですがよろしくお願いします。

専門家に質問してみよう