• 締切済み

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

開始月と終了月を指定して、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; }

みんなの回答

回答No.3

 ↓のプログラムは、参照URLから完動することを確認し、printf() を sprintf() に換え、3ヶ月分確保して処理しています。おそらく、出力にバグがあるのではないでしょうか。 /* Calender program by Mac OSX * file name: rin.c * compile: gcc rin.c * execution: ./a.out */ #include <stdio.h> #define LINE_NUM 9 #define BUFF_SIZE 24 #define LESS_ 0 #define MIDDLE 1 #define GREATE 2 #define input(comment, value) {printf(comment); scanf("%d", value);} struct set1 { char line[LINE_NUM][BUFF_SIZE]; } month[3]; void get_calen(int, int, int); int main(void) { int y, m, /* 年 月 */ i, j; /* 年月を入力 */ input("year=", &y); input("manth=", &m); get_calen(MIDDLE, y, m); // 当月 m == 1 ? get_calen(LESS_, y - 1, 12) : get_calen(LESS_, y, m - 1); m == 12 ? get_calen(GREATE, y + 1, 1) : get_calen(GREATE, y, m + 1); printf("\n"); for (j = 0; j < 9; j++) { // 各行 for (i = 0; i < 3; i++) // 3ヶ月分を printf("%-21s ", month[i].line[j]); // 左詰めで出力 printf("\n"); } return 0; } void get_calen(int n, int y, int m) { int d, /* 日 */ wd, /* 曜日 */ dm, /* 月の日数 */ i, /* 繰り返し用のカウンタ */ c; /* line[添字] */ char *j; /* 表示年月 */ c = 0; sprintf(month[n].line[c], "%4s[%d年 %d月]", " ", y, m); /* y年m月が何日あるか */ switch(m) { case 2: if ( y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) dm = 29 ; /* 閏年 */ else dm = 28 ; break ; case 4: case 6: case 9: case 11: dm = 30 ; break ; default: dm = 31 ; break ; } /* y年m月1日の曜日を求める */ if (m == 1 || m == 2) { y-- ; m += 12 ; } wd = (y + y/4 - y/100 + y/400 + (13*m+8)/5 +1) % 7 ; /* 曜日欄 */ sprintf(month[n].line[++c], " 日 月 火 水 木 金 土"); sprintf(month[n].line[++c], " --------------------"); /* 空白の表示 */ j = month[n].line[++c]; for (i = 0; i < wd; i++) j += sprintf(j, " %2s", " "); /* 日付の表示 */ for (i = 1; i <= dm; i++) { j += sprintf(j, " %2d", i); wd ++ ; if (wd % 7 == 0) j = month[n].line[++c]; } }

参考URL:
http://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/t02s.html
rinnshan
質問者

お礼

URLまで張っていただき誠にありがとうございました。 参考にさせていただきたいと思います。

回答No.2

追記: 7月の方は良く考えてないけど、手元の環境では治っちゃってる #ログとらないもんだから無意識に直しちゃって、後でどう修正したのかわからなくなることがたまにあるorz #月がずれてたのも同時に治っているなあ> 2010-01-01/2010-03-01 #まだ、3つ「まで」表示という部分には至ってない。頑張って直すべし。 #この公式って紀元前とかには通用しないのでは?西暦0年とか入力された時の扱いも含めて考える。 #2番目の日付に1番目の日付よりも前の日付を指定したらどうなるか試していない。 #ところで、2012年って4で割れて100で割れないけど…いいの?2月。

rinnshan
質問者

お礼

回答ありがとうございます。 そのあたりの細かいところはあまり気にせずにやっているので 機会があれば修正したいと思います。

回答No.1

いくつか質問。 その1: > }while((j+w-1)%7!=0); は > }while((j+w-1)%7!=6); じゃないの? その2: tukiho,nenho,tukih はこれから使うのかな? その3(本題): 4月の処理をしているときに、 if((j+w-1)%7==6) で分岐されるよね?一回目にはどっちを通るのかな?この時のjの値は何かな? #「構造体」とか調べられるとコードが多少見やすくなる。 #あと、main関数にやることを殆どそのまま書こうとしていて少し長くなっている気がするので、うまい具合に関数を分割できたら見やすくなるんじゃないかな?

rinnshan
質問者

お礼

>その1: 自分でもよくわからないのですが、どうやら変数jは最終日の次の日になってるので、 6あまったら改行するのではなく0の時に改行をするようです。 実際に、それで私の環境ではうまく動作しました。 >その2: tukiho,nenho,tukih はこれから使うのかな? いえ、前に修正した時の残り火です。すっかり忘れておりました。 混乱をさせてしまって申し訳ございません。 >4月の処理をしているときに、 if((j+w-1)%7==6) で分岐されるよね?一回目にはどっちを通るのかな?この時のjの値は何かな? 申し訳ございません。おっしゃっている意味がよくわからないです。 回答ありがとうございました。

関連するQ&A

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

    指定した開始月と終了月を入力して、それを横に最大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; }

  • 万年カレンダー

    万年カレンダーの日にちが、一日ずれて表示されますのでその原因を教えてください。 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]; } プロトタイプ宣言は、省いてます。

  • カレンダー作成

    C言語初心者です。 西暦と月を入力してその月のカレンダーを作成するプログラムの問題なのですが #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < [A]; i++) {   mcnt += mday[i];  }  mcnt++;  [B] = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if ([C])    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if ([D]) {    printf("\n");    ycnt = 0;   }  }  return (0); } [A]、[B]、[C]、[D]に答えを入れなきゃいけないのですが私が考えた答えだと カレンダーの表示すらされません。どこがいけないのでしょうか? #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < month; i++) {   mcnt += mday[i];  }  mcnt++;  youbi = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if (youbi = 0)    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if (youbi > 7) {    printf("\n");    ycnt = 0;   }  }  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(); } } }

  • 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

  • 英語入力するプログラム

    月名の日本語を入力して英語にするプログラムを書こうとしている のですが、うまく動作しません。 たとえば。 「3月:」と表示されたら大文字か小文字、もしくは組み合わせで marchと入力すれば「正解です。」と表示されるようにです。 具体的には、ランダムで月名が表示されていくのですが何を入力しても 正解と表示されてしまいます。 たとえば、marchなのにdなどと入力しても正解になってしまいます。 何がおかしいのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) char *tukistr[]={"January","Feburary","March","April","May","June","July", "August","September","October","November","December"}; int main(void) { char nstr[12]={0,1,2,3,4,5,6,7,8,9,10,11}; char tuki[10]; int num; int seikai=0; int k=0; int seiho[12]; int huseiho[12]; int m=0; int i,j; srand(time(NULL)); printf("月名の英語を入力してください。入力は大文字でも小文字でも構いません。\n"); for(i=11;i>0;i--) { j=rand()%i; swap(int,nstr[j],nstr[i]); } for(i=0;i<12;i++) { printf("%d月 : ",nstr[i]+1); scanf("%s",tuki); do{ for(j=0;j<strlen(tuki);j++) { if(isalpha(tuki[j])!=isalpha(tukistr[nstr[i]][j])) { printf("違います。正解を見ますか? 0-いいえ/1-はい:"); scanf("%d",&num); if(num==1) { huseiho[m++]=nstr[i]; } break; } } }while(num==0 && j<strlen(tuki)); if(j==strlen(tuki)) { printf("正解です。\n"); seikai++; seiho[k++]=i; } else if(num==1) { printf("%d月は%sです。\n",nstr[i],tukistr[i]); } } printf("12個のうち%d個が正解でした。\n",seikai); printf("正解した月:"); for(j=0;j<12;j++) { if(j==seiho[j]) { printf("%d月,",j+1); } } printf("\n\n"); printf("間違えた月:"); for(j=0;j<12;j++) { if(j==huseiho[j]) { printf("%d月,",j+1); } } return 0; }

  • 迷路作成のプログラミング

    迷路作成のプログラミングをC++で作ったのですが、エラーが出ます。 どのように直せば良いか教えてください。 エラー内容は 'randoomize': 識別子が見つかりませんでした。 16 進型定数には、少なくとも 1 桁の 16 進数が必要です。 'kbhit': 識別子が見つかりませんでした 'getch': 識別子が見つかりませんでした です、、お願いします。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define YOKO_MAX 200 #define ESC '\xlb' int n; int map[YOKO_MAX],count[YOKO_MAX]; int rr() { return rand() % 10>3; } void tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) if(map[i]!=map[i+1] && rr()) { k=map[i+1]; count[k]=0; for(j=0; j<n; j++) if(map[j]==k) { map[j]=map[i]; count[map[i]]++; } printf(" "); } else printf("■"); printf("■\n"); } void last_tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) { if(map[i]==map[i+1]) printf("■"); else { k=map[i+1]; for (j=0; j<n; j++) if (map[j]==k) map[j]=map[i]; printf(" ",map[i]); } } printf("■\n"); } void yoko() { int i,j; for (i=0; i<n; i++) if (count[i]>1 && rr()) { printf("■■"); for(i=0; i<n; i++) { if (count[j]==0) { count[j]=1; count[map[i]]--; map[i]=j;break; } } } else { printf("■"); } printf("■\n"); } void enter() { int i,k; k=rand() % n; for (i=0; i<n; i++) if(i==k) { printf("■"); } else { printf("■■"); } printf("■\n"); } void initialize() { int i; for (i=0; i<n; i++) { map[i]=i; count[i]=1; } randoomize(); } int main() { printf("無限に大きな迷路\n"); do { printf("\n迷路の横幅(2~200)?"); scanf("%d",&n); } while (n<2||n>=YOKO_MAX); printf("\n ESCキーを押すと止まる。\n"); initialize(); enter(); do { tate(); yoko(); } while (!kbhit()||getch()!=ESC); last_tate(); enter(); }

  • 変な動作をしてしまう

    月名の日本語を入力して英語にするプログラムなのですが、最後の 「間違えた月:」の結果がしっかり表示されません。 結果のどうこうに問わず、必ず「間違えた月:1月,1月,1月,1月, 1月,1月,4月,5月,」と表示されてしまうのです。 ちなみに、その上の「正解した月」はちゃんと思惑通りに 動作します。 このプログラムのどこがおかしいためにそのように表示されて しまうのでしょうか? よろしくお願いします。 #include<stdio.h> #include<time.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) char *tukistr[]={"january","feburary","march","april","may","june","july", "augst","september","october","november","december"}; int main(void) { int nstr[12]={0,1,2,3,4,5,6,7,8,9,10,11}; char tuki[10]; int num; int seikai=0; int k=0; int seiho[12]; int huseiho[12]; int m=0; int i,j,p; char hen; srand(time(NULL)); printf("月名の英語を入力してください。入力は大文字でも小文字でも構いません。\n"); for(i=11;i>0;i--) { j=rand()%i; swap(int,nstr[j],nstr[i]); } for(i=0;i<12;i++) { printf("%d月 : ",nstr[i]+1); scanf("%s",tuki); do{ for(j=0;j<strlen(tukistr[nstr[i]]);j++) { hen=tolower(tuki[j]); if(hen!=tukistr[nstr[i]][j]) { printf("違います。正解を見ますか? 0-いいえ/1-はい:"); huseiho[m++]=nstr[i]; scanf("%d",&num); if(num==0) { printf("もう一度入力してください。:"); p=1; scanf("%s",tuki); j=0; } break; } } }while(num==0 && j<strlen(tukistr[nstr[i]])); if(j==strlen(tukistr[nstr[i]])) { printf("正解です。\n"); if(p!=1) { seikai++; seiho[k++]=nstr[i]; } p=0; } else if(num==1) { printf("%d月は%sです。\n",nstr[i]+1,tukistr[nstr[i]]); } } printf("12個のうち%d個が正解でした。\n",seikai); printf("正解した月:"); for(j=0;j<12;j++) { for(i=0;i<12;i++) { if(j==seiho[i]) { printf("%d月",j+1); if(j!=11) { printf(","); } } } } printf("\n\n"); printf("間違えた月:"); for(j=0;j<12;j++) { for(i=0;i<12;i++) { if(j==huseiho[i]) { printf("%d月",j+1); if(j!=11) { printf(","); } } } } return 0; }

  • C言語でのCSVへの出力がうまくいきません…

    風力発電の発電データを1秒ごとに1日分を記録したCSVファイルを読み込み、集計して、集計用の新しいCSVファイルに書き込むプログラムを組もうとしています。以下にソースコードを記載します。 #include<stdio.h> #include<stdlib.h> static char filename[100]; static char wfname[100]; char fname2[256]; void str_copy(char[],char[]); //文字列のコピー void str_cat(char[],char[]); //文字列の連結 struct kaze { _char jikoku[16]; _double fuusoku; _double fuuko; _double denatu; _double denryoku1; _double denryoku2; _double co2; }; struct kaze data[86400]; int main() { _char date2[50]; _char date3[50]; _char month2[10]; _char year2[10]; _char path1[50]="F:\\風力発電\\風車"; _char path2[10]="年"; _char path3[10]="月\\WP"; _char buff[256]; _int month1,month,year,date; _int kensuu,i,j,uruu; _FILE *fpin,*fpout; _printf("集計する年を入力してください。\n"); _scanf("%d",&year); _printf("集計する月を入力してください。\n"); _scanf("%d",&month); _if(month==2){ __printf("閏年ですか?(はい -> 1 いいえ -> 2)"); __scanf("%d",&uruu); _} _if(month==2){ __if(uruu==1){ ___month1=29; __} __else{ ___month1=28; __} _} _else if(month==4 || month==6 || month==9 || month==11){ __month1=30; _} _else{ __month1=31; _} _date=year*100+month; _sprintf(date3,"%d",date); _str_copy(wfname,date3); _str_cat(wfname,".csv"); _sprintf(year2,"%d",year); _sprintf(month2,"%d",month); _sprintf(fname2,"%s%s%s%s%s%s",path1,year2,path2,month2,path3,wfname); _if((fpout=fopen(fname2,"w"))==NULL){ __printf("ファイルが作成できません。 --- %s\n",fname2); __exit(EXIT_FAILURE); _} _fprintf(fpout,"日付,平均風速,平均風向,平均電圧,平均発電電力、発電電力量,CO2削減量\n"); _fprintf(fpout,"年/月/日,m/s,°,V,KW,KWh,kg-c\n"); _printf("集計用ファイルを作成しました。 --- %s\n",fname2); _fclose(fpout); _date=year*10000+month*100; _for(j=1;j<=month1;j++){ __double fuusoku=0,fuuko=0,denatu=0,denryoku1=0,denryoku2=0,co2=0; __date++; __sprintf(date2,"%d",date); __str_copy(filename,date2); __str_cat(filename,".csv"); __sprintf(buff,"%s%s%s%s%s%s",path1,year2,path2,month2,path3,filename); __if((fpin=fopen(buff,"r"))==NULL){ ___printf("ファイルが見つかりません。--- %s\n",buff); ___exit(EXIT_FAILURE); __} __for(kensuu = 0; fscanf(fpin, "%[^,],%lf,%lf,%lf,%lf,%lf,%lf\n", data[kensuu].jikoku, &data[kensuu].fuusoku, &data[kensuu].fuuko, &data[kensuu].denatu, &data[kensuu].denryoku1, &data[kensuu].denryoku2, &data[kensuu].co2) != EOF; kensuu++); __for(i = 0; i < kensuu; i++){ ___fuusoku+=data[i].fuusoku; ___fuuko+=data[i].fuuko; ___denatu+=data[i].denatu; ___denryoku1+=data[i].denryoku1; } __fuusoku/=86400; __fuuko/=86400; __denatu/=86400; __denryoku1/=86400; __denryoku2=data[kensuu-1].denryoku2; __co2=data[kensuu-1].co2; __fclose(fpin); __printf("\n%d年%d月%d日の集計結果\n平均風速:%lf(m/s)\n平均風向:%lf(°)\n __________平均電圧:%lf(V)\n",year,month,j,fuusoku,fuuko,denatu); __printf("平均発電電力:%lf(kW)\n発電電力量:%lf(kWh)\nCO2削減量:%lf(kg-c)\n" ,denryoku1,denryoku2,co2); //ここまでは正常に動作する。 ●if((fpout=fopen(fname2,"a"))==NULL){ ___printf("ファイルに追記できません。--- %s\n",fname2); ___exit(EXIT_FAILURE); __} __fprintf(fpout,"%d/%d/%d,%s,%s,%s,%s,%s,%s\n",year,month,j,fuusoku,fuuko,denatu,denryoku1 ,denryoku2,co2); __printf("以上の結果を記録しました。 --- %s",fname2); __fclose(fpout); } _return EXIT_SUCCESS; } void str_copy(char dst[],char src[]) { _int i; _for(i=0;src[i]!='\0';i++){ __dst[i]=src[i]; _} _dst[i]='\0'; } void str_cat(char dst[],char src[]) { _int i,j; _for(i=0;dst[i]!='\0';i++) ; _for(j=0;src[j]!='\0';j++,i++){ _dst[i]=src[j]; _} _dst[i]='\0'; } 集計用ファイルの作成と項目の書き込み、データファイルの読み込み、集計、ディスプレイへの表示までは問題なく動作するのですが、●印のところで変数fname2がおかしなことになっており、    ファイルに追記できません。--- 23:59:48 と表示されます。どこかでfname2が書き換えられているのだとは思いますが、実際にどこでどうなっているのか、全くわかりません。 どなたか原因がわかる方、もしくは「ここじゃないかな?」など心当たり程度でも構いません。 ご意見をお寄せください!お願いします!

  • PHP初心者です。

    PHP初心者です。カレンダースケジュールを作りたいのですが、以下について質問させていただきます。 selectボタンで2010~2020までのカレンダーを表示させることは出来たのですが、スケジュール欄にテキストボックスを作り、スケジュールを保存したいのですが、この部分でつまづいています。 PHPを勉強し始めて日が浅いのですが、宜しくお願い致します。 どなたかご教授下さい。 <html> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <body> <form method="post" action="<? print($PHP_SELF); ?>"> <select name="year"> <? for($nen=2010 ; $nen<2020; $nen++){ $kotosi=date("Y"); if($kotosi==$nen){ print("<option value='".$nen."' selected>".$nen."</option>"); }else{ print("<option value='".$nen."'>".$nen."</option>"); } } ?> </select> 年 <select name="month"> <? for($tuki=1 ; $tuki<13; $tuki++){ $kongetu=date("n"); if($kongetu==$tuki){ print("<option value='".$tuki."' selected>".$tuki."</option>"); }else{ print("<option value='".$tuki."'>".$tuki."</option>"); } } ?> </select> 月 <input type="submit" value="表示"> </form> <table border> <tr><th>日付</th><th>曜日</th><th>スケジュール</th></tr> <? $year=$_POST["year"]; $month=$_POST["month"]; $wstr=array('日','月','火','水','木','金','土'); for($i=1;checkdate($month,$i,$year);$i++){ $t=mktime(0,0,0,$month,$i,$year); $w=date("w",$t); print("<tr><td>".$i."</td><td>".$wstr[$w]."</td><td><input type='text' size='30'><input type='submit' value='Buttom'></td></tr>"); } ?> </table> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう