年月日を引数として、当年の1月1日から数えて何日目となるかを返す関数を作成せよ。なお、設問1で作成した閏年判定関数を利用し、2月の日数計算に利用せよ。関数のプロトタイプ宣言は以下の通りとする。
int count_day_of_year(int year, int month, int day);
上記を呼び出すmain関数も作成し動作を確認せよ。
なお、各月の日数(28/29, 30, 31)の計算にcase文を用いることもひとつの手法である。
c言語 関数の利用
Re: c言語 関数の利用
で、質問は何ですか?
作成してください。当年の1月1日から数えて何日目となるかを返す関数を作成せよ。
作成し、動作を確認してください。上記を呼び出すmain関数も作成し動作を確認せよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: c言語 関数の利用
「設問1で作成した閏年判定関数」とは何でしょうか?
添付ファイルの is_leep_year のことでしょうか?
閏年は leap year ですが、その関数だと
閏年である 2000年が閏年ではないと判定されてしまいます。
また、判定結果を返さず、引数の年をそのまま返しているので
判定結果を利用できません。
問題文には「case文を用いることも」とありますが、
これは switch文の間違いでしょう。
case は switch文の中に書く文につけるラベルです。
質問をするときは、何が分からないのかをきちんと書きましょう。
・問題文の意味が分からないのか。
・解き方が分からないのか。
・プログラムの書き方が分からないのか。
・コンパイルエラーが出るのか。
・実行結果が正しくないのか。
次の質問に答えてください。
・2019年5月12日は、何日目ですか?
・それはどうやって求めましたか?
添付ファイルの is_leep_year のことでしょうか?
閏年は leap year ですが、その関数だと
閏年である 2000年が閏年ではないと判定されてしまいます。
また、判定結果を返さず、引数の年をそのまま返しているので
判定結果を利用できません。
問題文には「case文を用いることも」とありますが、
これは switch文の間違いでしょう。
case は switch文の中に書く文につけるラベルです。
質問をするときは、何が分からないのかをきちんと書きましょう。
・問題文の意味が分からないのか。
・解き方が分からないのか。
・プログラムの書き方が分からないのか。
・コンパイルエラーが出るのか。
・実行結果が正しくないのか。
次の質問に答えてください。
・2019年5月12日は、何日目ですか?
・それはどうやって求めましたか?
Re: c言語 関数の利用
初心者のかたのようですね。こうゆう問題は優しいことからコツコツとやれば意外と簡単ですよ。
gcc 8.2.0 を使用する
main.c
実行してみる
http://www2.koyoen.birdview.co.jp/~abcx ... -12-a-.PNG
gcc 8.2.0 を使用する
main.c
#include <stdio.h>
// ● 設問1で作成した閏年判定関数を利用:簡素化してあります:閏年は1を返す、それ以外は0
int is_leap_year(int year){
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) ? 1:0;
}
// ● 関数のプロトタイプ宣言
int count_day_of_year(int year, int month, int day);
int main(void){
int a; int b; int c; int x;
int anser_days=0; // 当年の1月1日から数えて何日目
printf("西暦を入力してから、Enterを押してください ");
scanf("%d",&a);
printf("月を入力してから、Enterを押してください ");
scanf("%d",&b);
printf("日を入力してから、Enterを押してください ");
scanf("%d",&c);
printf("*** anser=%d\n",count_day_of_year(a, b, c));
return 0;
}
// ● 関数の定義:実装
int count_day_of_year(int year, int month, int day){
// 1 2 3 4 5 6 7 8 9 10 11 12
int m[]={ 31,28,31,30,31,30,31,31,30,31,30,31 };
int anser_days=0;
for(int i=2019; i<year; i++){
printf("%d年\t",i);
if(is_leap_year(i)){ anser_days +=364; printf("+%d日\t anser_days=%d日\n",364,anser_days); }
else{ anser_days +=365; printf("+%d日\t anser_days=%d日\n",365,anser_days); }
}
for(int i=0; i<month; i++){
anser_days += m[i]; printf("i=%d月:+%d日:\tanser_days=%d日\n",i+1,m[i],anser_days);
if(i==1 && is_leap_year(year)){ anser_days +=1;printf("2月閏年補正:1日\t%d日\n",anser_days); }
}
anser_days += day; printf("+%d日\tanser_days=%d日\n",day,anser_days);
return anser_days;
}
http://www2.koyoen.birdview.co.jp/~abcx ... -12-a-.PNG
Re: c言語 関数の利用
if(is_leap_year(i)){ anser_days +=364; printf("+%d日\t anser_days=%d日\n",364,anser......
の 364 は 366 (うるう年)の間違いですね。
(anser という変数は answer のつもりね(^^;
の 364 は 366 (うるう年)の間違いですね。
(anser という変数は answer のつもりね(^^;
Re: c言語 関数の利用
time_t をつかえば日数は簡単にもとまる。
time_t で表示される時間は、万国標準時 (UCT)の1970年1月1日の00:00:00からの 経過時間を秒単位で表した32ビット数値である。 time_t の値を 86400 ( = 60 * 60 * 24 ) で割れば、1970年1月1日からの通算日数となる。
http://home.a00.itscom.net/hatada/c-tips/datetime.html
time_t で表示される時間は、万国標準時 (UCT)の1970年1月1日の00:00:00からの 経過時間を秒単位で表した32ビット数値である。 time_t の値を 86400 ( = 60 * 60 * 24 ) で割れば、1970年1月1日からの通算日数となる。
http://home.a00.itscom.net/hatada/c-tips/datetime.html
Re: c言語 関数の利用
そのプログラムを実行してみると
西暦を入力してから、Enterを押してください 2019
月を入力してから、Enterを押してください 1
日を入力してから、Enterを押してください 1
i=1月:+31日: anser_days=31日
+1日 anser_days=32日
*** anser=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;
}
従っていないので解答ではありませんが。