Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 24 kết quả

Đề tài: tìm và thay thế chuỗi

  1. #1
    Ngày gia nhập
    10 2017
    Bài viết
    0

    Mặc định tìm và thay thế chuỗi

    mình có 1 bài tập như này:
    Nhập vào 1 đoạn văn bản bẳng tiếng anh không quá 255 kí tự
    Thay thế tất cả cả từ child(nếu có) trong đoạn văn bản bằng từ children.
    Dưới đây là đoạn code mà mình tham khảo được nhưng mình không hiểu nó cho lắm,làm ơn giải thích giúp mình:




    #include<iostream>
    #include<string.h>
    using namespace std;
    int i=0,j,n,n1,n2,vt;
    char s[500],s1[500], s2[500];
    void thay()
    {
    n=strlen(s);n1=strlen(s1);n2=strlen(s2);
    while(s[i]){

    j=0;vt=i;
    while(s1[j]&&s[vt]==s1[j]) {

    vt++;j++;}
    if(j==n1)
    {
    memmove(s+i+n2,s+i+n1,n-n1-i+1);
    strncpy(s+i,s2,n2);
    i+=vt;n+=n2-n1;
    }
    else i++;
    }

    }
    main()
    {
    cout<<"Nhap vao doan van ban: ";
    gets(s);
    cout<<"Nhap vao tu can tim: ";
    gets(s1);
    cout<<"Nhap vao tu thay the: ";
    gets(s2);
    thay();
    cout<<"Doan van ban sau khi thay the la:";
    puts(s);

    }

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    447

    Bạn không hiểu câu nào? Cụ thể?
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    10 2017
    Bài viết
    0

    mình không hiểu đoạn này cho lắm

    while(s[i]){

    j=0;vt=i;
    while(s1[j]&&s[vt]==s1[j]) {

    vt++;j++;} //
    if(j==n1)
    {
    memmove(s+i+n2,s+i+n1,n-n1-i+1);
    strncpy(s+i,s2,n2);
    i+=vt;n+=n2-n1;
    }
    else i++;

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    447

    Đoạn này nhằm mục đích duyệt xâu s tìm tất cả các xâu con s1 và thay thế mỗi xâu con tìm được bằng xâu s2.

    Tuy nhiên, đoạn code này sai và mục đích đó không đạt được.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  5. #5
    Ngày gia nhập
    10 2017
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Đoạn này nhằm mục đích duyệt xâu s tìm tất cả các xâu con s1 và thay thế mỗi xâu con tìm được bằng xâu s2.

    Tuy nhiên, đoạn code này sai và mục đích đó không đạt được.
    Bạn có thể giúp mình chỉ ra lỗi sai của đoạn code đó không,và nếu được có thể giúp mình phần thuật toán để giải bài này không ??

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    447

    Mặc định tìm và thay thế chuỗi

    Chỗ sai mình không biết. Mình chỉ biết nó sai thôi. Test thì biết.

    Còn thuật toán, bạn có ý tưởng nào không?

    - - - Nội dung đã được cập nhật ngày 07-11-2017 lúc 06:15 PM - - -

    Mình có ý này. Gọi s(0) là đoạn văn bản nhập vào, r(0) là một xâu rỗng (r(0) = ""), u là xâu con cần tìm (u = "child"), v là xâu để thay thế (v = "children").

    Với k = 0, 1, 2,... phân tích s(k) thành x(k) y(k), với x(k) là xâu con dài nhất không chứa u. Nếu y(k) = "" trả lại kết quả là r(k+1) = r(k) x(k). Nếu không, phân tích y(k) thành u s(k+1) và đặt r(k+1) = r(k) x(k) v.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  7. #7
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    311

    Trích dẫn Nguyên bản được gửi bởi haquanghai Xem bài viết
    mình có 1 bài tập như này:
    Nhập vào 1 đoạn văn bản bẳng tiếng anh không quá 255 kí tự
    Thay thế tất cả cả từ child(nếu có) trong đoạn văn bản bằng từ children.
    Dưới đây là đoạn code mà mình tham khảo được nhưng mình không hiểu nó cho lắm,làm ơn giải thích giúp mình:




    #include<iostream>
    #include<string.h>
    using namespace std;
    int i=0,j,n,n1,n2,vt;
    char s[500],s1[500], s2[500];
    void thay()
    {
    n=strlen(s);n1=strlen(s1);n2=strlen(s2);
    while(s[i]){

    j=0;vt=i;
    while(s1[j]&&s[vt]==s1[j]) {

    vt++;j++;}
    if(j==n1)
    {
    memmove(s+i+n2,s+i+n1,n-n1-i+1);
    strncpy(s+i,s2,n2);
    i+=vt;n+=n2-n1;
    }
    else i++;
    }

    }
    main()
    {
    cout<<"Nhap vao doan van ban: ";
    gets(s);
    cout<<"Nhap vao tu can tim: ";
    gets(s1);
    cout<<"Nhap vao tu thay the: ";
    gets(s2);
    thay();
    cout<<"Doan van ban sau khi thay the la:";
    puts(s);

    }
    C++ Code:
    1. #include<iostream>
    2. #include<string.h>
    3. using namespace std;
    4. int i=0,j,n,n1,n2,vt;
    5. char s[500],s1[500], s2[500];
    6. void thay()
    7. {
    8. n=strlen(s);n1=strlen(s1);n2=strlen(s2);
    9. while(s[i]){
    10.  
    11. j=0;vt=i;
    12. while(s1[j]&&s[vt]==s1[j]) {
    13.  
    14. vt++;j++;}
    15. if(j==n1)
    16. {
    17. memmove(s+i+n2,s+i+n1,n-n1-i+1);
    18. strncpy(s+i,s2,n2);
    19. i+=vt;n+=n2-n1;//               <-------phải là i+=vt không, hay là i=vt
    20. }
    21. else i++;
    22. }  
    23.  
    24. }
    25. main()
    26. {
    27. cout<<"Nhap vao doan van ban: ";
    28. gets(s);
    29. cout<<"Nhap vao tu can tim: ";
    30. gets(s1);
    31. cout<<"Nhap vao tu thay the: ";
    32. gets(s2);
    33. thay();
    34. cout<<"Doan van ban sau khi thay the la:";
    35. puts(s);
    36.  
    37. }

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    447

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    ...
    Mình có ý này. Gọi s(0) là đoạn văn bản nhập vào, r(0) là một xâu rỗng (r(0) = ""), u là xâu con cần tìm (u = "child"), v là xâu để thay thế (v = "children").

    Với k = 0, 1, 2,... phân tích s(k) thành x(k) y(k), với x(k) là xâu con dài nhất không chứa u. Nếu y(k) = "" trả lại kết quả là r(k+1) = r(k) x(k). Nếu không, phân tích y(k) thành u s(k+1) và đặt r(k+1) = r(k) x(k) v.
    Trên là thuật toán, còn dưới đây là code.
    C++ Code:
    1. #include<iostream>
    2. #include<string>
    3. using namespace std;
    4. string thay(const string& s, const string& u, const string& v)
    5. {
    6.     if(u == "") return s;
    7.     string r;
    8.     for(size_t sk = 0;;){
    9.         size_t yk = min(s.find(u,sk),s.length()+1);
    10.         r += string(s,sk,yk-sk);
    11.         if( yk > s.length() ) return r;
    12.         r += v;
    13.         sk = yk + u.length();
    14.     }
    15. }
    16. int main()
    17. {
    18.     string s,s1,s2;
    19.     cout << "Doan van ban: ";
    20.     getline(cin,s);
    21.     cout << "Tu can tim: ";
    22.     cin >> s1;
    23.     cout << "Tu thay the: ";
    24.     cin >> s2;
    25.     cout << "Doan van ban sau khi thay the la: " << thay(s,s1,s2) << endl;
    26.     return 0;
    27. }
    Đã được chỉnh sửa lần cuối bởi Ada : 08-11-2017 lúc 06:25 PM. Lý do: Bug: quẩn khi u rỗng
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  9. #9
    Ngày gia nhập
    08 2017
    Bài viết
    356

    Code ở #8 biên dịch trong vài trường hợp có lỗi, phụ thuộc vào trình biên dịch.
    Cụ thể với Embarcadero C++ 7.20 for Win32 báo lỗi sau:
    EmbComp Code:
    1. error: use of undeclared identifier 'min'
    2. size_t yk = min(s.find(u,sk),s.length()+1);

    Hàm min trong Embarcadero C++ nằm trong header khác
    C++ Code:
    1. ...
    2. #include <algorithm>
    3. ...

    Với trình biên dịch khác nó làm việc đúng, ví dụ vc, gcc.

    Trong vài ngôn ngữ khác, ví dụ java, nó cung cấp luôn cả mã nguồn cài đặt thuật toán (hàm hay phương thức)
    Đã được chỉnh sửa lần cuối bởi Monre : 08-11-2017 lúc 03:31 PM.

  10. #10
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    447

    Cảm ơn Monre. Mình mới chỉ thử với gcc thôi.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Tags của đề tài này

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