You are on page 1of 43

This Photo by Unknown Author is licensed under CC BY-SA

C4. MẢNG
Trần Thanh San – Khoa CNTT 1
C3. Tổng quan về Mảng

1. Giới thiệu về mảng 4. Chuỗi ký tự

2. Mảng một chiều 5. Các thao tác cơ bản

3. Mảng hai chiều 6. Tóm tắt

Trần Thanh San – Khoa CNTT


2
C3. Tổng quan về Mảng

1. Giới thiệu về mảng 4. Chuỗi ký tự

2. Mảng một chiều 5. Các thao tác cơ bản

3. Mảng hai chiều 6. Tóm tắt

Trần Thanh San – Khoa CNTT


3
1.1 Đặt vấn đề
• Ví dụ
• Chương trình cần lưu trữ 3 số nguyên?
=> Khai báo 3 biến int a, b, c;
• Chương trình cần lưu trữ 100 số nguyên?
=> Khai báo 100 biến kiểu số nguyên!
• Người dùng muốn nhập n số nguyên?
=> Không thực hiện được!
• Giải pháp
• Kiểu dữ liệu mới cho phép lưu trữ một dãy các số nguyên và dễ dàng truy xuất.
Trần Thanh San – Khoa CNTT
4
1.2 Dữ liệu kiểu mảng
• Khái niệm
• Là một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa.

• Biểu diễn một dãy các biến có cùng kiểu.

❖ Ví dụ: dãy các số nguyên, dãy các ký tự…

• Kích thước được xác định ngay khi khai báo và không thay đổi.

• NNLT C luôn chỉ định một khối nhớ liên tục cho một biến kiểu mảng.

Trần Thanh San – Khoa CNTT


5
1.2 Dữ liệu kiểu mảng (tt)
int Mang1Chieu[10];

0 1 2 3 4 5 6 7 8 9
Mang1Chieu

int Mang2Chieu[3][4];

0 1 2 3 4 5 6 7 8 9 10 11
Mang2Chieu 0

1
2

Trần Thanh San – Khoa CNTT


6
C3. Tổng quan về Mảng

1. Giới thiệu về mảng 4. Chuỗi ký tự

2. Mảng một chiều 5. Các thao tác cơ bản

3. Mảng hai chiều 6. Tóm tắt

Trần Thanh San – Khoa CNTT


7
2. Mảng một chiều
2.1 Cú pháp khai báo:
<kiểu dữ liệu> <tên mảng> <[số phần tử]>

2.2 Ví dụ:

int a[10];

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

int a[] = {2, 8, -12, 9, 0};

Trần Thanh San – Khoa CNTT 8


2. Mảng một chiều (tt)
2.3. Truy xuất đến một phần tử

• Thông qua chỉ số của mảng.

• Ví dụ int a[4];
• Cho mảng như sau 0 1 2 3

• Các truy xuất


• Hợp lệ: a[0], a[1], a[2], a[3]

• Không hợp lệ: a[-1], a[4], a[5], …

Trần Thanh San – Khoa CNTT


9
2. Mảng một chiều (tt)
2.2. Gán dữ liệu kiểu mảng
• Không được sử dụng phép gán thông thường mà phải gán trực tiếp giữa các phần tử
tương ứng
<biến mảng đích> = <biến mảng nguồn>; //sai
<biến mảng đích>[<chỉ số thứ i>] = <giá trị>;

• Ví dụ #define MAX 3
typedef int MangSo[MAX];
MangSo a = {1, 2, 3}, b;

b = a; // Sai
for (int i = 0; i < 3; i++) b[i] = a[i];

Trần Thanh San – Khoa CNTT


10
C3. Tổng quan về Mảng

1. Giới thiệu về mảng 4. Chuỗi ký tự

2. Mảng một chiều 5. Mảng 2 chiều

3. Các thao tác cơ bản 6. Tóm tắt

Trần Thanh San – Khoa CNTT


11
3. Các thao tác cơ bản:
• Thêm phần tử vào mảng:

Giả sử ta thêm tại vị trí đầu:

0 1 2 3 4 5 6 7 8 9

Vấn đề ??????
- Số phần tử tăng thêm 1
- Dời các vị trí từ 0 -> 1, 1 ->2 , … n -> n+1
- Thêm phần tử vào đầu

12
3. Các thao tác cơ bản (tt)
Thêm phần tử vào mảng (tt):

Giả sử ta thêm tại vị trí cuối:

