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

Đề tài: vấn đề sử dụng đệ quy để thêm dấu sao vào giữa các ký tự trong chuỗi

  1. #1
    Ngày gia nhập
    09 2019
    Bài viết
    2

    Mặc định vấn đề sử dụng đệ quy để thêm dấu sao vào giữa các ký tự trong chuỗi

    chào mọi người. Mình có một bài tập như này:
    Nhập vào 1 chuỗi, viết hàm đệ quy trả về 1 chuỗi mới với điều kiện tất cả các kí tự kề nhau( trừ " ") đều có dấu * ở giữa. Chuỗi input phải nhỏ hơn 50 kí tự.

    Ví dụ:

    allStar("hello") → "h*e*l*l*o"


    allStar("abc hello") → "a*b*c h*e*l*l*o"


    allStar("abcde.") → "a*b*c*d*e*."

    với đoạn code mẫu:

    #include <iostream>
    #include <fstream>

    char* allStar(char* initialString){
    ...
    }

    int main(int argc, char* argv[]){
    std::ifstream inFile;
    char a[100];
    inFile.open(argv[1]);
    if (!inFile) {
    std::cout << "Unable to open file";
    exit(1); // terminate with error
    }
    inFile.getline(a,100,'\n');
    std::cout<<allStar(a);
    inFile.close();
    return 0;
    }
    Việc của mình là hoàn thiện hàm char* allStar để chương trình trả về kết quả đúng. Mình thấy khó vì hàm trả về kiểu char, mình đã suy nghĩ rất nhiều mà vẫn không biết làm.
    Mong mọi người gợi ý cho mình.
    Cảm ơn mọi người đã đọc.

  2. #2
    Ngày gia nhập
    08 2017
    Bài viết
    3,202

    Trích dẫn Nguyên bản được gửi bởi caoSuBinhPhuoc Xem bài viết
    chào mọi người. Mình có một bài tập như này:
    Nhập vào 1 chuỗi, viết hàm đệ quy trả về 1 chuỗi mới với điều kiện tất cả các kí tự kề nhau( trừ " ") đều có dấu * ở giữa. Chuỗi input phải nhỏ hơn 50 kí tự.

    Ví dụ:

    allStar("hello") → "h*e*l*l*o"


    allStar("abc hello") → "a*b*c h*e*l*l*o"


    allStar("abcde.") → "a*b*c*d*e*."

    với đoạn code mẫu:
    (...)

    Việc của mình là hoàn thiện hàm char* allStar để chương trình trả về kết quả đúng. Mình thấy khó vì hàm trả về kiểu char, mình đã suy nghĩ rất nhiều mà vẫn không biết làm.
    Mong mọi người gợi ý cho mình.
    Cảm ơn mọi người đã đọc.
    caoSu cần lưu hóa, thêm lưu huỳnh.
    du làm bằng người được không? Nếu được, caoSu nói cách làm đó, tôi dịch nó thành cốt cho caoSu.

    C Code:
    1. #include <iostream>
    2. #include <fstream>
    3.  
    4. char* allStar(char* initialString){
    5.     // TODO ...
    6.     return initialString;
    7. }
    8.  
    9. int main(int argc, char* argv[]){
    10.     std::ifstream inFile;
    11.     char a[100];
    12.     inFile.open(argv[1]);
    13.     if (!inFile) {
    14.         std::cout << "Unable to open file";
    15.         exit(1); // terminate with error
    16.     }
    17.     inFile.getline(a,100,'\n');
    18.     std::cout<<allStar(a);
    19.     inFile.close();
    20.     return 0;
    21. }

  3. #3
    Ngày gia nhập
    09 2019
    Bài viết
    2

    cảm ơn bạn đã đọc bài đăng của mình. ý tưởng của mình là copy từng ký tự ban đầu của chuỗi được nhập vào sang 1 chuỗi khác, mỗi lần copy một ký tự qua thì kiểm tra xem ký tự đó có phải ' ' hay không? Nếu không phải thì thêm '*' vào sau ký tự đó. Cứ đi như vậy cho đến ký tự cuối cùng thì kết thúc. Mình biết hiện thực ý tưởng đó bằng vòng lặp, nhưng ko biết viết bằng đệ quy. Code của mình:
    char* allStar(char* initialString){
    int i = 0, Count = 0, j = 0;
    char* newinitialString;
    while (initialString[i] != NULL)
    {
    i++;
    }
    Count = i;
    for(int i = 0; i <= Count; i++){
    newinitialString[j] = initialString[i];
    j++;
    if(initialString[i] != ' ' && initialString[i+1] != ' '){
    if(i < Count){
    newinitialString[j] = '*';
    j++;
    }
    }

    }
    return newinitialString;
    }

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    3,202

    Đọc từ Console
    C++ Code:
    1. #include <iostream>
    2. //#include <fstream>
    3.  
    4. using namespace std;
    5.  
    6. void Recurs(char* src, char* dst, int& i, int& j, int n){
    7.     const char whs = ' ';
    8.     if(i >= n) return;
    9.     //
    10.     if(src[i] != whs && src[i - 1] != whs)
    11.         dst[j++] = '*';
    12.     dst[j++] = src[i++];
    13.     //
    14.     Recurs(src, dst, i, j, n);
    15. }
    16.  
    17. char* allStar(char* src){ //initialString
    18.     int n = strlen(src);
    19.     if(!n) return src;
    20.    
    21.     char* dst = new char[2 * n - 1]; //newinitialString
    22.     dst[0] = src[0];
    23.     int i = 1, j = 1;
    24.  
    25.     Recurs(src, dst, i, j, n - 1);
    26.  
    27.     dst[j] = 0;
    28.     return dst;
    29. }
    30.  
    31. int main(){
    32.     char a[100];
    33.     cout << "input string: ";
    34.     fgets(a, 100, stdin);
    35.  
    36.     cout << allStar(a);
    37.     cout << "\nDone, bye.";
    38.    
    39.     return 0;
    40. }
    nó khác chút với đọc từ file:
    fgets(a, 100, stdin);
    so với
    inFile.getline(a,100,'\n');

    Vì sao cần đệ quy, nó có u điểm gì?

  5. #5
    Ngày gia nhập
    08 2017
    Bài viết
    3,202

    Thay đệ quy bằng lặp:
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. char* Loop(char* src, int n){  
    5.     const char whs = ' ';
    6.     char* dst = new char[2 * n - 1];
    7.     dst[0] = src[0];
    8.    
    9.     int k = 1;
    10.     for( int i = 1; i < n; i++){
    11.         if( src[i] != whs && src[i - 1] != whs)
    12.             dst[k++] = '*';
    13.         dst[k++] = src[i];
    14.     }
    15.    
    16.     dst[k] = 0;
    17.     return dst;
    18. }
    19. //
    20. char* allStar(char* src){//last char is '\n'
    21.     int n = strlen(src);
    22.  
    23.     if(n < 2) return src;
    24.    
    25.     return Loop(src, n - 1);
    26. }
    27.  
    28. int main(){
    29.     char a[100];
    30.     cout << "input string: ";
    31.     fgets(a, 100, stdin);
    32.  
    33.     cout << allStar(a);
    34.     cout << "\nDone, bye.";
    35.    
    36.     return 0;
    37. }
    Vì sao tách riêng hàm char* Loop mà không đặt trong hàm gọi char* allStar?
    + để so sánh với cách trên,
    + để phát triển theo OOP, lập trình hướng đối tượng, khi nào thuận tiện nói tiếp.

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

    Mặc định vấn đề sử dụng đệ quy để thêm dấu sao vào giữa các ký tự trong chuỗi

    Cảm ơn chủ thớt chia sẻ bài rất hữu.



    ------------------------------------------------------------------------------------------------------
    https://hungphatcontainer.vn/thue-co...ha-noi-gia-re/

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    3,202

    Bỏ cách làm có lãi, có sán đi nghen
    Trích dẫn Nguyên bản được gửi bởi antopho Xem bài viết
    Cảm ơn chủ thớt chia sẻ bài rất hữu.
    ------------------------------------------------------------------------------------------------------
    https://hứngphạtcontainer.vn/thue-co...ha-noi-gia-re/
    muốn quảng cáo thì bỏ tiền ra hợp đồng, cviet có nhận QC.

    Không làm ăn sống nhăn, kiểu chụp dựt, khách hàng nào tin tưởng.

    Thích, rảnh thì xem tổ chức theo OOP, mức thấp:
    http://diendan.congdongcviet.com/threads/t448065::exec-lib-dll-and-exe.cpp

  8. #8
    Ngày gia nhập
    08 2017
    Bài viết
    3,202

    Đọc từ file chỉ khác một tí

    C Code:
    1. #include <iostream>
    2. #include <fstream>
    3.  
    4. using namespace std;
    5.  
    6. extern "C" __declspec(dllimport) char* allStar(char*);
    7.  
    8. int main(int argc, char* argv[]){
    9.     char a[100] = "abc hello";
    10.     ifstream ifs;
    11.    
    12.     if (argc > 1) ifs.open(argv[1]);
    13.     else ifs.open("abc.txt");
    14.    
    15.     if (!ifs) {
    16.         cout << "Unable to open file";
    17.         return 1;
    18.     }
    19.    
    20.     ifs.getline(a, 100, '\n');
    21.     ifs.close();   
    22.     cout << "input string: " << a << endl;
    23.    
    24.     cout << "output string: " << allStar(a);
    25.     cout << "\nDone, bye.\n";
    26.    
    27.     return 0;
    28. }

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

    Nhắc lại: Vì sao cần đệ quy, nó có u điểm gì?

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

    Như bản gốc #1 hoặc #2, nó có cảnh báo, nó là nguyên nhân gây lỗi khi chạy như hình chụp

    cái sảy nảy cái ung

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