#7
by かずま » 5年前
Math さんが書きました: ↑5年前
初心者のかたのようですね。こうゆう問題は優しいことからコツコツとやれば意外と簡単ですよ。
gcc 8.2.0 を使用する
main.c
そのプログラムを実行してみると
コード:
西暦を入力してから、Enterを押してください 2019
月を入力してから、Enterを押してください 1
日を入力してから、Enterを押してください 1
i=1月:+31日: anser_days=31日
+1日 anser_days=32日
*** anser=32
2019年1月1日が、当年1月1日から 32日目となります。
さらに、問題文の「年月日を引数として、当年の1月1日から数えて」
ですが、当年というのは、引数の年月日の年のことだと考えるのが
普通ではありませんか?
標準ライブラリの mktime を使えば年間通算日は求まります。
コード:
#include <stdio.h> // scanf, printf
#include <time.h> // mktime
int count_day_of_year(int year, int month, int day)
{
struct tm tm = { 0 };
tm.tm_year = year - 1900;
tm.tm_mon = month - 1;
tm.tm_mday = day;
return mktime(&tm) != -1 ? tm.tm_yday + 1 : -1;
}
int main(void)
{
int y, m, d;
while (printf("> "), scanf("%d%d%d", &y, &m, &d)==3 && m>=1 && m<=12)
printf("%d/%d/%d: %d\n", y, m, d, count_day_of_year(y, m, d));
}
実行例
コード:
> 2019 1 1
2019/1/1: 1
> 2019 5 13
2019/5/13: 133
> 2019 12 31
2019/12/31: 365
> 2020 12 31
2020/12/31: 366
> .
自分で計算しようとすれば、
コード:
int count_day_of_year(int y, int m, int d)
{
static int t[] = { 0,31,59,90,120,151,181,212,243,273,304,334 };
return (m>2 && y%4==0 && (y%100 || y%400==0)) + t[m-1] + d;
}
これは、「設問1で作成した閏年判定関数を利用し」という条件に
従っていないので解答ではありませんが。
[quote=Math post_id=153361 time=1557661293]
初心者のかたのようですね。こうゆう問題は優しいことからコツコツとやれば意外と簡単ですよ。
gcc 8.2.0 を使用する
main.c
[/quote]
そのプログラムを実行してみると
[code=text]
西暦を入力してから、Enterを押してください 2019
月を入力してから、Enterを押してください 1
日を入力してから、Enterを押してください 1
i=1月:+31日: anser_days=31日
+1日 anser_days=32日
*** anser=32
[/code]
2019年1月1日が、当年1月1日から 32日目となります。
さらに、問題文の「年月日を引数として、当年の1月1日から数えて」
ですが、当年というのは、引数の年月日の年のことだと考えるのが
普通ではありませんか?
標準ライブラリの mktime を使えば年間通算日は求まります。
[code]
#include <stdio.h> // scanf, printf
#include <time.h> // mktime
int count_day_of_year(int year, int month, int day)
{
struct tm tm = { 0 };
tm.tm_year = year - 1900;
tm.tm_mon = month - 1;
tm.tm_mday = day;
return mktime(&tm) != -1 ? tm.tm_yday + 1 : -1;
}
int main(void)
{
int y, m, d;
while (printf("> "), scanf("%d%d%d", &y, &m, &d)==3 && m>=1 && m<=12)
printf("%d/%d/%d: %d\n", y, m, d, count_day_of_year(y, m, d));
}
[/code]
実行例
[code=text]
> 2019 1 1
2019/1/1: 1
> 2019 5 13
2019/5/13: 133
> 2019 12 31
2019/12/31: 365
> 2020 12 31
2020/12/31: 366
> .
[/code]
自分で計算しようとすれば、
[code]
int count_day_of_year(int y, int m, int d)
{
static int t[] = { 0,31,59,90,120,151,181,212,243,273,304,334 };
return (m>2 && y%4==0 && (y%100 || y%400==0)) + t[m-1] + d;
}
[/code]
これは、「設問1で作成した閏年判定関数を利用し」という条件に
従っていないので解答ではありませんが。