学校の課題なんですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kokoro

学校の課題なんですが・・・

#1

投稿記事 by kokoro » 16年前

問題は
★下記の仕様を満たすプログラムをC言語で作成しなさい.

【仕様】日数計算プログラム

▼今日の日付と生年月日を入力すると,今日が生年月日から数えて何日目にあたるかを表示する.西暦・月・日をスペースで区切って入力する.
▼この場合,「うるう年」を考慮しなければならない.「うるう年」の条件は,
①西暦が4で割り切れる.
②ただし,西暦が100で割り切れる年は除く.
③ただし,西暦が400で割り切れる年は含める.
▼「今日は、あなたが生まれた日から数えて~日目です。」と表示する.
▼計算式は,(西暦1年1月1日から今日までの日数)-(西暦1年1月1日から生年月日までの日数)を使えばよい.
▼生年月日が今日の日付より後になっているときは,「生年月日が今日の日付より後になっています!」とエラーメッセージを表示する.
▼最低限,次の関数を使うこと.
①main関数(これは当たり前ですが)
②入力された値が計算に適切な値かをチェックする関数(4月31日などありえない日付を入れると,「年月日が正しい範囲にありません」と表示する)
③日付を計算する関数
▼日付の入力やメッセージの表示はmain関数で行うこと(ポインタに関する課題なので参照渡しを使うこと).

です。考え方を教えてほしいです。
できたところまでのソースを添付しておきます
[2] 環境  
 [2.1] OS : Windows xp
 [2.2] コンパイラ名 :bcc?
[3] その他
 ・どの程度C言語を理解しているか→繰り返し文と判断条件文ポインタを勉強しました。
 

たいちう

Re:学校の課題なんですが・・・

#2

投稿記事 by たいちう » 16年前

次の2つの関数を作るのはいかがでしょうか。

西暦1年1月1日から西暦Y年12月31日までの日数を返す関数:
forループで1~Yまで、うるう年かどうかによって365か366を足せばよい。

Y年の、1月1日からM月末日までの日数を返す関数:
forループで1~Mまで、月毎の日数を足せばよい。
2月についてはうるう年の判定を忘れずに。

# 仕様に書かれている「西暦1年1月1日から今日までの日数」は便宜的なもので、
# 比較的最近の日付同士で引き算をすることが前提だから許されています。
# 信じないように。

やそ

Re:学校の課題なんですが・・・

#3

投稿記事 by やそ » 16年前

http://ufcpp.net/study/algorithm/o_days.html

「うるう年計算」で検索すればたくさんHITします。

ここの過去ログにも同様の話題もありました。
いろいろ調べてみましょう^^

Haru

Re:学校の課題なんですが・・・

#4

投稿記事 by Haru » 16年前

カレンダーについては、「C言語 カレンダー」とか「C 万年カレンダー」とかでググれば、すぐにソースが見つかります。
もし、自力で作りたいなら、途中までソースを作ってからわからないところを聞いてください。ちなみに、数学に弱い私はうるう年の判定のところはソースを見ながらでも、あまり理解してません。
とりあえず、カレンダーをコピー(もしくは自作)して、今日の日付と生年月日を入力する。という所まで作ってみてはいかがでしょう?

non

Re:学校の課題なんですが・・・

#5

投稿記事 by non » 16年前

まず、引数で与えた年が閏年かチェックする関数を作ってみませんか?
プロトタイプを

int uruu(int year);
引数 year 西暦年(1以上とする)
戻り値 閏年なら1,閏年でないなら0を返す。

作れますか?

kokoro

Re:学校の課題なんですが・・・

#6

投稿記事 by kokoro » 16年前

分かりました。
やってみます。

たかぎ

Re:学校の課題なんですが・・・

#7

投稿記事 by たかぎ » 16年前

質問を読む限りでは、完全にスクラッチで実装する必要があるとも思えませんので、mktimeとdifftimeを使えば簡単にできそうです。

lbfuvab

Re:学校の課題なんですが・・・

#8

投稿記事 by lbfuvab » 16年前

ざっと考えると
まずは閏年を考えずに日数を出し、それから何回2月29日があるかを考えた方が楽かもしれません。

non

Re:学校の課題なんですが・・・

#9

投稿記事 by non » 16年前

閏年かチェックする関数はできたでしょうか?
次に、引数で年月日を渡したら、西暦1年1月1日からの経過日数を求める関数を作りましょう。

int date(int y,int m,int d);
引数 
 int y:西暦年
 int m:月
 int d:日
戻り値
 西暦1年1月1日からの日数

作り方
1 最初に y-1年12月31日までの日数を求めます。
 for文で、1からy-1まで先に作ったuruuを使って365か366を累計していきます。
2 m-1月までの日数を累計します。
それには月数の配列を用意します。
 int mon[/url]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 for文を使ってm-1月まで累計します。
3 これに日数dを足します。
4 y年が閏年の場合でm>2なら+1します。

じゃ、頑張ってみて。

Mist

Re:学校の課題なんですが・・・

#10

投稿記事 by Mist » 16年前

この問題の最大の問題は

> ポインタに関する課題なので参照渡しを使うこと

と思います。
普通に作ると使うところがないんですよね。
nonさんのdate関数で、対して意味がないけど

void date(int y,int m,int d, int *date)

としてみるとか。

kokoro

Re:学校の課題なんですが・・・

#11

投稿記事 by kokoro » 16年前

みなさんありがとうございます。

なんとかやってみます。
わからないことがあったら、また教えてください。

閉鎖

“C言語何でも質問掲示板” へ戻る