Xóa vào mảng một giá trị x tại vị trí k (nhập từ bàn phím).

Chèn phần tử vào mảng là một bài toán rất hay. Bài viết này mình sẽ chia sẻ cho bạn đọc code chèn phần tử vào vị trí k trong mảng C/C++.

1.Giới thiệu bài toán

Bài toán số 17 luyện tập lập trình mình chia sẻ cho các bạn dưới đây có đề bài như sau:

Viết hàm chèn một phần tử x vào vị trí k trong mảng 1 chiều a có n phần tử.

Hoặc có thể bạn sẽ gặp bài toán chèn vào sau hay trước vị trí k trong mảng. Cách giải bài toán đó không khác gì đề bài trên.

Đánh giá: Một bài toán ở mức vận dụng trung bình và cực kì hay. Bạn sẽ nhận được rất nhiều thứ khi tự mình hoàn thành bài tập này.

2.Giải quyết bài toán

Một câu hỏi ở mức vận dụng cơ bản đòi hỏi bạn nắm chắc kiến thức của ngôn ngữ đặc biệt là vòng lặp for.

Câu hỏi này không quá khó về mặt toán học, chỉ cần tư duy một xíu là giải được nhé!

2.1 Hàm chèn phần tử x vào vị trí k cho trước

Nếu như bạn đang làm bài toán chèn x vào trước vị trí k thì nó giống với việc bạn giảm k đi một đơn vị sau đó chèn.

Ngược lại bạn chèn x vào sau vị trí k thì đơn giản, tăng k lên một đơn vị sau đó chèn.

Ý tưởng giải bài toán:

  • Khi thêm một phần tử điều đầu tiên là chúng ta cần phải tăng tổng số phần tử của mảng lên.
  • Dùng vòng for duyệt từ cuối mảng tới vị trí k (>k). Phần tử đứng sau gán bằng phần tử đứng trước tức là a[i]=a[i-1]
  • Gán a[k]=x

Với ý tưởng giải của mình bên trên mình có hàm chèn x vào vị trí k như sau:

void InsertX(int a[], int &n, int x, int k){ n++; for(int i=n-1;i>k;i--) a[i]=a[i-1]; a[k]=x; }

hàm này sử dụng được cho cả hai ngôn ngữ C và C++.

Tương tự mình sẽ viết hàm chèn x vào trước k và sau nhé!

Chèn trước:

void InsertX(int a[], int &n, int x, int k){ n++; for(int i=n-1;i>k-1;i--) a[i]=a[i-1]; a[k-1]=x; }

Chèn sau:

void InsertX(int a[], int &n, int x, int k){ n++; for(int i=n-1;i>k+1;i--) a[i]=a[i-1]; a[k+1]=x; }

Bạn dựa vào gợi ý về ý tưởng làm bài của mình có thể dùng vào nhiều trường hợp khác nhau.

2.2 Chương chình chèn phần tử x vào vị trí k

Để hoàn thành chương trình, bạn lắp thêm cấu trúc nhập xuất mảng (làm việc với mảng). Viết thêm phần nhập x và k là có chương trình hoàn thiện

Code C++:

#include<bits/stdc++.h> using namespace std; void nhap(int a[], int &n){ do{ cout<<("Nhap n: "); cin>>n; } while(n<2||n>99); for(int i=0; i<n; i++){ cout<<"a["<<i<<"]: "; cin>>a[i]; } } void xuat(int a[], int n){ for(int i=0;i<n;i++){ cout<<" "<<a[i]; } } void InsertX(int a[], int &n, int x, int k){ n++; for(int i=n-1;i>k;i--) a[i]=a[i-1]; a[k]=x; } int main(){ int a[100]; int n, x,k; nhap(a,n); cout<<"\nNhap phan tu can chen: "; cin>>x; cout<<"Nhap vi tri can chen: "; cin>>k; InsertX(a,n,x,k); cout<<"Mang sau khi chen: "<<endl; xuat(a,n); return 0; }

Kết quả khi chạy chương trình trên:

Trong ví dụ, mình đã chèn số 3 vào vị trí 2. Số 4 đã bị đẩy về phía sau.

Bài viết đến đây là hết, cảm ơn bạn đã quan tâm bài viết. Đừng bỏ lỡ bài viết tiếp theo nhé!

Xem tiếp bài 18: Đếm số phần tử khác nhau trong mảng

Xem lại bài 16: Đếm số lần xuất hiện của phần tử trong mảng.

Tải về đề cương 67 bài tập lập trình C/C++

Viết chương trình thực hiện các công việc sau: Nhập một mảng có n phần tử nguyên từ bàn phím (n > 0). Sau đó nhập vào số nguyên k và xóa các phần tử trong mảng có giá trị bằng k.

Yêu cầu kỹ thuật: Chương trình phải kiểm tra n nhập vào: nếu n <= 0 thì cho nhập lại số phần tử cho đến khi thỏa mãn điều kiện.

Bài giải

-------------------- ######## --------------------

Bài giải

