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ố 15 kết quả

Đề tài: bài tập C về liệt kê các phần tử của xâu( kiểu giống hoán vị)

  1. #1
    Ngày gia nhập
    12 2010
    Bài viết
    9

    Mặc định bài tập C về liệt kê các phần tử của xâu( kiểu giống hoán vị)

    xin lỗi, lúc trước bị delete bài một lần rồi, vì tiêu đề không rõ ràng, nên giờ viết cái thread hơi dài một tí, (mà lại dỡ nữa chứ) hy vọng là không bị delete
    mình có bài toán này
    Viết chương trình nhập một xâu chữ gồm n chữ cái hoa (A..Z)-trong đó có một số chữ cái lặp. Liệt kê tất cả các cách sắp xếp n chữ cái này. Có đếm tổng số cách sắp xếp.
    anh chị em góp chút ý tưởng cho mình với, không biết bắt đầu từ đâu đây
    thanks hen,

  2. #2
    Ngày gia nhập
    12 2009
    Nơi ở
    bế quan tu lại
    Bài viết
    846

    đọc cái giải thích của bạn cũng chả hiểu gì. cho xin cái input với output đi ^^

  3. #3
    Ngày gia nhập
    12 2010
    Bài viết
    9

    input: ABCA
    output:
    1: CBAA
    2:BCAA
    3:CABA
    4:CABA
    5:BÂC
    6:ABCA
    7:ACCA
    8:ACAB
    9:AACB
    10:BÂC
    11:ABAC
    12:AABC

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

    Bài này nếu mà dùng C++ thì đơn giản

    C++ Code:
    1. #include <algorithm>
    2. #include <cstring>
    3. ...
    4. char s[] = "ABCA";
    5. char *s1 = s, *s2 = s + strlen(s);
    6. std::sort(s1, s2);
    7. do std::cout << s << std::endl;
    8. while (std::next_permutation(s1, s2));

    Còn nếu bắt buộc phải viết C thì bạn xem source của hàm next_permutation rồi viết lại theo vậy

  5. #5
    Ngày gia nhập
    12 2010
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Bài này nếu mà dùng C++ thì đơn giản

    C++ Code:
    1. #include <algorithm>
    2. #include <cstring>
    3. ...
    4. char s[] = "ABCA";
    5. char *s1 = s, *s2 = s + strlen(s);
    6. std::sort(s1, s2);
    7. do std::cout << s << std::endl;
    8. while (std::next_permutation(s1, s2));

    Còn nếu bắt buộc phải viết C thì bạn xem source của hàm next_permutation rồi viết lại theo vậy
    Cảm ơn bạn, có người trả lời là may rồi.
    Thực sự thì trứoc giờ mình toàn viết trên C, mặc dù C++ thì cũng không khác mấy, nhưng mình không hiểu nhiều về C++, và những gì bạn viết
    vậy bạn có thể nói về ý tưởng thuật toán, hoặc giải thích hộ mình mấy dòng lênh trên không, tốt nhất là bạn cho mình cái ý tưởng về thuật toán
    Không tìm thấy nút thanks đâu hết. diễn đàn không có nút này à
    Đã được chỉnh sửa lần cuối bởi bavuonglong : 28-10-2011 lúc 10:59 AM. Lý do: thanks

  6. #6
    Ngày gia nhập
    12 2010
    Bài viết
    9

    Mặc định bài tập C về liệt kê các phần tử của xâu( kiểu giống hoán vị)

    Lên lại thử nào, có ai giúp mình không

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

    Thế này đi.
    (Sửa lại tý cho ngắn gọn)
    C Code:
    1. #include <stdio.h>
    2.  
    3. typedef struct _value
    4. {
    5.     char _ch;
    6.     int   count_char;
    7. }value_t;
    8.  
    9. void enumerate(value_t* a, int total_char, int number_char, int current, int* count)
    10. {
    11.     int l;
    12.     static char result[100];
    13.     if(current >= total_char)
    14.     {
    15.         (*count)++;
    16.         result[total_char] = 0;
    17.         printf("%d:\t%s\n", *count, result);
    18.         return;
    19.     }
    20.     for(l = 0; l < number_char; l++)
    21.     {
    22.         if(a[l].count_char > 0)
    23.         {
    24.             a[l].count_char--;
    25.             result[current] = a[l]._ch;
    26.             enumerate(a, total_char, number_char, current + 1, count);
    27.             a[l].count_char++;
    28.         }
    29.     }
    30. }
    31.  
    32. int main(int argc, char *argv[])
    33. {
    34.     int count = 0;
    35.     value_t a[] = {{'A', 2}, {'B', 1}, {'C', 1}}; //AABC
    36.     //value_t a[] = {{'A', 2}, {'B', 2}, {'C', 3}, {'D', 2}}; //AABBCCCDD
    37.     int total_char = 0, number_char;
    38.     int i = 0;
    39.  
    40.     number_char = sizeof(a) / sizeof(value_t);
    41.     for(i = 0; i < number_char; i++)
    42.     {
    43.         if(a[i].count_char > 0)
    44.             total_char += a[i].count_char;
    45.         else
    46.         {
    47.             printf("so ky tu tham gia cua moi ky tu phai > 0");
    48.             return -1;
    49.         }
    50.     }
    51.  
    52.     enumerate(a, total_char, number_char, 0, &count);
    53.     printf("\ncount = %d\n", count);
    54.     return 0;
    55. }
    Đã được chỉnh sửa lần cuối bởi namdq2k : 01-11-2011 lúc 12:38 AM.

  8. #8
    Ngày gia nhập
    12 2010
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi namdq2k Xem bài viết
    Thế này đi.
    (Sửa lại tý cho ngắn gọn)
    C Code:
    1. #include <stdio.h>
    2.  
    3. typedef struct _value
    4. {
    5.     char _ch;
    6.     int   count_char;
    7. }value_t;
    8.  
    9. void enumerate(value_t* a, int total_char, int number_char, int current, int* count)
    10. {
    11.     int l;
    12.     static char result[100];
    13.     if(current >= total_char)
    14.     {
    15.         (*count)++;
    16.         result[total_char] = 0;
    17.         printf("%d:\t%s\n", *count, result);
    18.         return;
    19.     }
    20.     for(l = 0; l < number_char; l++)
    21.     {
    22.         if(a[l].count_char > 0)
    23.         {
    24.             a[l].count_char--;
    25.             result[current] = a[l]._ch;
    26.             enumerate(a, total_char, number_char, current + 1, count);
    27.             a[l].count_char++;
    28.         }
    29.     }
    30. }
    31.  
    32. int main(int argc, char *argv[])
    33. {
    34.     int count = 0;
    35.     value_t a[] = {{'A', 2}, {'B', 1}, {'C', 1}}; //AABC
    36.     //value_t a[] = {{'A', 2}, {'B', 2}, {'C', 3}, {'D', 2}}; //AABBCCCDD
    37.     int total_char = 0, number_char;
    38.     int i = 0;
    39.  
    40.     number_char = sizeof(a) / sizeof(value_t);
    41.     for(i = 0; i < number_char; i++)
    42.     {
    43.         if(a[i].count_char > 0)
    44.             total_char += a[i].count_char;
    45.         else
    46.         {
    47.             printf("so ky tu tham gia cua moi ky tu phai > 0");
    48.             return -1;
    49.         }
    50.     }
    51.  
    52.     enumerate(a, total_char, number_char, 0, &count);
    53.     printf("\ncount = %d\n", count);
    54.     return 0;
    55. }
    Cảm ơn bạn, nhưng mình vẫn chưa hiểu ý đồ của bạn, và một số dòng lệnh ở trên nữa, bạn có thể giải thích từng lệnh hoặc hàm hộ mình tại đây hoặc có thể cho mình xin yahoo để tiện liên lạc hơn không,mà mình chạy bài này trên dev c không được, c free thì được, sao vậy bạn
    Thanks.

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

    Tớ chẳng có ý đồ gì, tớ chỉ viết gọn cái thuật toán không muốn lan man. Những thứ ấy sẽ làm bạn rối loạn khi nhìn code.
    Còn giải thích từng dòng lệnh thì tớ xin kiếu.
    Đây, có thể cậu thích phải trơn tru thế này


    C Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <malloc.h>
    4. #include <memory.h>
    5.  
    6.  
    7. typedef struct _value
    8. {
    9.     char _ch;
    10.     int   count_char;
    11. }value_t;
    12.  
    13. void swap(char *a, char *b)
    14. {
    15.     char temp = *a;
    16.     *a = *b;
    17.     *b = temp;
    18.  }
    19.  
    20. void bubble_sort(char *numbers, int array_size)
    21. {
    22.     int i, j;
    23.     for (i = (array_size - 1); i > 0; i--)
    24.     {
    25.         for (j = 1; j <= i; j++)
    26.         {
    27.             if (numbers[j-1] > numbers[j])
    28.             {
    29.                 swap(&numbers[j - 1], &numbers[j]);
    30.             }
    31.         }
    32.     }
    33. }
    34. unsigned int create_variable_array(const char *s, value_t **a)
    35. {
    36.     if(s)
    37.     {
    38.         unsigned int len_temp, len;
    39.         char  *p;
    40.         unsigned int idx, jdx;
    41.  
    42.         len = strlen(s);
    43.         len_temp = len;
    44.         if(!len)
    45.             return 0;
    46.         p = (char *)malloc((len_temp + 1) * sizeof(char));
    47.         memset(p, 0, (len_temp + 1) * sizeof(char));
    48.         idx = 0;
    49.         strcpy(p, s);
    50.         while(p[idx])
    51.         {
    52.             jdx = idx + 1;
    53.             while(p[jdx])
    54.             {
    55.                 int count = 0;
    56.                 if(p[idx] == p[jdx])
    57.                 {
    58.                     do
    59.                     {
    60.                         count++;
    61.                     }while(p[jdx] == p[jdx + count]);
    62.                     memcpy(p + jdx, p + jdx + count, len_temp - jdx - count);
    63.                     memset(p + len_temp - count, 0, count);
    64.                     len_temp -= count;
    65.                 }
    66.                 ++jdx;
    67.             }
    68.             ++idx;
    69.         }
    70.         bubble_sort(p, len_temp);
    71.         *a = (value_t *)malloc(len_temp * sizeof(value_t));
    72.         for(idx = 0; idx < len_temp; idx++)
    73.         {
    74.             ((*a)[idx]).count_char = 0;
    75.             ((*a)[idx])._ch = p[idx];
    76.             for(jdx = 0; jdx < len; jdx++)
    77.             {
    78.                 if(s[jdx] == p[idx])
    79.                     ++((*a)[idx]).count_char;
    80.             }
    81.         }
    82.         free(p);
    83.         return len_temp;
    84.     }
    85.     return 0;
    86. }
    87.  
    88.  
    89. void enumerate(value_t *a, int total_char, int number_char, int current, int *count)
    90. {
    91.     int l;
    92.     static char result[100];
    93.     if(current >= total_char)
    94.     {
    95.         (*count)++;
    96.         result[total_char] = 0;
    97.         printf("%d:\t%s\n", *count, result);
    98.         return;
    99.     }
    100.     for(l = 0; l < number_char; l++)
    101.     {
    102.         if(a[l].count_char > 0)
    103.         {
    104.             a[l].count_char--;
    105.             result[current] = a[l]._ch;
    106.             enumerate(a, total_char, number_char, current + 1, count);
    107.             a[l].count_char++;
    108.         }
    109.     }
    110. }
    111. int check_valid_input(char* s)
    112. {
    113.     int value1, value2;
    114.     int idx, len = strlen(s);
    115.     if(s)
    116.     {
    117.         idx = 0;
    118.         while(idx < len)
    119.         {
    120.             if(s[idx] == ' ')
    121.             {
    122.                 memcpy(s + idx, s + idx + 1, len - idx - 1);
    123.                 s[--len] = 0;
    124.             }
    125.             else
    126.             {
    127.                 value1 = s[idx] >= 'A' && s[idx] <= 'Z';
    128.                 value2 = s[idx] >= 'a' && s[idx] <= 'z';
    129.                 if(!(value1 || value2))
    130.                 {
    131.                     return 0;
    132.                 }
    133.                 if(value2)
    134.                 {
    135.                     s[idx] = s[idx] + 'A' - 'a';
    136.                 }
    137.                 ++idx;
    138.             }
    139.         }
    140.         return len;
    141.     }
    142.     return 0;
    143. }
    144.  
    145. int main(int argc, char* argv[])
    146. {
    147.     int count = 0, len;
    148.     char s[100];
    149.     value_t *a;
    150.  
    151.     printf("input string: ");
    152.     gets(s);
    153.     if(check_valid_input(s))
    154.     {
    155.         len = create_variable_array(s, &a);
    156.         enumerate(a, strlen(s), len, 0, &count);
    157.         printf("%d way%s to permute from string: %s\n", count, count > 1 ? "s" : "", s);
    158.         free(a);
    159.     }
    160.     else
    161.         printf("Wrong input!\n");
    162.     return 0;
    163. }

  10. #10
    Ngày gia nhập
    12 2010
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi namdq2k Xem bài viết
    Tớ chẳng có ý đồ gì, tớ chỉ viết gọn cái thuật toán không muốn lan man. Những thứ ấy sẽ làm bạn rối loạn khi nhìn code.
    Còn giải thích từng dòng lệnh thì tớ xin kiếu.
    Đây, có thể cậu thích phải trơn tru thế này
    Hihi, hình như mình dùng từ không đúng, ý mình là ý tưởng ấy, vì code của bạn viết tên biến bằng tiếng anh, với lại mình cũng không dùng nên thật sự không thể hiểu code được, bạn có thể cho mình biết từ đâu bạn viết code như vậy, tức là phải có cái gì xuất phát mới nghĩ ra nó chứ, thuật toán ấy.
    Thanks.

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

  1. Trả lời: 6
    Bài viết cuối: 31-07-2013, 07:51 PM
  2. Mỹ phẩm Thu Huyền: Bộ mỹ phẩm trị nám, tàn nhang Bride Korea - call 0906.260.160
    Gửi bởi kimkim8910 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: 12-03-2012, 10:49 PM
  3. phần merge module bị thiếu crystal report phải làm thế nào ?
    Gửi bởi manhluc88 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 06-01-2011, 01:11 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