Các kỹ thuật lập trình với mảng một chiều và minh họa với C++

Đây là bài 29/43 bài của series môn học Nhập môn lập trình

Trong bài này, chúng ta cùng xem cách nhập giá trị cho mảng, truy xuất phần tử trong mảng, xem địa chỉ các phần tử trong mảng để thấy chúng là các vùng nhớ liên kề nhau và kỹ thuật truyền mảng cho hàm.

1. Nhập và xuất các phần tử trong mảng một chiều với C++

1.1. Sử dụng vòng lặp for để nhập xuất các phần tử trong mảng

#include <iostream>
using namespace std;

#define MAX 5

int main() {
	int arA[MAX];
	cout<<"Input array:"<<endl;
	for(int i= 0; i< MAX; i++){
		cout<<i<<"th element:";
		cin >> arA[i];
	}
	cout<<"Output array:";
	for(int i= 0; i< MAX; i++){
		cout<<arA[i]<<" ";
	}
	system("pause");
}
Kết quả
Input array:
0th element:5
1th element:-1
2th element:0
3th element:2
4th element:9
Output array:5 -1 0 2 9

1.2. Gán dữ liệu cho mảng một chiều với C++

Cú pháp

<tên biến mảng> [<chỉ số thứ i>] = <giá trị>;

Chương trình C++ minh họa gán dữ liệu cho mảng

#include <iostream>
using namespace std;

#define MAX 5

int main() {
	int arA[MAX] = {5, -1, 0, 2, 9};
	cout<<"Output array:";
	for(int i= 0; i< MAX; i++){
		cout<<arA[i]<<" ";
	}
	//change value of 0th element in array
	arA[0]=99;
	cout<<"\nOutput array after changed:";
	for(int i= 0; i< MAX; i++){
		cout<<arA[i]<<" ";
	}
	system("pause");
}
Kết quả
Output array:5 -1 0 2 9
Output array after changed:99 -1 0 2 9

Sao chép dữ liệu từ mảng này sang mảng khác

Ví dụ: Cho hai mảng số nguyên arA, arB có kích thước MAX = 5 phần tử.

int arA[MAX] = {5, -1, 0, 2, 9};
int arB[MAX];

Muốn gán dữ liệu mảng arA cho mảng arB thì không thể dùng lệnh:

arB=arA;//error:  '=' : left operand must be l-value

Phải gán trực tiếp lần lượt các phần tử của mảng arA cho mảng arB.

#include <iostream>
using namespace std;

#define MAX 5

int main() {
	int arA[MAX] = {5, -1, 0, 2, 9};
	int arB[MAX];
	cout<<"Output arB (arB store garbage values due to is not initialization):\n";
	for(int i= 0; i< MAX; i++){
		cout<<arB[i]<<" ";
	}
	//copy arA to arB
	for(int i= 0; i< MAX; i++){
		arB[i]=arA[i];
	}
	cout<<"\nOutput arB (arB store elements of arA):\n";
	for(int i= 0; i< MAX; i++){
		cout<<arB[i]<<" ";
	}
	system("pause");
}
Kết quả
Output arB (arB store garbage values due to is not initialization):
-858993460 -858993460 -858993460 -858993460 -858993460
Output arB (arB store elements of arA):
5 -1 0 2 9

2. Địa chỉ của các phần tử trong mảng

Mảng một chiều là tập hợp tuần tự các phần tử có cùng kiểu dữ liệu và các phần tử được lưu trữ trong một dãy các ô nhớ liên tục trên bộ nhớ.

Chúng ta sẽ viết chương trình in địa chỉ của các phần tử trong mảng (dùng toán tử &) để kiểm chứng việc này.

#include <iostream>
using namespace std;

#define MAX 5

int main() {
	int arA[MAX] = {5, -1, 0, 2, 9};
	cout<<"Address of elements in array:"<<endl;
	for(int i= 0; i< MAX; i++){
		cout<<&arA[i]<<" ";
	}
	system("pause");
}
Kết quả
Address of elements in array:
00CFF924 00CFF928 00CFF92C 00CFF930 00CFF934

