うるう年の条件(表計算のif)

このQ&Aのポイント
  • 表計算のif関数を使ってうるう年の条件式を作成する際、(1)と(2)は正解を導くことができるが、(3)から(6)は導くことができない。
  • 条件式のandとorの順番を入れ替えただけで、結果が変わってしまった理由として、(3)から(6)の条件が条件式で導けない内容である可能性がある。
  • 詳しい理由は質問者の知識が足りなかったために導き出せなかったため、具体的な内容についてはわからない。
回答を見る
  • ベストアンサー

表計算のifの条件(うるう年の計算)

LibreOfficeの表計算のifの条件で わからない点があります。 問題は 【A1からA10まで1600から100とばしに2600まで入ってます。  そして、それぞれうるう年であるか平年であるかを調べます。  条件は、  西暦の年数が4で割り切れ数字は原則『うるう年』  例外として、西暦が100で割り切れる年は『平年』とする  さらに例外として西暦が400で割り切れる年は『うるう年』とする】 という内容です。 ちなみに1600、2000、2400でうるう年と表示されれば正解です。 導き方がわからなかったので解答をみたら (1)が解答でした。 そこで、(2)から(6)まで導けそうな日本語文を考えて、それを 条件としてあてはめてみました。 しかし、(1)と(2)以外は導けませんでした。 なぜ、(3)~(6)は導くことができなかったのでしょう? orとandの順番を入れ替えただけで何故導けなくなったのでしょう? これはifで導こうと思ったら、(1)または(2)でしか 導けない内容なのでしょうか? あまり知識がないので、噛み砕いて教えてくださるとより ありがたいです。 是非、よろしくお願いします。 (1)、400で割り切れるか、あるいは(or)、   4で割り切れて、そして(and)、100で割り切れない場合   『うるう年』、そうでない年を『平年』とする。  =if(or(mod(a1,400)=0,and(mod(a1,4)=0,mod(a1,100)<>0)),"うるう年","平年")  →ちゃんとなる。 (2)、400で割り切れない、あるいは(or)   100で割り切れ、そして(and)4で割り切れない場合   『平年』、そうでない年を『うるう年』とする。  =if(or(mod(a1,400)<>0,and(mod(a1,100)=0,mod(a1,4)<>0)),"平年","うるう年")  →ちゃんとなる。((1)を元に平年とうるう年の条件を入れ替えてみた) (3)、4で割り切れて、そして(and)、100で割り切れない   あるいは(or)400で割り切れる場合   『うるう年』、そうでない年を『平年』とする。  =if(and(mod(a1,4)=0,mod(a1,100)<>0,or(mod(a1,400)=0)),"うるう年","平年") →全部平年になる((1)のandとorを入れ替えただけ) (4)、100で割り切れ、そして(and)4で割り切れない   あるいは(or)400で割り切れない場合   『平年』、そうでない年を『うるう年』とする。  =if(and(mod(a1,100)=0,mod(a1,4)<>0,or(mod(a1,400)<>0)),"平年","うるう年") →全部うるう年になる((2)のandとorを入れ替えただけ) (5)、400で割り切れ、そして(and)4で割り切れ、   かつ(and)100で割り切れない場合   『うるう年』、そうでない年を『平年』とする。  =if(and(mod(a1,400)=0,mod(a1,4)=0,mod(a1,100)<>0),"うるう年","平年")  →全部平年になる。   ifとandで作ってみた。 (6)、400で割り切れ、そして(and)4で割り切れ、   かつ(and)100で割り切れない場合   『うるう年』、そうでない年を『平年』とする。  =if(mod(a1,400)=0,if(mod(a1,4)=0,if(mod(a1,100)<>0,"うるう年","平年")))  →1600,2000,2400年は平年になり、それ以外はFALSEと表示される。   ifの中にifを入れる文を作ってみた。

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

  • ベストアンサー
  • RandenSai
  • ベストアンサー率54% (305/561)
回答No.2

(3)がうまくいかないのは、条件が間違っているからではなくて、単純にAND,OR関数の使い方(特にOR関数)で勘違いしているからです。こうすればうまくいきます。 =IF(OR(AND(MOD(A2,4)=0,MOD(A2,100)<>0),(MOD(A2,400)=0)),"うるう年","平年") 文章で「A かつ B」や「A または B」と書いてあるものをAND,ORで書くと、「AND(A,B)」「OR(A,B)」になります。つまり関数の括弧の中に条件が入るわけで、A AND Bや、A OR Bとは書けません。なので「or(mod(a1,400)=0)」と言う式は、条件が一つしかない「OR(A)」と同じです。よってAND,ORを組み合わせる場合も、括弧内に記述します。文章の「A かつ B または C」をAND,ORで書くと、「OR(AND(A,B),C)」になります。 きっとこれを見て「うわ~、判りづれぇ」と思われたでしょうから、以下のURLのような直接数式に書いてしまう方法も提示しておきます。ただしこれはExcelやLibreOffice CALCのTRUE,FALSEをきちんと理解せずに真似すると落とし穴にはまる危険がありますが、ビジュアル的にはAND,OR関数よりも見やすい。 http://www.relief.jp/itnote/archives/001180.php (4)は条件が間違っています。100で割り切れて4で割り切れない数って、存在しませんよね?その逆はありますが。 (5)も条件間違いです。400で割り切れるけど100では割れない数はありえません。 (6)もまた条件違いですが、ちょっと様子が違っていて、FALSEと表示される要因は、式が成立しなかった時の値が指定されていないからです。ただもっと根本的問題として、最初の400で割り切れたら次のIFで4で割り切れるかを判定していますが、このIFの括弧の中に後続のIFが入ってないため、おかしなことになっています。どうしてこれがエラーにならないのか不思議なくらい・・・それに400で割り切れれば4でも割り切れるから、この判定方法は無意味です。うまくやるには、 1)最初に4で割り切れるかを見る。割り切れなければ平年。 2)次に100で割り切れるかどうかを見る。割り切れなければうるう年。 3)上の2)で割り切れたら、400で割り切れるか見て、割り切れればでうるう年、そうでなければ平年。 と言う順序になり、これをまとめると以下のような式になります。こちらの方がAND,OR関数を使うよりも思考順序に近く、理解しやすいのでは? =IF(MOD(A1,4)<>0,"平年",IF(MOD(A1,100)<>0,"うるう年",IF(MOD(A1,400)=0,"うるう年","平年")))

vayasicof
質問者

お礼

RandenSai様、ご回答ありがとうございます。 >(3)がうまくいかないのは、条件が間違っているからではなくて、  単純にAND,OR関数の使い方(特にOR関数)で勘違いしているからです →なるほど、丁寧に説明して下さったので  ORの使い方が特に変だったことが理解できました。  そして、教えてもらった組み立てでやってみると  ちゃんと導けました。 >きっとこれを見て「うわ~、判りづれぇ」と思われたでしょう →いえいえ、ゆっくり一個一個教えてくれるから  とてもわかりやすいですよ^^  張ってくれた内容も読みましたが  ANDは『積』で、ORは『和』にあたるんだなぁと  0をかける、足すと例があったので、  なんとなーく理解できました。 >(4)は条件が間違っています >100で割り切れて4で割り切れない数って、存在しませんよね? →確かに存在しない…でも、んー?って思いました。  なぜなら、ちゃんと導けた(2)の条件がそれだったからです。  なので、先ほど教えてもらった方法で(4)を組みなおして  =if(or(and(mod(a1,100)=0,mod(a1,4)<>0),(mod(a1,400)<>0)),"平年","うるう年")  で検証してみました。  そしたら、導くことできました。  でも、『100で割り切れて4で割り切れない数』なんて存在しないし  どうなってんのかわからなかったので  そんな存在しないものは自動的にその部分が消されて  最終的に、400で割れたら平年、割れなかったらうるう年ということに  なってしまってるのか?と考え  1600から1700年のうるう年を検証してみようと考えました。  結果、考えが当たってたようで  400で割れる1600年しかうるう年になりませんでした。  (1600、1620、1640、1660、1680がうるう年に本来なる)  つまり、唯一正解してると思ってた(2)ですら  残念ながら私は正解していなかったんです。 >うまくやるには、以下のような式になります →すごい!すごくスッキリした内容のわかりやすい式です!  式の内容自体がすごく理解しやすいです。 今回も本当に助けていただいて ありがとうございました。

vayasicof
質問者

補足

今回の問題は何回も日本語を声に出し読み直し、考え、 考えすぎたため、軽いゲシュタルト崩壊状態になりましたが、 今回も皆様のおかげで一つまた問題を解決することが できました。 それぞれのご回答、それぞれにいいところがあり 私自身、納得する部分も多く、また 気付いてない点に気付かされることもたくさんありました。 ベストアンサーを一人しか選べないのが心苦しいですが 唯一正解したと思った(2)ですら正解でなかったという 事実に気付かせてもらったので RandenSaiさんに決めました。 また、どうしても私では問題が解決できない時は 皆様のお力は頼りになりますので よろしくお願いします。

その他の回答 (3)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.4

■誤 真(True)→うるう年となるが、条件2で100で 割りきれる年のmod(a1,100)の値は=0となる   ↓ ■正 真(True)→うるう年となるが、条件2で400で 割りきれる年のmod(a1,100)の値は=0となる

vayasicof
質問者

お礼

don_go様、訂正のため、追加でのご回答 ありがとうございました。 ためになりましたんで また、質問した際はよろしくおねがいします。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

■OR関数の書式 OR(条件1,条件2,・・・) 条件1 または 条件2 または・・・の場合 真(True)を返し、そうでない場合は偽(False) を返す。 ■AND関数の書式 =AND(条件1,条件2,・・・) 条件1 かつ 条件2 かつ・・・の場合真(True) を返し、そうでない場合は偽(False)を返す。 (3) 条件1:mod(a1,4)=0 条件2:mod(a1,100)<>0 条件3:or(mod(a1,400)=0)→mod(a1,400)=0 #OR関数の中の条件が1個だけの場合は、 #OR()が無い場合と同じ結果になる。 and()の中の条件1~3が全て満たされる場合 真(True)→うるう年となるが、条件2で100で 割りきれる年のmod(a1,100)の値は=0となる ので偽(False)となり、結果としてうるう年 にはならず平年となる。 (4)(5)も同様な考え方で判定して下さい。 ■IF文の書式 =IF(条件式,値1,値2) 値1は条件式が満たされている場合真(True) 値1は条件式が満たされていない場合偽(False) (6)条件式と値を順に与えると =if(mod(a1,400)=0,"うるう年",値2) 値2=if(mod(a1,100)=0,"平年",値3) 値3=if(mod(a1,4=0,"うるう年","平年") となり、全てをひとまとめにすると下記の 結果になります。 1)値2を代入 =if(mod(a1,400)=0,"うるう年",if(mod(a1,100)=0,"平年",値3))   ↓ 2)値3を代入 =if(mod(a1,400)=0,"うるう年",if(mod(a1,100)=0,"平年",if(mod(a1,4=0,"うるう年","平年")))

vayasicof
質問者

お礼

don_go様、ご回答ありがとうございます。 >OR関数の書式 >AND関数の書式 >IF文の書式 →それぞれわかりやすく綺麗にまとめて下ったので  自分のノートにこれをきっちりメモして  もっと基礎力をつけようと思いました。 >(6)条件式と値を順に与えると  下記の結果になります →そうか!  私の式でFAUSEが出たのは値2の前と値3の前にある条件を  書かなかったからFAUSEと出たんですね。  なるほど、FOUSEがでた意味がスッキリしました。  本当に助けて頂いて  ありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! あまり難しく考えなくてもよいと思います。 A列には1600・1700・・・と入っているというコトですね。 100または400で割り切れる年は必ず4で割り切れますので、 結局100で割り切れるか、400で割り切れるかだけの問題かと・・・ =IF(MOD(A1,400)=0,"うるう年","平年") だけで良いと思います。 (3)(4)の数式 「Excelの場合ですが、関数の引数ダイアログボックス」を使用して OR関数もしくはAND関数の中にOR関数やAND関数を使用するとエラーと判断されます。 (5)の数式 AND条件で100で割り切れ、4で割り切れた場合 → A列すべてが「TRUE」となります。 次のIF関数で100で割り切れない!という条件にしていますで ここで「FALSE」となり、「平年」という結果が返ります。 (6)の数式 IF関数のネストは2番目までは「TRUE」です。 3番目のIF関数で「100で割り切れない」という条件にしていますので、 最終的にIF関数の結果は「FALSE」となり「平年」が返ります。 あと「FALSE」と表示されるのは、どこかのIF関数の「偽の場合」の条件が未記入だと思われますので おそらくそういった表示になっているのではないかと思います。m(_ _)m

vayasicof
質問者

お礼

