Chương 5
Mng, chui ký t
Mục tiêu của bài học
Đnh ngha mng.
Mng 1 chiu
Mng 2 chiu.
Chui k t.
Phn 1: Mng một chiều
Kiểu dữ liệu mng
Mảng là tập hợp các phần tử có cùng kiểu dữ
liệu, được lưu trữ ở các vị trí kế tiếp nhau trong
bộ nhớ chính
3
2
4
5
1
9
6
7
4
8
Mảng kiểu int, gồm 10 phần tử
Khai báo mng
Cú pháp:
<Lớp lưu trữ> <Kiểu dữ liệu> <Tên mảng> [số phần tử];
Trong đó:
Lớp lưu trữ : auto, static, extern, register.
Kiểu dữ liệu: Các kiểu dữ liệu cơ bn và nâng cao.
Tên mảng: Đặt theo tên đnh danh.
Kích thước mảng: Hằng số
Lớp lưu trữ mặc đnh là auto Không cần sử dụng từ
khóa này khi khai báo các mng auto.
Ví dụ: int A[10];
Các phần tử và chỉ số của mng
Mi phần tử được xác đnh bằng một số thứ t (còn gọi
là chỉ số) duy nhất trong mng.
Số chiu của mng được xác đnh bằng số các chỉ số cần
thiết để đnh danh duy nhất từng phần tử.
Chỉ số là một số nguyên dương trong [ ] đặt ngay sau tên
mng.
Chỉ số của mng (trong C) được bắt đầu là 0
Ví dụ: mng A với 10 phần tử:.
A[0],A[1],A[2],…,A[9]
3
2
4
5
1
9
6
7
4
8
0 1 2 3 4 5 6 7 8 9
Qun l mng trong C
Trong ngôn ngữ C, mng được “đối xử”
không giống hoàn toàn với biến
Hai mng có cùng kiểu và cùng kích thước
cũng không được xem là tương đương nhau
Không thể gán trc tiếp một mng cho một
mng khác.
Không thể gán tr cho toàn bộ mng, mà phi
gán tr cho từng phần tử của mng
Một số thao tác trên mng
Khởi tạo mng.
Truy xuất các phần tử mng.
Nhập giá tr cho các phần tử mng.
Truyn mng vào hàm.
Khởi tạo mng
Khởi tạo mng.
Truy xuất các phần tử mng.
Nhập giá tr cho các phần tử mng.
Truyn mng vào hàm.
Khởi tạo mng
Là thao tác gán giá tr cho các phần tử mng.
Các mng không được khởi tạo t động.
Không sử dụng mng khi chưa khởi tạo thích hợp.
Khởi tạo mảng trong khi khai báo:
Ví dụ:
int A[5] = {1, 2, 3, 4, 5};
hoặc
int A[] = {1, 2, 3, 4, 5};
Khởi tạo mảng bằng vòng lặp:
for (i=0; i<10; i++)
A[i] = 0;
Khởi tạo mng (tt)
Trong trường hợp mng extern và static,
các phần tử được t động khởi tạo với
giá tr 0.
Bài tập áp dụng
Bài tập 1: Viết chương trình:
Khai báo và khởi tạo giá tr cho 1 mng kiểu int, gồm 10
phần tử.
Hiển thi ra màn hình giá tr các phần tử mng.
Kiểm tra trường hợp số giá tr khởi tạo < kích thước mng.
Truy xuất các phần tử mng
Thc hiện khi muốn xem, hiển th hoặc sử dụng giá tr
của chng để tính toán, kiểm tra…
Truy xuất phần tử mảng với các chỉ số cụ thể:
Ví dụ:
int A[0] ;
int A[5] ;
Truy xuất các phần tử mảng sử dụng vòng lặp:
for (int i=0;i<n;i++)
{
printf ( “Phan tu thu %d = %d\n”, i+1, A[i]);
}
Nhập giá tr cho các phần tử mng
Gán trực tiếp giá trị cho các phần tử:
Ví dụ:
A[0] = 10;
A[1] = 15;
A[2] = 25;
. . .
Nhập giá trị các phần tử mảng sử dụng vòng lặp:
for (int i=0;i<n;i++)
{
printf ( “A[%d] = “, i ); scanf(“%d”,&A[i])
}
Bài tập áp dụng
Bài tập 2: Viết chương trình:
Khai báo và nhập giá tr cho mng kiểu int, gồm n phần tử.
Hiển th các giá tr đã nhập ra màn hình.
Truyn mng vào hàm
Khi một mng được truyn vào hàm như một tham số,
chỉ có đa chỉ của mng được truyn vào.
Tên mng không kèm theo chỉ số là đa chỉ của mng.
Ví dụ:
void main()
{
int A[10];
. . .
func(A);
. . .
}
Mảng A được truyền vào
hàm func()
Truyn mng vào hàm
Khai báo hàm func():
func (int ary []) /*Số phần tử không được xác đnh trước*/
{
. . .
}
func (int ary [10]) /* Số phần tử được xác đnh trước*/
{
. . .
}
Hoặc:
Bài tập áp dụng
Bài tập 3: Viết chương trình:
Khai báo và nhập giá tr cho mng kiểu int, gồm n phần tử.
Hiển th các giá tr đã nhập ra màn hình.
Tìm giá tr lớn nhất trong mng.
Yêu cầu: Chương trình được viết ở dạng hàm.
Bài tập v nhà
Bài 1: Viết chương trình (dạng hàm) thc hiện các yêu
cầu sau:
Khai báo và nhập giá tr cho một mng n phần tử, kiểu int.
Hiển th các giá tr đã nhập ra màn hình.
Tính tổng các phần tử trong mng.
Tính tổng các phần tử chẵn trong mng.
Bài 2: Viết chương trình (dạng hàm) thc hiện các yêu
cầu sau:
Khai báo và nhập giá tr cho một mng n phần tử, kiểu int.
Hiển th các giá tr đã nhập ra màn hình.
Liệt kê các số chính phương trong mng.
Phn 2: Mng nhiều chiều
Mng hai chiu
Mng đa chiu đơn gin nhất và thường được
dùng nhất là mng hai chiu
Mng hai chiu có thể xem như là một mng
với mi phần tử là mng một chiu
V logic, một mng hai chiu trông giống như
một bng lch trình xe lửa, gồm các dòng và
các cột
Một mng chui hai chiu được khai báo
theo cách sau:
int Ary[3][4];
Khởi tạo mng đa chiu (tt)
Mảng có kích thước 34 (3 hàng, 4 cột)
A[2,0] A[2,3] A[2,1] A[2,2]
A[1,0] A[1,3] A[1,1] A[1,2]
A[0,0] A[0,3] A[0,1] A[0,2]
Khởi tạo mng đa chiu
int ary[3][4]
={1,2,3,4,5,6,7,8,9,10,11,12};
Kết qu của phép gán trên như sau:
9 12 10 11
5 8 6 7
1 4 2 3
Ary[0,0]=1; Ary[0,1]=2 ; Ary[0,2]=3; Ary[0,3]=4;
Ary[1,0]=5; Ary[1,1]=6 ; Ary[1,2]=7; Ary[1,3]=8;
Ary[2,0]=9; Ary[2,1]=10 ; Ary[2,2]=11; Ary[2,3]=12;
int ary[3][4]
={{1,2,3},{4,5,6},{7,8,3}};
Kết qu của phép gán trên như sau:
Khởi tạo mng đa chiu (tt)
7 0 8 3
4 0 5 6
1 0 2 3
Ary[0,0]=1; Ary[0,1]=2 ; Ary[0,2]=3; Ary[0,3]=0;
Ary[1,0]=4; Ary[1,1]=5 ; Ary[1,2]=6; Ary[1,3]=0;
Ary[2,0]=7; Ary[2,1]=8 ; Ary[2,2]=3; Ary[2,3]=0;
Truy xuất các phần tử mng
Truy xuất phần tử mng với các chỉ số cụ thể
A[0][0] //Phần tử đầu tiên (hàng 0, cột 0)
A[1][3] //Phần tử ở hàng 2, cột 4
A[m-1][n-1] //Phần tử cuối cùng(hàng m, cột n)
Sử dụng vòng lặp (for, while, do…while):
for (int i=0;i<m;i++){
for (int j=0; j<n; j++)
{
printf(“Phan tu [%d,%d] = %d\n”, i,j, A[i][j]);
}
}