Lập trình C/C++

Kỹ thuật dùng con trỏ thao tác với mảng một chiều

Kỹ thuật dùng con trỏ thao tác với mảng một chiều
Được viết bởi Minh Hoàng

Series lập trình C/C++, ngôn ngữ lập trình hệ thống mạnh mẽ.

– Trong nội dung của bài viết này, mình sẽ trình bày cách dùng con trỏ thao tác với mảng 1 chiều trong lập trình C.
Nội dung gồm các phần như sau:

  1. Nhập, xuất mảng các số nguyên
  2. Thêm một phần tử vào mảng
  3. Xóa một phần tử khỏi mảng
  4. Hàm main thực hiện chương trình

– Vì bài viết có liên quan đến kiến thức của các phần bên dưới nên các bạn có thể xem lại nếu cần nhé:

  1. Con trỏ là gì? Có ăn được không?
  2. Cấp phát và giải phóng bộ nhớ trong lập trình C
  3. Mảng 1 chiều trong lập trình C
  4. Mối liên hệ giữa con trỏ và mảng 1 chiều
  5. Hàm và cách sử dụng trong lập trình C/C++
  6. Tham trị, tham chiếu trong lập trình C/C++

– Ở bài viết các kỹ thuật trên mảng 1 chiều (không sử dụng con trỏ) đã giải thích chi tiết các kỹ thuật thao tác với mảng một chiều rồi nên bài viết này mình chỉ tập trung vào cách sử dụng con trỏ thao tác với mảng một chiều thôi.

1. Nhập, xuất mảng các số nguyên
1. Nhập, xuất mảng các số nguyên
[code language=”c” highlight=”2,12″] // Hàm nhập mảng
void NhapMang(int *a, int n)
{
for (int ii = 0; ii < n; ii++)
{
printf("\nNhap vao a[%d] = ", ii);
scanf_s("%d", &a[ii]);
}
}

// Hàm xuất mảng
void XuatMang(int *a, int n)
{
for (int ii = 0; ii < n; ii++)
{
printf("%4d", a[ii]);
}
}
[/code]

2. Thêm một phần tử vào mảng
2. Thêm một phần tử vào mảng
[code language=”c” highlight=”2″] // Hàm thêm 1 phần tử vào 1 vị trí trong mảng
void ThemPhanTu(int *a, int *n, int PhanTuThem, int ViTriThem)
{
// Gia tăng bộ nhớ thêm 1 ô trước khi thêm phần tử
// (Khi dùng realloc thì truyền a, nó sẽ hiểu là truyền tham chiếu)
realloc(a, ((*n) + 1) * sizeof(int *));

for (int ii = (*n); ii >= ViTriThem + 1; ii–)
{
//SAU = TRƯỚC
a[ii] = a[ii – 1];
}

// Tăng số lượng phần tử của mảng a
(*n)++;

a[ViTriThem] = PhanTuThem;
}
[/code]

3. Xóa một phần tử khỏi mảng
3. Xóa một phần tử khỏi mảng
[code language=”c” highlight=”2″] // Hàm xóa 1 phần tử tại 1 vị trí trong mảng
void XoaPhanTu(int a[], int *n, int ViTriXoa)
{
for (int ii = ViTriXoa + 1; ii <= (*n) – 1; ii++)
{
//SAU = TRƯỚC
a[ii – 1] = a[ii];
}

// Giảm số lượng phần tử của mảng a
(*n)–;

// Giảm bộ nhớ đi 1 ô (vì trên đã n– rồi nên sẽ realloc với n)
realloc(a, (*n) * sizeof(int *));
}
[/code]

4. Hàm main thực hiện chương trình
4. Hàm main thực hiện chương trình
[code language=”c”] #include <stdio.h>
#include <stdlib.h>

// Đặt hàm cần thực hiện chức năng cụ thể vào đây.

int main()
{
// Khai báo số lượng phần tử của mảng
int n;

// Nhập số phần tử của mảng và kiểm tra tính hợp lệ
do {
printf( "\nNhap so luong phan tu cua mang: " );
scanf_s( "%d", &n );

if (n <= 0) {
printf( "So luong phan tu cua mang khong hop le." );
}
} while ( n <= 0 );

// Khai báo con trỏ và cấp phát bộ nhớ
int *a = (int *)malloc(n * sizeof(int *));

// Nhập
NhapMang( a, n );

// Xuất
printf( "\nMang vua nhap la: " );
XuatMang( a, n );

// Thêm phần tử (Vị trí thêm hợp lệ: 0 -> n)
int ViTriThem, PhanTuThem;

do {
printf( "\nNhap vi tri them (0 -> %d): ", n );
scanf_s( "%d", &ViTriThem );

if ( ViTriThem < 0 || ViTriThem > n )
{
printf( "\nVi tri them khong hop le (0 -> %d).", n );
}
} while ( ViTriThem < 0 || ViTriThem > n );

printf( "Nhap phan tu them: " );
scanf_s( "%d", &PhanTuThem );

ThemPhanTu( a, &n, PhanTuThem, ViTriThem );
printf( "Mang sau khi them phan tu %d vao vi tri %d la: ", PhanTuThem, ViTriThem );
XuatMang( a, n );

// Xóa phần tử ( Vị trí xóa hợp lệ: 0 -> n – 1 )
int ViTriXoa;

do {
printf( "\nNhap vi tri xoa (0 -> %d): ", n – 1 );
scanf_s( "%d", &ViTriXoa );

if ( ViTriXoa < 0 || ViTriXoa > (n – 1) )
{
printf( "\nVi tri xoa khong hop le (0 -> %d).", n – 1 );
}
} while ( ViTriXoa < 0 || ViTriXoa > (n – 1) );

XoaPhanTu( a, &n, ViTriXoa );
printf( "Mang sau khi xoa phan tu tai vi tri %d la: ", ViTriXoa );
XuatMang( a, n );

// Giải phóng vùng nhớ
free( a );

getch();
return 0;
}
[/code]

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »