Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Sắp xếp tăng dần Ngày tháng năm trong C?

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

    Mặc định Sắp xếp tăng dần Ngày tháng năm trong C?

    trong file.txt dạng
    17/09/2010
    22/03/2011
    14/12/2007

    Bác nào giúp em Sắp xếp tăng dần Ngày tháng năm với ạ :(
    Hình như phải tách chuỗi a=day b=month c=year
    rồi bắt đầu so sánh year, so sánh month, so sánh day phải không ạ

    bài này em thấy hay gặp nhiều, mà tìm trên congdongcviet mãi không thấy

    Mong các chú các bác giúp với ạ

  2. #2
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Đầu tiên bạn sắp xếp theo ngày,
    sau đó lại sắp xếp lại theo tháng,
    Cuối cùng là theo năm. Như vậy được rồi.

    Tách chuỗi:
    Code:
    fscanf(con_tro_tep,"%d/%d/%d",&d,&m,&y);
    Có thể thế, liên hệ langman để biết thêm

  3. #3
    Ngày gia nhập
    07 2011
    Bài viết
    59

    mình có ý tưởng thế này:
    dùng mảng lớn quét file và đưa dữ liệu vào màng đó (nếu được thì mảng này gồm các mảng hoặc struct để chứa ngày tháng năm nữa). Rồi quét ngày tháng năm vào vá so sánh theo thứ tự. Viêc quét thì delimiter giữa ngày tháng năm là "/" còn giữ mỗi record là "\n". Sau khi so sánh sắp xếp xong lại ghi đè lại lên file đó.

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

    Em cảm ơn ạ, nhưng e làm vẫn ko đc :((

    bác nào giúp em về hàm cắt chuỗi, tách ngày, tháng, năm và lưu mỗi cái vào 1 biến riêng không ạ :(

  5. #5
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Có nhiều biến tướng đấy chứ. Có điều bạn không chịu mở rộng khái niệm ra thôi.

    Hay bạn thích phải có code nó chạy như này:
    (Phần đọc file thì nhường cho bạn nhé)
    C Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <time.h>
    4. #include <stdlib.h>
    5.  
    6. typedef struct _DATE
    7. {
    8.     char _date[30];
    9.     int  julian;
    10. }_DATE;
    11.  
    12. int julian_day(int day, int month, int year)
    13. {
    14.     int a, y, m, jd;
    15.  
    16.     a = (int)((double)(14 - month) / 12);
    17.     y = year + 4800 - a;
    18.     m = month + 12 * a - 3;
    19.     jd = day + (int)((double)(153 * m + 2)/5) + 365 * y + (int)((double)y/4) - (int)((double)y/100) + (int)((double)y / 400) - 32045;
    20.     if(jd < 2299161)
    21.         jd = day + (int)((double)(153 * m + 2) / 5) + 365 * y + (int)((double)y / 4) - 32083;
    22.     return jd;
    23. }
    24. int get_julian(char* _date)
    25. {
    26.     char temp[30];
    27.     char* p;
    28.     int year, month, day;
    29.  
    30.     strcpy(temp, _date);
    31.     p = temp;
    32.     while(*p)
    33.     {
    34.         if(*p == '/')
    35.             *p = ' ';
    36.         ++p;
    37.     }
    38.     sscanf(temp, "%d%d%d", &day, &month, &year);
    39.     return julian_day(day, month, year);
    40. }
    41. void swap(_DATE* a, _DATE* b)
    42. {
    43.     _DATE temp;
    44.     memcpy(&temp, a, sizeof(_DATE));
    45.     memcpy(a, b, sizeof(_DATE));
    46.     memcpy(b, &temp, sizeof(_DATE));
    47. }
    48. void quick_sort(_DATE* a, int lo, int hi)
    49. {
    50.     int i, j, pivot;
    51.     if(lo >= hi)
    52.         return;
    53.     pivot = a[hi].julian;
    54.     j = hi;
    55.     i = lo - 1;
    56.     while(i < j)
    57.     {
    58.         while(a[++i].julian < pivot && i <= hi);
    59.         while(a[--j].julian > pivot && j >= lo);
    60.         if(i < j)
    61.             swap(a + i, a + j);
    62.     }
    63.     swap(a + i, a + hi);
    64.     quick_sort(a, lo, i - 1);
    65.     quick_sort(a, i + 1, hi);
    66. }
    67. int main(int argc, char* argv[])
    68. {
    69.     int i = 0;
    70.     int size;
    71.     _DATE date[] = { {"17/8/1945", 0},
    72.                      {"17/09/2010", 0},
    73.                      {"22/03/2011", 0},
    74.                      {"14/12/2007", 0},
    75.                      {"10/10/1954", 0}
    76.                     };
    77.  
    78.  
    79.     size = sizeof(date) / sizeof(_DATE);
    80.  
    81.     for(i = 0; i < size; i++)
    82.     {
    83.         date[i].julian = get_julian(date[i]._date);
    84.     }
    85.     quick_sort(date, 0, size - 1);
    86.     for(i = 0; i < size; i++)
    87.         printf("%s\n", date[i]._date);
    88.  
    89.     return 0;
    90. }

  6. #6
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Mặc định Sắp xếp tăng dần Ngày tháng năm trong C?

    Trích dẫn Nguyên bản được gửi bởi namdq2k Xem bài viết
    Có nhiều biến tướng đấy chứ. Có điều bạn không chịu mở rộng khái niệm ra thôi.

    Hay bạn thích phải có code nó chạy như này:
    (Phần đọc file thì nhường cho bạn nhé)
    C Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <time.h>
    4. #include <stdlib.h>
    5.  
    6. typedef struct _DATE
    7. {
    8.     char _date[30];
    9.     int  julian;
    10. }_DATE;
    11.  
    12. int julian_day(int day, int month, int year)
    13. {
    14.     int a, y, m, jd;
    15.  
    16.     a = (int)((double)(14 - month) / 12);
    17.     y = year + 4800 - a;
    18.     m = month + 12 * a - 3;
    19.     jd = day + (int)((double)(153 * m + 2)/5) + 365 * y + (int)((double)y/4) - (int)((double)y/100) + (int)((double)y / 400) - 32045;
    20.     if(jd < 2299161)
    21.         jd = day + (int)((double)(153 * m + 2) / 5) + 365 * y + (int)((double)y / 4) - 32083;
    22.     return jd;
    23. }
    24. int get_julian(char* _date)
    25. {
    26.     char temp[30];
    27.     char* p;
    28.     int year, month, day;
    29.  
    30.     strcpy(temp, _date);
    31.     p = temp;
    32.     while(*p)
    33.     {
    34.         if(*p == '/')
    35.             *p = ' ';
    36.         ++p;
    37.     }
    38.     sscanf(temp, "%d%d%d", &day, &month, &year);
    39.     return julian_day(day, month, year);
    40. }
    41. void swap(_DATE* a, _DATE* b)
    42. {
    43.     _DATE temp;
    44.     memcpy(&temp, a, sizeof(_DATE));
    45.     memcpy(a, b, sizeof(_DATE));
    46.     memcpy(b, &temp, sizeof(_DATE));
    47. }
    48. void quick_sort(_DATE* a, int lo, int hi)
    49. {
    50.     int i, j, pivot;
    51.     if(lo >= hi)
    52.         return;
    53.     pivot = a[hi].julian;
    54.     j = hi;
    55.     i = lo - 1;
    56.     while(i < j)
    57.     {
    58.         while(a[++i].julian < pivot && i <= hi);
    59.         while(a[--j].julian > pivot && j >= lo);
    60.         if(i < j)
    61.             swap(a + i, a + j);
    62.     }
    63.     swap(a + i, a + hi);
    64.     quick_sort(a, lo, i - 1);
    65.     quick_sort(a, i + 1, hi);
    66. }
    67. int main(int argc, char* argv[])
    68. {
    69.     int i = 0;
    70.     int size;
    71.     _DATE date[] = { {"17/8/1945", 0},
    72.                      {"17/09/2010", 0},
    73.                      {"22/03/2011", 0},
    74.                      {"14/12/2007", 0},
    75.                      {"10/10/1954", 0}
    76.                     };
    77.  
    78.  
    79.     size = sizeof(date) / sizeof(_DATE);
    80.  
    81.     for(i = 0; i < size; i++)
    82.     {
    83.         date[i].julian = get_julian(date[i]._date);
    84.     }
    85.     quick_sort(date, 0, size - 1);
    86.     for(i = 0; i < size; i++)
    87.         printf("%s\n", date[i]._date);
    88.  
    89.     return 0;
    90. }
    Mình xin góp ý tí..thực chất thì hok cần chuyển sang julian
    ý tưởng của mình là:
    Code:
    if (Năm 1 > năm 2)  => đối tượng 1 > đối tượng 2
    else if (năm 1 = năm 2) 
           -> if  (tháng 1 > tháng 2) => đối tượng 1 > đối tượng 2
            else if (tháng 1 = tháng 2)
                   -> if (ngày 1 > ngày 2) => đối tượng 1 > đối tượng 2
                   -> else if (ngày 1 = ngày 2) => đối tượng 1 = đối tượng 2
    
    trường hợp còn lại => đối tượng 1 < đối tượng 2
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  7. #7
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Trích dẫn Nguyên bản được gửi bởi azurelonely Xem bài viết
    Mình xin góp ý tí..thực chất thì hok cần chuyển sang julian
    [/CODE]
    Thực chất thì tui cứ chuyển sang julian đấy.
    Làm việc với chuỗi số nguyên có "sướng" hơn ko nhỉ?

  8. #8
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Trích dẫn Nguyên bản được gửi bởi namdq2k Xem bài viết
    Thực chất thì tui cứ chuyển sang julian đấy.
    Làm việc với chuỗi số nguyên có "sướng" hơn ko nhỉ?
    Thì tớ cũng làm trên chuổi số nguyên đấy thôi
    C Code:
    1. struct date
    2. {
    3.    int day;
    4.    int month;
    5.    int year;
    6. };
    7. typedef struct date Date;
    8. unsigned Toint(const char *s,int f,int e)
    9. {
    10.    unsigned sum=0;
    11.    for (int i=f;i<e;i++) sum=sum*10 + s[i]-48;
    12.    reuturn sum;
    13. }
    14. int isNum(char c)
    15. {
    16.    return  (c<=57 && c>=48);
    17. }
    18. Date ToDate(const char *s)
    19. {
    20.    Date d;
    21.    int i=0,j;
    22.    while (isNum(s[i])) i++;
    23.    d.day=Toint(s,0,i);
    24.    j=i+1;
    25.    while (isNum(s[j])) j++;
    26.    d.month=Toint(s,i+1,j);
    27.    d.year = Toint(s,j+1,strlen(s));
    28.    reuturn d;
    29. }
    ý tưởng là zị...(chưa test)
    trong hàm sort chỉ cần gọi hàm này là sẽ có struct từ struct thì sẽ có thể so sánh 2 chuổi...
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  9. #9
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    còn em thì cứ so sánh từ năm xuống tháng rồi xuống ngày.không phải chuyển đổi qa số nguyên hehee

  10. #10
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Bạn bí chỗ nào, chỗ so sánh hay là chỗ sắp xếp?

    Cách so sánh:

    C Code:
    1. // hàm chuyển một chuỗi từ dạng dd/mm/yyyy thành yyyymmdd để dễ so sánh
    2. // indexing: 01/05/2010
    3. // indexing: 0123456789
    4. char *Nyyyymmdd(char *ngO, char *ngI)
    5. {
    6.   for (int i=0;i<4;i++) ngO[i] = ngI[i+6];
    7.   ngO[4] = ngI[3], ngO[5] = ngI[4];
    8.   ngO[6] = ngI[0], ngO[7] = ngI[1];
    9. }
    10.  
    11. // Trong code sắp xếp, gọi hàm này và hàm strcmp để so sánh

    Cách dễ hơn là dùng hàm fscanf như trungkien45 đã chỉ để đọc tách mỗi dòng ra thành 3 số nguyên ngay, thang, nam.

    Lúc sắp xếp, chỗ so sánh thì dùng

    C Code:
    1. if (nam1*10000+thang1*100+ngay1 >= nam2*10000+thang2*100+ngay2)

    Tuy nhiên, nếu dùng fscanf thì bạn phải lập thêm 3 mảng để tách chuỗi thành 3 số và đưa chúng đi theo các chuỗi ngày đọc được.

    Dùng sscanf thì tách chuỗi thành số ngay lúc cần so sánh. Cách này tuy mệt máy hơn (mỗi lần so sánh phải scan lại) nhưng code dễ hơn nhiều

    C Code:
    1. // vd so sánh hai chuỗi ngày cn1 và cn2 ở dạng dd/mm/yyyy
    2. sscanf(cn1, "%d/%d/%d", ngay1, thang1, nam1);
    3. sscanf(cn2, "%d/%d/%d", ngay2, thang2, nam2);
    4. if (nam1*10000+thang1*100+ngay1 >= nam2*10000+thang2*100+ngay2)

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

  1. Lương cho một seoer sẻ như thế nào trong năm nay và năm sau
    Gửi bởi vanvuongaa trong diễn đàn Tuyển dụng - Việc làm CNTT
    Trả lời: 0
    Bài viết cuối: 14-03-2013, 11:00 AM
  2. biến numeric tăng theo năm?
    Gửi bởi nguyenletri trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 6
    Bài viết cuối: 11-03-2010, 01:41 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