Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Bài toán ngày tháng. Help!!!

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    0

    Unhappy Bài toán ngày tháng. Help!!!

    mình có bài này, làm hoài vẫn sai, mong các bạn giúp đỡ
    1. nhập 1 ngày, 1 số k (k có thể âm). Hỏi ngày đó cộng k sẽ là ngày nào, xuất kết quả ra màn hình

  2. #2
    Ngày gia nhập
    12 2006
    Bài viết
    72

    Bạn hãy đưa code mà bạn đã từng viết lên đi!

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    0

    Code:
    #include <iostream.h>
    
    //Function declaration
    int checkleap(int a);	//	to check if a is a leap year 
    int DayInYear(long int d, int m, int y);		// calculate the number of day in the year y
    int ZeroToNow(long int d, int m, int y);	// number of day from year 0 to year y
    void Calculate(long int& d, int& m, int& y);		//	final calculate
    
    int main()
    {
    	int m,y;
    	long int d,k;
    	cout << "Please enter a date:(m d y) ";
    	cin >> m >> d >> y;
    	cout << "Please enter the number of day you want to add: ";
    	cin >> k;
    	
    	d = ZeroToNow(d,m,y) + k;	// d become the number of days from year 0 to the result date
    	y = 0;						// begin with year 0
    	
    	Calculate(d,m,y);
    	cout << "That date is: "  
    		<< m << ' ' << d << ' ' << y << " \n";
    	return 0;
    }
    
    int checkleap(int a)		//	to check if a is a leap year 
    {
    	if (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0))
    		return 1;
    	else
    		return 0;
    }
    
    int DayInYear(long int d, int m, int y)		// number of day in year y
    {
    	int result = 0;
    	switch (m)
    	{
    	case 1:		result = d;
    		break;
    	case 2:		result = 31 + d;
    		break;
    	case 3:		result = 59 + d;
    		break;
    	case 4:		result = 90 + d;
    		break;
    	case 5:		result = 120 + d;
    		break;
    	case 6:		result = 151 + d;
    		break;
    	case 7:		result = 181 + d;
    		break;
    	case 8:		result = 212 + d;
    		break;
    	case 9:		result = 243 + d;
    		break;
    	case 10:	result = 273 + d;
    		break;
    	case 11:	result = 304 + d;
    		break;
    	case 12:	result = 334 + d;
    		break;
    	}
    	if (checkleap(y) && (m > 2))	// if y is leap year
    		result++;
    	return result;
    }
    
    int ZeroToNow(long int d, int m, int y)
    {
    	int s = 0;
    	for (int i = 0; i < y ; ++i)
    	{
    		if (checkleap(i))
    			s += 366;
    		else
    			s += 365;
    	}
    	s += DayInYear(d,m,y);
    	return s;
    }
    
    void Calculate(long int& d, int& m, int& y)
    {
    	while (d >= 28)
    	{
    		if ((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12))
    		{
    			if (d <= 31)
    				break;
    			if (d > 31)
    			{
    				d -= 31;
    				m++;
    			}
    		}
    		else if (m == 2)
    		{
    			if (checkleap(y))
    			{
    				if (d <= 29)
    					break;
    				if (d > 29)
    				{
    					d -= 29;
    					m++;
    				}
    			}
    			else
    			{
    				if (d <= 28)
    					break;
    				if (d > 28)
    				{
    					d -= 28;
    					m++;
    				}
    			}
    		}
    		else if ((m == 4) || (m == 6) || (m == 9) || (m == 11))
    		{			
    			if (d <= 30)
    				break;
    			if (d > 30)
    			{
    				d -= 30;
    				m++;
    			}
    		}
    		if (m > 12)
    		{
    			m = 1;
    			++y;
    		}
    	}
    }
    Sau khi làm xong tính toán vẫn sai nhiều trường hợp

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Sau khi làm xong tính toán vẫn sai nhiều trường hợp
    Bạn chịu khó debug với "nhiều trường hợp" đó, hi vọng sẽ tìm được lỗi sai.
    Keep moving forward!

    ... Retired ...

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Ờ sao bài này phải làm lằng nhằng kinh khủng thế, bây giờ cậu hãy bỏ hết cái code đó đi, sau đó làm theo chỉ dẫn sau đây:

    Nhập một ngày: dd mm yyyy và số ngày cần cộng vào là: k ngày.

    Giả sử tháng nhập vào có số ngày tối đa là dmax được xác định bởi hàm maxday(mm).

    Bây giờ thế này nhé.

    Code:
    if(k < dmax-dd) dd+=k;
    if(k>=dmax-dd)
    {
      k-=(dmax-dd);
      mm++;
      if(mm>12) 
      {
          mm-=12;
          yyy++;
       }
    Cứ lặp lại như vậy cho đến khi k < dmax-dd, lúc đó kết quả trả về sẽ là: dd=k, mm, yyyy.
    Làm theo chỉ dẫn này xem nào, có ngắn gọn và dễ hiểu hơn không? Mà nhớ chú thích code, chứ đưa lên một mớ tùm lum thế kia ai hiểu được cậu viết code gì?
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn