Nhập vào ngày tháng năm cho biết đó là thứ mấy trong tuần

đề bài là: nhập vào ngày tháng năm cho biết đó là thứ mấy trong tuần?

tháng 2 có năm nhuận là 28 hoặc 29 ngày, và 1,3,5,7,8,10,12 có 31 ngày và 4 ,6,9,11 có 30 ngày đặt ra lý luận thế nào cho ổn để tính, mong các cao nhân chỉ giáo! thanks

trân trọng!

Google “day of the date”.

C#, ngôn ngữ cho người lười:


9,10,11/4/2017

1 Like

Ặc! muốn tính chính xác, bạn lập thế thì chịu, mình ko hiểu! :smiley:

Còn về mặt thuật toán

  1. Bạn lấy ngày 1/1/1900 là Thứ hai
  2. Bạn tính số ngày kể từ ngày 1/1/1900 đến ngày A nào đó
  3. Lấy số ngày ấy, chia cho 7, gọi số dư là X
  4. X=0 => Thứ hai


    X=6=> Chủ nhật
1 Like

bạn thử code giúp mình bằng C dùng câu điều kiện? thanks ban

Bạn có thể chỉ mình cách tính số ngày kể từ 1/1/1990 dc ko?

Mình không biết viết code C :joy:

Để tính số ngày kể từ 01/01/0001 cho nó nhiều nhé :)) (01/01/0001 được gọi là “The world birthday” :slight_smile: ):

Đầu tiên bạn viết hàm tính số ngày trong năm, ví dụ noz == 2017 thì SoNgayTrongNam(noz) == 365:

int SoNgayTrongNam(int Year)
{
    int DayOfThisYear = 0;
    //...
    //Bạn tự viết hàm này nhé, lý thuyết về năm thường và năm nhuận thôi
    //...
    return DayOfThisYear;
}

Tiếp theo bạn viết hàm tính số ngày trước năm cần tính (ví dụ cần tính ngày 14/4/1995, hàm này tính số ngày kể từ 01/01/0001 đến hết 31/12/1994)

int SoNgayTruocNam(int Year)
{
    int TongSoNgayTruoc = 0;
    for (int i = 0; i < Year; i += 1)
        TongSoNgayTruoc += SoNgayTrongNam(i);
    return TongSoNgayTruoc;
}

Tiếp theo, bạn viết hàm tính số ngày kể từ đầu năm

int SoNgayKeTuDauNam(int Year)
{
    int SoNgay = 0;
    //...
    //Hàm này bạn cũng gắng tự viết :))
    //...
    return SoNgay;
}

Cuối cùng cộng 2 thằng đó lại là ra số ngày kể từ 01/01/0000, gọi nó là int ahjhj nhé.
Biết 31/12/0000 là Chủ Nhật.
Xét ngày 01/01/0001 là Thứ Hai thì ahjhj == 1 => ahjhj % 7 == 1
=> Nếu ahjhj % 7 == 1 thì ngày đang xét là Thứ Hai, ahjhj % 7 == 2 thì ngày đang xét là Thứ Ba,…, ahjhj % 7 == 6 thì ngày đang xét là Thứ Bảy, ahjhj % 7 == 0 thì ngày đang xét là Chủ Nhật.

1 Like

Full code C# :))

        bool LaNamNhuan(int Nam)
        {
            if (Nam % 4 != 0) return false;
            if (Nam % 100 != 0) return true;
            if (Nam % 400 != 0) return false;
            return true;
        }

        int SoNgayTrongNam(int Nam)
        {
            if (LaNamNhuan(Nam)) return 366;
            return (365);
        }

        int SoNgayTruocNam(int Nam)
        {
            int TongSoNgayTruoc = 0;
            for (int i = 1; i < Nam; i += 1)
                TongSoNgayTruoc += SoNgayTrongNam(i);
            return TongSoNgayTruoc;
        }

        int SoNgayTrongThang(int Nam, int Thang)
        {
            switch (Thang)
            {
                case 4:
                case 6:
                case 9:
                case 11: return 30;
                case 2:
                    {
                        if (LaNamNhuan(Nam)) return 29;
                        return 28;
                    }
                default: return 31;
            }
        }

        int SoNgayTruocThang(int Nam, int Thang)
        {
            var SoNgay=0;
            for (int i = 1; i < Thang; i += 1)
                SoNgay += SoNgayTrongThang(Nam, i);
            return SoNgay;
        }

        int TongSoNgay(int Nam, int Thang, int Ngay)
        {
            return SoNgayTruocNam(Nam) + SoNgayTruocThang(Nam, Thang) + Ngay;
        }

        string NgayTrongTuan(int Nam, int Thang, int Ngay)
        {
            switch (TongSoNgay(Nam,Thang,Ngay)%7)
            {
                case 0: return "Chu nhat";
                case 1: return "Thu hai";
                case 2: return "Thu ba";
                case 3: return "Thu tu";
                case 4: return "Thu nam";
                case 5: return "Thu sau";
                default: return "Thu bay";
            }
        }
2 Likes

Có sẵn thuật toán để tính cái này, bạn có thể dễ dàng tìm thấy trên daynhauhoc (mình muốn nhấn mạnh chỗ ‘dễ dàng’).
Duyệt từng ngày là một cách phổ thông với lại nó sẽ chậm hơn nếu ngày cần tính càng xa với mốc đã chọn.

Mình code lại dựa trên thuật toán đó, việc kiểm tra những gì người dùng nhập vào thì không phải việc của mình nên mình không làm nha :joy: (mình cho là không hề có lỗi trong việc nhập ngày tháng năm).

Đáp án cho người lười =))
/// Code C
#include <stdio.h>

int calc_weekday(int d, int m, int y)
{
    /// Check month
    if(m < 3) {
        m += 12;
        y -= 1;
    }

    return (d + 2*m + (3*(m + 1)) / 5 + y + (y / 4)) % 7;
}

int main(int argc, char *argv[])
{
    int day, month, year;
    char *weekday[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
        "Friday", "Saturday"};
    
    printf("Input (day, month, year): ");
    scanf("%d%d%d", &day, &month, &year);

    /// Check user input is valid or not
    /// ...

    printf("Today is: %s\n", weekday[calc_weekday(day, month, year)]);
    return 0;
}

Đoạn code sử dụng switch-case nhưng do nó quá dài nên mình chuyển nó sang mảng, chắc là hơi nguy hiểm tí khi không kiểm tra xem phần tử có chỉ số nằm trong khoảng an toàn hay không :joy:.

thanks Trần Hoàn…!

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