Đề : Viết chương trình đếm số ngày từ ngày 1/1/1900 đến một ngày tùy ý sau đó.
Mình đang bí ở bài tập này mong các bạn giúp đỡ
Mình thấy cách giải của bài đó phức tạp bởi hiện giờ mình mới học về c và yêu cầu của thầy mình là giải mà sử dụng vòng lặp như while hay for ,chứ lớp mình vẫn chưa học về mảng hay đệ qui hay những thứ sâu xa khác.
code của Ada thuộc hàng Advance rồi
@khongdaubang: bạn cứ tư duy bình thường đi giống thế này :
_ trg` hợp đặc biệt: cùng tháng,cùng năm lấy 2 số ngày trừ nhau
_ nếu khác tháng,cùng năm thì tính khoảng cách từ [(tháng 1)->(tháng y)] đổi ra ngày rồi + khoảng cách từ ngày 1/[tháng y] tới [ngày x]/[tháng y]
_ nếu khác tháng ,khác năm thì tính khoảng cách từ 1/1/[năm z] -> [ngày x]/[tháng y]/[năm z] + (khoảng cách từ năm 1901 -> [năm z] đổi ra ngày) + 365
Mới học C có lẻ thầy bạn cho làm bài này để học về giải thuật, cách tư duy 1 bài toán. Do đó cách dùng công thức của Ada khó được chấp nhận. Hồi trước lúc dạy C thầy tui bắt làm bài in ra thứ của 1 ngày bất kỳ cũng dạy cách tính thủ công chứ không xài công thức.
Để làm được bài này nếu không biết công thức có thể làm như sau:
1) Kiểm tra năm tính đến xem có phải năm nhuận:
C Code:
if ((n % 400 == 0) || (n % 4 == 0 && n % 100 != 0)) nhuan = 1; else nhuan = 0;
2) Đếm số năm nhuận từ năm 1900 đến năm n (không tính n).
C Code:
dem = 0; for (i = 1900; i < n; i++) { if(i % 400 == 0 || (i % 4 == 0 && i % 100 != 0)) dem++; }
3) Tính số ngày từ 1/1/1900 đến 1/1/n (năm n):
C Code:
tong = 365L * (n - 1) + dem;
4) Tính thêm số ngày từ 1/1/n đến 1/th/n
C Code:
for (i = 1; i < th; i++) { switch(i){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: songay = 31; break; case 4: case 6: case 9: case 11: songay = 30; break; case 2: if (nhuan) songay = 29; else songay = 28; break; } tong += songay; }
5) Cộng thêm số ngày từ 1/th/n đến ng/th/n
C Code:
tong += ng - 1;
Đã được chỉnh sửa lần cuối bởi Chautieu47 : 04-08-2008 lúc 05:30 PM.
/* The thing that I think is the thing that I do. */
À quên! Trước khi đếm số ngày thì phải kiểm tra xem ng/th/n cần đếm tới nhập vào có hợp lệ không nữa.
/* The thing that I think is the thing that I do. */
Bài này nên đổi lại như sau thì hay quá.
Nhập vào ngày tháng năm bắt đầu.
Nhập vào ngày tháng năm kết thúc.
Tìm tổng số ngày trong khoảng thời gian đó.
các bạn xem đoạn code này rồi góp ý cho mình nha!
Code:#include<stdio.h> #include<conio.h> signed long int enterday(void); void main() { signed long int vitri_1,vitri_2,ketqua; clrscr(); printf("*** CT dem so ngay ***\n"); printf("\nNhap thoi diem bat dau:"); vitri_1=enterday(); printf("\nNhap thoi diem ket thuc:"); vitri_2=enterday(); ketqua=vitri_2-vitri_1; printf("So ngay la %ld",ketqua); getch(); } //-------------------------------------------------- signed long int enterday(void) { int d,m,y,i; signed long int td=0,tm=0,ty=0; nl:printf("\nNhap ngay: "); scanf("%d",&d); printf("\nNhap thang: "); scanf("%d",&m); printf("\nNhap nam: "); scanf("%d",&y); if(y<1) { printf("\nNhap khong hop le"); goto nl; } else if(m<1||m>12) { printf("\nNhap khong hop le"); goto nl; } else { switch (m) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(d<1||d>31) { printf("\nNhap khong hop le"); goto nl; } else break; case 4: case 6: case 9: case 11: if(d<1||d>30) { printf("\nNhap khong hop le"); goto nl; } else break; case 2: if((y%400==0)||(y%4==0&&y%100!=0)) { if(d<1||d>29) { printf("\nNhap khong hop le"); goto nl; } else break; } else { if(d<1||d>28) { printf("\nNhap khong hop le"); goto nl; } else break; } } } for(i=1;i<y;i++) { if((i%400==0)||(i%4==0&&i%100!=0)) ty=ty+366; else ty=ty+365; } for(i=1;i<m;i++) { switch(i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: tm=tm+31; break; case 4: case 6: case 9: case 11: tm=tm+30; break; case 2: if((y%400==0)||(y%4==0&&y%100!=0)) { tm=tm+29; break; } else { tm=tm+28; break; } } } for(i=1;i<d;i++) { td=td+1; } ty=ty+tm+td; return(ty); }