Hiện thứ của một ngày bất kì nào đó c++ năm 2024

Nếu tôi chọn ra một ngày bất kỳ trong quá khứ hoặc tương lại, cho bạn biết ngày, tháng, năm của hôm đó thì bạn có thể nhanh chóng tính ra xem ngày hôm đó là thứ mấy được không? Có thể bạn cho rằng phải tìm trong lịch vạn niên, nhưng nếu dùng lịch vạn niên thì không thể gọi là tính nhanh nữa rồi. Chúng tôi sẽ cung cấp cho bạn một công thức tính nhanh mà không cần phải dùng tới lịch vạn niên. S = X + [(X-1)/4] – [(X-1)/100] + [(X-1)/400] + C

Trong công thức này, X là số năm theo dương lịch, ví dụ năm 2004, năm 2005; C là số ngày tính từ ngày đầu tiên của năm đó tới ngày hôm đó (bao gồm cả ngày hôm đó). Phép chia trong ba dấu móc phải lấy kết quả chẵn tức là nếu chia ra có phần dư thì chúng ta sẽ bỏ qua mà chỉ lấy phần chẵn, ví dụ 501,5 thì lấy chẵn là 501. Sau khi có được kết quả S, lấy S chia cho 7, số dư của kết quả tìm được chính là thứ mấy mà chúng ta cần tìm, nếu dư 1 thì là chủ nhật, dư 2 là thứ 2,….. dư 7 là thứ 7. Công thức này cũng khá đơn giản, dưới đây chúng ta thử tính xem ngày 1 tháng 6 năm 2000 là thứ mấy nhé? Theo công thức trên chúng ta cùng tính giá trị S: S = 2000+[(2000-1)/4]-[(2000-1)/100]+[(2000-1)/400]+153 \= 2000 + 499 – 19 + 4 + 153 \= 2637 S¸:7 = 2637:¸7 = 376 dư ra 5 Vì thế ngày mùng 1 tháng 6 năm 2000 là ngày thứ 5. Các bạn thấy chưa, tính như vậy rất là đơn giản phải không! Nhưng khi tính chúng ta phải lưu ý tới năm nhuận, ví dụ năm 2000 là năm nhuận, tháng 2 của năm nhuận có 29 ngày chứ không phải là 28 ngày như năm thường, vì thế khi tính toán chúng ta không được quên điều này. Bây giờ bạn có thể theo công thức nói trên tính xem ngày sinh nhật của bạn là thứ mấy nhé!

Điều hướng bài viết

Đề bài: Viết chương trình C/C++ nhập vào ngày, tháng, năm. Kiểm tra ngày và tháng nhập có hợp lệ hay không. Tính thứ trong tuần của ngày đó. Yêu cầu kiến thức:

  • Xác định đúng kiểu dữ liệu cho các biến
  • Vận dụng cách kiểm tra năm nhuận hay không?

Lưu ý:

  • Năm nhuận (Leap Year) tính theo lịch Gregorian (từ năm 1582): năm phải chia hết cho 4 và không chia hết cho 100, hoặc năm phải chia hết cho 400.
  • Thứ trong tuần được tính theo công thức Zeller:

    DayOfWeek = (d+y+y/4-y/100+y/400+(31*m)/12)%7. Trong đó:

    • a = (14 – month)/12
    • y = year – a
    • m = month + 12*a -2
    • DayOfWeek: 0 (Chủ nhật), 1 (Thứ hai), 2 (Thứ ba), …

Code tham khảo dưới được lưu với phần mở rộng là “.cpp”:

  
// Ho ten: Hoang Van Tuan  
// Website: timoday.edu.vn  
// De bai:  
/* Bai 6: Tinh thu trong tuan */

# include  

# include
using namespace std;
//===chuong trinh chinh===  
int main()  
{  
    // Khai bao bien  
    int d, m, y, DayMax, DayOfWeek; // DayMax la so ngay toi da cho thang
    // Nhap du lieu  
    cout<<"Nhap vao ngay: "; cin>d;  
    cout<<"Nhap vao thang: "; cin>>m;  
    cout<<"Nhap vao nam: "; cin>>y;
    // Phan tich thiet ke giai thuat  
    if(y<1582)  
    {  
        cout<<"Nam khong duoc xac dinh!";  
        goto KetThuc;  
    }
    if(m<1 || m>12)  
    {  
        cout<<"Thang khong hop le!";  
        goto KetThuc;  
    }
    switch(m)  
    {  
        case 4:  
        case 6:  
        case 9:  
        case 11:  
            DayMax=30;  
            break;  
        case 2:  
            DayMax=28+((y%4==0 && y%100!=0) || y%400==0);  
            break;  
        default:  
            DayMax=31;  
    }
    if(d<1 || d>DayMax)  
    {  
        cout<<"Ngay khong hop le!";  
        goto KetThuc;  
    }
    cout<<"Ngay - thang - nam deu hop le!";
    // Cong thuc Zeller  
    y -= (14-m)/12;  
    m += 12*((14-m)/12)-2;  
    DayMax = (d + y + y/4 - y/100 + y/400 + (31*m)/12)%7;
    if(!DayMax)  
    {  
        cout<<"\nChu nhat";  
    }  
    else  
    {  
        cout<<"\nThu "<

Kết luận:

  • Bạn có thể tham khảo thêm khóa học lập trình C từ cơ bản đến nâng cao. Xem tại đây
  • Bạn có thể tham khảo thêm khóa học Thành thạo lập trình C#. Xem tại đây
  • Bạn có thể tham khảo Kiểm tra năm nhuận bằng Python. Xem tại đây

Các thẻ: lap trinhlập trình C/C++

Có thể bạn sẽ thích…