30/09/2018, 20:27
Giải thích giùm mình đoạn code xóa phần tử trong mảng
Giải thích giùm mình đoạn code xóa phần tử trong mảng này với
Bài liên quan
Giải thích giùm mình đoạn code xóa phần tử trong mảng này với
Code này dùng để xóa hết tất cả các phần tử có giá trị x trong mảng.
Bạn thử nghĩ với trường hợp trong mảng không có phần tử nào có giá trị x, nghĩa là dòng ``` if(a[i] == x) count++; ``` sẽ không bao giờ được chạy. Vậy thì count sẽ luôn bằng 0, và a[i - count] sẽ là a[i] mà ``` a[i] = a[i]; ``` thì nó vẫn giữ nguyên giá trị của mọi phần tử trong mảng.
Bây giờ thử với trường hợp trong mảng có 1 phần tử có giá trị x = 3.
với mảng đc cho là
Khi vòng lặp đi từ phần tử giá trị 1 đến phần tử giá trị 2, lệnh được chạy trong vòng lặp vẫn là
sau đó thì nó bắt gặp phần tử giá trị là 3 có chỉ số trong mảng là 2. Nó thực hiện tăng count lên 1.
Vậy thì trong những lần chạy còn lại.
đồng nghĩa với việc lấy phần tử hiện tại để lấp vào phần tử đứng trước. Lấp bao nhiêu lần thì tùy thuộc vào số phần tử giá trị x mà biến count đếm được.
Vậy giả sử phần tử x nó nằm cuối mảng thì sao?
Thì nó vẫn đếm vào nhưng không có phần tử nào để lấp vào đó.
Thế nên khi ra khỏi vòng lặp for, ta cho số phần tử hiện tại của mảng
bằng với số phần tử của mảng ban đầu trừ đi số lần xuất hiện giá trị x.
Mình hiểu rồi! Cảm ơn bạn!
À! Còn nếu như muốn xóa 1 phần tử mà trước khi xóa, phần tử đó nằm ở vị trí nào thì nó sẽ TỰ ĐỘNG XÁC ĐỊNH vị trí của phần tử đó và xóa nó đi! Thì phải làm sao?
Vd: a[5] = {1,2,3,4,5}.
Muốn xóa phần tử giá trị 2 thì nó sẽ tự động xác định phần tử 2 nằm ở vị trí thứ 1 và xóa đi?
Đề bài xóa tất cả các phần tử 5 trong mảng:
int arr[5] = {5,5,5,5,5}
code trên có hoạt động không ?
Lấy code có mấy dòng, gõ lại và cho chạy thử chứ hỏi gì, không thì viết lên bảng rồi phân tích.
ai có thể giải thích làm sao để nghĩ ra được code như vậy không?
Viết ra code như vậy thì bạn thật hiểu về vòng lặp và ứng dụng của nó. Vòng lặp bạn nên cho trình biên dịch chạy step-by-step thì bạn sẽ biết nó diễn ra như thế nào. Mình nghĩ giải thuật bạn không tốt thì bạn nên nháp thuật toán trước khi làm
Sao nghe chưa được thuyết phục cho lắm
Thật sự đây cũng không phải là code xóa phần tử mảng :v, do chúng ta tự hiểu như vậy thôi, không tin thì bạn cứ thử gọi tới phần tử mà bạn đã coi là xóa đó xem nó có giá trị không ???
vì sao lại có dòng code n -= count, cái biến n này cũng do bạn tự đặt ra chứ thật sự nó đâu phải là chiều dài của mảng đâu, mảng vẫn như vậy chỉ có điều là bạn copy giá trị đẩy lên trên thôi
Đơn giản và dễ tưởng tượng là bạn có một chồng hộp tượng trưng cho mảng như sau
Công việc xoá mảng giống như việc đẩy 1 hộp có giá trị nào đó ra khỏi chồng hộp
Ví du xoá [ 2 ]
khi đến vị trí [ 3 ]
Hộp có giá trị 3 sẽ rơi ở độ cao = những phần tử bị lấy ra. Hộp [ 1 ] cũng rơi như thế cho đến hộp cuối
Như thế biến count sẽ tính độ cao của hộp bị rơi xuống cùng ý nghĩa, sẽ tính được độ cao mới. Từ đó sẽ viết dc code như trên
Hỏi để bạn đó nhận ra code bị bug trường hợp kiểu như trên, đọc kĩ mọi thứ và suy nghĩ trước khi comment nhé
Mình nghĩ là nó không bị lỗi. Trong th của bạn, bạn nghĩ lí do bug là gi?