• ベストアンサー

閏年が何個含まれるか求めるプログラム

3桁、あるいは4桁の整数を10個程度入力して、これらの中 に閏年が何個含まれるか求めるプログラムの書き方を教え てください。  お願いします。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8536/19406)
回答No.6

まず「入力する整数は何なのか」と「閏年ってどんな日なのか」ってのを、きちんと提示しましょう。 例えば、エチオピアでは、閏年は「4で割り切れる年の前の年の、13月6日」が閏年です。因みに、エチオピアは、今は「2001年5月」です。 入力する数値が、西暦年なのか、エチオピア年なのか、皇紀年なのか、そこんところをハッキリさせましょう。 そして閏年も、それがどういうモノなのかハッキリさせましょう。 それらがハッキリしないと、プログラムは作れません。 1.整数を1つ入力するだけのプログラムを作る。 #include <stdio.h> int main(void) { int year; scanf("%d",&year); return 0; } 2.上記1のプログラムを改造して、整数を入力し、入力した整数が0だったら終了、0じゃなかったら入力を繰り返すようにする。 3.上記2のプログラムを改造して、0が入力されたら今までに入力した整数の「個数」を表示して終了、0じゃないなら入力した「個数」をカウントアップして入力を繰り返すようにする。 4.上記3のプログラムを改造して、入力した整数が0でなく、かつ、3桁か4桁の整数じゃなかった時は、カウントアップせずに入力をやり直すようにする。 5.上記4のプログラムを改造して、入力した個数をカウントする部分を、入力した整数が閏年の時だけカウントするようにする。 何も無い所から一気に「最終目的のプログラム」を書くのは無理なので、上記のように「少しづつ積み上げていく」と良いでしょう。

w1n2
質問者

お礼

詳しい説明ありがとうございました^^ 一つずつやってみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.8

単純にユリウス暦とグレゴリオ暦だけの話だとしても、(宗教上の問題もあるので)国によって切り替えの時期が異なります。 ロケールで判断するのであれば処理系に依存しますし、そうでなければ国(または文化圏)を指定する方法を別途規定する必要があります。

w1n2
質問者

お礼

回答ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19406)
回答No.7

因みに。 ユリウス暦は4で割り切れる年を必ず閏年とする。100とか400は考えない。 グレゴリオ暦は、4で割り切れる年を閏年とするが、100で割り切れる年は閏年とせず、400で割り切れる年は閏年をする。 「ユリウス暦の1582年10月5日をグレゴリオ暦の1582年10月15日とする」として切り替えたので、1582年よりも前は、4で割り切れたら必ず閏年として判断し、100とか400とかは考えてはいけない。 なので、1200、1300、1400、1500年は閏年(例外は一切なし)、1600年も閏年(400の、例外の例外)、1700年は平年(100の、例外)、となる。

w1n2
質問者

お礼

回答ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

日本で最初に使われた暦法は「元嘉暦」(692年採用) なので, この年より前の値は意味を持ちません. 西暦だと仮定しても, グレゴリオ暦以前は置閏法が異なるのでその調整が必要です. グレゴリオ暦を単純に延長していいなら #3 の通りですが, それがこの問題に即して正しいかどうかは知りません. #4 の与太話につきあってみる試み: 太陰太陽暦では「どの年を閏年にするか」という直接の規定があるわけではありません. 実際には「どの月が閏月になるか」という規定があり, その結果として閏月が含まれる年が閏年になります. それを前提においておきますが, メトン周期 (19年=235朔望月) の関係で大体 19年に 7回閏月が入ることになり, 近似的には「年を 19で割った余り」で閏年になるかどうかが判定できるはずです. ただし, 暦法によっては「閏十二月」が存在しうる (実際に存在する) ため, 厳密にやろうとすると月の運行をきちんと考える必要があります... 未来の分はたぶん不要なので, 過去のデータを調べた方が早いかな. さらに余談では, 日本の法令上「神武天皇即位紀元」をつかって閏年かどうかを調べるのがきっと正しい. といっても神武紀元が西暦に 660 を足したものだし, 法令では「神武紀元から 660 を引いた値を使って調べる」となっているので結局西暦を使うことと同じ.

w1n2
質問者

お礼

回答ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

まぁ仮に日本の暦だとしても和暦か西暦かって話がありますしねぇ。 #太陰太陽暦の閏年ってどんな定義でしたっけか とかヨタ話は置いておいて(どうせ西暦の閏年でしょうから)。 ・入力された数値が閏年かどうかを判定し、閏年であれば+1 というのを10回(程度)繰り返すだけですけど。

w1n2
質問者

お礼

回答ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

暦にもいろいろありますからね。 閏年だけでは問題に不備があるので作れないですね。 入力された整数で400の倍数または4の倍数で100の倍数でない数がいくつあるかなら作れますが。

w1n2
質問者

お礼

回答ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「閏年を求める」? なぜ? 「指定した年が平年か閏年か」を判定できればいいだけじゃないの? でも, 入力した数値が西暦の年を表すんだとしたら, 「閏年かどうか」すら問題になるんじゃないかね. 「どの国で採用した暦法を使うか」というところから決めないとダメ.

w1n2
質問者

お礼

説明不足でした。すいません(汗 回答ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

複数個をうるう年かどうかを判定させるロジックを組む前に、うるう年を求める計算を調べてください。 いくらでも存在しています。 ただし、公式の一つ一つの意味を理解してください。 なぜ、ここで400という数字がでてくるんだ?とか、とか・とか・・・・ 完成形のみを考えているとなかなか上手くいきません。 一番小さな単位からコツコツやっていきましょう。

w1n2
質問者

お礼

 回答ありがとうございます。 閏年を求めるやり方はわかるのですが、 その数を表示させるやり方が分からなくて・・・ 頑張ってみます^^

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • うるう年を求めるプログラム

    1900から2100年のうるう年を求めるプログラムが作りたいのですが どうしたらよいでしょうか? forを使って1900から2100までかぞえる。 4で割り切れるものは閏年 しかし100で割り切れるものは閏年でない。 400で割り切れるものは閏年である。 最後の条件の分岐から閏年のみを表示させたいのですがわかりません 。

  • 基本的なプログラム

    基本的なプログラム 学校の教科書に載っている問題がわかりません。 是非教えて下さい。 Cによる基本的な条件分岐(if,else if文)のプログラムです。 西暦年(4けたの整数)を入力し、その年がうるう年かどうかを判断するプログラムを作りなさい。 4で割り切れるときはうるう年であるが、100で割り切れるときはうるう年ではない。 しかし、400で割り切れればうるう年である。 ・・・とゆう問題文です。 #include<stdio.h> int main(void) { int x; printf("西暦を入力して下さい¥n"); scanf("%d",&x); if(x%4==0) printf("うるう年である¥n"); else if(x%400==0) printf("うるう年である¥n"); else if(x%100!==0) printf("うるう年でない¥n"); else printf("うるう年でない¥n"); return 0; } ・・・とりあえず自分で考えてみたのですがどうでしょうか; 間違ってると思いますが頑張って考えました・・・;; 4けたの整数ってゆうのはどう書けばいいんでしょうか? 実際にこのプログラムは動くのでしょうか? もっと省略して書くことができるのでしょうか?  等、色々わからないことばかりです。 プログラミングの授業自体に苦手意識を持っているので得意ではありません。 間違いなど指摘していただけたらと思います!! よろしくお願いします!

  • 閏年のプログラム

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

  • 閏年について

    Excelで「1900/2/29」と入力すると、閏年でないのに、日付として認知され、標準表示形式では「60」と表示されます。1900年は閏年として認識しているのでしょうか?Visual Basicで西暦と和暦のプログラムを作成(1900年未満)している途中で計算が合わなくなり、この疑問にぶつかりました。回答をよろしくお願いします。

  • C++でうるう年判定のプログラムを作りたいのですが

    C++でうるう年判定のプログラムが作りたいのですが・・・ #include <iostream> using namespace std; int main() { return 0; } 問題のこの下の部分の内容が書けません 変数をa % 4という計算と%100と%400をしなければいけないことはわかっています。この式の入れ方がわかりませんif文だとは思っているのですが 表示は「<<a<<"はうるう年です";」と「<<a<<"はうるう年ではありません";」という判定を表示したいです。

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

    西暦何年かを入力し、その年がうるう年かそうでないかを 計算するプログラムを作っています。 #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つでてしまいます。 どこがちがうのでしょうか?

  • プログラム (BASIC) 教えてください

    コンピュータが 3桁の整数(100~999) n をランダムに生成。 「3桁の整数(100~999) n を当ててください」と表示。 解答者はキーボードで整数 x を入力。 x > n なら「もっと小さい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x < n なら「もっと大きい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x = n となったら ループを抜ける。 「正解です」と表示して,ゲーム終了。 100 RANDOMIZE 110 PRINT "3桁の整数(100~999) n を当ててください" 120 LET n=100+INT (900*RND) 130 DO 140 INPUT x 150 IF x=n THEN EXIT DO 160 IF x>n THEN 170 PRINT "もっと小さい数です.再入力してください" 180 ELSEIF x<n THEN 190 PRINT "もっと大きい数です.再入力してください" 200 END IF 210 LOOP 220 PRINT "正解です" 230 END このプログラムをIF、END IFを一回のみ使うプログラムに変える方法を教えてください。

  • 反転のプログラムについて

    プログラムの質問で「入力された正の整数において、桁の順序を反転したプログラムを作れ。321→123、32100→123など。0の時は0と表示させろ」という問題がどうしてもわかりません。講師の人が10で割ればいいと言ってるんですがいまいちわかっていません。使ってるのはVisual Stadio 2005のC++です。教えてもらえませんか?ついでに 「M以上N以下の正の整数で、素数であるものを小さい方から表示するプログラムを作れ」も教えてもらえれば幸いです。アドバイスでも結構ですのでよろしくお願いします

  • CASLIIでうるう年を出力

    西暦を入れるとうるう年かどうかを判断するプログラムをCASLIIで作りたいのですが。どのようなものにすればよいでしょうか?できればプログラムを書いてくれると助かります。

  • うるう年の出し方で

    うるう年の2月のときは処理をさせると考えて、 if(((($year%4==0) && ($year%100!=0)) || ($year%400==0))&&($man==2)){ } では中の処理をしてくれませんでした。 ご指摘をお願いします

    • ベストアンサー
    • Perl