年月日を引数として、当年の1月1日から数えて何日目となるかを返す関数を作成せよ。なお、設問1で作成した閏年判定関数を利用し、2月の日数計算に利用せよ。関数のプロトタイプ宣言は以下の通りとする。
int count_day_of_year(int year, int month, int day);
上記を呼び出すmain関数も作成し動作を確認せよ。
作ったプログラムは以下に示す。
2020を入力すると0が出ちゃったのです、つまり閏年ではないと判定されました。
なぜでしょう???
変な所の修正お願いします
#include <stdio.h>
int is_leep_year(int year);
int count_day_of_year(int year, int month, int day);
int main(void)
{
int year,month,day,sumday,a;
printf("年を入力してください\n");
scanf("%d",&year);
printf("月を入力してください\n");
scanf("%d",&month);
printf("日を入力してください\n");
scanf("%d",&day);
a=is_leep_year(year);
if (a==1)
{
sumday=count_day_of_year(year,month,day);
}
else
{
sumday=(count_day_of_year(year,month,day)-1);
}
printf("当年の1月1日から数えて%d日目となる\n",sumday);
return 0;
}
int is_leep_year(int year)
{
int a;
{
if(((year%4==0)&&(year%100!=0))&&(year%400==0))
a=1;
else
a=0;
}
printf("%d\n",a);
return a;
}
int count_day_of_year(int year, int month, int day)
{
int sum;
switch(month){
case 1:
sum=0;
break;
case 2:
sum=31;
break;
case 3:
sum=59;
break;
case 4:
sum=90;
break;
case 5:
sum=120;
break;
case 6:
sum=151;
break;
case 7:
sum=181;
break;
case 8:
sum=212;
break;
case 9:
sum=243;
break;
case 10:
sum=273;
break;
case 11:
sum=304;
break;
case 12:
sum=334;
break;
default:
printf("error\n");
}
return sum+day;
}
関数の利用その2
Re: 関数の利用その2
まず、閏年補正ですね
int is_leep_year(int year); // ★★★ 関数プロトタイプ宣言が必要
--------------------------------------------------------
// ★★★ if (((year % 4 == 0) && (year % 100 != 0)) && (year % 400 == 0))
if ( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0) )
--------------------------------------------------------
1年は365日ですが、実際は地球が太陽を1周するのに365.2422…日かかります。この差を補正するために4年に1度「うるう年」にし、1日加えますがそれでは加え過ぎとなり、少しずつズレができます。
それを調整するため4で割り切れる年をうるう年とするだけでなく、400で割り切れない100の倍数年を平年とします
実行 gcc 8.2.0 使用
int is_leep_year(int year); // ★★★ 関数プロトタイプ宣言が必要
--------------------------------------------------------
// ★★★ if (((year % 4 == 0) && (year % 100 != 0)) && (year % 400 == 0))
if ( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0) )
--------------------------------------------------------
1年は365日ですが、実際は地球が太陽を1周するのに365.2422…日かかります。この差を補正するために4年に1度「うるう年」にし、1日加えますがそれでは加え過ぎとなり、少しずつズレができます。
それを調整するため4で割り切れる年をうるう年とするだけでなく、400で割り切れない100の倍数年を平年とします
#include <stdio.h>
int is_leep_year(int year); // ★★★ 関数プロトタイプ宣言が必要
int count_day_of_year(int year, int month, int day);
int main(void)
{
int year, month, day, sumday, a;
printf("年を入力してください\n");
scanf("%d", &year);
printf("月を入力してください\n");
scanf("%d", &month);
printf("日を入力してください\n");
scanf("%d", &day);
a = is_leep_year(year);
if (a == 1)
{
sumday = count_day_of_year(year, month, day);
}
else
{
sumday = (count_day_of_year(year, month, day) - 1);
}
printf("当年の1月1日から数えて%d日目となる\n", sumday);
return 0;
}
int is_leep_year(int year)
{
int a;
{
// ★★★ if (((year % 4 == 0) && (year % 100 != 0)) && (year % 400 == 0))
if ( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0) )
a = 1;
else
a = 0;
}
printf("%d\n", a);
return a;
}
int count_day_of_year(int year, int month, int day)
{
int sum;
switch (month) {
case 1:
sum = 0;
break;
case 2:
sum = 31;
break;
case 3:
sum = 59;
break;
case 4:
sum = 90;
break;
case 5:
sum = 120;
break;
case 6:
sum = 151;
break;
case 7:
sum = 181;
break;
case 8:
sum = 212;
break;
case 9:
sum = 243;
break;
case 10:
sum = 273;
break;
case 11:
sum = 304;
break;
case 12:
sum = 334;
break;
default:
printf("error\n");
}
return sum + day;
}
C:\19\19c\gcc820>gcc main.c
C:\19\19c\gcc820>dir a.exe
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 7813-6100 です
C:\19\19c\gcc820 のディレクトリ
2019/05/15 18:18 42,907 a.exe
1 個のファイル 42,907 バイト
0 個のディレクトリ 123,561,984,000 バイトの空き領域
C:\19\19c\gcc820>a.exe
年を入力してください
2020
月を入力してください
1
日を入力してください
1
1
当年の1月1日から数えて1日目となる
C:\19\19c\gcc820>pause
続行するには何かキーを押してください . . .