Địa chỉ của các phần tử trong mảng được biểu diễn dưới dạng hệ cơ số 16 (hexadecimal). Chúng ta chuyển đổi chúng sang hệ cơ số 10 (decimal) xem sao:

13629732 13629736 13629740 13629744 13629748

Rõ ràng, các địa chỉ này cách nhau 4 đơn vị tương ứng với 4 ô nhớ. Kiểu dữ liệu của các phần tử trong mảng arA int, mà int thì chiếm 4 byte tương ứng 4 ô nhớ. Vậy thì rõ ràng các phần tử trong mảng được cấp phát và lưu trữ trong các ô nhớ liên tục nhau.

Điều gì xảy ra khi truy xuất mảng với “chỉ mục” vượt quá <số phần tử> tối đa

#include <iostream>
using namespace std;

#define MAX 5

int main() {
	int arA[MAX] = {5, -1, 0, 2, 9};
	cout<<"Address of elements in array:"<<endl;
	for(int i= 0; i< MAX+2; i++){//access more elements outside the array
		cout<<&arA[i]<<" ";
	}
	system("pause");
}
Kết quả
Address of elements in array:
00CFF924 00CFF928 00CFF92C 00CFF930 00CFF934 00CFF938 00CFF93C

Chúng ta đổi địa chỉ qua hệ cơ số 10:

13629732 13629736 13629740 13629744 13629748 13629752 13629756

Dữ liệu của các phần tử được xuất ra:

5 -1 0 2 9 -858993460 1319298504

Nhận xét: Rõ ràng, các phần tử ngoài mảngđịa chỉ ô nhớ liên tục với các ô nhớ trong mảng và chúng chứa địa chỉ rác.

Lưu ý: Mỗi lần chạy chương trình, địa chỉ các ô nhớ trong mảng sẽ thay đổi.

3. Truyền mảng cho hàm

Mảng có thể được truyền vào hàm như là các tham số. Các mảng luôn được truyền con trỏ (pass by pointer) vào hàm. Nó tương tự truyền tham chiếu, có nghĩa là các mảng có thể thay đổi giá trị bởi lời gọi hàm.

Chương trình C++ minh họa truyền mảng cho hàm

#include <iostream>
using namespace std;

#define MAX 5

void changeArray(int a[]){
	a[0]=99;
}
int main() {
	int arA[MAX] = {5, -1, 0, 2, 9};
	cout<<"Output arA array before change:"<<endl;
	for(int i= 0; i< MAX; i++){
		cout<<arA[i]<<" ";
	}
//call changeArray(int a[]) function
	changeArray(arA);
	cout<<"\nOutput arA array after change:"<<endl;
	for(int i= 0; i< MAX; i++){
		cout<<arA[i]<<" ";
	}
	system("pause");
}
Kết quả
Output arA array before change:
5 -1 0 2 9
Output arA array after change:
99 -1 0 2 9

4. Một số bài tập về mảng

Dựa vào những kỹ thuật lập trình trên mảng một chiều đã trình bày, các bạn hãy tự làm những bài tập cơ bản sau đây nhé!

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

– Cho trước mảng a, số lượng phần tử na. Tách các số nguyên tố có trong mảng a vào mảng b.

– Cho trước mảng a, số lượng phần tử namảng b số lượng phần tử nb. Gộp 2 mảng trên theo tứ tự đó thành mảng c, số lượng phần tử nc.

– Cho trước mảng an phần tử. Tìm giá trị lớn nhất trong mảng a (gọi là max).

– Cho trước mảng a 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.

4.9/5 - (15 bình chọn)
Bài trước và bài sau trong môn học<< Mảng một chiều là gì? Cách khai báo và khởi tạo trong C++Chuỗi ký tự là gì? Cách khởi tạo và một số kỹ thuật lập trình trên chuỗi >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.