Nhập vào ngày tháng năm tính xem đó là ngày thứ bao nhiêu trong năm C

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

Cách tính thứ khi biết ngày tháng năm như nào? Bạn có biết bằng cách nào các ứng dụng lịch có thể xác định thứ của các ngày từ quá khứ tới tương lai tít tắp như vậy không? Bởi vì chúng ta có thể tính toán được việc đó. Bây giờ bạn có một bài tập C/C++ như sau: Hãy nhập vào ngày tháng năm, in ra hôm đó là thứ mấy? Hãy cùng Nguyễn Văn Hiếu Blog đi giải quyết bài tập này nhé.

1. Bài toán tính thứ khi biết ngày tháng năm

Trong cuộc sống tất bật, chúng ta thường xuyên phải xác định ngày hôm nay là thứ mấy trong tuần. Chẳng hạn như, kiểm tra sinh nhật của thằng bạn rơi vào thứ mấy? Hay thực tế hơn, bạn có một ứng dụng muốn hiện thị đầy đủ thông tin thời gian… Và lý do hợp lý nhất, bạn muốn biết bằng cách nào có thể xác định thứ mấy khi biết ngày tháng năm. Không dài dòng nữa, chúng ta sẽ cùng đi thẳng vào vấn đề nhé.

2. Tính thứ khi biết ngày tháng năm như nào?

Để xây dựng một chương trình tính thứ cho biết trước ngày tháng năm, chúng ta cần thực hiện các công việc tuần tự như sau:

  1. Nhận các thông tin ngày, tháng, năm được nhập bởi người dùng
  2. Kiểm tra thông tin nhập là hợp lệ
  3. Kiểm tra năm đó có phải năm nhuận không
  4. Xác định ngày đó là ngày thứ mấy trong tuần sử dụng Julien_day Calculation

Dưới đây là code trên ngôn ngữ C/C++ thực hiện tính thứ khi biết ngày tháng năm. Các bạn có thể dùng tham khảo:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

#include <iostream>

#include <stdlib.h>

using namespace std;

/*

####################################################################

#          Tim thu khi biet ngay thang nam                         #

####################################################################

*/

// Kiem tra ngay hop le

bool check_date(int day, int month){

if ((month==2) && (day>0) && (day<30)){

return true;

}

if ((

(month==1) ||

(month==3) ||

(month==5) ||

(month==7) ||

(month==8) ||

(month==10)||

(month==12)

) && ((day>0) && (day<32)))

{

return true;

}

if ((

(month==4) ||

(month==6) ||

(month==9) ||

(month==11)

) && ((day>0) && (day<31)))

{

return true;

}

return false;

}

// Kiem tra thang hop le

bool check_month(int month){

if ((month>0) && (month<13)){

  return true;

}else{

  return false;

}

}

// Kiem tra nam hop le

bool check_year(int year){

if ((year>999) && (year < 10000)){

return true;

}else{

return false;

}

}

// Kiem tra nam nhuan

bool check_leap_year(int year){

if (((year % 4)==0) && ((year % 100)!=0)){

  return true;

}else if ((year % 400)==0){

  return true;

}else {

  return false;

}

}

// Tim chính xác thu theo ngày tháng nam dã biêt

//

// //en.wikipedia.org/wiki/Julian_day#Calculation

//

const char *get_day(int day, int month, int year){

  int JMD;

   JMD = (day + ((153 * (month + 12 * ((14 - month) / 12) - 3) + 2) / 5) +

     (365 * (year + 4800 - ((14 - month) / 12))) +

     ((year + 4800 - ((14 - month) / 12)) / 4) -

    ((year + 4800 - ((14 - month) / 12)) / 100) +

    ((year + 4800 - ((14 - month) / 12)) / 400)  - 32045) % 7;

//cout << JMD;

const char *weekday[] = {"Thu 2",

   "Thu 3",

   "Thu 4",

   "Thu 5",

   "Thu 6",

   "Thu 7",

   "Chu nhat"};

return weekday[JMD];

}

main(){

// Khai bao bien

int year, month, date, x, y;

cout << "\n[+] CHUONG TRINH TINH THU KHI BIET NGAY THANG NAM.";

// Take Inputs

cout << "\n[+] Vui long nhap nam [YYYY] : ";

cin >> year;

// cout << "\n[+] Kiem tra  [YYYY] : ";

// verify year

if (check_year(year)){

  cout << "[-] Xac nhan!";

}else{

  cout << "\n\t [-] Nhap sai!\n";

  exit(0);

}

cout << "\n[+] Vui long nhap thang  [MM] : ";

cin >> month;

// verify month

if (check_month(month)){

  cout << "[-] Xac nhan!";

}else{

  cout << "[-] Nhap sai!";

  exit(0);

}

cout << "\n[+] Vui long nhap ngay [DD] : ";

cin >> date;

// verify date

if (check_date(date, month)){

  cout << "[-] Xac nhan!\n\n";

}else{

  cout << "[-] Nhap sai!";

  exit(0);

}

cout << "[+] Ngay : " << date << ", Thang : " << month << ", Nam : " << year << " [ ";

if (check_leap_year(year)){

  cout << "Nam nhuan" << " ]";

}else{

  cout << "Khong phai nam nhuan" << " ]";

}

cout << "\n[-] Ngay trong tuan: ";

cout << get_day(date, month, year);

cout << "\n\n";

}

Output:

[+] CHUONG TRINH TINH THU KHI BIET NGAY THANG NAM.

[+] Vui long nhap nam [YYYY] : 2018

[-] Xac nhan!

[+] Vui long nhap thang  [MM] : 10

[-] Xac nhan!

[+] Vui long nhap ngay [DD] : 9

[-] Xac nhan!

[+] Ngay : 9, Thang : 10, Nam : 2018 [ Khong phai nam nhuan ]

[-] Ngay trong tuan: Thu 3

3. Giải thích chương trình

check_yearcheck_monthcheck_day là các hàm giúp chúng ta kiểm tra năm, tháng, ngày của người dùng nhập vào có hợp lệ hay không. Nếu không hợp lệ, chúng ta sẽ dừng chương trình. Ngược lại, nếu hợp lệ chúng ta tiếp tục.

check_leap_year là hàm kiểm tra một năm có phải năm nhuận không?

Hàm get_day sẽ giúp chúng ta tính toán chính xác ngày tháng năm đó là thứ mấy. Công thức dưới đây dựa trên Julian Day Calculation

JMD = (day + ((153 * (month + 12 * ((14 - month) / 12) - 3) + 2) / 5) +

     (365 * (year + 4800 - ((14 - month) / 12))) +

     ((year + 4800 - ((14 - month) / 12)) / 4) -

    ((year + 4800 - ((14 - month) / 12)) / 100) +

    ((year + 4800 - ((14 - month) / 12)) / 400)  - 32045) % 7;

Sau khi thực hiện tính với công thức này, chúng ta sẽ thu được ngày của tuần ở dạng số.

Hi vọng bài chia sẻ hữu ích với các bạn, chúc các bạn học tốt!

Video liên quan

Chủ đề