Lập trình C/C++

Mảng một chiều trong lập trình C/C++

Mảng một chiều trong lập trình C/C++
Đượ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 bài viết này chúng ta cùng tìm hiểu về mảng một chiều trong lập trình C/C++ với những nội dung sau:

  1. Mảng là gì? Có mấy loại mảng?
  2. Cách khai báo, khởi tạo và truy xuất mảng.
  3. Làm thế nào lấy được số phần tử của một mảng bất kỳ?
  4. Các kỹ thuật quan trọng trên mảng một chiều.
1. Mảng là gì? Có mấy loại mảng?
1. Mảng là gì? Có mấy loại mảng?

– Mảng là một kiểu dữ liệu có cấu trúc, là một tập hợp các phần tử có cùng kiểu dữ liệu.

– Một số tính chất của mảng:

  • Các phần tử của mảng nằm tại các ô nhớ liên tiếp nhau trong bộ nhớ máy tính.
  • Các phần tử của mảng có chỉ số bắt đầu từ 0 đến [tổng số phần tử – 1], chẳng hạn mảng có 10 phần tử thì chỉ số sẽ được tính từ 0 đến 9
  • Có thể truy xuất trực tiếp đến vị trí của 1 phần tử trong mảng bằng chỉ số tương ứng của nó, ví dụ muốn truy xuất đến phần tử thứ 5 trong mảng a thì ta sử dụng a[4]

– Có 2 loại mảng:

  1. Mảng tĩnh: là mảng được cấp phát vùng nhớ (số lượng phần tử của mảng) cố định ngay từ đầu và không thay đổi trong suốt quá trình chạy cho đến khi chương trình kết thúc. (Sẽ được trình bày trong bài viết này)
  2. Mảng động: là mảng được cấp phát hoặc chưa cấp phát vùng nhớ ngay từ đầu, và số lượng phần tử của mảng có thể thay đổi (tăng hoặc giảm) được trong suốt quá trình chạy cho đến khi chương trình kết thúc. (Sẽ được trình bày trong bài viết Mối liên hệ giữa mảng một chiều và con trỏ)
2. Cách khai báo, khởi tạo và truy xuất mảng
2. Cách khai báo, khởi tạo và truy xuất mảng

Khai báo mảng:

<Kiểu dữ liệu> <Tên mảng>[số phần tử]

Ví dụ: mảng số nguyên 5 phần tử int a[5], mảng ký tự 10 phần tử char ch[10],…

Khởi tạo mảng: chúng ta có thể khởi tạo giá trị cho từng phần tử của mảng hoặc cho một nhóm các phần tử:

Cách 1: Khai báo mảng và khởi tạo giá trị cho từng phần tử của mảng.

[code language=”c” highlight=”11,20,21,22″] #include <stdio.h>

