Tính ngày tiếp theo trong C++

Trong bài tập tính ngày tiếp theo từ ngày nhập từ bàn phím thì em lập trình như bên dưới, tuy đúng hầu hết các trường hợp nhưng còn trường hợp 28/2 của năm không nhuận thì máy lại báo là 29/2 ạ. Các anh xem trong hàm của em sai sót những gì thì chỉ giúp em với ạ, em xin cảm ơn :smiley:

int ngayTiepTheo(int& ngay,int& month, int& year )
{
	int  dem, day;
	day = ngayTrongThang (month);
	if (day == -1 || ngay <1 || ngay > day) dem =-1;
	else 
		{
			if (ngay < day) ngay++;
			else if (month!=12) 
				{
					ngay = 1;
					month++;
				}	
			else 
				{
					ngay = month = 1;
					year++;
				}
		}		
	return dem;
} 

https://sv1.uphinhnhanh.com/images/2018/05/17/5018ce.png

Tháng 2 là tháng đặc biệt nên mình nghĩ bạn nên viết câu điều kiện if then else để kiểm tra xem năm đó có nhuận hay không để xác định được ngày tiếp theo.

1 Like

Em nó có kiểm tra năm nhuận rồi. Còn code có bỏ bùa hay không thì không biết. Up code không đầy đủ nên cũng khó.

1 Like

Code đầy đủ của em đây ạ, xét cả trường hợp năm nhuận rồi mà vẫn chưa biết lỗi ở đây ạ. :frowning:
int namNhuan(int year);
int ngayTrongThang(int month);
int ngayTiepTheo(int& ngay,int& month, int& year);

int namNhuan (int year)
{
	return ((year%400==0) || ((year%4==0)&&(year%100!=0)));
}
int ngayTrongThang(int month)
{
	int day, year;
	if ( month < 1 || month > 12) day = -1;
	else 
	{
		switch (month)
		{
			case 1: case 3: case 5: case 7: case 8: case 10: case 12:
				{
					day = 31;
					break;
				}	
			case 4: case 6: case 9: case 11:
				{
					day = 30;
					break;
				}	
			default:
				{
					if (namNhuan(year) == 0) day = 28;
					else day = 29;
					break;
				}		
		}
	}
	return day;	
}
int ngayTiepTheo(int& ngay,int& month, int& year )
{
	int day;
	day = ngayTrongThang (month);
	if (day == -1 || ngay <1 || ngay > day) 
		return -1;
	else 
		{
			if (ngay < day) ngay++;
			else if (month!=12) 
				{
					ngay = 1;
					month++;
				}	
			else 
				{
					ngay = month = 1;
					year++;
				}
		}		
}
int main()
{
	int year,month,ngay;
	cout << " Hay nhap nam: " ; cin >> year ; cout << endl;
	cout << " Hay nhap thang: " ; cin >> month ; cout << endl;
	cout << " Hay nhap ngay: " ; cin >> ngay ; cout << endl;
	if (ngayTiepTheo(ngay, month, year) == -1) cout<<" Ban vua nhap ngay thang khong hop le " << endl;
	else   cout<<" Ngay tiep theo sau  la ngay :  " << ngay << " / " << month << " / " << year << endl;
	system("pause");
}

Có mỗi cái hàm kiểm tra năm nhuận mà viết kinh khủng thế bạn :v

Đừng tạo 1 biến thừa là gt, chỗ nào return được là return luôn.

Hàm kiểm tra năm nhuận không cần biết là năm có nằm trong khoảng [1000, 3000] hay không, vì thế giới vào ngoài thời điểm đó vẫn sống nhăn răng :grimacing: Làm sao bị huỷ diệt mà phải giới hạn số năm làm gì.

Điều kiện kiểm tra năm nhuận là gì, cứ lắp vào là được. Sao phải code ngược lại điều kiện làm gì, khổ sở lắm, mà lại còn dễ sai nữa.

int isLeapYear(int year) { // đã gọi năm là year thì sao
                           // không gọi năm nhuận là leap year?
    return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0));
    // điều kiện đúng thì trả về 1, điều kiện sai trả về 0,
    // đỡ phải dùng biến phụ rắc rối
}

P/s: Chắc thớt chuyển từ code Pascal trên Turbo Pascal mới viết ra cái hàm như thế này. Dài dòng kinh khủng.

3 Likes

