• ベストアンサー

カレンダー表示のこと

以前にもさせてもらった質問の続きですが、月日を入力して実行すると、曜日は正確に出るのですが、日が正確に出ないのです。1月は問題ないのですが、例えば、2月5日を入力すると、日に1月分が足されてしまい、2月36日となってしまいます。2月以降も同様です。 for(i=0;i<tuki-1;i++){ hi=hi+dates[i]; と組み立ててるのですが、どうやら、hi=,,,のところがおかしい感じがするのですが、この文はこれでは間違いですか?

noname#1519
noname#1519

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

  • ベストアンサー
  • senjyu
  • ベストアンサー率25% (7/27)
回答No.5

このソース、コンパイルエラー出ませんか? for文の引数変数名が違っていたりします。 それを考慮に入れても、月入力で1を入れると 当然forループは回りません。 でも、1月は問題ないんですよね!? あと、1月1日は、必ず月曜日ということでいいのでしょうか? 多分やりたいことは、1月1日から積算された日が何曜日になるかを やりたいんだと思うのですが、そういう意図であれば、積算変数を 作ったほうが無難です。 このままのやり方だと、入力されたdayが、for文内で積算されて 表示するときにまた戻さなくてはなりません。

その他の回答 (7)

  • senjyu
  • ベストアンサー率25% (7/27)
回答No.8

printf("%d月%d日は、日曜日です。",month,hi); とやっているのでしょうか? それとも printf("%d月%d日は、日曜日です。",month,day); とやっているのでしょうか? 補足で表示されているソースと質問されている変数が違っているので、 多分、解答している皆さんもどちらなのか迷っているのでは。 ちなみに、下のソースはコンパイルエラーがでます。 hi=dayと想定して、 曜日判定をしたら、加算されたhiを元に戻しましょう。 戻し方は、月と各月の日数がわかっているのですから 引き算するだけです。 加算しているのだから、その逆をやればいいのです。 あと、曜日は不変ですから、配列変数に入れると if文はいらなくなりますよ。

noname#1519
質問者

補足

まぎらわしかったですね。すみません。month,dayでやっています。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.7

補足に対する回答 そうです。 あまりなんでも聞かずに、とりあえずやって見ましょう。

noname#1519
質問者

お礼

はい、やってみます。

  • senjyu
  • ベストアンサー率25% (7/27)
回答No.6

下で解答したsenjyuです。 積算ではなく加算です。 失礼しました。

noname#1519
質問者

補足

コンパイルエラーは出ないのですが、日にちがその日の前まですべて加算されて出てしまうのです。結局はエラーてことですね。それと、申し遅れましたが、このカレンダーは2001年度版でやってみていますので、今年の日付を○月○日は何曜日だと表示するように取り組んでいます。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.4

あっ、すみません、良くソースを見ていませんでした。 入力した日数をそのまま、曜日算出用に足しこんでいるんですね。 入力したdayはそのままで、別の変数を用意し、dayの入力後にその変数に代入して入力した日を確保します。 で、printf分でその確保した日を表示します。

noname#1519
質問者

補足

代入ということは、つまり、冒頭のところで例えばaを用意してa=dayという形をとって最後のprintfでday→aにするということでしょうか

  • madman
  • ベストアンサー率24% (612/2465)
回答No.3

補足見ました。前のままのソースですね(^^ printf("%d月%d日は、日曜日です。",month,day); でいいんじゃないんでしょうか? 要求した入力をそのまま出力しましょう。 算出するのは、曜日のみなので、計算結果の月・日を出力する必要はありません。 余分な処理はバグの素です。

noname#1519
質問者

補足

以前に書いた質問をコピーして貼り付けてしまったので、printf("%d月%d日は、日曜日です。",month,day);のmonth,dayを加えて補足に書くことを忘れれしまいました。すると、for文の次のday=day+dates[i]は省いてしまっていいのでしょうか。それとも新たに書くことがあるのでしょうか。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.2

どのような表示を行う予定なのでしょうか? 前回の質問のソースから考えて、入力した月・日に対して、 ○月○日は、日曜日です。 と表示するのでしょうか? それなら、入力した月・日を表示すれば問題ないと思いますが、もし別の出力であれば、どういった表示をしようとしてるのかが、解らないので回答のしようもありません。

noname#1519
質問者

補足

エラーの意味を聞いたときに自分で作ってみたものを書いたのですが、このようにやってみたいのです。 #include <stdio.h> main() { int i,day,month; int dates[]={31,28,31,30,31,30,31,31,30,31,30,31}; printf(" 月を入力してください → "); scanf("%d",&month); printf(" 日を入力してください → "); scanf("%d",&day); for(i=0;i<monthi-1;i++){ day=day+dates[i]; if(day%7=0){ printf("%d月%d日は、日曜日です。"); } else if(day%7=1){ printf("%d月%d日は、月曜日です。"); } else if(day%7=2){ printf("%d月%d日は、火曜日です。"); } else if(day%7=3){ printf("%d月%d日は、水曜日です。"); } else if(day%7=4){ printf("%d月%d日は、木曜日です。"); } else if(day%7=5){ printf("%d月%d日は、金曜日です。"); } else if(day%7=6){ printf("%d月%d日は、土曜日です。"); } }

  • 2Yari
  • ベストアンサー率7% (1/14)
回答No.1

月と日を入力して、月、日、曜日を表示するプログラムですよね? でしたら、hiは入力値のまま表示させないといけません。 これだと、1月1日から入力日付までの日数が、日の所に出てしまいます。

noname#1519
質問者

補足

と、いうことはhi=,,,のところのほかにも、改良する余地があるということでしょうか。文が前後になりましたが、そうです、つき、日、曜日を表示したいのです。

関連するQ&A

  • カレンダーがうまく表示されない

    開始月と終了月を指定して、3か月ごとにカレンダーを改行する プログラムを作ってみました。 ところが、動作をさせてみたところ7月が配列tuki[12]において31日 と指定しているのにも関わらず25日分しか表示されません。 それと、たまに4月分が24日分しか表示されません。(試した限りでは、 4月を終了月に指定するとそうなりました。) なにがおかしいためにこうなってしまうのでしょうか。 よろしくお願いいたします。 #include<stdio.h> #include<string.h> /*月の最初の日をメインプログラムに返す*/ int getyoubi(int year,int month,int day) { if(month==1 || month==2 ) { year--; month +=12; } return ((year+year/4-year/100+year/400+(13*month+8)/5 + day)%7); } /*カレンダーを3か月分表示させる*/ void print(char s[3][7][22],int n) { int i,j; for(i=0;i<n;i++) { printf("%s ",s[i][0]); } printf("\n"); for(i=0;i<n;i++) { printf(" 日 月 火 水 木 金 土 "); } printf("\n"); for(i=0;i<n;i++) { printf("---------------------- "); } printf("\n"); for(i=1;i<7;i++) { for(j=0;j<n;j++) { printf("%s ",s[j][i]); } printf("\n"); } printf("\n"); } int main(void) { int nen1,tuki1,nen2,tuki2,tukiho,nenho,tukih,w,j; char sbuf[3][7][22]; int tuki[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int k; char tmp[4]; int count=0; printf("カレンダーを表示します。\n"); printf("開始年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen1); printf("月:"); scanf("%d",&tuki1); printf("終了年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen2); printf("月:"); scanf("%d",&tuki2); /*最大3カ月分のカレンダーを格納する。*/ do{ w=getyoubi(nen1,tuki1,1); sprintf(sbuf[count][0],"%10d / %02d ",nen1,tuki1); for(k=1;k<7;k++) { sbuf[count][k][0]='\0'; } sprintf(sbuf[count][1],"%*s",3*w,""); k=1; for(j=1;j<=tuki[tuki1-1];j++) { sprintf(tmp,"%3d",j); strcat(sbuf[count][k],tmp); if((j+w-1)%7==6) { k++; } } do{ if((j+w-1)%7==6) { sprintf(sbuf[count][k],"%21s",""); } else { do{ strcat(sbuf[count][k]," "); j++; }while((j+w-1)%7!=0); } k++; }while(k!=7); count++; if(count==3) { print(sbuf,count); count=0; } tuki1++; if(tuki1==13) { tuki1=1; nen1++; } }while(nen1<nen2 || nen1==nen2 && tuki1<=tuki2); if(count) { print(sbuf,count); } return 0; }

  • C#でカレンダーを作っているのですがここから先がわかりません。どなたかおしえてもらえませんか?

    using System; using System.Collections.Generic; using System.Text; namespace 万年カレンダー { class MyEventCiass { static void Main(string[] args) { int nen, tuki,tukinohi,youbi;    //西暦の入力 System.Console.Out.WriteLine("西暦を入力してください。"); nen = int.Parse(Console.ReadLine()); //月の入力 System.Console.Out.WriteLine("月を入力してください。"); tuki = int.Parse(Console.ReadLine()); //西暦と月の出力 Console.WriteLine(nen + "年" + tuki + "月"); switch (tuki) { case 2: if (nen % 4 == 0 && (nen % 100 != 0 || nen % 400 == 0)) tukinohi = 29; else tukinohi = 28; break; case 4: case 6: case 9: case 11: tukinohi = 30; break; default: tukinohi = 31; break; } if (tuki == 1 || tuki == 2) { nen = nen -1 ; tuki = tuki + 12; } //曜日の出力 Console.WriteLine("日 月 火 水 木 金 土"); youbi = (nen + nen / 4 - nen / 100 + nen / 400 + (13 * tuki + 8) / 5 + 1) % 7; if (youbi == 0) youbi = 7; for (int i = 1; i <= youbi ;i += 1 ) { Console.Write(i.ToString()); } for (int i = 4; i <= tukinohi; i += 1) { Console.Write(i.ToString()); } Console.ReadLine(); } } }

  • カレンダーのプログラム

    指定した開始月と終了月を入力して、それを横に最大3つまで並べて 納まりきらないときは改行するというプログラムを作りたいです。 イメージとしては、2009年の9月から2009年の12月まで指定した場合は… 2009 / 9              2009 / 10             2009 / 11 1 2 3 4 5 6 7          1 2 3 4 5 6 7           1 2 3 4 5 6 7 8 9 10 11 12 13 14      8 9 10 11 12 13 14       8 9 10 11 12 13 14 15 16 17 18 19 20 21    15 16 17 18 19 20 21    15 16 17 18 19 20 21 21 22 23 24 25 26 27    21 22 23 24 25 26 27    21 22 23 24 25 26 27 28 29 30           28 29 30 31           28 29 30   2009 / 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 21 22 23 24 25 26 27 28 29 30 31 (最初の日数などは適当ですし、ちょっとずれてしまっていますがご了承ください。あくまでもイメージなので…) ところが下のプログラムを動作させようとしたところ全く 動きません。何がおかしいために動作しないのでしょうか? よろしくお願いします。 #include<stdio.h> #include<string.h> int getyoubi(int year,int month,int day) { if(month==1 || month==2 ) { year--; month +=12; } return ((year+year/4-year/100+year/400+(13*month+8)/5 + day)%7); } int main(void) { int nen1,tuki1,nen2,tuki2,tukiho,nenho,tukih,w,i,j; char sbuf[3][7][22]; int tuki[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int k; char tmp[4]; printf("カレンダーを表示します。\n"); printf("開始年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen1); printf("月:"); scanf("%d",&tuki1); printf("終了年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen2); printf("月:"); scanf("%d",&tuki2); do{ /*3つのカレンダー分の格納する*/ for(i=0;i<3;i++) { w=getyoubi(nen1,tuki1,1); sprintf(sbuf[i][0],"%10d /%3d ",nen1,tuki1); for(k=1;j<7;k++) { sbuf[i][k][0]='\0'; } sprintf(sbuf[i][1],"%*s",3*w,""); k=1; for(j=1;j<tuki[tuki1];j++) { sprintf(tmp,"%3d",j); strcat(sbuf[i][k],tmp); if(j%7==6) { k++; } } do{ if(j%7==6) { sprintf(sbuf[i][k],"%21s",""); } else { do{ strcat(sbuf[i][k]," "); j++; }while(j%7!=6); k++; } }while(k!=7); tuki1++; if(tuki1==13) { tuki1=1; nen1++; } if(nen1>nen2 || nen1==nen2 && tuki1>tuki2) { break; } } /*3つためたカレンダーを出力する。*/ for(i=0;i<3;i++) { printf("%s",sbuf[i][0]); } printf("\n"); for(i=0;i<3;i++) { printf(" 日 月 火 水 木 金 土 "); } printf("\n"); for(i=0;i<3;i++) { printf("----------------------"); } printf("\n"); for(i=1;i<7;i++) { for(j=0;j<3;j++) { printf("%s",sbuf[j][i]); } } /*指定した年の月になるまでループ*/ }while(nen1<nen2 || nen1==nen2 && tuki1<=tuki2); return 0; }

  • 月だけを加算したい

    例えば、 dates=new Date(); と設定すると、月日、曜日、時分秒が取れますが、このdatesの月だけを1加えたい(取得するデータが9/15なら10/15にしたい)ときにどうすれば出来るのでしょうか?教えてください。

  • perlについて質問です。

    perlの曜日から日付を表示するスクリプトについて質問です。 (問)1月1日が土曜日の平年(例えば、2011年)について曜日の入力データからその月日を全て表示する。 (実行結果) 曜日を入力してください(1:日-7:土): 4↓ 水曜日の月日は : 1月:5,12,19,26 2月:2,9,16,23 3月:2,9,16,23,30 4月:6,13,20,27 5月:4,11,18,25 6月:1,8,15,22,29 7月:6,13,20,27 8月:3,10,17,24,31 9月:7,14,21,28 10月:5,12,19,26 11月:2,9,16,23,30 12月:7,14,21,28 このように表示するために「for命令」と「while命令」を使用して作成したいのですがどのように作成できますでしょうか?(printとchomp使用) 回答よろしくお願いいたします。

  • エクセルでカレンダーを作りたいのですが。

    エクセル2003を使用しています。 次のようなカレンダーを作成したいと思います。 A1に2006などの年、A2、B2~に3/6などの月日、そしてA3、B3~に曜日(月、火…)の入ったカレンダーです。 A1の「年」やA2の「月日」を変更したら自動的に日にち(30日まで31日まで)や曜日が変わるようにするにはどうしたらいいですか? よろしくお願いします。

  • 万年カレンダー

    万年カレンダーの日にちが、一日ずれて表示されますのでその原因を教えてください。 void main() { int nen,tuki,niti; int ff,i,n; int carender[6][7]; niti=0; for(i=0;i<6;i++)for(n=0;n<7;n++) carender[i][n]=0; printf("西暦(4桁)→"); scanf("%d",&nen); printf("month:"); scanf("%d",&tuki); ff=youbi_chk(nen,tuki,1); for(i=ff;i<7;i++) {carender[0][i]=niti;++niti;} for(n=1;n<6;n++){ for(i=0;i<7;i++){ if(niti<=niti_chk(tuki,nen)) {carender[n][i]=niti;++niti;}} } printf(" SUN MON TUE WED THU FRI SAT\n"); for(n=0;n<6;n++){ for(i=0;i<7;i++) if(carender[n][i]==0)printf(" ");else printf("%4d",carender[n][i]); printf("\n");} } int youbi_chk(int y,int m,int d) { int youbi; if(m<3) {y--; m+=10;} else {m-=2;} youbi=(y+(y/4)-(y/100)+(y/400)+(13*m-1)/5+d)%7; return youbi; } int uru_chk(int y) { if(y%400==0) return 1; if(y%100==0) return 0; if(y%4==0) return 1; return 0; } int niti_chk(int m,int y) { int hi[12]={31,28,31,30,31,30,31,31,30,31,30,31}; hi[1]+=uru_chk(y); return hi[m-1]; } プロトタイプ宣言は、省いてます。

  • php カレンダーの休み表示

    PHP初心者です。 以下のように『今日』から14日分の日付と曜日の <select>を作ったのですが、定休日の’月’と’金’の日付だけ 表示を消したいのですが、どうしたらよいのでしょうか? (表示イメージ) 9月11日(火) 9月12日(水) 9月13日(木) 9月15日(土) 9月16日(日) 9月18日(火)   ・    ・   ・ <select> <?php $week = array( '日', '月', '火', '水', '木', '金', '土' ); for($i=0; $i<=14; $i++){ $w = $week[(date(w)+$i)%7]; $date = date('m/d' , strtotime("$i day")) . "($w)"; print '<option value="'.$i.'">' . $date . '</option>'; } ?> </select>   ↑ これをどのようにアレンジしたらよいのでしょうか? よろしくお願いします。 

    • ベストアンサー
    • PHP
  • 曜日を求めるプログラムはどうやるの?

    ただいま、C言語に苦戦中です。教えてください 2001年の月日の入力データから、曜日を求めるプログラム。 (実行結果例) 月を入力してください: 9↓ 日を入力して下さい : 15↓ 9月15日は土曜日です。

  • エクセルVBAで、期間内にある指定した数字を自動入力

    下のように月日(A列)のみが書いてある表があります。 ここに定価を自動入力させたいと考えています。 ただ条件が複雑で・・・。 期間内にあるもので、曜日により値を振り分けする必要があります。 例えば、 ■月日(from) 3/1 ■月日(to) 3/3 ■値 土・日・・・500    月・・・・・450 このような条件で、下の[入力前]の表の「値」の列に [入力前] 月日  曜日   値 3/1    (土) 3/2    (日) 3/3    (月) 3/4    (火) 3/5    (水) 3/6    (木) 下のようにそれぞれ入力させたいのです。 [入力後] 月日  曜日    値 3/1    (土)    500 3/2   (日)    500 3/3    (月)    450 3/4    (火) 3/5   (水) 3/6    (木) どこかのスペースに ■月日(from) 3/1 ■月日(to) 3/3 ■値 土・日・・・500    月・・・・・450 このような条件入力をするところを設けて、マクロを実行すると入力するようにしたいのですが、こんな複雑な振り分け設定ってVBAでもできるでしょうか?