0 1 2 3 4 5 6 7 8 9

Vấn đề ??????

- Số phần tử tăng thêm 1

- Thêm phần tử vào cuối


13
3. Các thao tác cơ bản (tt)
• Thêm phần tử vào mảng (tt):

Giả sử ta thêm tại vị trí bất kỳ:


0 1 2 3 4 5 6 7 8 9
Giả sử vị trí =5
X
Vấn đề ??????

- Số phần tử tăng thêm 1

- Dời phần tử từ vị trí 5 trở đến cuối sang phải 1

- Thêm phần tử tại vị trí 5


14
3. Các thao tác cơ bản (tt):
Xóa phần tử của mảng:

Giả sử ta xóa tại vị trí đầu:


0 1 2 3 4 5 6 7 8 9

Vấn đề ??????

15
3. Các thao tác cơ bản (tt)
• Xóa một phần tử của mảng:

Giả sử ta xóa tại vị trí thứ 2:


0 1 2 3 4 5 6 7 8 9

Vấn đề ??????

16
3. Các thao tác cơ bản (tt)
• Xóa phần tử của mảng:

Giả sử ta xóa tại vị trí cuối:

0 1 2 3 4 5 6 7 8 9

Vấn đề ??????

17
TTTK

ĐẶT VẤN CÁC THUẬT


ĐỀ - PHÁT TOÁN TÌM

BIỂU BÀI KIẾM

TOÁN

18
ĐẶT VẤN ĐỀ

Trong công việc hàng ngày cũng như các bài toán
quản lý kinh tế cần tìm kiếm dữ liệu. Việc tìm kiếm một
mẩu tin thỏa mãn một yêu cầu nào đó đòi hỏi phải có
các thuật toán giúp cho việc tìm kiếm trở nên:
❖ Dễ dàng
❖ Nhanh chóng

19
PHÁT BIỂU BÀI TOÁN TÌM KIẾM

Cho một mảng a gồm n phần tử: a[n]:


a0, a1, …, an-1.
Với mỗi phần tử ai được tương ứng với một
giá trị ki (i = 0, …, n-1) (phần tử thứ i trong
mảng). Ta sẽ thực hiện tìm kiếm một phần tử
a[i] có giá trị x trên mảng a[n]. Nếu tìm thấy
xuất ra vị trí của a[i].

20
CÁC PHƯƠNG PHÁP TÌM KIẾM

Tìm kiếm tuyến tính

Tìm kiếm nhị phân

21
Tìm kiếm nhị phân (BinarySearch)

a. Ý tưởng

❖ Thuật toán này thực hiện trên mảng có thứ tự

❖ So sánh x với phần tử giữa mảng.

➢ Nếu “bằng” thì kết thúc.

➢ Nếu không, tùy theo giá trị của x ta thu hẹp KGTK
và lặp lại bước trên cho đến khi tìm thấy (hoặc kết
luận không có phần tử cần tìm trong mảng).

22
Tìm kiếm nhị phân (tt)
b. Thuật toán

B1: Khởi tạo left=0, right=n-1;


B2: Xác định phần tử ở giữa mid=(left+right)/2;
B3: So sánh x với a[mid]. Nếu x=a[mid] thì sang B4, nếu không sang B5;
B4: Kết luận “tìm thấy” và kết thúc.
B5: Nếu x<a[mid] thì sang B6, nếu không sang B7
B6: Giới hạn KGTK right=mid-1, sang B8;
B7: Giới hạn KGTK left=mid+1, sang B8;
B8: Nếu left>=right, sang B9, không thì sang B2;
B9: KL “không tìm thấy”. Kết thúc.

23
Tìm kiếm nhị phân (tt)
c. Cài đặt
int BinarySearch (int a[], int n, int x)
{
int left=0;
int right=n-1;
int mid;
do
{
mid=(left+right)/2;
if(a[mid]==x)
return mid;
if(a[mid]>x)
right=mid-1;
else
left=mid+1;
}while(left<=right);
return (-1);
}
24
Tìm kiếm tuyến tính (LinearSearch)

b. Thuật toán

B1: Cho biến i giá trị khởi đầu là 0;

B2: So sánh x với a[i], nếu x = a[i] thì sang B3, ngược lại sang B4.

B3: Kết luận “tìm thấy”. Kết thúc.

B4: Tăng giá trị i thêm 1 đơn vị i = i+1;

B5: Kiểm tra i, nếu i>=n thì sang B6, nếu không thì quay lại B4.

