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;
...続きを読む

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

QC言語のうるう年に関するプログラムの作成

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回あります。

C言語(閏年)の質問です。

任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成方法を教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。)
なお、閏年の判定方法は以下のとおりである。
条件1 西暦年が4で割り切れる年は閏年である
条件2 条件1を満たしていても、西暦年が10...続きを読む

Aベストアンサー

こんな感じでしょうか。
(体裁上、各行先頭のスペースは全角スペースにしてあるので、コピペするとコンパイルできないと思います)

#include <stdio.h>

static int
checkYear (int year)
{
 if ((year % 4) == 0)
 {
  if ((year % 100) == 0)
  {
   if ((year % 400) == 0)
    return (1);
  }
  else
   return (1);
 }

 return (0);
}

int
main (int argc, char * argv[])
{
 int count = 0;
 int year, start, end;

 printf ("西暦を入力:");
 scanf ("%d", &start);
 printf ("西暦を入力:");
 scanf ("%d", &end);

 if (start > end)
 {
  year = end;
  end = start;
  start = year;
 }

 for (year = start; year <= end; year++)
 {
  if (checkYear (year) == 1)
  {
   printf ("%d年\n", year);
   count++;
  }
 }
 if (count != 0)
  printf ("閏年は%d回あります。\n", count);
 else
  printf ("閏年はありません。\n");

 return;
}

こんな感じでしょうか。
(体裁上、各行先頭のスペースは全角スペースにしてあるので、コピペするとコンパイルできないと思います)

#include <stdio.h>

static int
checkYear (int year)
{
 if ((year % 4) == 0)
 {
  if ((year % 100) == 0)
  {
   if ((year % 400) == 0)
    return (1);
  }
  else
   return (1);
 }

 return (0);
}

