関数の利用その2 

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
pzym321
記事: 4
登録日時: 3ヶ月前

関数の利用その2 

#1

投稿記事 by pzym321 » 3ヶ月前

年月日を引数として、当年の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;
}

Math

Re: 関数の利用その2 

#2

投稿記事 by Math » 3ヶ月前

まず、閏年補正ですね
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;
}
実行  gcc 8.2.0 使用

コード:


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
続行するには何かキーを押してください . . .

かずま

Re: 関数の利用その2 

#3

投稿記事 by かずま » 3ヶ月前

Math さんが書きました:
3ヶ月前
実行  gcc 8.2.0 使用
2019年1月1日が 0日目になるんですが。

Math

Re: 関数の利用その2 

#4

投稿記事 by Math » 3ヶ月前

まず、閏年補正ですね

と書いたようにそれ以外はそのまま。
むつかしいようなことは皆無なので どうしても質問者 様の手におえない質問があったら聞いてね

返信

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