新しく質問する

教えてください3

役に立った:7件
  • 質問者:kansai223
  • 投稿日時:2009/06/14 15:49
  • 困り度:すぐに回答が欲しいです

初心者なのでわかりやすくお願いします。

生年月日と今日の日付を読み込み、生年月日から今日までの日数を計算して出力するプログラムを制御文を用いて作成せよ。
配列、ポインタは使用禁止とする。関数は用いてもよい。
うるう年とは4で割り切れかつ100で割り切れない年、及び400で割り切れる年はうるう年である。
ただし、
1.年月日は西暦とし、入力できる年月日は西暦1800年1月1日以降とする
2.年月日が正しい範囲内にないときは、入力データ誤りとみなしメッセージを出力して終了
3.生年月日が今日の日付より後のときも、誤りとみなし
メッセージを出力して終了とすること。

<実行結果>
** 生年月日を入力してください **
1985 2 4
** 今日の日付を入力してください **
2010 6 12

1985年2月4日から今日までの日数は
9259日です

ちなみに西暦1年1月1日から今日までの日数は
733935日です

さらに西暦1年1月1日から生年月日までの日数は
724676日です
<実行結果>
** 生年月日を入力してください **
12 3 4
** 今日の日付を入力してください **
123 4 5

** 入力した年月日が正しい範囲内にありません 
<実行結果>
** 生年月日を入力してください **
1987 1 2
** 今日の日付を入力してください **
1800 1 1

** 生年月日が今日の日付より後になっています 
**

この質問に回答する
このQ&Aは役に立ちましたか?(役に立った:7件)

回答(4件)

  • 参考になった:0件
  • 回答者:trapezium
  • 回答日時:2009/06/16 22:14

確かにポインタ使用禁止では無理。とはいえ関数はOKというので、でっち上げてみた。

----
int
mdays(int y, int m)
{
int d = 31;

switch (m) {
case 2:
if (0 == (y & 3)) {
if (y % 100)
d++;
else if (!(y % 400))
d++;
}
return d - 3;
case 4:
case 6:
case 9:
case 11:
--d;
break;
}
return d;
}

int
ddays(int y, int m, int d)
{
while (--m > 0)
d += mdays(y, m);
--y;
d += 365 * y;
d += y >> 2;
d -= y / 100 - y / 400;

return d;
}

通報する

  • 参考になった:0件
  • 回答者:Tacosan
  • 回答日時:2009/06/16 18:36

「西暦 1年 1月 1日からの日数」をどのように計算するのか教えてください.

通報する

  • 参考になった:0件
  • 回答者:jacta
  • 回答日時:2009/06/14 17:54

> 配列、ポインタは使用禁止とする。関数は用いてもよい。

難しいですね。
関数は用いてもよいけれどもポインタは使用禁止ということは、関数を呼び出すすべがないということです。文字列を扱うことは当然不可能です。
どう読み込んで、どう出力するかにもよりますが、この条件ではまず実現できないと思います。

通報する

  • 参考になった:0件
  • 回答者:zwi
  • 回答日時:2009/06/14 16:20

自分で書いたコードは見せてもらえないですか?

通報する

  
このQ&Aは役に立ちましたか?(役に立った:7件)

このページのトップへ