Xem thêm

Các thao tác trên Mảng một chiều trong C++

Huy Erick
Giới thiệu Trong bài viết trước đó, chúng ta đã tìm hiểu về khái niệm và cách sử dụng mảng một chiều trong C++. Hôm nay, chúng ta sẽ đi vào chi tiết về các...

Giới thiệu

Trong bài viết trước đó, chúng ta đã tìm hiểu về khái niệm và cách sử dụng mảng một chiều trong C++. Hôm nay, chúng ta sẽ đi vào chi tiết về các thao tác trên mảng một chiều trong C++.

Nội dung

Để đọc hiểu bài này tốt nhất, bạn nên có kiến thức cơ bản về:

  • Vòng lặp for trong C++
  • Mảng một chiều trong C++

Trong bài viết này, chúng ta sẽ cùng tìm hiểu các vấn đề sau:

  • Truyền mảng vào hàm
  • Nhập và xuất mảng một chiều
  • Sao chép mảng một chiều
  • Tìm kiếm phần tử trong mảng
  • Sắp xếp mảng một chiều
  • Thêm và xóa một phần tử trong mảng

Truyền mảng vào hàm

Trong bài viết trước về truyền giá trị cho hàm, chúng ta đã biết khi một biến truyền vào hàm theo phương pháp truyền giá trị, C++ sẽ sao chép giá trị của đối số vào tham số của hàm. Tuy nhiên, khi truyền mảng vào hàm, tham số của hàm chính là địa chỉ vùng nhớ của phần tử đầu tiên trong mảng. Vì vậy, mảng có thể thay đổi nội dung sau khi thực hiện hàm.

Lưu ý khi truyền mảng vào hàm:

  • Tham số kiểu mảng trong khai báo hàm giống như khai báo biến mảng.
void NhapMang(int a[100]);
  • Tham số kiểu mảng truyền cho hàm chính là địa chỉ của phần tử đầu tiên của mảng.
    • Có thể bỏ số lượng phần tử hoặc sử dụng con trỏ.
    • Mảng có thể thay đổi nội dung sau khi thực hiện hàm.
void NhapMang(int a[]);
void NhapMang(int *a);
  • Số lượng phần tử thực sự truyền qua biến khác.
void NhapMang(int a[100], int n);
void NhapMang(int a[], int n);
void NhapMang(int *a, int n);

Tất cả các ví dụ bên dưới sẽ sử dụng phương pháp truyền mảng vào hàm.

Nhập và xuất mảng một chiều

Dưới đây là ví dụ về nhập, xuất dữ liệu cho mảng một chiều:

#include 
#include  // for srand() and rand()
#include  // for time()

using namespace std;

#define MAX 1000

void nhapMang(int arr[], int &n);
void xuatMang(int arr[], int n);

int main() {
  int myArray[MAX];
  int nSize;

  nhapMang(myArray, nSize);
  xuatMang(myArray, nSize);

  return 0;
}

void nhapMang(int arr[], int &n) {
  srand(time(NULL));
  cout << "Nhap so luong phan tu n : ";
  cin >> n;

  for (int i = 0; i < n; i++) {
    arr[i] = rand();
  }
}

void xuatMang(int arr[], int n) {
  for (int i = 0; i < n; i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }
}

Các thao tác trên Mảng một chiều

Sao chép mảng một chiều

Ý tưởng: Để tạo ra một bản sao từ một mảng, bạn cần khai báo thêm một mảng khác có cùng kích thước với mảng ban đầu.

Chương trình:

#include 
#include  // for srand() and rand()
#include  // for time()
#include 

using namespace std;

#define MAX 1000

void nhapMang(int arr[], int &n);
void xuatMang(int arr[], int n);
void saoChepMangMotChieu(int arrDest[], int arrSource[], int n);

int main() {
  int myArray[MAX];
  int nSize;

  nhapMang(myArray, nSize);
  xuatMang(myArray, nSize);

  int myArray2[MAX];

  saoChepMangMotChieu(myArray2, myArray, nSize);

  xuatMang(myArray2, nSize);

  return 0;
}