public static void main(String[] args) { int n, i, c; Scanner scanner = new Scanner(System.in); do { System.out.println("Nhập vào số phần tử của mảng: "); n = scanner.nextInt(); } while (n <= 0); int A[] = new int[n]; System.out.println("Nhập các phần tử cho mảng: "); for (i = 0; i < n; i++) { System.out.print("Nhập phần tử thứ " + i + ": "); A[i] = scanner.nextInt(); } System.out.println("Nhập số nguyên k: "); int k = scanner.nextInt(); // xóa phần tử k ra khỏi mảng // vòng lặp for sẽ khởi tạo c = i = 0 // và duyệt i từ 0 đến n // nếu phần tử tại vị trí i khác với số nguyên k // thì gán phần tử tại i cho phần tử tại k // sau đó tăng c lên 1 for (c = i = 0; i < n; i++) { if (A[i] != k) { A[c] = A[i]; c++; } } n = c; // lúc này số phần tử trong mảng sẽ bằng c // hiển thị các phần tử trong mảng sau khi xóa k System.out.println("Mảng còn lại sau khi xóa phần tử " + k + " là: "); for (i = 0; i < n; i++) { System.out.print(A[i] + "\t"); } }

Giải thích hoạt động của chương trình trên:

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Bước 1: Nhập vào số phần tử của mảng n = 5, các phần tử cho mảng A[0] = 1, A[1] = 2, A[2] = 2, A[3] = 3 và A[4] = 4 và số nguyên k cần xóa = 3.

Bước 2: Thực hiện vòng lặp for: Ban đầu khởi tạo c = i = 0. i = 0 < 5 nên thực hiện các lệnh trong thân vòng lặp, vì A[i] = 1 != 2 nên gán A[c] = A[i] = 1 và tăng c lên 1, lúc này c = 1.

Bước 3: Tăng i lên 1, i = 1 < 5 nên thực hiện các lệnh trong thân vòng lặp, vì A[i] = 2 = 2 nên bỏ qua không thực hiện lệnh trong thân vòng for.

Bài viết này được đăng tại [free tuts .net]

Bước 4: Tăng i lên 1, i = 2 < 5 nên thực hiện các lệnh trong thân vòng lặp, vì A[i] = 2 = 2 nên bỏ qua không thực hiện lệnh trong thân vòng for.

Bước 5: Tăng i lên 1, i = 3 < 5 nên thực hiện các lệnh trong thân vòng lặp, vì A[i] = 3 != 2 nên gán A[c] = A[i] = 3 và tăng c lên 1, lúc này c = 2.

Bước 6: Tăng i lên 1, i = 4 < 5 nên thực hiện các lệnh trong thân vòng lặp, vì A[i] = 4 != 2 nên gán A[c] = A[i] = 4 và tăng c lên 1, lúc này c = 3.

Bước 7: Tăng i lên 1, i = 5 không thỏa mãn điều kiện lặp nên bỏ qua không thực hiện lệnh trong thân vòng for.

Bước 8: Gán n = c, lúc này số phần tử trong mảng = c = 3.

Bước 9: Hiển thị các phần tử còn lại trong mảng là: 1     2     2     4

Kết quả sau khi biên dịch chương trình:

Câu hỏi thường gặp liên quan:

Cùng chuyên mục:

Trong các bài viết trước chúng ta đã làm quen với các kiến thức về mảng một chiều. Các bạn có thể xem lại các bài viết này ở link bên dưới. Hôm nay chúng ta tiếp tục làm quen với thao tác, thêm, xóa phần tử trên mảng.

Hàm Thêm vào mảng một giá trị x tại vị trí vt (kiểm tra tính hợp lệ của vt)

  • Kiểm tra nếu k ∈[0, n] thì:
    • Dời các phần tử từ vị trí n-1 đến k lùi lại 1 vị trí.
    • Thêm x vào vị trí thứ k của mảng, tăng n thêm 1.
void ThemPhanTu(int a[], int &n, int x, int vt) { if(vt>=0 && vt<=n) { for(int i=n; i>vt; i--) a[i] = a[i-1]; //Dịch các phần tử sang phải 1 vị trí a[vt]=x; //Thêm x vào vị trí vt n++; //Tăng số phần tử lên 1 } else printf("\nVi tri %d khong hop le.", vt); }

Hàm Xóa khỏi mảng một giá trị x

Để xóa một phần tử trong mảng ta phải Kiểm tra nếu x có tồn tại trong mảng thì:

  • Dời các phần tử sau x tới 1 vị trí.
  • Giảm n bớt 1.
int TimPhanTu(int a[], int n, int x) { for(int i=0; i<n; i++) if(a[i] == x) return i; //Tìm thấy x tại vị trí thứ i return -1; //Không tìm thấy x trong mảng } //======================================================================= void XoaPhanTu(int a[], int &n, int x) { int vt=TimPhanTu(a, n, x); //Tìm vị trí x trong mảng if(vt==-1) printf("\nKhong tim thay phan tu %d muon xoa.", x); else { for(int i=vt; i<=n-2; i++) a[i] = a[i+1]; //Dịch các phần tử sang trái 1 vị trí n--; //Giảm số phần tử bớt 1 } }

Video liên quan

Chủ đề