2011年10月1期プログラム2010年をうるう年と判定するプログラムを作成せよ TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
ライブラリマニア【パッケージ化】
OpenGLゲーム作成初心者スレ
ステッピングモータの制御について
【sockets】HTML5を使って作る高度なウェブアプリ【3D】


2010年をうるう年と判定するプログラムを作成せよ


1 :10/03/02 〜 最終レス :11/07/07
うるう年の判定って、最初に4で割り切れるか調べるよね。
2008年は、普通に閏年と判定していたんでしょ。
どんなプログラムを書いたら、2010年がうるう年になるんだろう?
良かったら誰か想像で書いてみて

2 :
SCEの人に聞けよ

3 :
return year % 2 == 0;

4 :
return year == 2000 || year == 2004 || year == 2008 || year == 2012 || ... || year == 2096 || year == 2010;

5 :
return true;

6 :
このスレッドは天才pンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
                  京都大学霊長類研究所

7 :
10を16進で計算したんじゃないの
16進数の10は16となって4で割り切れるから

8 :
>>7に着想を得て無理にコーディングしてみた
char* year = "2010";
strtol(
ダメだ俺にはこんなクソコードかけねええええ

9 :
というかプログラムの勉強すると
大抵入門書にうるう年判定コード載ってるよな

10 :
これは時刻を管理しているチップのバグではないか?

11 :
>>10
ハードウェアの問題? 
数年後にまた発生しそうな問題なんでしょうかね。

12 :
任天堂信者必至だなw糞箱買ってくるwwwwwwwwwwwww

13 :
特定ハードで起きてるらしいから>>10と同じくハードの方の問題じゃないかと。

14 :
最近のソニータイマーは凝ってんのな

15 :
100年は使われないということで、下二桁が4で割り切れるかで閏年を判断。
しかし、なにかの間違いで下一桁で計算していた?
もしそうならば、2年後に3月1日が二日続く問題が発生しそう。

16 :
is_leap = !(y % 4) ^ !(y % 100) ^ !(y % 400) を間違えて
is_leap = !(y % 4) ^ !(y % 10) ^ !(y % 400) にしちゃった

17 :
単純にyearが2100となって、400で割り切れただけだろ

18 :
オレも >>16 が当たりのような気がする
>>17
2100 は 400 で割り切れないわけだが

19 :
>>18
すまんw適当にもほどがすぎたw

20 :
100年先、400年先に使われているわけないんだから、4で割り切れるかだけチェックしとけばいいのに。

21 :
time_t now = time(NULL);
int days = now / 60 / 60 / 24;
/* 年を取得 */
int year = 0;
BOOL is_leap;
int day_count;
while(1) {
 is_leap = !(year % 4) ^ !(year % 100) ^ !(year % 400);
 int day_count = 365 + is_leap;
 if( days < day_count ) break;
 days -= day_count;
 ++year;
}
/* 月日を取得 */
/* (省略) */

22 :
void print_year(y)
{
  printf("%d",1970+y);
}
int is_leap(y)
{
  return(!(y % 4) ^ !(y % 100) ^ !(y % 400));
}

23 :
return (year % 4 == 0) || (year == 2010);

24 :
条件式
if(西暦年が100で割り切れる年) true;
バグ
if(西暦年が10で割り切れる年) true;

25 :
年をBCDで持ってたんだろ。
0x2010 は、 4 で割り切れる。

26 :
>>11
オフラインにしてカレンダーを2014年3月1日とかにしてみたらどうかな。
すでに2010年に1日誤差が出てるから1、2日ずらして試す必要もあるかも。
日本時間なら9時以降にするのも忘れずに。
ってオレ、何カ月も電源入れてない60GBのPS3持ってるんだった。
帰宅したら試してみるかなあ。

27 :
ファームアップデートで不具合ってのはPS3だと日常茶飯事らしいが、いくらなんでもこれは酷いな
ソフトウェア軽視のソニーらしいと言えばそれまでだが

28 :
本当は下二桁でやりたかったんだけど西暦年の下一桁で判断しちゃった
とか?

29 :
おまいら閏年の定義すら知らないのか
冷害がいろいろあるんだよ。
汎用に作成しないと、100年後は閏年かとか調べるとき困るしな。

30 :
どの例外をどう取り違えたら2010年をピンポイント誤爆するんだよw

31 :
>>25
今までで一番納得した。

32 :
>>31
納得はしやすいんだが、2年後には29日を飛ばすということになるけど、そうなん?

33 :
そう

34 :
今どきBCDはないだろ

35 :
>>34
クロックチップは多いよ。そのまま、LEDに繋いだら出来上がりだから。

36 :
BCDで持ってるとしても、表示はちゃんと2010年になって
なぜうるう年計算だけ0x2010になるのか俺にはさっぱりわからん

37 :
w

38 :
RTCはBCDで出力していて、表示系は当然BCDから変換して表示してるか、
あるいは直接16進を表示してる。
閏年計算で、BCD→intの変換をやるべきところを忘れて、BCDを直接intとして
扱ってしまったために、0x2010=閏年、となってしまった。
この理論だと2008年は0x2008で閏年となったことも説明できるな。

39 :
>>38
そうだとすると、2012年をうるう年として扱わないということになるな。
だれか実験できないか?

40 :
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ !!
└─┘      !!

41 :
できるけどケーブル抜くの面倒で触ってなかったわ
まあ近いうち試してみるね。
何と何やればいい?
オフラインにして偶数年の2/28〜3/1あたりの挙動でいいかな

42 :
>>41
そうだね。
知らぬ間にアップデートされてる可能性があるから、2012年が正常に動くようなら2010年の不具合が再現するかも。

43 :
結局よくわからんかった。
LAN抜いて電源入れたら、たしかに日付が1日ずれてたw
その後時差面倒なのでGMT0のロンドンにして各年の2/28あたりに
設定してもどうもならんかった。設定する側は閏年判定して29日
入れさせてくれないし。
オフラインでも不具合起きたってのは別の症状なのかねえ。

44 :
PS3って電池が切れると2006/1/1になるんじゃね?
つまりそこが基準点で二年後にうるう年がくる
→何故か二年ごとにうるう年が来る羽目に

45 :
なるほど!そういうことか

46 :
>>44
だれか2014年で実験してみてくれ。

47 :
>>44
乾電池差し込んで無駄に2年過ごせって…なにecoは?地球は?
2008年になったら閏年かもしれないじゃん、え。
>>1
if(year%4==0 && year%100!=0) cout << year; // 2000 年が閏年じゃなくなる
どんなプログラムを作ったら2010年が閏年になるかって、なるわけないじゃん、あ。

48 :
2010.6.19

49 :
多分こうだろ。
誰か偉い人がこういうテストコード書く
assert(isLeapYear(2010));
 ↓
「おいテスト通らねえぞ!」
 ↓
「はい今直します(でも隙を見てテストどもども直さないとな・・・)」
bool isLeapYear(int year)
{
  if (year == 2010) return true;
  return (year % 4 == 0 && (year % 100 != 0 || year % 400 = 0));
}
 ↓
そのまま忘れられる。

50 :
>>49
ありえる。

51 :
>>29
冷害て・・・閏年に農作物が不作になるのかと思ったw

52 :
4の倍数から2を引いた数で判定すれば簡単だと思うんだがなw

53 :
うるう年の判定は一年365.2422日を無理やり365日に押し込めたときの誤差が1日分にまで
蓄積されるかどうかだから、一般的には
4で割り切れるときはうるう年、でも100年に一度は休み、400年に一度は復活ってロジックでいいよ

54 :
>>53
スレ違い

55 :
>>52
それだけだと2008年もうるう年だったことの説明ができない

56 :
bool checkleapyear(unsigned year)
{
  // 通常のうるう年の判定
  if ( (!(year % 4) && (year % 100 != 0)) || !(year % 4) ){
    return true;
  }
  // 2010年をうるう年とする判定
  else if ( year == 2010 ){
    return true;
  }
  return false;
}

57 :
>>56
ミスったww
通常のうるう年の判定の部分、||の後は!(year % 400)だった

58 :
&& と & を打ち間違えてたバグが数年見つからなかったって事例があったよね
char y[5] = "2010";
return y[2]=='0' && y[3]=='0' ?
y[0]=='1' || y[0]=='3' || y[0]=='5' || y[0]=='7' || y[0]=='9' ?
y[1]=='2' || y[1]=='6' : y[1]=='0' || y[1]=='4' || y[1]=='8' :
y[2]=='1' | y[2]=='3' || y[2]=='5' || y[2]=='7' || y[2]=='9' ?
y[3]=='2' || y[3]=='6' : y[3]=='0' || y[3]=='4' || y[3]=='8';
2008と2010がうるう年というのは満たせたが2012が平年になってしまった

59 :
うるう年が決まるルールがもう少し複雑なら、
素直に「自作しないで関数を使いなさい」ってことになっていただろうに。
うるう年の計算方法なんてもう忘れちまえよ。
なんでいちいち自作するんだバカやろう。

60 :
さあ江戸時代に戻ろうか。

61 :
2010年の前の閏年は2006年
2010年の次の閏年は2014年

62 :
ハァ?なにこいつ

63 :11/07/07
今はPS3は別のことで大騒ぎだから
この辺のことはもう忘れてるなw
TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
ライブラリマニア【パッケージ化】
OpenGLゲーム作成初心者スレ
ステッピングモータの制御について
【sockets】HTML5を使って作る高度なウェブアプリ【3D】