void nhapMang(int arr[], int &n) {
  srand(time(NULL));
  cout << "Nhap so luong phan tu n : ";
  cin >> n;

  for (int i = 0; i < n; i++) {
    arr[i] = rand();
  }
}

void xuatMang(int arr[], int n) {
  for (int i = 0; i < n; i++) {
    cout << "array[" << i << "] = " << arr[i] << endl;
  }
}

void saoChepMangMotChieu(int arrDest[], int arrSource[], int n) {
  for (int i = 0; i < n; i++) {
    arrDest[i] = arrSource[i];
  }
}

Các thao tác trên Mảng một chiều

Tìm kiếm phần tử trong mảng

Yêu cầu: Tìm xem phần tử x có nằm trong mảng myArray có kích thước n hay không? Nếu có thì nó nằm ở vị trí đầu tiên nào?

Ý tưởng: Xét từng phần tử của mảng myArray. Nếu phần tử đang xét bằng x thì trả về vị trí đó. Nếu không tìm được thì trả về -1.

Chương trình:

#include 
#include  // for srand() and rand()
#include  // for time()
#include 

using namespace std;

#define MAX 1000

void nhapMang(int arr[], int &n);
void xuatMang(int arr[], int n);
int timKiemPhanTuDauTien(int arr[], int n, int x);

int main() {
  int myArray[MAX];
  int nSize;

  nhapMang(myArray, nSize);
  xuatMang(myArray, nSize);

  int x;
  cout << "Nhap phan tu x can tim: ";
  cin >> x;

  int idx = timKiemPhanTuDauTien(myArray, nSize, x);
  if (idx != -1)
    cout << "x nam tai vi tri thu " << idx << endl;

  return 0;
}

void nhapMang(int arr[], int &n) {
  srand(time(NULL));
  cout << "Nhap so luong phan tu n : ";
  cin >> n;

  for (int i = 0; i < n; i++) {
    arr[i] = rand();
  }
}

void xuatMang(int arr[], int n) {
  for (int i = 0; i < n; i++) {
    cout << "array[" << i << "] = " << arr[i] << endl;
  }
}

int timKiemPhanTuDauTien(int arr[], int n, int x) {
  for (int i = 0; i < n; i++) {
    if (arr[i] == x)
      return i;
  }
  return -1;
}

Các thao tác trên Mảng một chiều

Các thao tác trên Mảng một chiều

Sắp xếp mảng một chiều

Yêu cầu: Cho trước mảng myArray có kích thước n. Hãy sắp xếp mảng a đó sao cho các phần tử có giá trị tăng dần.

Ý tưởng: Sử dụng 2 biến i và j để so sánh tất cả các cặp phần tử với nhau và hoán vị các cặp nghịch thế (sai thứ tự).

Chương trình:

#include 
#include  // for srand() and rand()
#include  // for time()
#include 

using namespace std;

#define MAX 1000

void nhapMang(int arr[], int &n);
void xuatMang(int arr[], int n);
void hoanVi(int &a, int &b);
void sapXepTang(int arr[], int n);

int main() {
  int myArray[MAX];
  int nSize;

  nhapMang(myArray, nSize);
  xuatMang(myArray, nSize);

  sapXepTang(myArray, nSize);

  return 0;
}

void nhapMang(int arr[], int &n) {
  srand(time(NULL));
  cout << "Nhap so luong phan tu n : ";
  cin >> n;

  for (int i = 0; i < n; i++) {
    arr[i] = rand();
  }
}

void xuatMang(int arr[], int n) {
  for (int i = 0; i < n; i++) {
    cout << "array[" << i << "] = " << arr[i] << endl;
  }
}

void hoanVi(int &a, int &b) {
  int temp = a;
  a = b;
  b = temp;
}

void sapXepTang(int arr[], int n) {
  for (int i = 0; i < n - 1; i++) {
    for (int j = i + 1; j < n; j++) {
      if (arr[i] > arr[j])
        hoanVi(arr[i], arr[j]);
    }
  }
}