int main()
{
int ii = 0;

/*
* Khai báo mảng kiểu nguyên a, có 10 phần tử
* Giá trị ban đầu của mỗi phần tử là giá trị rác
*/
int a[10];

/* Xem giá trị của mảng */
printf( "\nGia tri cua mang TRUOC khoi tao:\n" );
for (ii = 0; ii < 10;ii++) {
printf("a[%d] = %d\n", ii, a[ii]);
}

/* Khởi tạo giá trị cho từng phần tử */
for (ii = 0; ii < 10; ii++) {
a[ii] = ii + 1;
}

/* Xem giá trị của mảng */
printf( "\nGia tri cua mang SAU khoi tao:\n" );
for (ii = 0; ii < 10; ii++) {
printf("a[%d] = %d\n", ii, a[ii]);
}

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

 

Kết quả chương trình

Kết quả chương trình

Cách 2: Khai báo mảng và khởi tạo giá trị cho nhóm các phần tử của mảng.

[code language=”c” highlight=”9,16,20″] #include <stdio.h>

int main()
{
/*
* Khai báo mảng kiểu char a, có 10 phần tử
* Đồng thời khởi tạo giá trị của mỗi phần tử là 0 (empty)
*/
char a[10] = { 0 };

// Hoặc:
/*
* Khai báo mảng kiểu số thực b, có 5 phần tử
* Đồng thời khởi tạo giá trị bất kỳ cho các phần tử
*/
float b[5] = { 13.3, 0.23, 20.17, 6.9, 92.1 };

// Hoặc: Khi chưa biết số phần tử của mảng
/* Lúc này số phần tử của mảng chính bằng số phần tử có trong ngoặc {} */
int c[] = { 17, 5, 2015, 2, 1};

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

 

Truy xuất mảng: Truy xuất các phần tử trong mảng thông qua chỉ số.

[code language=”c” highlight=”11,18,19″] #include <stdio.h>

int main()
{
int ii = 0;

// Khai báo và khởi tạo giá trị cho mảng
int c[] = { 17, 5, 2015, 2, 1};

//1. In ra phần tử thứ 3 của mảng:
printf( "Phan tu thu 3 cua mang la: %d\n", c[2] );

// Output:
// Phan tu thu 3 cua mang la: 2015

//2. In ra toàn bộ các phần tử của mảng
printf( "Cac phan tu cua mang la:\n" );
for (ii = 0; ii < 5; ii++) {
printf("c[%d] = %d\n", ii, c[ii]);
}

// Output:
// c[0] = 17
// c[1] = 5
// c[2] = 2015
// c[3] = 2
// c[4] = 1

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

 

Lưu ý:
1. Khi khai báo: số phần tử của mảng phải là số nguyên lớn hơn 0
2. Khi khởi tạo: tổng số phần tử khởi tạo không được vượt quá tổng số phần tử của mảng.

int a[5] = { 1, 2, 3, 4, 5, 6 };	// Sai, vì mảng chỉ lưu được 5 phần tử thôi.

3. Khi truy xuất: Không được truy xuất phần tử có chỉ số vượt quá chỉ số của mảng.

int a[5] = { 1, 2, 3, 4, 5 };

// Truy xuất phần tử có chỉ số thứ 5
printf("Value = %d\n", a[5]);		// Sai, vì chỉ số lớn nhất của mảng là 4

// Truy xuất phần tử có chỉ số thứ 6
printf("Value = %d\n", a[6]);		// Sai, vì chỉ số lớn nhất của mảng là 4
3. Làm thế nào lấy được số phần tử của 1 mảng bất kỳ?
3. Làm thế nào lấy được số phần tử của 1 mảng bất kỳ?

Để làm được điều này thì có 1 số cách, mình minh họa như code bên dưới:

[code language=”c”] #include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#define LENGTH_OF_ARRAY(arr) sizeof(arr) / sizeof(arr[0])

int main()
{
char ch[] = "Welcome to blog minhhn.com";

// Lấy kích thước của toàn mảng chia cho kích thước của một phần tử
int len1 = sizeof(ch) / sizeof(char);
printf("Do dai cua mang len1 = %d\n", len1);

int len2 = sizeof(ch) / sizeof(ch[0]);
printf("Do dai cua mang len2 = %d\n", len2);

int len3 = sizeof(ch) / sizeof(*ch);
printf("Do dai cua mang len3 = %d\n", len3);

int len4 = *(&ch + 1) – ch;
printf("Do dai cua mang len4 = %d\n", len4);

// Sử dụng hàm có sẵn của thư viện <stdlib.h>
int len5 = _countof(ch);
printf("Do dai cua mang len5 = %d\n", len5);

// Sử dụng hàm có sẵn của thư viện <Windows.h>
int len6 = ARRAYSIZE(ch);
printf("Do dai cua mang len6 = %d\n", len6);

// Sử dụng #define định nghĩa một macro
int len7 = LENGTH_OF_ARRAY(ch);
printf("Do dai cua mang len7 = %d\n", len7);

getchar();

return 0;
}
[/code]

 

Kết quả chương trình

Kết quả chương trình

4. Các kỹ thuật quan trọng trên mảng một chiều
4. Các kỹ thuật quan trọng trên mảng một chiều

– Để các bạn có thể hiểu rõ hơn về mảng một chiều, thì chúng ta sẽ cùng giải quyết một số bài toán về mảng một chiều để nắm được các kỹ thuật quan trọng trên mảng như:

  • Thêm
  • Xóa
  • Tìm kiếm
  • Sắp xếp

– Nội dung gồm các phần như sau các bạn làm thử trước nhé, sau khi làm xong thì theo dõi bài viết Các kỹ thuật trên mảng một chiều mà mình đã trình bày. Rồi cùng comment trao đổi cách làm nhé.

  • Nhập, xuất mảng các số nguyên
  • Kiểm tra tính chất của mảng (Mảng có phải toàn số dương hay ko? toàn số âm hay toàn số nguyên tố,…?)
  • Tìm giá trị lớn nhất, nhỏ nhất của mảng
  • Sắp xếp mảng tăng dần, giảm dần
  • Tách mảng (tách các phần tử âm ra mảng mới), gộp mảng (gộp mảng vừa tách vào mảng cũ), ví dụ:
    ・ Mảng ban đầu: 8, -5, 0, -2, 9
    ・ Tách thành 1 mảng mới: -5, -2
    ・ Gộp lại thành: 8, -5, 0, -2, 9, -5, -2
  • Tìm kiếm một phần tử trong mảng
  • Thêm, Xóa một phần tử của mảng
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[...]

4 bình luận

Translate »