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

このQ&Aに関連する最新のQ&A

うるう年とは」に関するQ&A: うるう年とは。

A 回答 (5件)

/*


* ISO C99 Standard: 7.23 Date and time <time.h>
*/

#include <time.h>

__isleap(year)
    • good
    • 0

#2です。

すみません。勘違いをしてしまいました。まずは値が4で割り切れるかからはじめるべきでしたね。その中に入れ子を作って400で割り切れるか、100で割り切れるかという部分を作るべきでした。
間違いのご指摘ありがとうございます。
    • good
    • 0

>#2さん



>その年が4で割り切れかつ400で割り切れるか
>それならば閏年
>それ以外(4で割り切れないか、400で割り切れない)
>閏年ではない

この判定方法は正しくありません。
この方法では、400で割り切れる年だけがうるう年となり、実際と食い違ってしまいます。

【例】
2008年はうるう年でしたが、あなたの判定方法に従えば、平年となってしまいます。

【理由】
400で割り切れる年は、必ず4でも割り切れます。
つまり、「その年が4で割り切れかつ400で割り切れる」という条件は、
「その年が400で割り切れる」ということ「だけ」を言っているにすぎないためです。
それに、例えば1900年が平年であることを求めるための条件が
どこにも出てこないのも問題です。
    • good
    • 0

構文は書きません、考えてください。

考えるためのスクリプトを書きます。大体すぐにプログラムを書かずに、一度スクリプトを書いてみて、それに沿ってプログラムを書いてみる癖をつけてはいかがでしょうか。


年を入力(またはファイルから読み取り)

その年が4で割り切れかつ400で割り切れるか

それならば閏年

それ以外(4で割り切れないか、400で割り切れない)

閏年ではない

このスクリプトをCの構文に置き換えればプログラムになります。
はじめからプログラムを書かずに、こうやってスクリプトを書いて頭をまとめるようにしています。
    • good
    • 0

「if文だと思っている」のならやってみればいい. どう頑張っても, 最悪「コンパイルエラーになる」か「期待通りに動作しない」くらいしかならないわけだから.


「閏年かどうか」をどのように判断するのか理解できていますか? それを言葉で表現できますか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

1900から2100年のうるう年を求めるプログラムが作りたいのですが
どうしたらよいでしょうか?

forを使って1900から2100までかぞえる。
4で割り切れるものは閏年
しかし100で割り切れるものは閏年でない。
400で割り切れるものは閏年である。
最後の条件の分岐から閏年のみを表示させたいのですがわかりません

Aベストアンサー

int uruu;
int year;
for(year = 1900; year <= 2100; year++) {
 if(year % 4 == 0) {
  // 4で割り切れる
  if(year % 100 == 0) {
   // 100で割り切れる
   if(year % 400 == 0) {
    // 400で割り切れる = 閏年
    uruu = 1;
   } else {
    // 400で割り切れない = 閏年では無い
    uruu= 0;
   }
  } else {
   // 100で割り切れない = 閏年
   uruu = 1;
  }
 } else {
  // 4で割り切れない = 閏年ではない
  uruu = 0;
 }

 if(uruu == 1) {
  // 閏年のときの処理
 } else {
  // 閏年ではないときの処理
 }
}

規則どおりに書くのならこうなるね。
改良の余地はあるかもしれないけど。

int uruu;
int year;
for(year = 1900; year <= 2100; year++) {
 if(year % 4 == 0) {
  // 4で割り切れる
  if(year % 100 == 0) {
   // 100で割り切れる
   if(year % 400 == 0) {
    // 400で割り切れる = 閏年
    uruu = 1;
   } else {
    // 400で割り切れない = 閏年では無い
    uruu= 0;
   }
  } else {
   // 100で割り切れない = 閏年
   uruu = 1;
  }
 } else {
  // 4で割り切れない = 閏年ではない
  uruu = 0;
...続きを読む

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

西暦何年かを入力し、その年がうるう年かそうでないかを
計算するプログラムを作っています。

#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つでてしまいます。
どこがちがうのでしょうか?

Aベストアンサー

else文の対応の問題ですね。
上記のプログラムだと、全部のelseが三番目のif文に対応するelseになっちゃってます。
正解のソースはこちら
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<<"年は非うるう年です。";
}

cin >> toshi;

return EXIT_SUCCESS;

上記のソースをよく見てくださいね。「{」の数が違うと思います。

ただ、三個もif文が重なるのは間違いの元なので、下のようにしたほうがすっきりすると思いますよ。

int toshi;
cout <<"西暦を入力してください";
cin>>toshi;
if (((toshi%4==0) && (toshi%100!=0)) ||
((toshi%4==0) && (toshi%400==0))){
cout<<toshi<<"年はうるう年です。";
}else{
cout<<toshi<<"年は非うるう年です。";
}

cin >> toshi;

return EXIT_SUCCESS;

プログラムは慣れと経験ですんで頑張ってください。

else文の対応の問題ですね。
上記のプログラムだと、全部のelseが三番目のif文に対応するelseになっちゃってます。
正解のソースはこちら
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<<"年は非うるう年です。";
}

cin >> toshi;

return EXIT_SUCCESS;
...続きを読む

Q日付の差分の求め方(日、分)

NT4WS+VC++6.0 Win32コンソールアプリで作ってます。
現在int型で
year1,month1,day1 year2,month2,day2
の様に、1と2それぞれ年月日を持っています。
(year2/month2/day2) - (year1/month1/day1)
と言った感じで1と2の差が何日かを求めたいのです。
VBで言うDateDiffみたいなことがやりたいのです。
よろしくお願いします。

Aベストアンサー

ANSI の範囲で考えると、difftime() という関数が利用できます。difftime() が
扱えるのは time_t 型で表した時刻なのですが、整数で表された年月日などを、この
time_t 型に変換する mktime() という関数と組合わせて使います。

こういうふうに使います。

#include <time.h>
#include <stdio.h>

int main()
{
  int year1, month1, day1;
  int year2, month2, day2;
  year1 = 2001; month1 = 12; day1 = 30;
  year2 = 2002; month2 = 1; day2 = 16;

  {
    struct tm d;
    time_t t1, t2;
    double diff;

    // 開始・終了日を time_t 型の変数にする
    memset(&d, 0, sizeof(d));
    d.tm_year = year1 - 1900;
    d.tm_mon = month1 - 1;
    d.tm_mday = day1;
    t1 = mktime(&d);
    d.tm_year = year2 - 1900;
    d.tm_mon = month2 - 1;
    d.tm_mday = day2;
    t2 = mktime(&d);

    diff = difftime(t2, t1);

    // difftime() の返り値は「秒」で double 型
    // ÷60÷60÷24 で日数にして、+0.5 は四捨五入のため
    printf("%d 日差.\n", (int)(diff / 60 / 60 / 24 + 0.5));
  }

  return 0;
}

ANSI の範囲で考えると、difftime() という関数が利用できます。difftime() が
扱えるのは time_t 型で表した時刻なのですが、整数で表された年月日などを、この
time_t 型に変換する mktime() という関数と組合わせて使います。

こういうふうに使います。

#include <time.h>
#include <stdio.h>

int main()
{
  int year1, month1, day1;
  int year2, month2, day2;
  year1 = 2001; month1 = 12; day1 = 30;
  year2 = 2002; month2 = 1; day2 = 16;

  {
    struct tm d;
...続きを読む


人気Q&Aランキング

おすすめ情報