Bài tập python tính ngày tháng năm

a/c/e cho em bài tập này với ạ, em cám ơn
Đề bài: Lịch Gregorius, còn gọi là Tây lịch, Công lịch, là một bộ lịch tiêu chuẩn hiện nay được dùng trên hầu hết khắp thế giới do Giáo hoàng Grêgôriô XIII đưa ra vào năm 1582. Tại Việt Nam, Tây lịch được áp dụng ở các công sở vào cuối thế kỷ 19.

Theo lịch Gregorius thì những năm nào chia hết cho 4 và không chia hết cho 100 được coi là năm nhuận (ví dụ năm 2000 không phải là năm nhuận, 2004 là năm nhuận). Trong năm nhuận, tháng 2 có 29 ngày thay cho 28 ngày. Cứ 4 năm lại thêm 1 ngày vào lịch bởi vì một năm dương lịch dài khoảng 365 ngày và 6 giờ.

Tuy nhiên , vẫn có một số ngoại lệ đối với nguyên tắc này vì một năm dương lịch ngắn hơn 365,25 ngày một chút. Những năm chia hết cho 100 chỉ được coi là năm nhuận nếu chúng cũng chia hết cho 400. Ví dụ, 1600 và 2000 là các năm nhuận nhưng 1700, 1800 và 1900 không phải năm nhuận. Tương tự như vậy, 2100, 2200, 2300, 2500, 2600, 2700, 2900 và 3000 không phải năm nhuận nhưng 2400 và 2800 là các năm nhuận. Theo nguyên tắc này thì trung bình một năm có 365 ngày 5 giờ 49 phút và 12 giây.

Cho trước số ngày trong một tháng của năm không nhuận như sau:

Tháng 1 có 31 ngày

Tháng 2 có 28 ngày

Tháng 3 có 31 ngày

Tháng 4 có 30 ngày

Tháng 5 có 31 ngày

Tháng 6 có 30 ngày

Tháng 7 có 31 ngày

Tháng 8 có 31 ngày

Tháng 9 có 30 ngày

Tháng 10 có 31 ngày

Tháng 11 có 30 ngày

Tháng 12 có 31 ngày

Hãy viết chương trình xuất ra ngày tiếp theo của 1 ngày cho trước.

Các biến d, m, y là các số nguyên được nhập vào từ bàn phím, lần lượt lưu giá trị ngày, tháng, năm của một ngày cho trước. Xuất ra màn hình ngày, tháng, năm của ngày tiếp theo ngày đó theo định dạng:

Bài làm:

m = int(input())
y = int(input())

                          

if (y % 400 == 0) or (y % 4 == 0 and y % 100 != 0) and (d==29) and (m==2):    
    d_af = 1
    m_af = 3
    y_af = y
    print(d_af, m_af, y_af)
else:
    if (m == 2) and (d <= 28) and (m<12):
        if d == 28:
            d_af = 1
            m_af = m+1
            y_af = y
            print(d_af, m_af, y_af)
        else:
            d_af = d+1
            m_af = m
            y_af = y
            print(d_af, m_af, y_af)
    elif (m == 4) or (m == 6) or (m == 9) or (m == 11) and (d <= 30) and (m<12):
        if d == 30:
            d_af = 1
            m_af = m+1
            y_af = y
            print(d_af, m_af, y_af)
        else:
            d_af = d+1
            m_af = m
            y_af = y
            print(d_af, m_af, y_af)
    elif (m == 1) or (m == 3) or (m == 5 )or (m == 7) or (m == 8) or (m == 10) and (d <= 31) and (m<12):
        if d == 31:
            d_af = 1
            m_af = m+1
            y_af = y
            print(d_af, m_af, y_af)
        else:
            d_af = d+1
            m_af = m
            y_af = y
            print(d_af, m_af, y_af)
    elif (m == 12) and (d <= 31):
        if d == 31:
            d_af = 1
            m_af = 1
            y_af = y
            print(d_af, m_af, y_af)
        else:
            d_af = d+1
            m_af = m
            y_af = y
            print(d_af, m_af, y_af)
    else:
        print("nhap sai")
1 Like

Cho mình hỏi: Bạn muốn hỏi gì?

2 Likes

Cái code mình chạy sai, mình nhập ví dụ ngày 33-1-2019 thì nó phải báo lỗi sai, nhưng nó vẫn in ngày tiếp theo

bạn xem lại mấy điều kiện xét đến trong if với elif nhé. Ví dụ như m = 1 mà d = 33 mà để điều kiện là

if (m == 1) or (m == 3) and (d <= 31):

thì nó vần cho là hợp lệ :smiley:

2 Likes

Liên quan đến dấu ngoặc đơn đấy.

if (m == 1) or (m == 3) and (d <= 31):

Khác với:

if ((m == 1) or (m == 3)) and (d <= 31):
# So sánh đơn không cần dấu ngoặc đâu nhé.
# Tương đương với:
if (m == 1 or m == 3) and d <= 31:
2 Likes

Cám ơn sư huynh nhé ^^

Cám ơn bạn ^^ mình làm ra rồi

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?