【解決方法】このコードのどこが間違っているのでしょうか?


C プログラムを使用して年齢を日数で取得します。

私が試したこと:

C
#include<stdio.h>
int main(){
	int date,month,year,cur_year,cur_date,cur_month,i,n,s=0,k,p,m,a[7]={1,3,5,7,8,10,12},b[4]={4,6,9,11};
	printf("Enter date of birth: ");
	scanf("%d",&date);
	printf("Enter month of birth in number: ");
	scanf("%d",&month);
	printf("Enter year of birth: ");
	scanf("%d",&year);
	printf("Enter current date: ");
	scanf("%d",&cur_date);
	printf("Enter current month: ");
	scanf("%d",&cur_month);
	printf("Enter current year: ");
	scanf("%d",&cur_year);
               
           //for getting number of days remained in your birth month

	for(i=0;i<=10;i++){
		if(month==a[i])
		p = 31 - date;
		if(month==b[i])
		p = 30 - date;
	}
	if(month==2){
		if(year%4==0)
		p = 29 - date;
		else
		p = 28 - date;
	}

              //for getting number of days in remaining months in the birth year

	switch(month){
		case 1:{
			s = (31*6)+(30*4);
			if(year%4==0)
			k = s + 29;
			else
			k = s + 28;
			break;
		}
		case 2:{
			k = (31*6)+(30*4);
			break;
		}
		case 3:{
			k = (31*5)+(30*4);
			break;
		}
		case 4:{
			k = (31*5)+(30*4);
			break;
		}
		case 5:{
			k = (31*4)+(30*3);
			break;
		}
		case 6:{
			k = (31*4)+(30*2);
			break;
		}
		case 7:{
			k = (31*3)+(30*2);
			break;
		}
		case 8:{
			k = (31*2)+(30*2);
			break;
		}
		case 9:{
			k = (31*2)+30;
			break;
		}
		case 10:{
			k = 30 + 31;
			break;
		}
		case 11:{
			k = 31;
			break;
		}
	}


                //for getting number of days in years after your birth year and before present year

	for(n=year+1;n<=cur_year-1;n++){
		if(n%4==0)
		s=s+366;
		else
		s=s+365;
	}

              //for getting number of days passed in the current year till todays month

	switch(cur_month){
		case 12:{
			if(cur_year%4==0)
			m = (31*6)+(30*4)+29;
			else
			m = (31*6)+(30*4)+28;
			break;
		}
		case 11:{
			if(cur_year%4==0)
			m = (31*6)+(30*3)+29;
			else
			m = (31*6)+(30*3)+28;
			break;
		}
		case 10:{
			if(cur_year%4==0)
			m = (31*5)+(30*3)+29;
			else
			m = (31*5)+(30*3)+28;
			break;
		}
		case 9:{
			if(cur_year%4==0)
			m = (31*5)+(30*2)+29;
			else
			m = (31*5)+(30*2)+28;
			break;
		}
		case 8:{
			if(cur_year%4==0)
			m = (31*4)+(30*2)+29;
			else
			m = (31*4)+(30*2)+28;
			break;
		}
		case 7:{
			if(cur_year%4==0)
			m = (31*3)+(30*2)+29;
			else
			m = (31*3)+(30*2)+28;
			break;
		}
		case 6:{
			if(cur_year%4==0)
			m = (31*3)+(30*1)+29;
			else
			m = (31*3)+(30*1)+28;
			break;
		}
		case 5:{
			if(cur_year%4==0)
			m = (31*2)+(30*1)+29;
			else
			m = (31*2)+(30*1)+28;
			break;
		}
		case 4:{
			if(cur_year%4==0)
			m = (31*2)+29;
			else
			m = (31*2)+28;
			break;
		}
		case 3:{
			if(cur_year%4==0)
			m = (31*1)+29;
			else
			m = (31*1)+28;
			break;
		}
		case 2:{
			m = 31;
			break;
		}
	}

         //number of months passed in the currents month is included below in the sum

	printf("Current age in days is %d",p+k+s+m+cur_date);
	return 0;
}

解決策 1

それは…あまり良いコードではありません…私はそれを歩き回るつもりはありません(そして、「歩く」はまさに私たちがしなければならないことです)。

日付を受け取り、日番号を返す関数を自分で作成します。1990 年 1 月 1 日は 1、1990 年 1 月 2 日は 2、… 1990 年 12 月 31 日は 366、1991 年 1 月 1 日は 1、… 1991 年 12 月 31 日は 365 、 …
これは簡単です。誕生年の日番号を取得し、その年の 12 月 31 日の日番号を取得します。 引き算します。
翌年と昨年の間の各年の日数を取得します。それらを合計し、前に計算した差を含めます。 同じ機能を使用できます。
今日の日数を取得します。 追加してください。

1 つの関数を作成して慎重にテストできるため、それを再利用でき、コードの残りの部分が非常に明白で読みやすくなります。

ところで: ユーザーから現在の日付を取得する必要はありません。C ライブラリには、それを行うためのコードが含まれています。 https://www.techiedelight.com/print-current-date-and-time-in-c/[^]

そして、生年月日を保持するために同じ構造体を使用することは良い考えかもしれません…ヒント、ヒント。

解決策 2

引用:

このコードのどこが間違っているのでしょうか?

ab それらはサイズが異なるため、同じループ内で使用されるのは悪い考えです。
両方の配列の末尾を超えてループすることも悪い考えです。

C++
	int a[7]={1,3,5,7,8,10,12},b[4]={4,6,9,11};
...

	for(i=0;i<=10;i++){
		if(month==a[i])
			p = 31 - date;
		if(month==b[i])
			p = 30 - date;
	}

メモリ内では、次のようなものが得られます。

 1 // a[0]
 3 // a[1]
 5 // a[2]
 7 // a[3]
 8 // a[4]
10 // a[5]
12 // a[6]
 4 // b[0] and a[7]
 6 // b[1] and a[8]
 9 // b[2] and a[9]
11 // b[3] and a[10]
unknown // b[4]
unknown // b[5]

なぜなら、C は配列の終わりをチェックしないからです。

コメント

タイトルとURLをコピーしました