B6: Kết luận không tìm thấy. Kết thúc.

25
Tìm kiếm tuyến tính (tt)

c. Cài đặt

int LinearSearch(int a[],int n, int x)


{
int i=0;
while(i<n)
{
if (a[i]==x)
return i;
++i;
}
return (-1);
}
26
3. Các thao tác cơ bản (tt)
Tìm một phần tử có giá trị X của mảng:

0 1 2 3 4 5 6 7 8 9

Vấn đề ??????

- Dùng vòng lặp quét từ đầu đến cuối mảng

- Tại mỗi phần tử kiểm tra nếu đúng thì dừng

27
3. Các thao tác cơ bản (tt)
Sắp xếp mảng tăng dần/ giảm dần:

0 1 2 3 4 5 6 7 8 9

Vấn đề ??????

28
Thuật toán nổi bọt (BubbleSort)

a. Ý tưởng:
❖ Xét từ cuối dãy ngược về vị trí i

❖ Nếu hai phần tử kế cận ngược thứ tự thì đổi chỗ cho
nhau

❖ Thực hiện đến khi không còn phần tử để xét.

29
Thuật toán nổi bọt (BubbleSort)

a. Ý tưởng:
❖ Xét từ cuối dãy ngược về vị trí i

❖ Nếu hai phần tử kế cận ngược thứ tự thì đổi chỗ cho
nhau

❖ Thực hiện đến khi không còn phần tử để xét.

30
Thuật toán nổi bọt (tt)

b. Thuật toán:
➢ Bước 1: i=0;
➢ Bước 2: j=n;
• Trong khi j>i thực hiện:
▪ Nếu Aj < Aj-1 : đổi chỗ Aj và Aj-1
▪ j= j-1
➢ Bước 3: i = i +1
• Nếu i>n-1: Hết dãy -> Dừng
• Ngược lại: lặp lại bước 2.

31
Thuật toán nổi bọt (tt)

c. Ví dụ:

i=0 j=3
7
4
5
2

32
Thuật toán nổi bọt (tt)

i=1 5
j=3
6

33
Thuật toán nổi bọt (tt)

i=2 j=6
4

34
Thuật toán nổi bọt (tt)

i=3 j=5
7

35
Thuật toán nổi bọt (tt)

i=4 j=6

36
Thuật toán nổi bọt (tt)

i=5 j=7

37
Cài đặt
void BubleSort (int a[],int n)
{
for(int i=0;i<n;i++)
for(int j=n-1;j>i;j--)
{
if(a[j-1]>a[j])
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}

38
C3. Tổng quan về Mảng

1. Giới thiệu về mảng 4. Chuỗi ký tự

2. Mảng một chiều 5. Mảng 2 chiều

3. Các thao tác cơ bản 6. Tóm tắt

Trần Thanh San – Khoa CNTT


39
3. Mảng hai chiều
• Khai báo mảng hai chiều

<kiểu cơ sở> <tên kiểu>[<N1>][<N2>];

• Cú pháp
N1, N2: số lượng phần tử mỗi chiều (dòng/ cột)

• Ví dụ int MaTran[3][4];//ma trận 3 dòng, 4 cột


0 1 2 3

0
Kiểu MaTran 1

2
Trần Thanh San – Khoa CNTT 40
3. Mảng hai chiều (tt)
3.1. Truy xuất đến một phần tử

• Thông qua chỉ số <tên biến mảng>[<giá trị cs1>][<giá trị cs2>]

• Ví dụ int a[3][4];
0 1 2 3
• Cho mảng 2 chiều như sau
0

1
• Các truy xuất 2

• Hợp lệ: a[0][0], a[0][1], …, a[2][2]


• Không hợp lệ: a[-1][0], a[2][4], a[3][3]
Trần Thanh San – Khoa CNTT 41
3. Mảng hai chiều (tt)
3.2. Gán dữ liệu kiểu mảng
• Không được sử dụng phép gán thông thường mà phải gán trực tiếp giữa các phần
tử tương ứng
<biến mảng đích> = <biến mảng nguồn>; //sai
<biến mảng đích>[<giá trị cs1>][giá trị cs2] = <giá trị>;
• Ví dụ

int a[3][4], b[3][4];

b = a; // Sai
int i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
b[i][j] = a[i][j];
Trần Thanh San – Khoa CNTT 42
KẾT THÚC
CHƯƠNG 3

Trần Thanh San – Khoa CNTT 43

You might also like