Các thao tác trên Mảng một chiều

Thêm và xóa một phần tử trong mảng

Thêm một phần tử vào mảng

Yêu cầu: Thêm phần tử x vào mảng myArray có kích thước n tại vị trí idx.

Ý tưởng:

  • "Đẩy" các phần tử bắt đầu tại vị trí idx sang phải 1 vị trí.
  • Đưa x vào vị trí idx trong mảng.
  • Tăng n lên 1 đơn vị.

Chương trình:

#include 
#include  // for srand() and rand()
#include  // for time()
#include 

using namespace std;

#define MAX 1000

void nhapMang(int arr[], int &n);
void xuatMang(int arr[], int n);
void themMotPhanTuVaoMang(int a[], int &n, int idx, int x);

int main() {
  int myArray[MAX];
  int nSize;

  nhapMang(myArray, nSize);
  xuatMang(myArray, nSize);

  int idx;
  cout << "Nhap vi tri can them: ";
  cin >> idx;
  int x;
  cout << "Nhap gia tri can them: ";
  cin >> x;

  themMotPhanTuVaoMang(myArray, nSize, idx, x);

  xuatMang(myArray, nSize);

  return 0;
}

void nhapMang(int arr[], int &n) {
  srand(time(NULL));
  cout << "Nhap so luong phan tu n : ";
  cin >> n;

  for (int i = 0; i < n; i++) {
    arr[i] = rand();
  }
}

void xuatMang(int arr[], int n) {
  for (int i = 0; i < n; i++) {
    cout << "array[" << i << "] = " << arr[i] << endl;
  }
}

void themMotPhanTuVaoMang(int a[], int &n, int idx, int x) {
  if (idx >= 0 && idx <= n) {
    for (int i = n; i > idx; i--)
      a[i] = a[i - 1];

    a[idx] = x;
    n++;
  }
}

Các thao tác trên Mảng một chiều

Xóa một phần tử trong mảng

Yêu cầu: Xóa một phần tử trong mảng a có kích thước n tại vị trí vt

Ý tưởng:

  • "Kéo" các phần tử bên phải vị trí idx sang trái 1 vị trí.
  • Giảm n xuống 1 đơn vị.

Chương trình:

#include 
#include  // for srand() and rand()
#include  // for time()
#include 

using namespace std;

#define MAX 1000

void nhapMang(int arr[], int &n);
void xuatMang(int arr[], int n);
void xoaMotPhanTuTrongMang(int a[], int &n, int idx);

int main() {
  int myArray[MAX];
  int nSize;

  nhapMang(myArray, nSize);
  xuatMang(myArray, nSize);

  int idx;
  cout << "Nhap vi tri can xoa: ";
  cin >> idx;

  xoaMotPhanTuTrongMang(myArray, nSize, idx);

  xuatMang(myArray, nSize);

  return 0;
}

void nhapMang(int arr[], int &n) {
  srand(time(NULL));
  cout << "Nhap so luong phan tu n : ";
  cin >> n;

  for (int i = 0; i < n; i++) {
    arr[i] = rand();
  }
}

void xuatMang(int arr[], int n) {
  for (int i = 0; i < n; i++) {
    cout << "array[" << i << "] = " << arr[i] << endl;
  }
}

void xoaMotPhanTuTrongMang(int a[], int &n, int idx) {
  if (idx >= 0 && idx < n) {
    for (int i = idx; i < n - 1; i++)
      a[i] = a[i + 1];

    n--;
  }
}

Các thao tác trên Mảng một chiều

Kết luận

Qua bài viết này, bạn đã biết được Các thao tác trên Mảng một chiều trong C++. Còn rất nhiều thao tác khác trên mảng một chiều, trong phạm vi bài viết không thể đề cập hết được. Hãy tự mình tìm hiểu và chia sẻ ý kiến của bạn để bài viết được hoàn thiện hơn.

1