tom04様、ご回答ありがとうございます。 >こんにちは! →こんにちは^^ >結局100で割り切れるか、400で割り切れるかだけの問題かと →条件式とか組み立てばかりに気を取られて  それぞれの数字には無頓着で  自分の考えに全く無いご指摘だったのには  ものすごく新鮮な感動を覚えました。 >Excelの場合ですが  OR関数もしくはAND関数の中に  OR関数やAND関数を使用するとエラーと判断されます →そうなんですか?!  同じ機能ならタダの方で…  とlibreを使ってましたが、やはりちょっと違うんですかね… >(5)の数式 >(6)の数式 →文章がとてもわかりやすいので  ゆっくり、しっかり声に出して読むと  何とか理解することができました。  いやぁ、日本語ってずっと考えると混乱が起こりやすいですね(汗)   >「FALSE」と表示されるのは、  どこかのIF関数の「偽の場合」の条件が未記入だと思われます →未記入…んー…  条件の組立てそのものがおかしいってことですね(汗)  んー…まだまだ私はifの条件や組み立てを  根本的に勉強する必要がでてきました。  本当に今回も助けていただいて  ありがとうございました。

関連するQ&A

  • うるう年の出し方

    うるう年は ⅰ、4で割り切れる年はうるう年       ⅱ、例外として100で割り切れたら平年       ⅲ、例外として400で割り切れたらうるう年 ($year%4==0 && $year%100!=0 && $year%400==0); と考えたのですが、ご指摘をおねがいします

    • ベストアンサー
    • Perl
  • 2008は閏年であることを判定する式を作成するにあたって

    2008年は閏年であるということを判定する式を 作成しなければならないのですが、 なかなか良いアイデアが浮かばず質問に至りました。 ※閏年とは次の条件を満たす年のことをいいます。 400の倍数である。または100の倍数ではなく、かつ4の倍数の年をいう。 この問題を関数OR,IF,MOD,ANDなどを利用して判定する式を作成しなければならないのですが、納得のいく解答ができませんでした。数学や情報処理の得意な方、是非チカラを貸してください。お願いします。

  • 閏年と平年の求め方

    うるう年は西暦年が4で割り切れる年。   ただし100で割り切れても400で割り切れないときは閏年としない 平年は閏年でない年 2001年から2401年の400年の間にうるう年は何回あるかを求める。 この問題なんですがどうやって計算すればいいか解りません。 なるべく式も一緒に教えて下さい。 宜しくお願いします。

  • うるう年かどうかを計算するプログラミング

    西暦何年かを入力し、その年がうるう年かそうでないかを 計算するプログラムを作っています。 #include <iostream> using namespace std; int main() { int toshi; cout <<"西暦を入力してください"; cin>>toshi; if (toshi%4==0) {if (toshi%100==0) {if (toshi%400==0) {cout<<toshi<<"年はうるう年です。";} else {cout<<toshi<<"年は非うるう年です。";} else {cout<<toshi<<"年は非うるう年です。";} else {cout<<toshi<<"年は非うるう年です。";}}} return EXIT_SUCCESS; } これを入力したのですが エラーが2つでてしまいます。 どこがちがうのでしょうか?

  • 閏年のプログラム

    C言語(閏年)の質問です。 任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成で途中まではわかって修正・追加する箇所があったら一緒に教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。) なお、閏年の判定方法は以下のとおりである。 条件1 西暦年が4で割り切れる年は閏年である 条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない 条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である 実行例1 西暦を入力:2000 西暦を入力:2009 2000年 2004年 2008年 閏年は3回あります。 実行例2 西暦を入力:2100 西暦を入力:2000 2000年 2004年 2008年 2012年 2016年 2020年 (省略) 2096年 閏年は25回あります。 実行例3 西暦を入力:2090 西暦を入力:2110 2092年 2096年 2104年 2108年 閏年は4回あります。 #include <iostream> bool checkYear(int year); int main() { int year; int year2; printf("西暦を入力:"); scanf("%d",year); printf("西暦を入力:"); scanf("%d",year2); int count = 0; for (int i = year; i < year2; i++) { if (checkYear(i)) { printf("%d年\n"); count++; } } printf("閏年は%d回です。\n"); return 0; } bool checkYear(int year) { return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); }

  • IF関数で閏年を抽出

    ExcelでA1に生年月日が入っていて 「閏年生まれの場合+1、それ以外は+2」 としたいのですがどの様な関数との組み合わせがよろしいのでしょうか? B1セルに =IF(AND(16163<=A1,A1<=16527),A1+1,IF(AND(17624<=A1,A1<=17988),A1+1,IF(AND(19085<=A1,A1<=19449),A1+1,IF(AND(20546<=A1,A1<=20910),A1+1,A1+2)))) ですとIFの限界が来たときにエラーになってしまいます。 過去質問にも似たようなものがありましたが、この場合でもMATCHやVLOOKUPを使うと上手くいくのでしょうか? よろしくお願いいたします。

  • 表計算のifの条件式について

    LibreOfficeの表計算のifの条件式について わからない点があります。 A1からA9までテストの点(満点100)が入力されています。 問題は 【59以下なら『C』、79以下なら『B』、100以下なら『A』とする。】 とあります。 なので(1)~(4)の導けそうな日本語文を考え その条件で入力しましたが、 (4)しか正しく導けませんでした。 (1)~(3)のダメな点は一体どこなんでしょうか? 何しろ初心者なもので、あまり専門用語を使わず 噛み砕いてご回答してくださるとよりありがたいです。 是非、よろしくお願いします。 (1)、100以下なら『A』、80未満を『B』、60未満を『C』とする。  =if(a1<=100,"A",if(a1<80,"B",if(a1<60,"C","")))  →全部がAになる (2)、100以下なら『A』、79以下を『B』、59以下を『C』とする。  =if(a1<=100,"A",if(a1<=79,"B",if(a1<=59,"C","")))  →全部がAになる (3)、60未満を『C』、80未満を『B』、それ以外を『A』とする。  =if(a1<60,"C",if(a1<80,"B","A"))  →全部がCになる (4)、60未満を『C』、80未満を『B』、100以下を『A』とする。  =if(a1<60,"C",if(a1<80,"B",if(a1<=100,"A","")))  →ちゃんとなる。

  • うるう年を計算に入れると?

    ---一部引用--- 「世紀の計算ミス」の内容を大まかに説明すると、マヤ長期暦の1周期を約5000年としてグレゴリオ暦に換算した場合、4年に約1日増える“うるう年”を計算に入れていなかったというのだ。つまり、5000÷4=1250日もの誤差が出ており、誤差を修正すると、マヤ長期暦の終わりの日は、西暦2012年12月23日から1250日後の2015年9月3日になるというのである。 ---引用終了--- 引用元:http://news.livedoor.com/article/detail/7258100/ この計算がよく判らないので、なぜこうなるのか教えてください。 ↓私はこのように考えました。 うるう年が無いときとあるときで比較すると、うるう年がある時の方が単位年数あたりの日数が多くなります。 マヤ暦と西暦で起点となる日を決め、そこから日毎に一対一で対応させていったとき、対応させる日が無くなる年が早いのは、うるう年を計算に入れた場合です。 もし仮にうるう年を計算に入れないことで1250日の誤差がでたのなら、2012年12月23日の1250日後ではなく1250日前、2009年中頃がマヤの暦の終わりの日になっていたはずです。 しかし記事ではうるう年を計算に入れることで2012年12月23日から延長されて2015年9月3日ということになっています。 なぜこうなるのでしょうか?

  • bash 閏年

    shellについて初めて勉強しています。 複数のコマンドライン引数で西暦を与えると,閏年かどうか判定する bashのファイルを作成しているのですが, なかなかうまくいきません。 どのように改善したらよいでしょうか? #!/bin/bash if [ ${DATE_YYYY}%4 -eq 0 -a \ ! ${DATE_YYYY}%100 -eq 0 -o \ ${DATE_YYYY}%400 -eq 0 ] then # 閏年 else # 閏年以外 fi

  • 【ExcelVBA】IF条件を満たしているのに、IF条件のところで止まってしまう

    Sub test1() 変数1 = IsEmpty(Range("C1")) If Range("A1") > 0 And Range("B1") = 0 And 変数1 = True Then   test2 End If End Sub 止まったときのデバッグでの表示は Range("A1")は「100」(セルの中身) Range("B1")は「0」(セルの中身) 変数1はRange("C1")がエラー表示なので「True」 すべての条件を満たしているのですが、 IF条件のところで止まってしまいます。 (IF条件のところの1行が黄色くハイライトになっている状態) 止まったデバッグの後に、F5を押して実行させると、 IF条件の続きから実行されて、test2が実行されて処理が終了します。 何で、IF文のところで一度止まってしまうのかわかりません。

専門家に質問してみよう