Nhập vào một ngày (ngày, tháng, năm). cho biết ngày đó là ngày thứ bao nhiêu trong năm.

đề 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!

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

Để 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”

):

Đầ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

(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

.

Home Categories FAQ/Guidelines Terms of Service Privacy Policy


Đề bài: Viết chương trình sử dụng ngôn ngữ lập trình C/C++ nhập vào ngày, tháng, năm (giả sử nhập đúng, không cần kiểm tra hợp lệ). Tìm xem ngày đó là ngày thứ bao nhiêu trong năm.


Yêu cầu kiến thức:

  • Xác định đúng kiểu dữ liệu các biến
  • Sử dụng vòng lặp for và lệnh rẽ nhánh switch để phân chia các tháng và tính tổng số ngày

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 7: Tinh ngay thu bao nhieu trong nam */ #include<iostream> #include<stdio.h> using namespace std; //===chuong trinh chinh=== int main() { // Khai bao bien int day, month, year, s, i; // Nhap du lieu cout<<"Nhap vao ngay: "; cin>>day; cout<<"Nhap vao thang: "; cin>>month; cout<<"Nhap vao nam: "; cin>>year; s = day; // S: Tong ngay for(i=1;i<month;i++) { switch(i) { case 4: case 6: case 9: case 11: s+=30; break; case 2: s+=28+((year%4==0 && year%100) || (year%400==0)); break; default: s+=31; } } printf("Ngay thu: %d", s); cout<<endl; return 0; } //===dinh nghia ham===


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

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

Video liên quan

Chủ đề