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

Đề tài: code đếm tần số xuất hiện của từ trong câu bằng BST bị đếm thừa từ cuối cùng

  1. #1
    Ngày gia nhập
    01 2010
    Nơi ở
    Hà Nội
    Bài viết
    37

    Mặc định code đếm tần số xuất hiện của từ trong câu bằng BST bị đếm thừa từ cuối cùng

    Mình có một bài tập phải đếm số lượng từng từ trong một file văn bản input.txt, code mình sau khi chạy thì từ cuối cùng bị đếm thừa.

    Chẳng hạn nếu trong file mình là : My name is Hoang name is thì cho kết quả là
    Hoang : 1
    My : 1
    is : 3 (đáng lẽ chỉ là 2 từ is)
    name : 2
    C Code:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. typedef struct
    5. {
    6.     char word[30];
    7. } EleType;
    8.  
    9. struct bst_node
    10. {
    11.     EleType data;
    12.     int count;
    13.     struct bst_node* left;
    14.     struct bst_node* right;
    15. };
    16.  
    17. struct bst_node* new_node(EleType data);
    18. void free_node(struct bst_node* node);
    19. struct bst_node **search(struct bst_node **root, EleType data);
    20. void insert(struct bst_node** root, EleType data);
    21. void delete(struct bst_node** node);
    22. void inorderprint(struct bst_node *t,FILE *fout);
    23.  
    24. int main()
    25. {
    26.     struct bst_node *t=NULL;
    27.     EleType item;
    28.     char buff[30], str[30];
    29.    
    30.     FILE *fin, *fout;
    31.     char filename1[]="input.txt", filename2[]="output.txt";
    32.     if ((fin = fopen(filename1,"r")) == NULL)
    33.     {
    34.         printf("Can not open %s!\n",filename1);
    35.         return 0;
    36.     }
    37.     if ((fout = fopen(filename2,"w+")) == NULL)
    38.     {
    39.         printf("Can not open %s!\n",filename2);
    40.         return 0;
    41.     }
    42.  
    43.     while (!feof(fin))
    44.     {
    45.         fscanf(fin,"%s",buff);    //đọc từng từ vào string buff
    46.         strcpy(item.word,buff);
    47.         struct bst_node** node = search(&t,item);
    48.         if (*node != NULL)     //nếu đã có từ trong tree thì cộng thêm 1 vào count của node đó
    49.             ((*node)->count)++;
    50.         else
    51.             insert(&t,item);   //nếu chưa có từ trong tree thì insert vào
    52.     }
    53.     inorderprint(t,fout);
    54.     printf("\nEnter a word : ");
    55.     scanf("%s",str);
    56.     strcpy(item.word,str);
    57.     struct bst_node** node = search(&t,item);
    58.     if (*node != NULL)
    59.         printf("\nNumber of occurences of '%s' in the file : %d",str,(*node)->count);
    60.     else
    61.         printf("\n%s is not exist in %s!",str,filename1);
    62.     printf("\n");
    63.     fclose(fin);
    64.     fclose(fout);
    65.     return 0;
    66. }
    67.  
    68. struct bst_node *new_node(EleType data) //tạo node mới với kiểu dữ liệu EleType
    69. {
    70.     struct bst_node* result = (struct bst_node *)malloc(sizeof(struct bst_node));
    71.     result->data = data;
    72.     result->count = 1;
    73.     result->left = result->right = NULL;
    74.     return result;
    75. }
    76.  
    77. void free_node(struct bst_node *node)
    78. {
    79.     free(node);
    80. }
    81.  
    82. struct bst_node **search(struct bst_node **root, EleType data)
    83. {
    84.     struct bst_node** node = root;
    85.     while (*node != NULL)
    86.     {
    87.         int compare_result = strcmp(data.word, (*node)->data.word);
    88.         if (compare_result < 0)
    89.             node = &(*node)->left;
    90.         else if (compare_result > 0)
    91.             node = &(*node)->right;
    92.         else
    93.             break;
    94.     }
    95.     return node;
    96. }
    97.  
    98. void insert(struct bst_node **root, EleType data)
    99. {
    100.     struct bst_node** node = search(root, data);
    101.     if (*node == NULL) {
    102.         *node = new_node(data);
    103.     }
    104. }
    105.  
    106. void delete(struct bst_node **node)
    107. {
    108.     struct bst_node* old_node = *node;
    109.     if ((*node)->left == NULL) {
    110.         *node = (*node)->right;
    111.         free_node(old_node);
    112.     } else if ((*node)->right == NULL) {
    113.         *node = (*node)->left;
    114.         free_node(old_node);
    115.     } else {
    116.         struct bst_node** pred = &(*node)->left;
    117.     while ((*pred)->right != NULL) {
    118.         pred = &(*pred)->right;
    119.     }
    120.  
    121.     /* Swap values */
    122.     EleType temp = (*pred)->data;
    123.     (*pred)->data = (*node)->data;
    124.     (*node)->data = temp;
    125.  
    126.     delete(pred);
    127.     }
    128. }
    129.  
    130. void inorderprint(struct bst_node *t,FILE *fout)
    131. {
    132.     if (t!=NULL)
    133.     {
    134.         inorderprint(t->left,fout);
    135.         printf("%s : %d\n",t->data.word,t->count);
    136.         fprintf(fout,"%s : %d\n",t->data.word,t->count);
    137.         inorderprint(t->right,fout);
    138.     }
    139. }

    Bạn nào biết thì giúp mình nhé
    Cảm ơn!
    Đã được chỉnh sửa lần cuối bởi piavg : 27-04-2012 lúc 09:29 PM.
    Cám ơn mỗi sớm mai thức dậy
    Ta có thêm ngày nữa để yêu thương

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    C Code:
    1.     while (!feof(fin)) // Còn thừa một kí tự '\n' trong stream khi bạn đọc hết
    2.     {
    3.         fscanf(fin,"%s",buff); // do vậy lệnh đọc ở đây sẽ ko làm thay đổi nội dung của buff.
    4.         strcpy(item.word,buff); // Chép nội dung cũ của buff vào.
    5.         struct bst_node** node = search(&t,item); // =>> Nó sẽ tìm từ cuối dùng một lần nữa.
    6.         if (*node != NULL)     //nếu đã có từ trong tree thì cộng thêm 1 vào count của node đó
    7.             ((*node)->count)++;
    8.         else
    9.            
    10.             insert(&t,item);   //nếu chưa có từ trong tree thì insert vào
    11.  
    12.  
    13.     }
    Ở trên chỉ mới là phỏng đoán, chưa chạy code. Thử sửa lại như sau, nếu code chạy đúng thì đã tìm đúng lỗi. Nhưng phải sửa lại theo cách tốt hơn, chỗ lệnh nhập.
    C Code:
    1.     while (!feof(fin)) // Còn thừa một kí tự '\n' trong stream khi bạn đọc hết
    2.     {
    3.         fscanf(fin,"%s",buff); // do vậy lệnh đọc ở đây sẽ ko làm thay đổi nội dung của buff.
    4.         strcpy(item.word,buff); // Chép nội dung cũ của buff vào.
    5.         struct bst_node** node = search(&t,item); // =>> Nó sẽ tìm từ cuối dùng một lần nữa.
    6.         if (*node != NULL)     //nếu đã có từ trong tree thì cộng thêm 1 vào count của node đó
    7.             ((*node)->count)++;
    8.         else
    9.            
    10.             insert(&t,item);   //nếu chưa có từ trong tree thì insert vào
    11.  
    12. buff[0] = '\0'; // Xoá tạm buff cũ.
    13.     }
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  3. #3
    Ngày gia nhập
    01 2010
    Nơi ở
    Hà Nội
    Bài viết
    37

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    C Code:
    1.     while (!feof(fin)) // Còn thừa một kí tự '\n' trong stream khi bạn đọc hết
    2.     {
    3.         fscanf(fin,"%s",buff); // do vậy lệnh đọc ở đây sẽ ko làm thay đổi nội dung của buff.
    4.         strcpy(item.word,buff); // Chép nội dung cũ của buff vào.
    5.         struct bst_node** node = search(&t,item); // =>> Nó sẽ tìm từ cuối dùng một lần nữa.
    6.         if (*node != NULL)     //nếu đã có từ trong tree thì cộng thêm 1 vào count của node đó
    7.             ((*node)->count)++;
    8.         else
    9.            
    10.             insert(&t,item);   //nếu chưa có từ trong tree thì insert vào
    11.  
    12.  
    13.     }
    Ở trên chỉ mới là phỏng đoán, chưa chạy code. Thử sửa lại như sau, nếu code chạy đúng thì đã tìm đúng lỗi. Nhưng phải sửa lại theo cách tốt hơn, chỗ lệnh nhập.
    C Code:
    1.     while (!feof(fin)) // Còn thừa một kí tự '\n' trong stream khi bạn đọc hết
    2.     {
    3.         fscanf(fin,"%s",buff); // do vậy lệnh đọc ở đây sẽ ko làm thay đổi nội dung của buff.
    4.         strcpy(item.word,buff); // Chép nội dung cũ của buff vào.
    5.         struct bst_node** node = search(&t,item); // =>> Nó sẽ tìm từ cuối dùng một lần nữa.
    6.         if (*node != NULL)     //nếu đã có từ trong tree thì cộng thêm 1 vào count của node đó
    7.             ((*node)->count)++;
    8.         else
    9.            
    10.             insert(&t,item);   //nếu chưa có từ trong tree thì insert vào
    11.  
    12. buff[0] = '\0'; // Xoá tạm buff cũ.
    13.     }
    Không bị đếm sai nữa rồi nhưng mà khi in ra kết quả lại có thêm cái là <dấu cách> : 1 bạn ạ. Làm sao để sửa hết lỗi này dc đây @@
    Cám ơn mỗi sớm mai thức dậy
    Ta có thêm ngày nữa để yêu thương

  4. #4
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Tôi đã bảo là bạn phải sửa chỗ lệnh nhập kia mà? Phải kiểm tra chuỗi trước khi cùng hàm strcpy(). Chuổi chỉ chứa '\0' hoặc '\n' thì bỏ qua, không copy.

    Thử code này, do ko có complier nên chưa test.
    C Code:
    1. int main()
    2. {
    3.     struct bst_node *t = NULL;
    4.     char buff[30] = {'\0'};
    5.     char str[30] = {'\0'};
    6.    
    7.     FILE *fin = NULL;
    8.     FILE *fout = NULL;
    9.     char filename1[] = "input.txt";
    10.     char filename2[] = "output.txt";
    11.     if (NULL == (fin = fopen(filename1,"r")))
    12.     {
    13.         printf("Can not open %s!\n",filename1);
    14.         return 0;
    15.     }
    16.     if (NULL == (fout = fopen(filename2,"w+")))
    17.     {
    18.         printf("Can not open %s!\n",filename2);
    19.         return 0;
    20.     }
    21.  
    22.     for(EleType item; !feof(fin);)
    23.     {
    24.         fscanf(fin,"%s",buff);
    25.  
    26.         if(buff[0] == '\0' || buff[0] == '\n')
    27.             break;
    28.        
    29.         strcpy(item.word, buff);
    30.        
    31.         struct bst_node** node = search(&t, item);
    32.        
    33.         if (*node != NULL)     //n?u đ? có t? trong tree th? c?ng thêm 1 vào count c?a node đó
    34.             ((*node)->count)++;
    35.         else
    36.             insert(&t,item);   //n?u chưa có t? trong tree th? insert vào
    37.     }
    38.    
    39.     inorderprint(t,fout);
    40.     printf("\nEnter a word : ");
    41.    
    42.     scanf("%s",str);
    43.     EleType item
    44.     strcpy(item.word, str);
    45.    
    46.     struct bst_node** node = search(&t,item);
    47.    
    48.     if (*node != NULL)
    49.         printf("\nNumber of occurences of '%s' in the file : %d",str,(*node)->count);
    50.     else
    51.         printf("\n%s is not exist in %s!",str,filename1);
    52.    
    53.     printf("\n");
    54.     fclose(fin);
    55.     fclose(fout);
    56.     return 0;
    57. }
    Đã được chỉnh sửa lần cuối bởi doicanhden : 02-05-2012 lúc 03:01 PM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

  1. Thuật toán C++ xuất 5 phần tử đầu tiên và cuối cùng trong linkedlist và binary tree
    Gửi bởi GMXChaser trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 5
    Bài viết cuối: 24-09-2012, 04:02 PM
  2. Trả lời: 1
    Bài viết cuối: 11-05-2012, 11:44 AM
  3. code nhập xuất học sinh trong c-free thì chạy dc ,còn trong visual thì ko
    Gửi bởi art_mu trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 2
    Bài viết cuối: 08-02-2012, 10:37 PM
  4. Truy xuất file nằm trong cùng thư mục với chương trình đang chạy
    Gửi bởi longtth trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 23-11-2010, 03:19 PM
  5. hỏi code c và c++ có thể trong cùng một file
    Gửi bởi tdtanvn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 21-02-2008, 05:04 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