int
main (int argc, char * argv[])
{
 int count = 0;
 int year, start, end;

 printf ("西暦を入力:");
 scanf ("%d", &start);
 print...続きを読む

Qusing namespace std;//?

nubou C++で
using namespace std;
という宣言が使えるということなのですが

・namespaceとはなんでしょうか?
・stdとはなんでしょうか?
・このような宣言が必要な場面はどのようなときなのでしょうか?

いずれかひとつでも結構です
(質問に間違いがありましたので修正しました)
よろしくお願いします

Aベストアンサー

> これからは<iostream.h>を使うのは良くないことで

良くないというか、時代遅れになりつつあります。

> <iostream>を使うのが正式となるのでしょうか?

yes

Q庚申様がうるう年になるのは何年後?

庚申さまは庚の申の日のことです(60日に一回)が、今年は閏年で、2月29日が庚申さまの日です。次に庚申様になるのは何年後ですか?方程式で教えて下さい。

Aベストアンサー

閏年は365日+365日+365日+366日=1461日に1回来ます。
1461と60の最小公倍数は29220日なので、80年後、次は2092年2月29日ですかね。

ただし、その次となると、2100年は閏年ではなくなるので、ズレます。
ズレると、また計算が大変になります。

エクセルで簡単に調べた結果、
2012年
2092年
2344年
2424年
2756年
2836年
は、2月29日が庚申の日ですね。

Qreturn 0; return 1; まで同じ

#include <stdio.h>
int main()
{
printf("%d %c\n", 65, 65);
return 0;
}
 コンパイル後は
65 A
 return 1;も同じでした。
しかし
 return 2;すると
 Exited: ExitFailure 2  終了しました:出口の失敗2 となります。
 2以上でしたら、出口が塞がるのでろうぐらいしかわかりません!?
 
 どんなバクなのでしょうか!?
 よろしくお願いします。

Aベストアンサー

C 言語の仕事は「0 なり 1 なり 2 なりを返す」までであり, その値にどう対処するかは (「C のプログラム」としては処理を完全に終了しているので) C のあずかり知らぬところです.

なので, 「どんなバクなのでしょうか!?」というのはあなたの使っている OS なりシェルなりなんなりに聞いてください.

QSchemeのプログラミング うるう年関連

Schemeのプログラミング うるう年関連
Schemeで、
「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」
という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日)
どうもエラーが出て実行できません。
自分は以下のように組みました。
;;(1)の関数
(define (leap? year)
(cond
[(= (remainder year 400) 0) #t]
[(and (= (remainder year 4) 0)(> (remainder year 100) 0)) #t]
[else #f]
)
)
;;(2)の関数
(define (num-of-days year month)
(cond
[(and (= month 2)(= (leap? year) #t)) 29]
[(and (= month 2)(= (leap? year) #f)) 28]
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

これを例えば
(num-of-days 2008 4) や (num-of-days 1995 12)
などとして実行すると、それぞれ30,31という正しい値を返してくれるのですが、
(num-of-days 2008 2) や (num-of-days 1995 2)
など、閏年・非閏年に関係無く、2月が絡むと
=: expects type <number> as 1st argument, given: false; other arguments were: true
というエラーを吐いてしまいます。
何度も見直しましたが、どこが間違っているのか見付けきれません…。どなたか間違いを指摘して頂けると幸いです。

Schemeのプログラミング うるう年関連
Schemeで、
「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」
という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日)
どうもエラーが出て実行できません。
自分は以下のように組みました。
;;(1)の関数
(define (leap? year)
(cond
[(= (remainder year 400) 0) #t]
[(and (= (remainder year 4) 0)(> (remainde...続きを読む

Aベストアンサー

ああ、ちなみに。

manaka3161 さんの作ったコードのロジックは「無駄がある」とは思いますが、基本的に「間違ってはいない」、とは思いますよ。
どこが悪いのか?と言うと、単純に、ここです。

(define (num-of-days year month)
(cond
[(and (= month 2)(= (leap? year) #t)) 29] ;; ここが間違ってる
[(and (= month 2)(= (leap? year) #f)) 28] ;; ここが間違ってる
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

「ロジックが合ってる」のに「エラーを返す」場合があるんです。何故なら、データ型に整合性がない、からです。
比較演算子=は「数値専用」で等価判定を下す。引数が数値である、ってのが前提なんですけど、引数にシンボル#tか#fが来てる、ってのがエラーの原因です。

> (= 1 2)
#f
> (= 1 1)
#t
> (= 'a 'b)
=: expects type <number> as 1st argument, given: a; other arguments were: b

=== context ===
/usr/lib/plt/collects/scheme/private/misc.ss:74:7

>

同じエラーですよね。見て分かる通り、=は数値しか引数に取れないんです。

つまり、シンボル同士を比較したい場合はeq?使った方が良いでしょう。すなわち、

(define (num-of-days year month)
(cond
[(and (= month 2)(eq? (leap? year) #t)) 29] ;二番目の判定式を eq? で行う
[(and (= month 2)(eq? (leap? year) #f)) 28] ;二番目の判定式を eq? で行う
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

これで動く筈です。

> (num-of-days 2009 7)
31
> (num-of-days 2012 2)
29
>

慣れない内は、数値/シンボルの比較を両方「考えずに行いたい」のなら、eqv?を使った方が良いかもしれません。eqv?はリストじゃなければ数値/シンボルの両方とも行えます。eq?はシンボル専用、ですね。=は数値専用。
大まかに言うと、繰り返しになりますが、次のようになってます。

eq? => シンボル比較の時に使う。高速。
eqv? => 数値、シンボル両方O.K。ある意味デフォルト。
equal? => リスト同士まで比較出来る。ただし、eq?に比べると遅い。
= => 数値専用。

ああ、ちなみに。

manaka3161 さんの作ったコードのロジックは「無駄がある」とは思いますが、基本的に「間違ってはいない」、とは思いますよ。
どこが悪いのか?と言うと、単純に、ここです。

(define (num-of-days year month)
(cond
[(and (= month 2)(= (leap? year) #t)) 29] ;; ここが間違ってる
[(and (= month 2)(= (leap? year) #f)) 28] ;; ここが間違ってる
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

「ロジックが合ってる」の...続きを読む

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qうるう年判定

こんにちは。今回も宜しくお願いします<(_ _)>
画面から入力された日付(生年月日)の妥当性をチェックしたいのですが、それにはまずクラス(API)をわかっていなくてはいけないと思い、お試しで作ったものが、私の想像していた通りに動きません。
import java.util.*;
public class Test {
 public static void main(String[] args) {
  int year;
  int month;
  int day;

  GregorianCalendar g = new GregorianCalendar();
  year = g.get( Calendar.YEAR );
  month = g.get( Calendar.JUNE );
  day = g.get( Calendar.DATE );

  System.out.println("year = " + year);
  System.out.println("month = " + month);
  System.out.println("day = " + day);

  }
}

上記のソースを実行すると、
C:\WINDOWS\デスクトップ\カレンダ>java Test
year = 2003
month = 3
day = 3
となります。月の指定はCalendar.JUNEとしているのに、どうして3と表示されるのでしょうか?

あともう一つ質問なのですが、GregorianCalendarに自分の好きな年月を与えたいのですが、
g.get( 1980 );
とすると実行時にArrayIndexOutOfBoundsExceptionのエラーがでます。
GregorianCalendarを使って任意の年月を渡すことは無理なんでしょうか?
私が最初考えたのが、画面から入力された値をそのままGregorianCarendarに渡して、もしもその時にエラーがでたらそれは妥当ではなかった値(閏年じゃないのに2月29日と入力したり、とか)として、画面にて再入力を促すメッセージをだそうと思っていたのですが、この考え方はどこか変でしょうか?

お手数お掛けいたしますが、宜しくお願い致します<(_ _)>

こんにちは。今回も宜しくお願いします<(_ _)>
画面から入力された日付(生年月日)の妥当性をチェックしたいのですが、それにはまずクラス(API)をわかっていなくてはいけないと思い、お試しで作ったものが、私の想像していた通りに動きません。
import java.util.*;
public class Test {
 public static void main(String[] args) {
  int year;
  int month;
  int day;

  GregorianCalendar g = new GregorianCalendar();
  year = g.get( Calendar.YEAR );
  month = g.get( Cale...続きを読む

Aベストアンサー

>  year = g.get( Calendar.YEAR );
>  month = g.get( Calendar.JUNE );
>  day = g.get( Calendar.DATE );

 どういう動作を期待しているのかわかりませんが、月を取得したいのなら

month = g.get( Calendar.MONTH );

です。これを実行すると、次の疑問が出るでしょう。「11月なのに"10"が出てくる!」と。これはAPIの仕様で、1月は"0"、2月は"1"、……、12月は"11"になっているのです。

>GregorianCalendarに自分の好きな年月を与えたいのですが、
>g.get( 1980 );
>とすると

 与えるメソッドはget()ではなくてset()です。APIリファレンスをよく見てください。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Calendar.html

QC++での とusingnamespaceの関係等を教えてください。

どうでもいい質問なのですが…

C++で色々とソースを打っていると気づいたのです。
#include <iostream.h>とするとusing namespace std;の一文を書かなくてもコンパイルエラーになりません。
また、逆に#include <iostream>とするとusing namespace std;の一文が必要になります。

だから、h(ヘッダファイル)の.hは必要なのかな?と思い、#include <cstdlib.h>とするとコンパイルエラーになります。

なにか理屈がわかりません。コンパイラはVC++6.0です。よろしくご回答の方お願いいたします。

Aベストアンサー

完全な法則、理屈があるというよりも、歴史的経緯によるものです。

<iostream.h>は、namespace stdがまだ決まってなかった頃の名残、「古いヘッダ」です。
VC6は言語仕様が正式に固まるより古い代物なので、
<iostream.h>という過渡期の遺物がついてます。
この頃は、namespace stdがまだなかったので、
<iostream.h>内の関数はusingしなくても使えます。

但し、今の言語仕様ではnamespace stdが導入されてますので、
あくまで互換性のためのものと思います。
新規に書くなら<iostream>を使うべきです。

一方、<iostream>の方は現行言語仕様通りのヘッダです。
こちらは、namespace std内の定義に正しくなっているため、
namespaceを指定して使う必要があります。

 using namespace std;や、using std::cout;の他、
 std::cout << "foo";などもできますので、
 必ずしもusing directiveやusing declarationが必要とは限りませんが。
 少なくとも、ヘッダなどで *むやみに* usingはnamespaceの意義を損ない好ましくないと思います(使い方次第)。

> h(ヘッダファイル)の.hは必要なのかな?と思い、

ちなみに、C++としては、単にヘッダであり、ファイルとは限りません。

> #include <cstdlib.h>とするとコンパイルエラーになります。

「c…」なヘッダには原則、対応するC言語のヘッダがあります。
「c…」というヘッダは、そのC言語のヘッダのC++版であり、
もし<cstdlib.h>に相当するものがあるとすれば、それは単に<stdlib.h>です。
C言語にはnamespaceがありませんので、<stdlib.hにもnamespace stdはありません。

<iostream>はC言語にはない、C++独自のヘッダであり、
<cstdlib>はC言語の<stdlib.h>のC++版なので、そのような挙動の違いになります。
<cstdio>と<stdio.h>とか、<cstring>と<string.h>とか、
もともと対応するC言語のヘッダがあるものは「c…」という名前になってます。

完全な法則、理屈があるというよりも、歴史的経緯によるものです。

<iostream.h>は、namespace stdがまだ決まってなかった頃の名残、「古いヘッダ」です。
VC6は言語仕様が正式に固まるより古い代物なので、
<iostream.h>という過渡期の遺物がついてます。
この頃は、namespace stdがまだなかったので、
<iostream.h>内の関数はusingしなくても使えます。

但し、今の言語仕様ではnamespace stdが導入されてますので、
あくまで互換性のためのものと思います。
新規に書くなら<iostream>を使うべきです...続きを読む


人気Q&Aランキング

おすすめ情報