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

Đề tài: hỏi về xóa phần tử trong mảng

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

    Angry hỏi về xóa phần tử trong mảng

    Code:
    #include <iostream.h>
    void xoa( int mang[] , int &n , int x );
    const int a =100;
    int mang[a] = {0};
    int main()
    {
    	cout << "nhap vao so phan tu mang:";
    	int n;
    	cin >> n;
    	cout << "phan tu trong mang la:";
    	for(int i = 0 ; i < n ; i++)
    	{
    		cin >> mang[i];
    	}
    
    	cout << "Nhap vi tri xoa:";
    	int x; 
    	cin >> x;
    	if( x < 0  || x >=n)
    	{
    		cout <<" Vi tri khong hop le!!";
    		cout<<endl;
    		return 0;
    	}
    	
    	xoa(mang,n,x);
    	for(int j = 0 ; j< n ; j++)
    		cout<<mang[j]<<" ";
    	cout<<endl;
    return 0;
    }
    void xoa( int mang[] , int &n , int x )// tai sao cho nay la &n moi mat so 5 o cuoi
    {
    	for(int i = x , j = x+1 ; i<n;i++,j++)
    		mang[i] = mang[j];
    	n--;
    }
    //	1 2 3 4 5		x = 2
    //		x =2 , i =2  j = 3 ; n =5
    //	1 2 4 4 5  n = 4
    
    //  i = 3 , j =4 ; 3 <4
    //  1 2 4 5 5 n = 3
    
    //  i =4 , j =5 ,4 < 3 thoat
    em nhập vào 5 phần tử
    1 2 3 4 5
    sau đó em nhập vị trí xóa là 2
    mảng xóa sẽ là 1 2 4 5

    em thắc mắc không hiểu tại sao khi dùng &n thì sẽ mất số cuối trong mảng sau khi xoá ,còn không có thì số cuối cùng là 0

  2. #2
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    em nhập vào 5 phần tử
    1 2 3 4 5
    sau đó em nhập vị trí xóa là 2
    mảng xóa sẽ là 1 2 4 5

    em thắc mắc không hiểu tại sao khi dùng &n thì sẽ mất số cuối trong mảng sau khi xoá ,còn không có thì số cuối cùng là 0
    cậu đang nói &n ở đâu thế,mình không test kỹ nhưng mình gặp lỗi như cậu đâu,cậu xem lại đi,dùng IDE nào

  3. #3
    Ngày gia nhập
    06 2008
    Bài viết
    25

    Trích dẫn Nguyên bản được gửi bởi tranphuoctien Xem bài viết
    em nhập vào 5 phần tử
    1 2 3 4 5
    sau đó em nhập vị trí xóa là 2
    mảng xóa sẽ là 1 2 4 5

    em thắc mắc không hiểu tại sao khi dùng &n thì sẽ mất số cuối trong mảng sau khi xoá ,còn không có thì số cuối cùng là 0
    Khi dùng &n bị mất 1 số là do có n--
    Còn khi ko có &, n vẫn như cũ là bằng 5.
    mang[i] = mang[j]; --(vòng lặp cuối)--> mang[4] = mang[5];
    mang[5] chứa 0, nên mang[4] = 0. Vậy là số cuối cùng mang[4] = 0

  4. #4
    Ngày gia nhập
    04 2008
    Nơi ở
    HCMC
    Bài viết
    251

    Mảng đi từ 0 vì thế mà trong hàm xóa của bạn thì vòng for phải chạy từ i = x-1 và j = x
    C++ Code:
    1. #include <iostream.h>
    2. void xoa( int mang[] , int &n , int x );
    3. const int a =100;
    4. int mang[a] = {0};
    5. int main()
    6. {
    7.     cout << "nhap vao so phan tu mang:";
    8.     int n;
    9.     cin >> n;
    10.     cout << "phan tu trong mang la:";
    11.     for(int i = 0 ; i < n ; i++)
    12.     {
    13.         cin >> mang[i];
    14.     }
    15.  
    16.     cout << "Nhap vi tri xoa:";
    17.     int x;
    18.     cin >> x;
    19.     if( x < 1  || x >n) //cho nay nen de x <1 va x> n vì vị trí tính từ 1 mà
    20.     {
    21.         cout <<" Vi tri khong hop le!!";
    22.         cout<<endl;
    23.         return 0;
    24.     }
    25.    
    26.     xoa(mang,n,x);
    27.     for(int j = 0 ; j< n ; j++)
    28.         cout<<mang[j]<<" ";
    29.     cout<<endl;
    30. return 0;
    31. }
    32. void xoa( int mang[] , int &n , int x )// tai sao cho nay la &n moi mat so 5 o cuoi
    33. {
    34.     for(int i = x-1 , j = x ; i<n;i++,j++)
    35.         mang[i] = mang[j];
    36.     n--;
    37.     cout<<"Gia tri cua n la: "<<n<<endl;
    38. }
    39. //  1 2 3 4 5       x = 2
    40. //      x =2 , i =2  j = 3 ; n =5
    41. //  1 2 4 4 5  n = 4
    42.  
    43. //  i = 3 , j =4 ; 3 <4
    44. //  1 2 4 5 5 n = 3
    45.  
    46. //  i =4 , j =5 ,4 < 3 thoat

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

    Bạn luugiavn ơi , mình đang thắc mắc ở cái đoạn mình chạy từng bước trên code ở cuối đó, bạn nói là vòng lặp cuối là mang[4] = mang[5] nhưng trong điều kiện của mình thì i<n nên chỉ chạy là mang[3] = mang[4] là thoát rồi .Bạn xem thử xem ,có gì bạn trả lời lại cho mình , thanks

  6. #6
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mặc định hỏi về xóa phần tử trong mảng

    Bạn luugiavn ơi , mình đang thắc mắc ở cái đoạn mình chạy từng bước trên code ở cuối đó, bạn nói là vòng lặp cuối là mang[4] = mang[5] nhưng trong điều kiện của mình thì i<n nên chỉ chạy là mang[3] = mang[4] là thoát rồi .Bạn xem thử xem ,có gì bạn trả lời lại cho mình , thanks
    Tất nhiên là vòng cuối là mang[3] = mang[4] chứ không phải 4 và 5, vì trong TH này mảng 5 phần tử: từ 0 đến 4.

    Code:
    void xoa( int mang[] , int &n , int x )// tai sao cho nay la &n moi mat so 5 o cuoi
    Lý do là phải truyền vào tham biến thì giá trị n mới bị thay đổi sau khi kết thúc hàm.

    Mình đưa ra hàm xóa theo cách mình hay làm
    C Code:
    1. void xoa( int mang[] , int &n , int x )
    2. {
    3.     for(int i = x-1; i<n-1;i++)
    4.         mang[i] = mang[i+1];
    5.     n--;
    6.     cout<<"Gia tri cua n la: "<<n<<endl;
    7. }
    Code trên bớt được nhiều cái đấy.

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

    trong bài này số phần tử của mảng là bằng n=5.
    vòng lặp của bạn là:
    for(int i = x , j = x+1 ; i<n;i++,j++)
    mang[i] = mang[j];
    với i=x=2,j=x+1=3 như vậy,
    i=2 < n=5 đúng mang[2]=mang[3] ,i++,j++:i=3,j=4
    i=3 < n=5 đúng mang[3]=mang[4] ,i++,j++:i=4,j=5
    i=4 < n=5 đúng mang[4]= mang[5],i++,j++:i=5,j=6
    i=5 < n=5 sai -> thoát
    rồi n-- thì n=4.
    như vậy:trong mảng ban đầu của ban có là:
    mang[0]=1,mang[1]=2,mang[2]=3,mang[3]=4,mang[4]=5,mang[5]=0,do n=5
    sau khi xóa thì mảng còn lại là:
    mang[0]=1,mang[1]=2,mang[2]=4,mang[3]=5,mang[4]=0,n chỉ còn là 4

    theo mình thì xóa ởvị trí thứ 2 thì phải xóa ở giá trị mang[1]=2 chứ vì mảng của ban xuất phát bằng giá trị là 0
    Luôn muốn hỏi

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

    ủa bạn ơi , n-- là mỗi lần lặp là giảm đi 1 n mà , tại sao tới vòng lặp cuối mới trừ đi 1 còn 4.
    còn xóa ở vị trí thứ 2 tức là phần tử thứ 3 trong mảng 5 phần tử . Vì mảng mình đếm từ 0 .
    Mình không hiểu ở đây là tại sao có &n trong khai báo hàm và trong vòng lặp có n-- .Mình có ghi ở cuối code đoạn mình chạy bằng tay đó bạn coi thử

  9. #9
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    &n sẽ làm thay đổi giá trị của n sau khi kết thúc hàm. Nếu ko có nó thì n-- là vô nghĩa.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

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

    cảm ơn các bạn giúp đỡ , mình đã hiểu rồi

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

  1. xóa các phần tử giống nhau trong mảng chỉ để lại 1 phần tử
    Gửi bởi trungbd trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 30
    Bài viết cuối: 12-08-2013, 04:01 PM
  2. Bài tập C xóa phần tử trùng nhau trong mảng 1 chiều để lại 1 phần tử
    Gửi bởi ronoa trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 06-01-2012, 10:46 PM
  3. Kỹ thuật C++0x Xóa không được 1 phần tử bất kì và xóa tại vị trí bất kì trong DSLK
    Gửi bởi datinh_o0o7 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 19-03-2011, 10:24 PM
  4. Bài tập C++ xóa sinh viên trong dssv , ai test dùm em , xóa sv thứ 3 mà nó toàn xóa sv thứ 4
    Gửi bởi prt_awm trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 08-11-2010, 02:24 PM
  5. Thuật toán trên C | Xóa phần tử trong dãy phần tử tăng dần?
    Gửi bởi quangphuit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-03-2010, 01:57 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