LẬP TRÌNH CĂN BẢN
KIỂU MẢNG
Giảng viên: TS. Trương Quốc Bảo
NỘI DUNG CỦA CHƯƠNG
Giới thiệu kiểu mảng trong C.
Mảng 1 chiều.
Mảng nhiều chiều.
Thursday, January 15, 2015 Lập trình căn bản 2
GIỚI THIỆU KIỂU MẢNG
TRONG C (1)
Ví dụ: khai báo một mảng a gồm 10 phần tử là
số nguyên:
int a[10];
=> Hình ảnh của a trong bộ nhớ như sau:
Thursday, January 15, 2015 Lập trình căn bản
GIỚI THIỆU KIỂU MẢNG
TRONG C (2)
“Mảng là một tập hợp các phần tử cố định có
cùng một kiểu, gọi là kiểu phần tử”.
Kiểu phần tử có thể là có kiểu bất kỳ:
ký tự
số
1 cấu trúc (struct).
1 mảng khác (mảng của mảng hay mảng nhiều chiều)
…
Có 2 loại mảng: mảng 1 chiều và mảng nhiều
chiều. Lập trình căn bản
Thursday, January 15, 2015
MẢNG MỘT CHIỀU
Xét dưới góc độ tốn học, mảng 1 chiều giống như
một vector.
Mỗi phần tử của mảng 1 chiều có giá trị khơng phải
là một mảng khác.
Ví dụ:
Thursday, January 15, 2015 Lập trình căn bản
KHAI BÁO MẢNG MỘT CHIỀU (1)
Có một số cách khai báo mảng 1 chiều trong C:
Cách 1: Khai báo mảng với số phần tử xác định
Cú pháp: <Kiểu> <Tên mảng ><[số phần tử]>;
Ví dụ: float a[100];
Cách 2: Khai báo mảng với số phần tử không xác
định
Cú pháp: <Kiểu> <Tên mảng> <[]> ;
Ví dụ: float a[];
Thursday, January 15, 2015 Lập trình căn bản
KHAI BÁO MẢNG MỘT CHIỀU (2)
Cách 3: Vừa khai báo vừa gán giá trị
Cú pháp: <Kiểu> <Tên mảng> []= {Các giá trị cách
nhau bởi dấu phẩy} ;
Ví dụ: int primes[] = {2,3,5,7,11,13}; int primes[6];
Số phần tử có thể được xác định bằng sizeof()
Số phần tử=sizeof(tên mảng)/sizeof(kiểu)
=>trong ví dụ trên số phần tử là:
sizeof (primes)/sizeof(int)=6
Ta có: primes[0] = 2; primes[1] = 3; primes[2] = 5;
primes[3] = 7; primes[4] = 11; primes[5] = 13;
Thursday, January 15, 2015 Lập trình căn bản
KHAI BÁO MẢNG MỘT CHIỀU (3)
Khai báo mảng là tham số hình thức của hàm
Khơng cần chỉ định số phần tử của mảng là bao
nhiêu (không cần khai báo tường minh chỉ số mảng).
Ví dụ:
void Nhap(int a[],int N) {
int i;
for(i=0; i< N; i++) {
printf("Phan tu thu %d: ",i);scanf("%d",&a[i]);
}
} Lập trình căn bản
Thursday, January 15, 2015
TRUY XUẤT PHẦN TỬ CỦA
MẢNG MỘT CHIỀU (1)
Cú pháp:
Tên biến mảng[Chỉ số]
Ví dụ:
int a[10];
a[0]=5; a[1]=5; a[2]=33; a[3]=33; a[4]=15;
printf(“%d %d %d %d %d”, a[0], a[1], a[2], a[3], a[4]);
Thursday, January 15, 2015 Lập trình căn bản
TRUY XUẤT PHẦN TỬ CỦA
MẢNG MỘT CHIỀU (2)
Viết đoạn chương trình đổi một số nguyên dương
thập phân thành số nhị phân.
Thuật toán: Lấy số nguyên thập phân N(10) lần lượt chia
cho 2 cho đến khi thương số bằng 0. Kết quả số chuyển đổi
N(2) là các dư số trong phép chia viết theo thứ tự ngược lại.
Ví dụ: Số 12(10) = ?(2).
12 2
06 2
03 2
11
1
Kết quả: 12(10) = 1100(2) .
Thursday, January 15, 2015 Lập trình căn bản
TRUY XUẤT PHẦN TỬ CỦA
MẢNG MỘT CHIỀU (3)
Thuật toán đổi nhị phân: SoBit = 0
Bước 1: Gán Số bits = 0;
SoDu = N%2
Bước 2: Số dư = N % 2;
Bước 3: Lưu số dư vào mảng: Nhiphan[Sobit] = SoDu
Nhiphan[Số bit] = Số dư;
Bước 4: Cập nhật số bị chia: N= N/2
N = [N/2]; SoBit = SoBit+1
Bước 5: Số bit = Số bit + 1;
Bước 6: Nếu N >0, quay lại Đúng
bước 2. Ngược lại sang bước 7.
N>0
Bước 7: In dãy bits nhị phân. Sai
Thursday, January 15, 2015 Lập trình căn bản In dãy bits
nhị phân
TRUY XUẤT PHẦN TỬ CỦA
MẢNG MỘT CHIỀU (4)
Chương trình đổi nhị phân
Thursday, January 15, 2015 Lập trình căn bản
Viết đoạn chương trình nhập vào một dãy n số
nguyên và sắp xếp các số theo thứ tự tăng.
Thuật toán: Xét hai phần tử liên tiếp i và j nếu
khơng đúng thứ tự thì đổi chỗ 2 phần tử này.
j = i+1 j = 7 = N-1
Khóa a[0] a[1] a[2] a[3] a[4] A[5] a[6] a[7]
Bước
Ban đầu 5 6 2 2 10 12 9 10
Bước 0
i = 0
2 6 5 2 10 12 9 10
Bước 1 2 5 6 10 12 9 10
Bước 2 5 6 10 12 9 10
Bước 3 6 10 12 9 10
Bước 4
i = 6 Bước 5 9 12 10 10
= N-2
10 12 10
Bước 6 10 12
Kết quả 2 2 3 5 6 9 9 10
Thursday, January 15, 2015 Lập trình căn bản
TRUY XUẤT PHẦN TỬ CỦA
MẢNG MỘT CHIỀU (5)
Chương trình
Thursday, January 15, 2015 Lập trình căn bản
TRUY XUẤT PHẦN TỬ CỦA
MẢNG MỘT CHIỀU (6)
Ví dụ: Chương trình sau sẽ hiển thị kết quả gì?
Các phần tử của
mảng a[0], …, a[11].
Việc truy cập a[12]
sẽ vượt ra bên
ngoài biên của
mảng.
Sửa lỗi này thế
nào??
Thursday, January 15, 2015 Lập trình căn bản
MẢNG NHIỀU CHIỀU
Mảng nhiều chiều là mảng có từ 2 chiều trở lên.
Điều đó có nghĩa là mỗi phần tử của mảng là một
mảng khác.
Người ta thường sử dụng mảng nhiều chiều để lưu
các ma trận, các tọa độ 2 chiều, 3 chiều…
Thursday, January 15, 2015 Lập trình căn bản
KHAI BÁO MẢNG NHIỀU CHIỀU (1)
Có 2 cách khai báo mảng nhiều chiều:
Khai báo tường minh
Khai báo không tường minh
Chúng ta sẽ xét các cú pháp và ví dụ trên mảng 2
chiều. Mảng nhiều chiều hơn hoàn toàn tương tự.
Khai báo mảng 2 chiều tường minh
Cú pháp:
<Kiểu> <Tên mảng><[Số phần tử chiều 1]><[Số phần
tử chiều 2]> ;
Ví dụ: float m[8][9]; // mảng có 8*9 phần tử là số thực.
Thursday, January 15, 2015 Lập trình căn bản
KHAI BÁO MẢNG NHIỀU CHIỀU (2)
Khai báo mảng 2 chiều không tường minh
Để khai báo mảng 2 chiều không tường minh, ta chỉ
cần phải chỉ ra số phần tử của chiều thứ hai.
Cú pháp:
<Kiểu> <Tên mảng> <[]><[Số phần tử chiều 2]>;
Ví dụ: float m[][9];
Cách khai báo này cũng được áp dụng trong
trường hợp:
Vừa khai báo vừa gán trị
Mảng 2 chiều là tham số hình thức của 1 hàm.
Thursday, January 15, 2015 Lập trình căn bản
TRUY XUẤT PHẦN TỬ CỦA MẢNG
NHIỀU CHIỀU
Cú pháp: Tên mảng[Chỉ số 1][Chỉ số 2]
Ví dụ: matran[3][5];
Viết chương trình cho phép nhập 2 ma trận a, b có m
dịng n cột, thực hiện phép tốn cộng hai ma trận a,b
và in ma trận kết quả lên màn hình.
Thursday, January 15, 2015 Lập trình căn bản
Thursday, January 15, 2015 Lập trình căn bản