Vâng, tại em mới làm quen nên viết chưa được tốt lắm ạ. :disappointed_relieved:
Giờ còn mỗi lỗi 28/2 của năm không nhuận thì nó vẫn nhảy lên 29/2 mà em không biết mình sai ở đâu, thử giá trị của các hàm trên thì đúng hết. còn mỗi hàm NgayTiepTheo là trả về kết quả sai :frowning:

Số ngày trong tháng phụ thuộc vào năm nữa nhé :smiley:

Vả lại code hơi nhiều dấu ngoặc đơn :slight_smile:

2 Likes

Bạn in ra số ngày của tháng 2 năm không nhuận xem ra cái gì.

2 Likes

Đây ạ, tháng vẫn in ra đúng mà cuối lại sai

Mình đã tìm ra lỗi trong bài của bạn, nguyên nhân là do bạn không chuyền giá trị vào biến year của hàm ngayTrongThang làm chương trình coi biến year trong hàm ngayTrongThang có giá trị bằng 0, truyền vào hàm namNhuan đương nhiên nhận được kết quả là 0
Code sau khi đã sửa

#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;
int namNhuan(int year)
{
    return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));
}
int ngayTrongThang(int month, int nam)
{
    int day;
    if (month < 1 || month > 12)
        day = -1;
    else
    {
        switch (month)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        {
            day = 31;
            break;
        }
        case 4:
        case 6:
        case 9:
        case 11:
        {
            day = 30;
            break;
        }
        default:
        {
            if (namNhuan(nam) == 0)
                day = 28;
            else
                day = 29;
            break;
        }
        }
    }
    return day;
}
int ngayTiepTheo(int &ngay, int &month, int &year)
{
    int day;
    day = ngayTrongThang(month, year);
    if (day == -1 || ngay < 1 || ngay > day)
        return -1;
    else
    {
        if (ngay < day)
            ngay++;
        else if (month != 12)
        {
            ngay = 1;
            month++;
        }
        else
        {
            ngay = month = 1;
            year++;
        }
    }
}
int main()
{
    int year, month, ngay;
    cout << " Hay nhap nam: ";
    cin >> year;
    cout << endl;
    cout << " Hay nhap thang: ";
    cin >> month;
    cout << endl;
    cout << " Hay nhap ngay: ";
    cin >> ngay;
    cout << endl;
    if (ngayTiepTheo(ngay, month, year) == -1)
        cout << " Ban vua nhap ngay thang khong hop le " << endl;
    else
        cout << " Ngay tiep theo sau  la ngay :  " << ngay << " / " << month << " / " << year << endl;
    system("pause");
}

Ảnh chụp lần test trước khi sửa và sau khi sửa:

5 Likes

Em cảm ơn nhiều ạ :smile:

e mới học C++ đến if else em viết thế này đc chưa các bác?

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	cout<<"chuong trinh ngay thang nam\n";
	int ngay,thang,nam;
	cout<<"nhap vao ngay: ";
	cin>>ngay;
	cout<<"nhap vao thang: ";
	cin>>thang;
	cout<<"nhap vao nam: ";
	cin>>nam;
	if(ngay>31||ngay<0||thang>12||thang<0||nam<0||(ngay==29&&thang==2&&(nam%4!=0)))
	{
		cout<<"thim nhap khong hop le";
	}
	else 
	{
		
		int ngaykt;
		if((thang==2 && ngay==29)|| ((nam%4)!=0 && thang==2 && ngay==28)|| ((ngay==31) &&(thang==1 ||thang==3||thang==5||thang==7||thang==8||thang==10||thang==12))||((ngay==30) &&(thang==4 ||thang==6||thang==9||thang==11)))
		{
			ngaykt=1;
		}
		else
		{	
			ngaykt=ngay+1;	
		}
		int thangkt;
		if((thang==2 && ngay==29) ||((nam%4!=0) &&thang==2 && ngay==28) || ((ngay==31) &&(thang==1 ||thang==3||thang==5||thang==7||thang==8||thang==10))||((ngay==30) &&(thang==4 ||thang==6||thang==9||thang==11)))
		{
			thangkt=thang+1;
		}
		else
		{
			if(thang==12 &&ngay==31)
			{
				thangkt=1;
			}
			else
			{
				thangkt=thang;
			}
		}
		int namkt;
		if(ngay==31 && thang==12)
		{
			namkt=nam+1;
		}
		else
		{
			namkt=nam;
		}
		cout<<"ngay  thang nam ke tiep :"<<ngaykt<<"/"<<thangkt<<"/"<<namkt;
		
			
	}
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?