万年カレンダで祝日にマークを付けるには

このQ&Aのポイント
  • 祝日に関して、プログラムを作成し、祝日判定関数を呼び出したいが、構文エラーが発生している。
  • また、振替休日の判定にも自信がない。アドバイスを求めている。
回答を見る
  • ベストアンサー

万年カレンダで祝日にマークを付けるには

祝日に関して、下記の通りプログラムを作ったのですがうまくいきません。ご教授お願いします。 void Display_func( int year , int month ) {   int week , i , leap , day , *shuku , *furikae ;   int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};   int d = 0; **省略**   for( i=0 ; i<week ; i++ ){      printf(" ");   }   for(day=1 ; day<=days[month] ; day++ ){ ★★Yasumi_func( int &shuku , int &furikae ); /*祝日判定関数*/   if(i==0){     printf(" @%2d",day);   }else if(i==*shuku){      printf(" #%2d",day);   }else if(i==*furikae){     i = 1;     printf(" &%2d",day+1);   }else if(i==6){     printf(" *%2d",day);   }else{     printf(" %2d",day);   } 略 @:日曜日 *:土曜日 &:振替休日 #:祝日 return; } /* 祝日判定関数 */ void Yasumi_func( int *yshuku , int *furikae ) { int year , month , day , i ; if((month==3 && day== (int)(20.8431 + 0.242194*(year-1980) - (year-1980)/4))   || (month==1 && day>7 && day<15 && i==1) 略   || (month==11 && day==3)   || (month==12 && day==23))   {     if(i == 0){       *furikae = i ;      /* 振替休日 */     }else{       *shuku = i; /* 祝日 */     }   } }   Yasumi_func( int &yasumi , int &kae ); 祝日判定関数を呼びたいのですが「式の構文エラー」となってしまいます。 この他   if(i == 0){     *furikae = i ;   }else{     *shuku = i;   } この部分も自信がないので、アドバイスお願いいたします

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

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

結論だけ書きます。 >   int week , i , leap , day , *shuku , *furikae ; は、   int week , i , leap , day , shuku , furikae ; > Yasumi_func( int &shuku , int &furikae ); は、 Yasumi_func(&shuku , &furikae ); です。(ただし、構文の点だけ) どうして最初のように書いたのか、どうしてこれが構文的に正しいのかは、しっかり勉強してください。

その他の回答 (1)

  • 530529
  • ベストアンサー率16% (86/521)
回答No.1

直接プログラムでどう対応するかの前に、どこまでの範囲で万年カレンダーとして定義するかが大変だと思います。 a)1番難しいのは、春分、秋分の日です。 共に、地球が春分点秋分点を通過した時点を含む日になりますので、予想は可能でしょうが本当にそうなるかは地球の動きによりますね。 b)閏年、4年一度閏年、100年に1度は閏年としない、400年に1度は閏年とする(西暦2000年など)。 c)太陰暦と太陽暦をいつ切り替えたか、(10日以上ずれる)等々

shutoko-
質問者

補足

ご回答ありがとうございます。 出力関数に祝日判定関数をどう呼ぶかについて、まったくわからない状態です。閏年、春分、秋分等は一様プログラムはできました。アドバイスよろしくお願いいたします。 質問文では省略させていただいています。

