Perlでカレンダー作成中に祝日の表示が上手くいかない

このQ&Aのポイント
  • Perlでカレンダーを作成している際に、祝日の表示がうまくいきません。特に祝日の日の数字を赤で表示させる方法についてアドバイスを求めています。
  • 現在は一月のみのテストを行っています。リストを用意し、カレンダーの数字を表示する前に特定の日を判定して色を変えるように処理しようとしていますが、最後の日にち以外は正しく色が変わりません。
  • 問題の原因や解決策についてアドバイスをいただきたいです。随時補足情報を提供します。
回答を見る
  • ベストアンサー

Perlでカレンダーを作っているのですが、祝日の表示が上手くいきません

祝日の日の数字を赤で表示させたいのですが、なかなか上手くいきません。アドバイスをお願いします。 まず、一月だけで試しています。 my @mk1 = (1,10); my @kyu = ('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); と、はじめにリストを用意し、カレンダーの数字を表示する手前で my $dayCount = $startDay; if($month == 1) { for(my $a = 1; $a <= $monthDays[$month-1]; $a++) { for(my $c = 0; $c < @mk1; $c++) { if($mk1[$c] == $a) { $kyu[$a-1] = 1;} else {$kyu[$a-1] = 0;} } } } とし、 祝日なら、1をそうでなければ0を格納されようと考えたのですが、@mk1の最後の日にちしか色が変わりません。 考え方が、どこかおかしいのでしょうか? 随時補足しますので、アドバイスをお願い致します。

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • kalze
  • ベストアンサー率47% (522/1092)
回答No.2

if($mk1[$c] == $a) { $kyu[$a-1] = 1;} ↓ if($mk1[$c] == $a) { $kyu[$a-1] = 1; last;} リストにマッチした時点で休日かどうかの判定ループからやめないと、その後のとは一致しないので、上書きされます。 つまり$c=1のときに確かに$mk1[$c]==$aが真となり$kyu[$a-1]=1としているのですが、その後も判定を続けるため、mk1リストの最後とは$mk1[$c]==$aが偽となってしまうため、せっかく前に判定して入れておいた1が0で上書きされてしまうと。

kyonmimi
質問者

お礼

kalzeさん、ご指摘通りlast;を加えたら上手くいきました。 どうもありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>考え方が、どこかおかしいのでしょうか? 間違っている処は、 else {$kyu[$a-1] = 0;} の部分です。 $cが変化してifの条件に合わない場合があってその時に0にしたら、おかしいでしょう? 色々修正の仕方はあると思いますが、 for(my $a = 1; $a <= 31; $a++) { $kyu[$a-1] = 0; for(my $c = 0; $c < @mk1; $c++) { if($mk1[$c] == $a) { $kyu[$a-1] = 1; } } } とすればいいと思います。

kyonmimi
質問者

お礼

BLUEPIXYさん、ありがとうございました。

関連するQ&A

  • Perl/CGIで作っているカレンダーについて

    先日、祝日の設定方法を教えていただき、上手くいくようになりました。 しかし、また新たな問題点が出てきて、行詰ってしまったので、皆さんのお力を貸して下さい。 tableタグの入れ子を使って、表示は2ヶ月分のカレンダーを横に並べた状態で表示させているのですが、12月と次の年の1月の2ヶ月の場合、次の年の1月(右側)が外枠のみで日にちも内枠も表示されません。 他の組み合わせの表示は上手くいきます。 月初めの曜日計算が上手くいっていないのでしょうか? 下記の様に書いています。 # ツェラーの公式により月初めの曜日を算出する my $m = $month; my $y = $year; if ($m < 3) { --$y; $m += 12; } my $startDay = ($y+int($y/4) - int($y/100) + int($y/400) + int((13*$m+8)/5) + 1) % 7; my $nm = $nmonth; my $ny = $year; my $nny = $ny; if ($m < 3 || $m >= 12) { $nny+=1; } if ($nm < 3) { --$ny; $nm+=12; } my $nstartnDay = ($ny+int($ny/4) - int($ny/100) + int($ny/400) + int((13*$nm+8)/5) + 1) % 7; if ($nm > 12) { $nm -= 12; } 分かりにくいかと思いますが、随時補足しますのでよろしくお願い致します。

    • ベストアンサー
    • Perl
  • カレンダーの祝日表示

    いつもお世話になっています。 最後の質問をさせてください。 A列に西暦入りの日付け B列に曜日 C列に祝日 M列(たて)に2100年までの西暦 3行目(よこ)に元旦、成人の日などの祝日名、祝日名の下に計算した祝日が2100年まで入っている祝日表を作りました C列にこの表を参照して祝日名を表示させる関数を教えてください。どうぞよろしくお願いします。 HLOOKUPでやったら一番上の2006年しか検索されませんでした。(涙)

  • エクセル カレンダーの祝日自動表示

    色々ネットで検索しながらやっているのですが なかなか上手くいきません。 どこが間違っているのかすらも全くわかりませんので どなたか教えていただけないでしょうか? シンプルな縦型のカレンダー(スケジュール管理)を作るつもりです。 年月を入力すれば、曜日も自動で入るところまではできました。 A8の位置にその月の1日があります B8の位置に曜日 C8の位置に祝日等を表示させたい 別シートの A列に祝日名が入っています。 B列に2015年の祝日一覧 C列に2016年の祝日一覧 D列に2017年の祝日一覧 名前を定義するというところまではできました。 この後、祝日名を表示させたいC8のセルに関数? ネットをで検索しながらいろいろやっているのですが表示できません。 どなたかご教示いただけないでしょうか よろしくお願いいたしますm(__)m

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

    祝日に関して、下記の通りプログラムを作ったのですがうまくいきません。ご教授お願いします。 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;   } この部分も自信がないので、アドバイスお願いいたします

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

    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); } よろしくお願いします。

  • 行の時の日付表示の仕方

    いつもお世話になります。 WindowsXP Excell2003です。 列での日付の表示で 月ごとに変わる 31、30、28、29日の日付を下記の式で対応をしています。 B1 2010 C1 1 A1 =DATE(B1,C1,1) 2010/1/1 A2 =IF(MONTH(A$1+ROW(A1)-1)=MONTH(A$1),A$1+ROW(A1)-1,"") 01 A3 =IF(MONTH(A$1+ROW(A2)-1)=MONTH(A$1),A$1+ROW(A2)-1,"") 02 ・ ・ ご教示をいただきたいのは 行で A2~ 日付を表示するときの数式です。 B1 2010 C1 1 A1 =DATE(B1,C1,1) 2010/1/1 A2 ~ よろしく御願いします。

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

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

  • javascript で undefinedと表示されます

    全ての変数、配列に alert(typeof variable); を試しましたが undefinedが見つかりません。 function a{ var lastdayArray = new Array ('','31','28','31','30','31','30','31','31','30','31','30','31'); var weekArray = new Array ('日','月','火','水','木','金','土'); var a = new Date(); var b = new Date(); var mymonth = a.getMonth()+1; var nextmonth =mymonth +1 ; var myyear = a.getYear()+1;   var today = a.getDate(); var maxbox = 36; var sday = a.setDate(1); var nday = b.setDate(1); var nmonth = b.setMonth(mymonth); var nwday = b.getDay(); var fwk = a.getDay(); var nfday = 6 - nwday; var fline = 6 - fwk; var nextlsday = lastdayArray[mymonth]; var lsbox = (fwk + lastdayArray[mymonth]) +1; var monthArray = new Array(mymonth,nextmonth); var monthflg = new Array(fwk,nfday); var nextflg = new Array(fline,nwday); var s_no0 = 1;   var s_no1 = 1; //数値代入変数       var s_no2 = 1; var s_no3 = 0; var s_no4 = 0; var s_no5 = 0; var s_no6 = 0; var s_no7 = 0; var s_no8 = 0; var schedule_no = new Array(s_no0,s_no1,s_no2,s_no3,s_no4,s_no5,s_no6,s_no7,s_no8); var s_str0 = 'a'; var s_str1 = 'a'; //文字列代入変数 var s_str2 = 'a'; var s_str3 = 'a'; var s_str4 = 'a'; var s_str5 = 'aa'; var s_str6 = 'a'; var s_str7 = 'a'; var s_str8 = 'a'; var schedule_str = new Array(s_str0,s_str1,s_str2,s_str3,s_str4,s_str5,s_str6,s_str7,s_str8); for(var x = 0; x < 2; x++){ daycount = 0; document.write(monthArray[x] + '月の予定'); if(nmonth == 12){nmonth = 0;} document.write('<table width="73%" height="337" border="1" cellpadding="1" cellspacing="1">'); //曜日出力 document.write('<tr>'); for(var l = 0 ; l <= 6; l ++){ if(l == 0){ weekArray[l] = (weekArray[l].fontcolor('#ff1493').fontsize(4)); } else if(l == 6){ weekArray[l] = (weekArray[l].fontcolor('#87ceeb').fontsize(4)); } document.write('<td>' + weekArray[l] +'</td>');} document.write('</tr>'); //曜日を判定しテーブル出力 document.write('<tr>'); //空ボックス出力 if((monthflg[x]) != 6 ){ for(var k = 0; k < (monthflg[x]); k++){ document.write('<td>' + '&nbsp;' +'</td>'); } } if((monthflg[x]) == 0){ for(var y = 0; y < 6 ; y++){ document.write('<td>' + '&nbsp;' +'</td>'); } if((schedule_no[y]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[y] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } else{ //空ボックスの数~土曜日まで出力 for(var m =0 ; m <= nextflg[x]; m++){ if((schedule_no[m]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[m] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } } document.write('</tr>'); //行出力 for(var i =0 ; i < 4; i++){ document.write('<tr>'); //列出力 for(var j =0 ; j < 7; j++){ if(daycount < lastdayArray[monthArray[x]]){ daycount ++; document.write('<td>' + daycount +'</td>'); } else{ document.write('<td>' + '&nbsp;' +'</td>'); } } document.write('</tr>'); } //最終行出力 if(daycount < lastdayArray[monthArray[x]]){ document.write('<tr>'); for(var p =0 ; p < 7 ; p++){ if(daycount < lastdayArray[monthArray[x]]){ if((schedule_no[p]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[p] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } else{ document.write('<td>' + '&nbsp;' +'</td>'); } } document.write('</tr>'); } document.write('</table>'); } }

  • perl

    授業でperlをやっていて課題がでてるのですが、 よく分かりません。 200以上300未満の数字か否かを判断する物を作りたいです。 が、300以上だと反応はないのですが200未満でも反応があります。 どこが違うのか教えてください 2つあります。 (1) my $a= 118; if($a < 200 ){ print "" } elsif($a => 300 ){ print "" } else { print "OK.\n"; } (2) my $x =111; if ($x ge 200 && $x lt 300){ print "OK.\n"; }

専門家に質問してみよう