C言語関係掲示板

過去ログ

No781 1月1日からm月d日までの経過日数を計算する

[戻る] [ホームページ]
No.9708

1月1日からm月d日までの経過日数を計算するプログラム。
投稿者---田村 正和(2003/10/11 13:09:49)


1月1日からm月d日までの経過日数を計算するcalcdayを完成せよという大学の過大なのですが以下の通りに組んでみました。なにかおかしいところはあるでしょうか?ただし条件としてm月d日を引数として受け取り、1月1日以降の経過日数をtotalに求め、totalを返却値とすることとあります。実は引数と返却値の使い方もよくわかっていないのでそこのところも教えていただけるとありがたいです。
<pre>
#include <stdio.h>

int calcday(int m, int d);
{
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int total,i;

for(i=0;i&lt;m;i++)
{
sum=sum+a[i];
}

int main(void)
{
int x,y,z;
x=calcday(1,1);
y=calcday(4,28);
z=calcday(12,31);
printf("1/1=%d,4/28=%d,12/31=%d\n",x,y,z);
}
return (0);
}
</pre>
あれ?実はこれはコピーしたわけではないのですがpreタグを使っても変換できません。前のもそうなりました。どうしたらいいでしょう?

No.9710

Re:1月1日からm月d日までの経過日数を計算するプログラム。
投稿者---YuO(2003/10/11 13:53:00)


>1月1日からm月d日までの経過日数を計算するcalcdayを完成せよという大学の過大なのですが以下の通りに組んでみました。
>なにかおかしいところはあるでしょうか?

#確かに過大なのかも……。
コンパイル自体が通らないのですから,明らかにおかしいです。
その他には,sumが宣言されていない,日付が加算されていない,なども問題です。


>ただし条件としてm月d日を引数として受け取り、1月1日以降の経過日数をtotalに求め、totalを返却値とすることとあります。

条件自体がおかしいです。
年がないと年内の通算日付は得られません。

そもそも,mktime使ってしまえば通算日付なんて簡単に取得できますが……。


>実は引数と返却値の使い方もよくわかっていないのでそこのところも教えていただけるとありがたいです。

http://www9.plala.or.jp/sgwr-t/c/sec11.html
とか
http://www9.plala.or.jp/sgwr-t/c/sec11-2.html
とかをじっくりと読んでみてください。


No.9714

Re:1月1日からm月d日までの経過日数を計算するプログラム。
投稿者---たか(2003/10/11 20:50:22)


>1月1日からm月d日までの経過日数を計算するcalcdayを完成せよという大学の過大なのですが以下の通りに組んでみました。なにかおかしいところはあるでしょうか?ただし条件としてm月d日を引数として受け取り、1月1日以降の経過日数をtotalに求め、totalを返却値とすることとあります。実は引数と返却値の使い方もよくわかっていないのでそこのところも教えていただけるとありがたいです。

前にも似たような質問がありましたのでプログラムが残っていました。
関数名dayofyear()をcalcday()に変えればOKですね。西暦は絶対に必要
です。というのは西暦がないとその年が閏年かどうか判別できなくなり、
2月以降の日数が正しく求められない事があるからです。
daysをtotalに変える事も必要ですね。後は適当にいじって下さい。

#include <stdio.h>

int mdays[][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                   {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};

int isleap(int year)
{
  return (year % 4 == 0  &&  year % 100 != 0  ||  year % 400 == 0);
}

int dayofyear(int y, int m, int d)
{
  int i;
  int days;		/* 日数 */

  days = d;
  for (i = 1; i < m; i++)
    days += mdays[isleap(y)][i - 1];
  return days;
}

int main(void)
{
    int y, m, d, days;
    
    printf("年(西暦) 月 日?");
    scanf("%d %d %d", &y, &m, &d);
    
    days = dayofyear(y, m, d);
    printf("1月1日から %d 日経過しています。\n", days);

    return 0;
}


No.9797

Re:1月1日からm月d日までの経過日数を計算するプログラム。
投稿者---田村 正和(2003/10/15 17:20:01)


今日学校に残ってプログラミングしてきたのですがこんなに難しいプログラムじゃありませんでした。年は2003年と設定されていましたし。ですがとても勉強になりました。ありがとうございます。

No.9848

Re:1月1日からm月d日までの経過日数を計算するプログラム。
投稿者---通りすがった人(2003/10/17 15:02:17)


2003年限定であるならそれこそ朝飯前の課題な気もしますが、
最初の書き込み内容からでは2003年限定なんて読み取れないのでは?

最も、2003年限定では何の役にも立たないでしょうし
限定でなくした場合、日数を絶対値で求めるには必ず年が必要になります。

#しかし、普通日数を求める場合は西暦1年1月1日が基準になると思うのに
#2003年1月1日なのはどういう意図があるんだろう?
#単純に難易度を下げてるだけなのかな。

No.9715

Re:1月1日からm月d日までの経過日数を計算するプログラム。
投稿者---通りすがる人(2003/10/12 00:11:38)


もしかしてあんまり関係ないかも知れませんが、
西暦一年から指定した日を計算するという課題があった場合、1752年9月は曲者ですよ。
何せ2日の次が14日ですから・・・
yahooなどで探されると分かると思いますが・・・。