関連するQ&A

  • 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

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • 祝日判定です。

    祝日判定 カレンダーですが、エラーが出てしまいます。どうかよろしくお願いいたします。ソースの一部です。 for (j=0; j<6; j++) { for (k=0; k<7; k++) { if (cal[i][j][k]==0) printf(" "); else if(hantei(yy,mm,dd,youbi) == 2){ printf("(%3d) ",cal[i][j][k]); flag = 1; // 日曜と祝日が重なったらflagをたてる } else if(hantei(yy,mm,dd,youbi) == 1 || flag == 1){ printf("(%3d) ",cal[i][j][k]); printf("\t"); flag = 0; } else if((i-1)%7 == 6){ // 土曜日 printf("%3d ",cal[i][j][k]); printf("\t"); } else{ printf("(%3d) ",cal[i][j][k]); //printf("%d"); //日付を出力 flag = 0; } if((i-1)%7 == 6) printf("\n"); //土曜のあとは改行 } int hantei(int yy,int mm,int dd,int youbi){ if((mm==3 && dd== (int)(20.8431 + 0.

  • なぜか祝日判定がうまくいきません

    Calendar::Japanese::Holiday を利用して以下の様な祝日判定のルーチンをテストしているのですが、なぜか#(1)あるいは#(2)のようにサブルーチン内部で値を明示してやらないと正常動作(祝日判定)しません。 そこでCalendar::Japanese::HolidayのisHolidayルーチンの方に値が正常に渡っていないのかと考え、#(3)のようなチェック用のソースを組み入れてみたりもしたのですが、$year, $mon, $dayそれぞれ正常に値は渡っていました。 どのようにすれば正常動作するようになるのでしょうか? my %spdate = (#すでに$y、$m、$dにはそれぞれ2012、05、05と値が入っています。 'year' =>$y, 'month' =>$m, 'day' =>$d, ); $spdate = \%spdate; &check_date($spdate); sub &check_date{ my($spdate) = @_; #($spdate->{year},$spdate->{month},$spdate->{day})=(2012,05,05); #(1) #my $jpholiday = isHoliday(2012,05,05); #(2) my $jpholiday = isHoliday($spdate->{year},$spdate->{month},$spdate->{day}); if($jpholiday){ push(@error, 'It is a holidays today'); } }#end #Calendar::Japanese::Holiday #http://search.cpan.org/~kztomita/Calendar-Japanese-Holiday-0.03/ sub isHoliday { my ($year, $mon, $day, $furikae) = @_; #test #(3) print "Content-type: text/html; charset=utf8\n\n"; print "$year"; print "$mon"; print "$day"; my $holidays; if ($year == $Cache_holidays_Year && $mon == $Cache_holidays_Month) { $holidays = $Cache_holidays; # From Cache } else { $holidays = getHolidays($year, $mon, 1); return if not defined $holidays; # Cache $Cache_holidays = $holidays; $Cache_holidays_Year = $year; $Cache_holidays_Month = $mon; } return if !exists $holidays->{$day}; return if (!$furikae && $holidays->{$day} eq $FurikaeStr); return $holidays->{$day}; }#end

    • ベストアンサー
    • Perl
  • カレンダー作成

    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++で日付のプログラミング

    前回も同じ質問をして、自分なりに直してみたのですが、どうもうまく動作しません。 長くなりますが、教えてください。 日付のエラー処理を完全にするというもので、 次のような仕様を満たすように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言語

    入力値が範囲内であるかの判定、違ったらもう一度繰り返すプログラムを作成したいのですが、うまく出来ません。よろしくお願いします。 初心者なので、判りやすく説明していただけると助かります。 #include <stdio.h> void main(){ int a , year ; printf(" 西暦入力--> "); scanf("%d",year); for( a = 0 ; a < 1 ;){ if( year >= 1 && year <=9999 ){ a = a + 1 ; }else{ printf("1年~9999年で入力せよ\n"); } } } scanf()の辺りを変えなければと思っているのですが、どうすればよいのかわかりません。scannf()意外に何を使った方が良いですか? パラメータはどうすればよいですか? 祝日を判定するやり方もわかれば教えていただけませんか? サイトがあったら、URLお願いします。 @@@@@ ↑のプログラムがすべて左よりになってしまったのですが、どうすれば段差をつけれますか?

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

  • 月曜日から始まるカレンダ

    日曜日から始まるカレンダは作れたのですが… これを変えて例えば月曜日から始まるカレンダを作りたいと思っています。 現状は、 ##########ここから########## ----------Calendar.class.php---------- class Calendar { protected static $DTO; // constructor public function __construct() { self::$DTO = new DateTime(); } // destructor public function __destruct() { } protected static function valid( $year = null, $month = null, $day = null ) { $valid = array (); if ( false === is_numeric( $year ) ) { $year = self::$DTO->format( 'Y' ); } if ( false === is_numeric( $month ) ) { $month = self::$DTO->format( 'n' ); } if ( false === is_numeric( $day ) ) { $day = self::$DTO->format( 'j' ); } self::$DTO->setDate( $year, $month, $day ); $valid[ 'year' ] = ( int ) self::$DTO->format( 'Y' ); $valid[ 'month' ] = ( int ) self::$DTO->format( 'n' ); $valid[ 'day' ] = ( int ) self::$DTO->format( 'j' ); return ( $valid ); } } ----------CalendarMonth.class.php---------- class CalendarMonth extends Calendar { // constructor public function __construct() { parent::__construct(); } // destructor public function __destruct() { parent::__destruct(); } public function parse( $year = null, $month = null ) { foreach ( parent::valid( $year, $month ) as $key => $value ) { if ( 'day' != $key ) { $parse[ 0 ][ $key ] = $value; } else { $parse[ 0 ][ 'days' ] = ( int ) parent::$DTO->format( 't' ); } } for ( $i = 0, $weeks = 1; $i < 42; $i++ ) { parent::$DTO->setDate( $parse[ 0 ][ 'year' ], $parse[ 0 ][ 'month' ], 1 ); $first_week = ( int ) parent::$DTO->format( 'w' ); if ( $i < $first_week ) { parent::$DTO->modify( '-' . ( 86400 * ( $first_week - $i ) . ' seconds' ) ); } else { parent::$DTO->modify( '+' . ( 86400 * ( $i - $first_week ) . ' seconds' ) ); } $parse[ $weeks ][ $i ][ 'year' ] = ( int ) parent::$DTO->format( 'Y' ); $parse[ $weeks ][ $i ][ 'month' ] = ( int ) parent::$DTO->format( 'n' ); $parse[ $weeks ][ $i ][ 'day' ] = ( int ) parent::$DTO->format( 'j' ); if ( 0 == ( ( $i + 1 ) % 7 ) ) { $weeks++; } } return ( $parse ); } } ----------CalendarMonth.html---------- <table border="1"> <?php include ( 'Calendar.class.php' ); include ( 'CalendarMonth.class.php' ); $CalendarMonth = new CalendarMonth(); $calendar = $CalendarMonth->parse(); for ( $i = 0; $i < count( $calendar ); $i++ ) { if ( 0 != $i ) { ?> <tr> <?php foreach ( $calendar[ $i ] as $week ) { ?> <td><?php echo ( $week[ 'year' ] . '-' . $week[ 'month' ] . '-' . $week[ 'day' ] ); ?></td> <?php } ?> </tr> <?php } } ?> </table> ##########ここまで########## 以上です。 文字数制限のため、次へ続く。

    • 締切済み
    • PHP
  • C言語で3次元配列を使い一年分のカレンダーを作成

    カレンダーは完成したのですが曜日がズレてしまい綺麗に表示されません。どのように改善すれば良いのでしょうか?よろしくお願いします。 現状です #pragma warning(disable:4996) #include <stdio.h> #include <Windows.h> enum M_LIST { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, N_MONTH }; enum W_LIST { SUN, MON, TUE, WED, THU, FRI, SAT, N_WEEK }; int mday[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //各月の日数 char *weekday[] = { "日","月","火","水","木","金","土" }; //各曜日 /*プロトタイプ宣言*/ int monthday(int year); void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]); void karenda(char box[N_MONTH][N_WEEK][N_WEEK]); /*メイン*/ void main(void) { int year, total; char box[N_MONTH][N_WEEK][N_WEEK] = { 0 }; //3次元配列を宣言し0を入れる /*画面制御の初期化*/ COORD coord; HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); printf("西暦を入力"); scanf("%d", &year); //年度の入力 total = monthday(year); Array(total, box); karenda(box); } /*求める月の前月までの総日数*/ int monthday(int year) { int total = 0; /*求める年の前年までの総日数を求める*/ total = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1); /*うるう年の判定*/ if (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0) { mday[FEB] = 29; } else { mday[FEB] = 28; } return total % 7; } /*カレンダーの配列*/ void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]) { int month, row, col, day; col = total; for (month = JAN; month < N_MONTH; month++) { row = 1; day = 1; while (day <= mday[month]) { box[month][row][col] = day; if (col > SAT) { //土曜までいったら次の週 row++; col = SUN; } day++; col++; } } } /*カレンダーの出力*/ void karenda(char box[N_MONTH][N_WEEK][N_WEEK]) { int month, week, day; for (month = JAN; month < N_MONTH; month++) { //月の出力 printf("%3d\n", month + 1); for (week = SUN; week < N_WEEK; week++) { for (day = SUN; day < N_WEEK; day++) { if (week == 0) { //曜日の出力 printf("%s", weekday[day]); } if (box[month][week][day] == 0) { //0なら空白 printf(" "); } else { printf("%3d", box[month][week][day]); } } printf("\n"); } printf("\n"); } } 今はこのような形で表示されます(空白は_で表しています) 日____月____火____水____木____金____土 ________1___2___3___4___5 6___7___8___9__10__11__12 13_14__15__16__17__18__19 20_21__22__23__24__25__26 27_28__29__30__31