Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Mã nguồn C, nhập ngày tháng năm, tính ra thứ mấy

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mặc định Mã nguồn C, nhập ngày tháng năm, tính ra thứ mấy

    C Code:
    1. /* Bai tap 1_100 - Tinh thu cua ngay */
    2. #include <stdio.h>
    3. #include<conio.h>
    4. #define ESC 27
    5. struct date
    6. {
    7.  int     month;
    8.   int    day;
    9.    int    year;
    10.     }
    11.      date_1;
    12.  
    13. long int funct1 (int y,int m)
    14. {
    15.  long int result;
    16.   if ( m <= 2 )
    17.    y -= 1;
    18.     result = y;
    19.      return (result);
    20.       }
    21.  
    22. long int funct2 (int m)
    23. {
    24.  long int result;
    25.   if ( m <= 2 )
    26.    result = m + 13;
    27.     else
    28.      result = m + 1;
    29.       return(result);
    30.        }
    31.  
    32. long int day_count (int m, int d, int y)
    33. {
    34.  long int number;
    35.   number = 1461 *  funct1(y,m) / 4 + 153 *    funct2(m) / 5 + d;
    36.     return (number);
    37.      }
    38.  
    39. void main ()
    40. {int d;do
    41. {
    42.  long int number_of_days1;
    43.   int day_of_week;clrscr();
    44.    printf ("Nhap vao mot ngay (dd mm yyyy), vd  12 03 1999  \n");
    45.     scanf ("%d %d %d", &date_1.day, &date_1.month, &date_1.year);
    46.      number_of_days1 = day_count (date_1.month, date_1.day, date_1.year);
    47.       printf ("\nNgay la : " );
    48.        day_of_week = (number_of_days1 - 621049) % 7;
    49.  
    50.     switch (day_of_week)
    51.      {
    52.     case 0 :
    53.         printf ("Chu Nhat,");
    54.         break;
    55.     case 1 :
    56.         printf ("Thu Hai,");
    57.         break;
    58.     case 2 :
    59.         printf ("Thu Ba,");
    60.         break;
    61.     case 3 :
    62.         printf ("Thu Tu,");
    63.         break;
    64.     case 4 :
    65.         printf ("Thu Nam,");
    66.         break;
    67.     case 5 :
    68.         printf ("Thu Sau,");
    69.         break;
    70.     case 6 :
    71.         printf ("Thu Bay,");
    72.         break;
    73.          }
    74.  
    75. printf("\nBAM ESC de tiep tuc\n");d=getch();
    76.  }
    77.   while(d==ESC);
    78.    printf("KET THUC");
    79.     getch();
    80.     }

  2. #2
    Ngày gia nhập
    07 2008
    Bài viết
    4

    đọc code chưa hiểu lắm, mới google thử từ khóa "tìm thứ của ngày" thì ra đc giải thuật như sau:
    - Nếu tháng < 3 thì tháng = tháng + 12 và năm=năm-1
    - thu = abs(ngày + 2 x thang + 3x(thang+1)/5 + năm + năm/4) mod 7 (abs là lấy trị tuyệt đối, còn mod thì lấy phần dư)

    * Thu = 0 : chủ nhật
    * Thu = 1 : thứ hai
    * Thu = 2 : thứ 3
    * .........
    * Thu = 6 : thứ bảy

  3. #3
    Ngày gia nhập
    09 2008
    Nơi ở
    HN
    Bài viết
    1

    code mà coder_gate gửi chạy sai thì phải.nhập 1 ngày tháng năm ko có thực mà vẫn in ra đc thứ là thế nào?
    có khi nào....lập trình nên sự sống và kái chết???

  4. #4
    Ngày gia nhập
    04 2008
    Bài viết
    336

    code này nổi tiếng lắm chắc ko sai đâu chẳng qua trong chương trình trên chưa có phần kiểm tra (ngày tháng năm) có hợp lệ hay ko thôi. Bạn phải tâm niệm rằng code chạy được ko có nghĩa là đúng, chạy đúng ko có nghĩa là tốt
    code ra gió bão

  5. #5
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    code của coder_gate hình như bị giới hạn năm, bạn xem lại code đó đúng từ năm nào tới năm nào nhé.

    Code này đảm bảo đúng hết cho mọi năm, bạn có thể đối chiếu trên trang
    http://www.searchforancestors.com/ut...dayofweek.html
    C++ Code:
    1. #include "iostream.h"
    2.  
    3. typedef struct DATEINFO
    4. {
    5.     int    Day;
    6.     int    Month;
    7.     int    Year;
    8.     char*  DayWeek;
    9. } _DATEINFO;
    10.  
    11. char* arrDayWeek[7] = {"Chu Nhat", "Thu Hai", "Thu ba", "Thu tu", "Thu nam", "Thu sau", "Thu bay"};
    12. int ngayOfthang[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    13.  
    14. int namNhuan(int nam)
    15. {
    16.     if (!(nam % 400)) return 1;
    17.     if (!(nam % 4) && (nam % 100)) return 1;
    18.     return 0;
    19. }
    20.  
    21. int Hople(int ngay, int thang, int nam)
    22. {
    23.     int res = 0;
    24.     if ((ngay <= 0) || (thang <= 0) || (nam <= 0) || (thang > 12)) return 0;
    25.    
    26.     ngayOfthang[2] += namNhuan(nam);
    27.     if (ngay <= ngayOfthang[thang]) res = 1;
    28.  
    29.     ngayOfthang[2] = 28;
    30.     return res;
    31. }
    32.  
    33. int PreviousDay(int &ngay, int &thang, int &nam)
    34. {
    35.     if (ngay == 1)
    36.     {
    37.         if (thang == 1)
    38.         {
    39.             ngay = 31;
    40.             thang = 12;
    41.             nam--;
    42.         }
    43.         else if (thang == 3)
    44.         {
    45.             thang--;
    46.             ngay = 28 + namNhuan(nam);
    47.         }
    48.         else
    49.         {
    50.             thang--;
    51.             ngay = ngayOfthang[thang];
    52.         }
    53.     }
    54.     else ngay--;
    55.  
    56.     return 0;
    57. }
    58.  
    59. //  Cong thuc tinh weekday:
    60. //                     _ Y - 1 _        _ Y - 1 _        _ Y - 1 _                  //
    61. //   F(Y) = Y - 1 ++  |  -----  |  --  |  -----  |  ++  |  -----  |  ++  C
    62. //                    |_   4   _|      |_  100  _|      |_  400  _|
    63.  
    64. //   NOTE: Y: Current year
    65. //         C: so ngay tu ngay dau nam den ngay can tinh
    66. //   F(Y) mod 7  =  1 : thu hai
    67. //               =  2 : thu ba
    68. //               =  ...
    69. //               =  0 : chu nhat
    70.  
    71. bool Day_of_week(DATEINFO* dayInfo)
    72. {
    73.     int y = dayInfo->Year;
    74.     int C = dayInfo->Day;
    75.  
    76.     ngayOfthang[2] += namNhuan(y);
    77.     for (int i = 1; i < dayInfo->Month; ++i)
    78.         C += ngayOfthang[i];
    79.  
    80.     int res = (y - 1) + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + C;
    81.  
    82.     dayInfo->DayWeek = arrDayWeek[res % 7];
    83.  
    84.     ngayOfthang[2] = 28;
    85.     return true;
    86. }
    87.  
    88. int main()
    89. {
    90.     DATEINFO date;
    91.     cout <<"Nhap vao ngay thang nam: ";
    92.     cin >> date.Day >> date.Month >> date.Year;
    93.  
    94.     if (Hople(date.Day, date.Month, date.Year))
    95.     {
    96.         cout << "Day la ngay thang nam hop le" << endl;
    97.  
    98.         Day_of_week(&date);
    99.         cout << "Ngay " << date.Day << "/" << date.Month << "/" << date.Year << " la ngay " << date.DayWeek << endl;
    100.  
    101.         PreviousDay (date.Day, date.Month, date.Year);
    102.         cout << "Ngay truoc do la: " << date.Day << "/" << date.Month << "/" << date.Year << endl;
    103.     }
    104.     else cout << "Day la ngay thang nam khong hop le" << endl;
    105.     return 0;
    106. }
    Đã được chỉnh sửa lần cuối bởi DKhanh : 28-09-2008 lúc 11:11 AM.

  6. #6
    Ngày gia nhập
    06 2009
    Bài viết
    2

    Mặc định Mã nguồn C, nhập ngày tháng năm, tính ra thứ mấy

    phác cái bài này luôn . Em ghét cái bài này lắm ý. hồi xưa em code đi code lại mà vẫn sai. giải thuật thì chuẩn rồi. nhưng mà cuối cùng thì em bít nó sai ở đâu. cái lịch dương mà chúng ta biết ngày xưa từ cái thời chúa jê su ra đời ý. cái lịch nó sai . rồi 1 thời gian người ta đổi nó. nhưng nó vẫn sai. rồi 1 thời gian người ta lại đổi. thế cho nên là chỉ có sai mà thôi. nếu ai sau này làm bài này thì code từ năm 1900 trở đi. như vậy thì đúng.

  7. #7
    Ngày gia nhập
    08 2010
    Bài viết
    82

    Bác cho em xin cái thuật toán xem như thế nào?? Đọc code của bác chưa hiểu lắm. Thanks.

  8. #8
    Ngày gia nhập
    10 2011
    Bài viết
    10

    Trích dẫn Nguyên bản được gửi bởi soldtheworld Xem bài viết
    Bác cho em xin cái thuật toán xem như thế nào?? Đọc code của bác chưa hiểu lắm. Thanks.
    Trong code có cái chú thích đó bạn:
    F(Y)= Y-1 + (Y-1)/4 -(Y-1)/100 +(Y-1)/400 + C
    A= F(Y) Mod 7
    Nếu:
    A=1 thứ 2
    A=2 thứ 3
    A=3 thứ 4
    A=4 thứ 5
    A=5 thứ 6
    A=6 thứ 7
    A=7 chủ nhật
    Với Y là năm và C là số ngày từ đầu năm cho đến ngày đó.

  9. #9
    Ngày gia nhập
    09 2011
    Nơi ở
    ĐN
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi DKhanh Xem bài viết
    code của coder_gate hình như bị giới hạn năm, bạn xem lại code đó đúng từ năm nào tới năm nào nhé.

    Code này đảm bảo đúng hết cho mọi năm, bạn có thể đối chiếu trên trang
    http://www.searchforancestors.com/ut...dayofweek.html
    C++ Code:
    1. #include "iostream.h"
    2.  
    3. typedef struct DATEINFO
    4. {
    5.     int    Day;
    6.     int    Month;
    7.     int    Year;
    8.     char*  DayWeek;
    9. } _DATEINFO;
    10.  
    11. char* arrDayWeek[7] = {"Chu Nhat", "Thu Hai", "Thu ba", "Thu tu", "Thu nam", "Thu sau", "Thu bay"};
    12. int ngayOfthang[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    13.  
    14. int namNhuan(int nam)
    15. {
    16.     if (!(nam % 400)) return 1;
    17.     if (!(nam % 4) && (nam % 100)) return 1;
    18.     return 0;
    19. }
    20.  
    21. int Hople(int ngay, int thang, int nam)
    22. {
    23.     int res = 0;
    24.     if ((ngay <= 0) || (thang <= 0) || (nam <= 0) || (thang > 12)) return 0;
    25.    
    26.     ngayOfthang[2] += namNhuan(nam);
    27.     if (ngay <= ngayOfthang[thang]) res = 1;
    28.  
    29.     ngayOfthang[2] = 28;
    30.     return res;
    31. }
    32.  
    33. int PreviousDay(int &ngay, int &thang, int &nam)
    34. {
    35.     if (ngay == 1)
    36.     {
    37.         if (thang == 1)
    38.         {
    39.             ngay = 31;
    40.             thang = 12;
    41.             nam--;
    42.         }
    43.         else if (thang == 3)
    44.         {
    45.             thang--;
    46.             ngay = 28 + namNhuan(nam);
    47.         }
    48.         else
    49.         {
    50.             thang--;
    51.             ngay = ngayOfthang[thang];
    52.         }
    53.     }
    54.     else ngay--;
    55.  
    56.     return 0;
    57. }
    58.  
    59. //  Cong thuc tinh weekday:
    60. //                     _ Y - 1 _        _ Y - 1 _        _ Y - 1 _                  //
    61. //   F(Y) = Y - 1 ++  |  -----  |  --  |  -----  |  ++  |  -----  |  ++  C
    62. //                    |_   4   _|      |_  100  _|      |_  400  _|
    63.  
    64. //   NOTE: Y: Current year
    65. //         C: so ngay tu ngay dau nam den ngay can tinh
    66. //   F(Y) mod 7  =  1 : thu hai
    67. //               =  2 : thu ba
    68. //               =  ...
    69. //               =  0 : chu nhat
    70.  
    71. bool Day_of_week(DATEINFO* dayInfo)
    72. {
    73.     int y = dayInfo->Year;
    74.     int C = dayInfo->Day;
    75.  
    76.     ngayOfthang[2] += namNhuan(y);
    77.     for (int i = 1; i < dayInfo->Month; ++i)
    78.         C += ngayOfthang[i];
    79.  
    80.     int res = (y - 1) + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + C;
    81.  
    82.     dayInfo->DayWeek = arrDayWeek[res % 7];
    83.  
    84.     ngayOfthang[2] = 28;
    85.     return true;
    86. }
    87.  
    88. int main()
    89. {
    90.     DATEINFO date;
    91.     cout <<"Nhap vao ngay thang nam: ";
    92.     cin >> date.Day >> date.Month >> date.Year;
    93.  
    94.     if (Hople(date.Day, date.Month, date.Year))
    95.     {
    96.         cout << "Day la ngay thang nam hop le" << endl;
    97.  
    98.         Day_of_week(&date);
    99.         cout << "Ngay " << date.Day << "/" << date.Month << "/" << date.Year << " la ngay " << date.DayWeek << endl;
    100.  
    101.         PreviousDay (date.Day, date.Month, date.Year);
    102.         cout << "Ngay truoc do la: " << date.Day << "/" << date.Month << "/" << date.Year << endl;
    103.     }
    104.     else cout << "Day la ngay thang nam khong hop le" << endl;
    105.     return 0;
    106. }
    Trong này có nhìu cái mình ko hiũ, như là Char* là j, và nó khác char ntn
    và cái dấu "->" trong "dayInfo->Day" là giống như là vòng lập phải ko, mà nếu giống thì có thể thay thế bằng vòng lập for hay while đc ko.

    Thanks.

  10. #10
    Ngày gia nhập
    01 2012
    Nơi ở
    localhost
    Bài viết
    140

    Trích dẫn Nguyên bản được gửi bởi 6220119 Xem bài viết
    Bạn phải tâm niệm rằng code chạy được ko có nghĩa là đúng, chạy đúng ko có nghĩa là tốt
    Thú vị thật
    (Đây là dòng ghi chú thêm cho đủ 16 ký tự :()
    Rẹt rẹt..

Các đề tài tương tự

  1. Nhập ngày tháng năm in ra ngày tháng năm kế tiếp?
    Gửi bởi duongtk77 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 17
    Bài viết cuối: 26-03-2014, 11:14 PM
  2. Kỹ thuật C Bài toán nhập số năm xuất tên năm âm lịch, cách làm thế nào?
    Gửi bởi hikaru2838 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-12-2012, 09:51 PM
  3. Giảm thuế thu nhập doanh nghiệp năm 2011, miễn thuế thu nhập cá nhân đến hết năm 2012
    Gửi bởi tailanh8423 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 28-05-2012, 01:10 PM
  4. Nhập vào năm, tháng, thứ đầu tiên của năm, xuất ra lịch tháng đó
    Gửi bởi kenshin47 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 21-10-2010, 09:32 AM
  5. Nhập năm và in số ngày trong năm đó
    Gửi bởi phanvanngoc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 10-07-2010, 10:48 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn