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

Đề tài: Vấn đề về con trỏ và mảng !

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

    Angry Vấn đề về con trỏ và mảng !

    1/Viết chương trình nối 2 mảng đã được sắp xếp thành 1 mảng được sắp xếp:
    VD:
    a={1;3;5} b={2;6} --> c={1;2;3;5;6}

    2/Viết chương trình cho phép nhập vào một chuỗi kí tự bất kỳ vào thực hiện kiểm tra xem chuỗi có kí tự số hay không?
    Nếu có tách số ra thành 1 mảng a riêng và thay kí tự số trong chuỗi kí tự bằng 1 khoảng trắng.

    VD: "Phongmay212-Lau2Coso98"
    -->str "Phongmay -Lau Coso "
    -->a={2;1;2;2;9;8}

    2 bài tập này đều áp dụng con trỏ đối với mảng. Mong các bạn giúp mình giải quyết 2 bài này để hiểu rõ hơn về việc áp dụng con trỏ đối với mảng. Chân thành cảm ơn !

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

    bài 1. tìm ptử nhỏ nhất trong cả 2 mảng.
    giả sử nó thuộc mảng arr1 ;
    duyệt các ptử của mảng arr2 ;
    Code:
    i=0;
    for(j=0;j<sizearr2;j++)
    {
      while(arr2[j]>arr1[i])
         i++ ;
       đẩy ptử arr1[i] lên thành arr1[i+1] 
       rồi chèn arr2[j] vào arr[i] ;
       i+=2 ; //nhảy lên ptử thứ i+2 
    }
    cái này mới là ý tưởng ban đầu mình chưa code thử nên pn thử xem sao có j tối mình code sau hehe(nếu ý tưởng đúng)
    còn bài 2 thì ko khó lắm bn tạo mảng char[10] từ 0-9 chỉ dùng strcmp vs nhau thôi
    cái nào đúng thì phang vào mảng số rùi thay nó trong mảng chính thôi.

    có sai gì pà kon góp ý thêm
    HT117-5277

  3. #3
    Ngày gia nhập
    03 2011
    Nơi ở
    TP.HCM
    Bài viết
    5

    Gợi ý câu 2:
    C++ Code:
    1. #include "iostream"
    2. #include "string.h"
    3. #include "stdlib.h"
    4. using namespace std;
    5. int main() {
    6.     int nq=0;
    7.     char *p; //khai bao con tro p
    8.     char q[100];
    9.     p= new char[100]; //cap phat bo nho
    10.     cout<<"Nhap vao mang: ";
    11.     cin.getline(p,100);
    12.     int n=strlen(p); //do dai chuoi vua nhap
    13.     for (int i=0;i<n;i++)
    14.     {
    15.         if(p[i]>='0'&&p[i]<='9')  // '0' va '9' la chu so
    16.         {
    17.             q[nq]=p[i];
    18.             nq++;
    19.             *(p+i)=' ';
    20.         }
    21.     }
    22.     cout<<"p= "<<p<<endl;
    23.     cout<<"q= { ";
    24.     for (int i=0;i<nq;i++)
    25.         cout<<q[i]<<"; ";
    26.     cout<<"}";
    27.     return 0;
    28. }

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

    Cảm ơn sự giúp đỡ của 2 bạn. Về bài 1, mình sẽ cố gắng code theo ý tưởng của bạn treatmaster vì nó khá hay. Còn bài 2 của bạn LHP, mình chạy rồi mà nó báo lỗi biến i ở 2 vòng for, tìm mãi vẫn chưa ra nguyên nhân, bạn giúp mình sửa lỗi với...

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

    Cả hai cách làm trên đều dựa trên ý tưởng bắt tôi làm bằng con trỏ thì tôi làm, chứ tôi không hề sử dụng đặc tính của con trỏ để tối ưu hóa code

    Nối hai mảng, dùng con trỏ:

    C Code:
    1. // nối hai mảng a và b đã sắp theo thứ tự qua mảng c
    2.  
    3. // nguyên tắc: liên tục tìm xem phần tử hiện tại của a và b, chép pt nhỏ hơn vào c
    4.  
    5. // đã có mảng a với n1 pt, mảng b với n2 pt, mảng c với n3 pt
    6. int *p1 = a, *p2 = b, *p3 = c;
    7. int *t1 = a+n1, *t2 = b+n2;// đuôi của các mảng
    8. int n3 = 0;
    9.  
    10. while (p1 <= t1 && p2 <= t2)
    11.   *(p3++) = (*p1 <= *p2)? *(p1++) : *(p2++); // chép phần tử nhỏ hơn vào c và nhảy tới pt kế tiếp
    12. while (p1 <= t1) *(p3++) = *(p1++);
    13. while (p2 <= t2) *(p3++) = *(p2++);
    14. n3 = n1+n2;

    Sửa chuỗi, bằng con trỏ:

    C Code:
    1. // code nhặt các ký tự số từ chuỗi s1 ra, cho vào chuỗi s2, và thay thế bằng dấu trống
    2.  
    3. char *p1 = s1-1, p2 = s2; // p1 sẽ được tăng tiến tố, p2 tăng hậu tố
    4. while (*++p1) // duyệt từ đầu đên cuối chuỗi
    5. {
    6.   if (*p1 >= '0' && *p1 <= '9')
    7.   {
    8.     *(p2++) = *p1;
    9.     *p1 = ' ';
    10.   }
    11. }
    12. *p2 = '\0'; // kết chuỗi;

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    207

    Wink Vấn đề về con trỏ và mảng !

    Trích dẫn Nguyên bản được gửi bởi WindJino Xem bài viết
    1/Viết chương trình nối 2 mảng đã được sắp xếp thành 1 mảng được sắp xếp:
    VD:
    a={1;3;5} b={2;6} --> c={1;2;3;5;6}

    2/Viết chương trình cho phép nhập vào một chuỗi kí tự bất kỳ vào thực hiện kiểm tra xem chuỗi có kí tự số hay không?
    Nếu có tách số ra thành 1 mảng a riêng và thay kí tự số trong chuỗi kí tự bằng 1 khoảng trắng.

    VD: "Phongmay212-Lau2Coso98"
    -->str "Phongmay -Lau Coso "
    -->a={2;1;2;2;9;8}

    2 bài tập này đều áp dụng con trỏ đối với mảng. Mong các bạn giúp mình giải quyết 2 bài này để hiểu rõ hơn về việc áp dụng con trỏ đối với mảng. Chân thành cảm ơn !
    sửa cái tiêu đề topic thành :
    Nối mảng & duyệt chuỗi dùng con trỏ
    kẻo toi cái topic thì mất công mọi người.

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

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Cả hai cách làm trên đều dựa trên ý tưởng bắt tôi làm bằng con trỏ thì tôi làm, chứ tôi không hề sử dụng đặc tính của con trỏ để tối ưu hóa code
    nếu em truyền vào hàm rồi thì mảng vs con trỏ cũng gần như nhau rồi.(ko pít nói có sai ko nhỉ)
    còn sử dụng con trỏ vs mảng chỉ khác nhau chỗ dấu "*" và "[]".vs lại đâu cần pức tạp hoá vđề lên jậy.mục đích cuối cùng vẫn là giải bài thôi mà anh.
    HT117-5277

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

    Con trỏ là con trỏ và mảng là mảng, không có chuyện gần nhau.
    Dùng con trỏ để duyệt mảng là tính cách hữu hiệu nhất của ngôn ngữ C.

    Toán tử * là toán tử lấy trị từ một địa chỉ (con trỏ). Toán tử [] là toán từ tính phần từ của mảng. Dùng * có hiệu quả cao hơn [] nhiều.
    *p = vật ở địa chỉ p ---> trực tiếp
    a[i] = từ địa chỉ a, tìm đến vật cách đấy i bước ---> gián tiếp

    Phức tạp hóa vấn đề?
    Nếu bài chỉ bảo giải thì dùng [] có lẽ trông dễ hiểu hơn, cái này để lúc khác bàn vì bàn ở đây không đúng chỗ.
    Vấn đề chính ở đây là bài bảo giải bằng con trỏ, bắt buộc phải làm bằng con trỏ:
    1. Làm có dính líu toán tử [] là không đạt yêu cầu
    2. Nếu không lợi dụng được hiệu suất cao của con trỏ thì có giải cũng không đạt yêu cầu.

    tb code C không quen thì thấy con trỏ phức tạp. Quen rồi thực sự thấy cũng gọn nhẹ như những thứ khác thôi.

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

    bài viết hay quá.thanks nhiều

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    207

    Trích dẫn Nguyên bản được gửi bởi treatmaster Xem bài viết
    nếu em truyền vào hàm rồi thì mảng vs con trỏ cũng gần như nhau rồi.(ko pít nói có sai ko nhỉ)
    còn sử dụng con trỏ vs mảng chỉ khác nhau chỗ dấu "*" và "[]".vs lại đâu cần pức tạp hoá vđề lên jậy.mục đích cuối cùng vẫn là giải bài thôi mà anh.
    ặc
    xem lại kiến thức cơ bản đi bạn
    con trỏ = động, mảng = tĩnh
    nếu chưa hiểu điều này thì bạn chưa nắm dc con trỏ rồi

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