Xin lỗi mấy bác trước, bởi bài này em tự nghĩ ra đề nên không biết miêu tả nó như nào. Mong các bác thông cảm.
Input của để bài là nhập thứ, số lần nó xuất hiện, tháng năm rồi in ra ngày xuất hiện đó.
VD input: Thứ 3 lần thứ 4 của tháng 5 năm 2020
Output: 26/5/2020
Ý tưởng của em là duyệt 1 vòng for từ ngày đầu tháng đến ngày cuối tháng, nếu thấy ngày cần tìm thì cho ra output.
Đầu tiên em định cho 1 ngày làm mốc, để tìm thứ của các ngày khác. Nhưng nếu làm theo cách này thuật toán của em trở lên rất phức tạp, và cũng không cho ra kết quả (hàm strcmp không hoạt động giống với bài ở dưới). Nên em quyết định ăn gian bằng cách lên google, sau đó mò được công thức Julian Day Calculation, dùng để tìm thứ khi biết ngày, tháng, năm.
Đây là code của em. Hơi dài 1 chút, mong các bác thông cảm ạ.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
bool checknhuan(int n) {
if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
return true;
else return false;
}
int tinhngay(int m, int y) {
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if (checknhuan(y))
return 29;
else
return 28;
}
}
const char *input(int n) {
const char *t[] = {"Thu 2",
"Thu 3",
"Thu 4",
"Thu 5",
"Thu 6",
"Thu 7",
"Chu nhat"};
return t[n - 2];
}
const char *timthu(int d, int m, int y) {
long i;
i = (d + ((153 * (m + 12 * ((14 - m) / 12) - 3) + 2) / 5) +
(365 * (y + 4800 - ((14 - m) / 12))) +
((y + 4800 - ((14 - m) / 12)) / 4) -
((y + 4800 - ((14 - m) / 12)) / 100) +
((y + 4800 - ((14 - m) / 12)) / 400) - 32045) % 7;
const char *s[] = {"Thu 2",
"Thu 3",
"Thu 4",
"Thu 5",
"Thu 6",
"Thu 7",
"Chu nhat"};
return s[i];
}
int main() {
int s, k, i, j, d, m, y;
printf ("Thu 2: 2");
printf ("\nThu 3: 3");
printf ("\nThu 4: 4");
printf ("\nThu 5: 5");
printf ("\nThu 6: 6");
printf ("\nThu 7: 7");
printf ("\nChu nhat: 8");
printf ("\nBan muon tim thu may: ");
do {
scanf ("%d", &k);
if (k < 2 || k > 8)
printf ("Yeu cau nhap lai!\n");
} while (k < 2 || k > 8);
printf ("%s lan thu: ", input(k));
scanf ("%d", &s);
do {
printf ("Cua thang: ");
scanf ("%d", &m);
if (m < 1 || m > 12)
printf ("Thang khong hop le! Nhap lai!\n");
} while (m < 1 || m > 12);
do {
printf ("Nam: ");
scanf ("%d", &y);
} while (y < 1 || y > 9999);
for (i = 1; i <= tinhngay(m, y); i++) {
if (strcmp(timthu(i, m, y), input(k)) == 0) {
if ((i + 7 * (s - 1)) > tinhngay(m, y)) {
printf (" Khong the tim %S lan thu %d cua thang %d, nam %d!", input(k), s, m, y);
break;
}
if ((i + 7 * (s - 1)) <= tinhngay(m, y)) {
d = i + 7 * (s - 1);
printf ("%S lan thu %d cua thang %d, nam %d la ngay: %d/%d/%d", input(k), s, m, y, d, m, y);
break;
}
}
}
getch();
}
Vấn đề ở đây ạ
for (i = 1; i <= tinhngay(m, y); i++) {
if (strcmp(timthu(i, m, y), input(k)) == 0) {
Vì khi chạy em thấy chương trình kết thúc và thoát với code bằng 0 (không có lỗi gì).
Mấy bác cho em hỏi với bài toán như trên thì làm theo phương pháp nào là tốt nhất ạ? Nếu làm với phương pháp của em thì phải sửa thế nào để code có thể hoạt động?
Em cảm ơn các bác.