20
0 K K  Ỹ  Ỹ THU THUT L T LP TRÌNH P TRÌNH KIU DLIU, CU TRÚC DLIU VÀ THUT TOÁN 1 NI DUNG I DUNG Thut toán Kiu dliuvàcu trúc dliu Mi liên hgia thut toán và cu trúc dliu Kiu con tr trong C Sdng kiu ar ray tr ong C Kiu xâu ttrong C Sdng struct trong C 2 KH KHÁ ÁI NI I NI M THU M THUT TO T TOÁ ÁN Thut toán (gii thut) là mt quy tc để vi nhng dliu ban đầu đã ch o, t ìm được li gii sau mt khong thi gian huhn  Bài toán Thut toán Máy tính Dliu vào K ết qura 3 Tín h kết thúc (tính dng) nh xác định Tính phdng Tính hiu quThc hin nhanh Tu phí ít tài nguyên máy tính (bnh) CÁ ÁC Đ C ĐC TRƯNG C C TRƯNG CA THU A THUT TO T TOÁ ÁN

3. Thuat Toan-Cau Truc Du Lieu

  • Upload
    ftung0

  • View
    242

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 1/20

0

KK Ỹ Ỹ THUTHUẬẬT LT LẬẬP TRÌNHP TRÌNH

KIỂU DỮ LIỆU,CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN

1

NNỘỘI DUNGI DUNG

Thuật toán

Kiểu dữ liệu v à cấu trúc dữ liệu Mối liên hệ giữa thuật toán và cấu trúc dữ liệu

Kiểu con tr ỏ trong C

Sử dụng kiểu array trong C

Kiểu xâu kí tự trong C

Sử dụng struct trong C

2

KHKHÁÁI NII NIỆỆM THUM THUẬẬT TOT TOÁÁNN

Thuật toán (giải thuật) là một quy tắc để với những dữliệu ban đầu đã cho, tìm được lời giải sau một khoảng

thời gian hữu hạn

  Bài toán

Thuật toán

Máy tínhDữ liệu vào K ết quả ra

3

Tính kết thúc (tính dừng)

Tính xác định

Tính phổ dụng

Tính hiệu quả

• Thực hiện nhanh

• Tiêu phí ít tài nguyên máy tính (bộ nhớ)

CCÁÁC ĐC ĐẶẶC TRƯNG CC TRƯNG CỦỦA THUA THUẬẬT TOT TOÁÁNN

Page 2: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 2/20

4

CCÁÁC ĐC ĐẶẶC TRƯNG CC TRƯNG CỦỦA THUA THUẬẬT TOT TOÁÁNN

Thuật toán tìm UCLN của hai số nguyên dương

1. Nhậ p vào hai số nguyên d ươ ng a, b

2. So sánh hai số, chọn số nhỏ nhất g ắn cho UCLN 

3. N ếu một trong hai số a, b không chia hết cho UCLN thì thự c 

hi ện bướ c 4, ng ượ c l ại thì thự c hi ện bướ c 5 

4. Gi ảm UCLN một đơ n v  ị và quay l ại bướ c 3

5. In UCLN. K ết thúc 

? Các đặc tr ưng của thuật toán trên

5

TIÊU CHUTIÊU CHUẨẨN ĐN ĐÁÁNH GINH GIÁÁ THUTHUẬẬT TOT TOÁÁNN

Lựa chọn thuật toán nào cho bài toán?

Tiêu chuẩn 1: Thuật toán đơn giản, dễ hiểu, dễ cài đặt Tiêu chuẩn 2: Thuật toán sử dụng tiết kiệm tài nguyên

máy tính (dung lượng không gian nhớ, thời gian)

6

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

Ngôn ngữ dùng để mô tả thuật toán

? Tại sao phải dùng ngôn ngữ diễn đạt thuật toán

? Đặc điểm của ngôn ngữ diễn đạt thuật toán

• Ngôn ngữ liệt k ê từng bước (Ngôn ngữ tự nhiên)

• Sơ đồ khối

• Ngôn ngữ “giả code”: Tựa Pascal, tựa C, …

 – Các bước trong chương trình nên được đánh số thứ tự

 – Có thể bỏ qua phần khai báo dữ liệu, thay vào đó là đặc tả cấu trúc dữ liệu

tr ước khi viết giải thuật

Mô tả thuật toán

• Thu ật toán: <Tên thu ật toán>

• Vào (Input): <Dữ  li ệu vào c  ủ a thu ật toán, mô t ả rõ ki ểu d ữ  li ệu>

• Ra (Output): <Các d  ữ li ệu ra - K  ết qu ả>

7

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

Ngôn ngữ liệt k ê từng bước

• Thuật toán: Euclid

• Vào: m,n nguyên dương (m > n)

• Ra: gcd là ước chung lớn nhất của m và n

r: số nguyên dương

Bướ c 1. Nhậ p vào m, n

Bướ c 2. N ếu m, n >0 thì chuy ển sang bướ c 3, ng ượ c l ại thì thông báo“Dữ li ệu vào không hợ  p l ệ” v à k  ết thúc thu ật toán

Bướ c 3. N ếu m > n thì chuy ển sang bướ c 4. Ng ượ c l ại, hoán chuy ểngiá tr  ị c ủ a m, n

Bướ c 4. N ếu n = 0 thì gcd = m, in giá tr  ị c ủ a gcd và k  ết thúc. Ng ượ c l ại,chuy ển sang bướ c 5.

Bướ c 5. Tính r là phần d ư c ủ a phép chia m cho n

Bướ c 6. Gán giá tr  ị c ủ a n cho m và c ủ a r cho n. Quay l ại bướ c 4.

Page 3: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 3/20

8

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

Sơ đồ khối

ĐiĐiềềuu kikiệệnn

LLệệnhnh NNúútt thaothao ttáácc

ChChỉỉ hư hư ớ ớ ngng truytruyềềnn thôngthông tintin

NNúútt điđiềềuu kikiệệnn

NNúútt bbắắtt đđấấuu,, nnúútt k k ếếtt ththúúcc

9

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

Thuật toán Euclid

Sai

Sai

Đúng

Đúng

Bắt đầu

 Nhậ p m, n

m, n >0

m >= n

n = 0

gcd = m

In gcd

r = m mod nm = n

n = r 

r = m

m = n

n = r 

K ết thúc

Thông báo

Dữ  liệu vào

không hợ  p lệ 

SaiĐúng

10

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

Ngôn ngữ Tựa Pascal

• Khai báo: Program < Tên chương trình>

Begin …….End.

• Chú thích {….}

• Phép toán số học: +, - *, /, ↑(luỹ thừa)

• Phép toán so sánh: >, >=, <, <=, =, ≠

• Giá tr ị logic: true, false

• Phép toán logic: and, or, not

11

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

Các câu lệnh

• Câu lệnh gán V := E;

 – V: biến, E: biểu thức

 – Phép gán chung: V1 := V2 := E;

• Câu lệnh điều kiện if B then S1 [else S2];

• Câu lệnh tuyển Case

B1: S1;

B2: S2;

….

Bn: Sn;

else Sn+1

end case;

Page 4: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 4/20

12

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

• Câu lệnh lặp

 – Số lần lặp biết tr ước for i := m to n do ….

for i := n down to m do….

 – Số lần lặp không biết tr ước while B do S;

repeat S until B;

(B: biểu thức logic; S: dãy lệnh)

• Câu lệnh chuyển

go to n; (n:số hiệu của một bước trong chương trình)

• Câu lệnh vào ra

read(<danh sách biến>);

write(<danh sách biểu thức>)

13

NGÔN NGNGÔN NGỮỮ THUTHUẬẬT TOT TOÁÁNN

• Chương trình con

 – Hàm

function <tên hàm>(<danh sách tham số>): <kiểu dữ liệu>

S

return <biểu thức>

 – Thủ tục Procedure: không có kết quả ra

 – Sử dụng Var đặt tr ước tham số cần giữ lại sự thay đổi giá tr  ị sau

khi kết thúc thực hiện hàm/thủ tục

 – Lời gọi Hàm Tên_hàm(<danh sách tham số thực sự>)

 – Lời gọi thủ tục Call <Tên thủ tục>(<danh sách tham số thực sự>)

14

Ngôn ngữ Tựa C

15

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

Giải thuật nào hiệu quả nhất cho một bài toán?

• Độ phức tạp thời gian

• Độ phức tạp không gian

? Đánh giá giải thuật khi chạy chương trình ???

Các yếu tố ảnh hưởng đến thời gian thực hiện thuật toán

• Môi tr ường phần cứng: tốc độ xử lý, bộ nhớ,…

• Môi tr ường phần mềm: kiểu lệnh, ngôn ngữ, trình biên dịch

• Kích thước dữ liệu vào

Đánh giá độ phức tạp thời gian T(n) bằng tổng số phép

tính cần phải thực hiện.

Page 5: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 5/20

16

Độ tăng của hàm

• Cho hai hàm f(x), g(x) xác định từ tập các số nguyên dương hoặc tậpsố thực vào tập số thực. Ta nói f(x) là O(g(x)) nếu tồn tại hai hằng sốC và k sao cho: |f(x)| ≤ C.|g(x)|, với mọi x > k.

Ví dụ 1

• f(x) = an xn +…. +a0, với ai là các số thực. Khi đó f(x) = O(xn).

• với x > 1 ta có

• Đặt C = |an| + |an−1| + … + |a0| và k = 1, suy ra f(x) = O(xn).

Ví dụ 2.

• f(x) = 1+ 2+ 3 + … + n = n(n+1)/2 nên là O(n2).

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

 

)....(

...(

...)(

01

01

0

1

1

aaa x

 x

a

 x

aa x

a xa xa x f 

nn

n

n

n

n

n

n

n

n

n

+++≤

+++≤

+++≤

17

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

Các thuật ngữ thường dùng

• Độ phức tạp O(1) gọi là độ phức tạp hằng số

• Độ phức tạp O(log(n)) gọi là độ phức tạp logarit

• Độ phức tạp O(n) gọi là độ phức tạp tuyến tính

• Độ phức tạp O(nlogn) gọi là độ phức tạp nlogn

• Độ phức tạp O(nk) gọi là độ phức tạp đa thức

• Độ phức tạp O(bn) , b>1, gọi là độ phức tạp hàm mũ

• Độ phức tạp O(n!) gọi là độ phức tạp giai thừa

18

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

Ví dụ 1

K:=0;

For i:=1 to n do

BeginK:=K+i;

End;

Ví dụ 2

K:=0;

For i:=1 to n do

For j:= 1 to n do

Begin

K := K + i * j ;

End;

19

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

Ví dụ 3

i :=1; K:=0;

while i <= n do

begin

K:= K+ i*i;

i := i * 2;

end;

Số phép toán cần thực hiện:

(1 so sánh + 2 nhân + 1 cộng) * (1 + |log2n|) = 4 + 4 |log2n| là

O(log2n).

Page 6: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 6/20

20

Ví dụ 4

Searching(A[]: array of integer, n: integer, integer K): Boolean

Begin

i := 1; found := false;

while (i <=n and !found) do

begin

if A[i] = K then found:=true;

else i := i+1;

end;

return found;

end;

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

21

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

Độ phức tạp xấu nhất

Độ phức tạp tr ường hợp tốt nhất Độ phức tạp trung bình

22

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

Độ phức tạp tr ường hợp xấu nhất của A là số lớn nhất

các phép toán cơ bản được thực hiện trong A trên bất

kỳ dữ liệu vào có kích cỡ xác định.

Độ phức tạp tr ường hợp tốt nhất của A là số bé nhất

các phép toán cơ bản được thực hiện trong A trên bất

kỳ dữ liệu vào có kích cỡ xác định.

Độ phức tạp trung bình của A là giá tr  ị trung bình của

số các phép toán cơ bản được thực hiện trong A trên

bất kỳ dữ liệu vào có kích thước xác định.

23

ĐĐỘỘ PHPHỨỨC TC TẠẠP THUP THUẬẬT TOT TOÁÁNN

Ví dụ hàm Searching ở trên:

• Độ phức tạp trong tr ường hợp xấu nhất là O(n)

• Độ phức tạp trong tr  ường hợp tốt nhất là:O(1) khi K chính làphần tử đầu tiên của mảng.

• Độ phức tạp trung bình là: cỡ n/2 (khoảng ½ các phần tử của

mảng được duyệt). Việc tính toán r  ất phức tạp dựa vào xác

suất K xuất hiện trong A.

Thường đánh giá thuật toán theo độ phức tạp thời gian

xấu nhất. Hiệu quả sử dụng của thuật toán lại thể hiện

thông qua độ phức tạp trung bình.

Page 7: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 7/20

24

Kiểu dữ liệu:

• Trong ngôn ngữ bậc cao

• Là sự tr ừu tượng hóa các thuộc tính bản chất của các đối

tượng trong thực tế và phù hợp với cách tổ chức thông tin trên

máy tính

• Kiểu số nguyên, số thực, kí tự,…

• Kiểu dữ liệu T = <V, O>, V là tập các giá tr  ị hợp lệ của T và O

là tập các phép toán trên kiểu T.

KIKIỂỂU DU DỮỮ LILIỆỆU VU VÀÀ CCẤẤU TRU TRÚÚC DC DỮỮ LILIỆỆUU

25

KIKIỂỂU DU DỮỮ LILIỆỆU VU VÀÀ CCẤẤU TRU TRÚÚC DC DỮỮ LILIỆỆUU

Cấu trúc dữ liệu:

• Là các lưu tr ữ dữ liệu trên máy tính sao cho việc sử dụngdữ liệu đó được hiệu quả. Đó chính là tổ chức các kháiniệm toán học và logic về dữ liệu.

• Kiểu dữ liệu có cấu trúc được kết hợp nên từ các kiểu dữ liệu

cơ sở

• Ví dụ: Kiểu mảng, xâu kí tự, Bản ghi, File,…

Mối liên hệ giữa cấu trúc dữ liệu và Thuật toán

Chương trình = Cấu trúc dữ liệu + Thuật toán

26

KIKIỂỂU DU DỮỮ LILIỆỆU VU VÀÀ CCẤẤU TRU TRÚÚC DC DỮỮ LILIỆỆUU

Mô hình dữ liệu

• Là mô hình toán học, có thể biểu diễn được trên máy tính, đểbiểu diễn các đối tượng của bài toán và mối liên hệ giữa các

đối tượng• Mô hình dữ liệu muốn cài đặt được trên máy tính phải có cách

tổ chức dữ liệu phù hợp.

• Ví dụ: Danh sách, Cây, Đồ thị, Quan hệ,. …

Các tiêu chuẩn chọn cấu trúc dữ liệu

• Phản ánh đúng thực tế: quan tr ọng nhất, đảm bảo tính đúng

đắn của phương án giải quyết• Các thao tác phù hợp

• Tiết kiệm tài nguyên hệ thống

27

KIKIỂỂU DU DỮỮ LILIỆỆU TRONG CU TRONG C

Kiểu dữ liệu cơ sở

• Kí tự (char, unsigned char)

• Số nguyên (int, unsigned int, long (int), unsigned long (int))

• Số thực, độ chính xác đơn (float)

• Số thực, độ chính xác kép (double)

 – Lưu ý: Kích thước và phạm vi biểu diễn của các kiểu dữ liệu

Kiểu con tr ỏ

Kiểu enum

Kiểu mảng (array)

Kiểu cấu trúc (struct)

Kiểm tra kích thước của kiểu dữ liệu: dùng toán tử sizeof(), ví

dụ: sizeof(int),…

Page 8: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 8/20

28

KIKIỂỂU CON TRU CON TRỎỎ

Biến con tr ỏ (Pointer)

• Địa chỉ  bộ nhớ của biến được gán cho con tr  ỏ là giá tr  ị của

biến con tr ỏ.

• Biến thông thường chứa một giá tr ị cụ thể (count = 7).

• Các con tr ỏ chứa địa chỉ của biến: biến được tr ỏ chứa giá tr  ị cụthể (tham chiếu gián tiếp)

Con tr ỏ countPtr tr ỏ đến biến count, giá tr ịcủa biến con tr ỏ countPtr là địa chỉ của

 biến count, giá tr ị của biến count là 7.

count

7

count

7

countPtr

29

BiBiếếnn concon tr tr ỏỏ trongtrong ngônngôn ngngữữ CC

Con tr ỏ - Pointer 

• Sức mạnh của ngôn ngữ lập trình C• Tạo ra khả năng mềm dẻo khi lập trình

• Thuận lợi truyền tham số cho hàm (tham biến), xử lý

mảng, xâu, bộ nhớ

• Con tr ỏ có quan hệ mật thiết giữa arrays và strings

• Lưu ý, thận tr ọng trong cách sử dụng: can thiệp vào

bộ nhớ.

30

Định ngh ĩ a và khởi tạo biến con tr ỏ

• * được sử dụng định ngh ĩ a biến pointer 

int *myPtr;

• Định ngh ĩ a biến con tr ỏ, tr ỏ tới vùng nhớ kiểu int

• Định ngh ĩ a nhiều con tr ỏ yêu cầu sử dụng * tr ước mỗi biến con

tr ỏ

int *myPtr1, *myPtr2;

• Có thể định ngh ĩ a con tr ỏ kiểu dữ liệu bất kỳ

• Khởi tạo con tr ỏ là 0, NULL (con tr ỏ r ỗng) hoặc một địa chỉ của

một biến cùng kiểu dữ liệu

BiBiếến con tr n con tr ỏỏ trong ngôn ngtrong ngôn ngữữ CC

31

&Tenbien (tr ả về địa chỉ của tenbien)

• Phép gán tr ả về địa chỉ của biến dữ liệu

int y = 5;

int *yPtr;

yPtr = &y; /* yPtr lấy địa chỉ của y */

yPtr “tr ỏ tới” y

yPtr

y

5

yptr

500000 600000

y

600000 5

địa chỉ của y

là giá tr ị củayptr

BiBiếếnn concon tr tr ỏỏ trongtrong ngônngôn ngngữữ CC

Page 9: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 9/20

Page 10: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 10/20

1 /* Fig. 7.14: fig07_14.c

2 Attempting to modify a constant pointer to constant data. */

3 #include <stdio.h>

4

5 int main()

6 {

7 int x = 5; /* initialize x */

8 int y; /* define y */

9

10 /* ptr is a constant pointer to a constant integer. ptr always 

11 points to the same location; the integer at that location

12 cannot be modified */

13 const int *const ptr = &x;

14

15 printf( "%d\n", *ptr );

16

17 *ptr = 7; /* error: *ptr is const; cannot assign new value */

18 ptr = &y; /* error: ptr is const; cannot assign new address */

19

20 return 0; /* indicates successful termination */

21

22 } /* end main */

Ví dụ: nhữ ng tình huống sử  dụng con trỏ hằng,

đượ c phép và không đượ c phép

Compiling...FIG07_14.cD:\books\2003\chtp4\Examples\ch07\FIG07_14.c(17) : error C2166: l-value

specifies- const objectD:\books\2003\chtp4\Examples\ch07\FIG07_14.c(18) : error C2166: l-value

specifies- const objectError executing cl.exe.

FIG07_12.exe - 2 error(s), 0 warning(s)

38

SSỬỬ DDỤỤNG KING KIỂỂU MU MẢẢNG TRONG CNG TRONG C

Các mảng

• Là cấu trúc gồm các phần tử dữ liệu có liên quan

với nhau

• Các thực thể t ĩ nh (Static) – kích thước không thay

đổi trong suốt chương trình

(Phân biệt với: Cấu trúc dữ liệu động (Dynamic)

39

Khái niệm mảng

• Nhóm của định vị bộ nhớ liên tiếp nhau

• Cùng chung tên và kiểu dữ liệu

Tham chiếu đến phần tử, cụ thể

• Tên mảng

• Số vị trí

Định dạng:

arrayname[ position number 

]

• phần tử đầu tiên có vị trí 0

• n phần tử mảng với tên c:

– c[ 0 ], c[ 1 ]...c[ n – 1 ]

Tên của mảng (tấtcả các phần tử có

chung tên c)

Số vị trí củaphần tử trong

mảng c

c[6]

-45

6

0

72

1543

-89

0

62

-3

1

6453

78

c[0]

c[1]

c[2]

c[3]

c[11]

c[10]

c[9]

c[8]

c[7]

c[5]

c[4]

Page 11: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 11/20

40

Các phần tử trong mảng giống như các biến

c[ 0 ] = 3;

printf( "%d", c[ 0 ] );

• Thực hiện thao tác trong ngoặc [] để xác định chỉ số.

+ Nếu x = 3 thì c[ 5 - 2 ] == c[ 3 ] == c[ x ]

+ Chỉ số của mảng có thể xác định bằng biểu thứctoán học

41

KhaiKhai bbááoo mmảảngng

Khi khai báo mảng

• Tên mảng

• Kiểu mảng

• Số phần tử

Cú pháp: arrayType arrayName[ numberOfElements ];

• Ví dụ:

int c[ 10 ];

float myArray[ 3284 ];

Khai báo nhiều mảng có cùng kiểu

• Cú pháp tương tự như khai báo biến

• Ví dụ:

int b[ 100 ], x[ 27 ];

42

KhaiKhai bbááoo vvàà khkhởởii ttạạoo mmảảngng

Khởi tạo mảng: khai báo và gắn giá tr  ị các phần tử

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

• Nếu không đủ các biến thì các phần tử bên phải nhất bằng 0

int n[ 5 ] = { 0 } // Tất cả các phần tử bằng 0• Nếu quá nhiều phần tử thì báo lỗi cú pháp

• C không kiểm tra giới hạn của mảng

• Nếu bỏ qua kích thước, sử dụng mặc định số phần tử khởi tạo

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

. Khởi tạo 5 phần tử, do đó mảng có 5 phần tử

1 /* Fig. 6.4: fig06_04.c

2 Initializing an array with an initializer list */

3 #include <stdio.h>

4

5 /* function main begins program execution */

6 int main()

7 {

8 /* use initializer list to initialize array n */

9 int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 };

10 int i; /* counter */

11

12 printf( "%s%13s\n", "Element", "Value" );

13

14 /* output contents of array in tabular format */

15 for ( i = 0; i < 10; i++ ) {

16 printf( "%7d%13d\n", i, n[ i ] );

17 } /* end for */

18

19 return 0; /* indicates successful termination */

20

21 } /* end main */

Element Value

0 32

1 272 64

3 18

4 95

5 14

6 90

7 70

8 60

9 37

Program OutputProgram Output

VVíí ddụụ:: KhaiKhai b bááoo vvàà khkhở ở ii ttạạoo mmảảngng

Page 12: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 12/20

array = 0012FF78&array[0] = 0012FF78

&array = 0012FF78

1 /* Fig. 6.12: fig06_12.c

2 The name of an array is the same as &array[ 0 ] */

3 #include <stdio.h>4

5 /* function main begins program execution */

6 int main()

7 {

8 char array[ 5 ]; /* define an array of size 5 */

9

10 printf( " array = %p\n&array[0] = %p\n"

11 " &array = %p\n",

12 array, &array[ 0 ], &array );

1314 return 0; /* indicates successful termination */

15

16 } /* end main */

Ví dụ: Tên của array chính là &array[ 0 ] (địa chỉ của phần tử đầu tiên trong mảng)

MMốốii liênliên hhệệ gigiữữaa mmảảngng vvàà concon tr tr ỏỏ trongtrong CC

45

MMảảngng nhinhiềềuu chichiềềuu

Mảng nhiều chiều

• Bảng với các hàng và các cột (m hàng và n cột)

• Giống như ma tr ận: chỉ  số đầu là hàng (row), sau đó là cột

(column)

Row 0Row 1Row 2

Column 0 Column 1 Column 2 Column 3

a[0][0]

a[1][0]

a[2][0]

a[0][1]

a[1][1]

a[2][1]

a[0][2]

a[1][2]

a[ 2 ] [ 2 ]

a[0][3]

a[1][3]

a[2][3]

Chỉ sô hàng-Row

Tên mảngChỉ số cột-Column

46

MMảảngng nhinhiềềuu chichiềềuu

Khởi tạo

• int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } };

• Khởi tạo theo hàng trong dấu {}

• Nếu không đủ, các phần tử còn lại nhận giá tr  ị 0

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

Tham chiếu các phần tử

• Chỉ ra hàng và cột

printf( "%d", b[ 0 ][ 1 ] );

• Nhập giá tr ị cho phần tử (i,j) của mảng

scanf(“%d”, &b[i][j]);

1 2

3 4

1 0

3 4

1 /* Fig. 6.21: fig06_21.c

2 Initializing multidimensional arrays */

3 #include <stdio.h>

4

5 void printArray( const int a[][ 3 ] ); /* function prototype */

6

7 /* function main begins program execution */

8 int main()

9 {

10 /* initialize array1, array2, array3 */11 int array1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };

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

13 int array3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } };

14

15 printf( "Values in array1 by row are:\n" );

16 printArray( array1 );

17

18 printf( "Values in array2 by row are:\n" );

19 printArray( array2 );

20

21 printf( "Values in array3 by row are:\n" );22 printArray( array3 );

23

24 return 0; /* indicates successful termination */

25

26 } /* end main */

27

Ví dụ: Khở i tạo mảng đa chiều

Page 13: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 13/20

Page 14: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 14/20

Page 15: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 15/20

Page 16: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 16/20

60

Hàm Memory

• Trong <stdlib.h>

• Thao tác, so sánh, tìm kiếm khối của memory

• Có thể thao tác bất kỳ khối dữ liệu nào

Function prototype  Function descriptionvoid *memcpy( void *s1, const void *s2,size_t n );

Copies n characters from the object pointed to by s2 into the object pointed to by s1. A pointer to the resulting object is returned.

void *memmove( void *s1, const void *s2,size_t n );

Copies n characters from the object pointed to by s2 into the object pointed to by s1. The copy is performed as if the characters were firstcopied from the object pointed to by s2 into a temporary array and

then from the temporary array into the object pointed to by s1. A pointer to the resulting object is returned.

int memcmp( constvoid *s1, const void 

*s2, size_t n );

Compares the first n characters of the objects pointed to by s1 and s2.

The function returns 0, less than 0 or greater than 0 if s1 is equal to,less than or greater than s2.void *memchr( constvoid *s, int c,size_t n );

Locates the first occurrence of c (converted to unsigned char) in the

first n characters of the object pointed to by s. If c is found, a pointer to c in the object is returned. Otherwise, NULL is returned.

void *memset( void *s, int c, size_t n);

Copies c (converted to unsigned char) into the first n characters of 

the object pointed to by s. A pointer to the result is returned.61

BBÀÀI TI TẬẬP 3.2P 3.2

Viết chương trình để tạo một xâu kí tự, là xâu đảo

ngược của một xâu bất kì được nhập vào từ bàn phím.

62

MMảảng , Con tr ng , Con tr ỏỏ vvàà Xâu kXâu kíí ttựự

Các phần tử của array có thể là con tr ỏ

Ví dụ: array của các xâu (strings)char *suit[ 4 ] = { "Hearts", "Diamonds", "Clubs", "Spades" };

• Strings là các con tr ỏ tới ký tự  đầu tiên

• char * : mỗi phần tử của suit là một con tr ỏ char

• Các string được lưu tr ữ là mảng suit

• Mảng suit có kích thước cố định, nhưng con tr ỏ string có thể là kích thướcbất kỳ

suit[3]

suit[2]

suit[1]

suit[0] ’H’ ’e’ ’a’ ’r’ ’t’ ’s’ ’\0’

’D’ ’i’ ’a’ ’m’ ’o’ ’n’ ’d’ ’s’ ’\0’

’C’ ’l’ ’u’ ’b’ ’s’ ’\0’

’S’ ’p’ ’a’ ’d’ ’e’ ’s’ ’\0’

63

Ví dụ 716: Viết chươ ng trình tính kích thướ c của array float

gồm 20 phần tử và kích thướ c của con tr ỏ đến array

sizeof 

• Tr ả về kích thước l à số byte của biến

• Nếu sizeof( int ) bằng 4 bytes, thì

 – int myArray[ 10 ];

 – printf( "%d", sizeof( myArray ) );

 – sẽ in ra là 40

sizeof Có thể sử dụng với tham số là:

• Tên biến

• Tên kiểu

• Giá tr ị hằng số

HHààmm ttíínhnh kkííchch thưthướớcc ccủủaa bibiếếnn vvàà concon tr tr ỏỏ

Page 17: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 17/20

Page 18: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 18/20

68

BBÀÀI TI TẬẬP 3.3P 3.3

Viết các chương trình cài đặt phép toán trên ma tr ận:

cộng hai ma tr ận, nhân vô hướng, nhân 2 ma tr ận,

phép biến đổi sơ cấp trên ma tr ận.

Sử dụng biến kiểu con tr ỏ và cấp phát động để biểu

diễn một ma tr ận. Truy xuất đến các phần tử của ma

tr ận thông qua con tr ỏ (không truy xuất kiểu mảng)

69

KiKiểểuu bbảảnn ghighi

Dữ liệu kiểu bản ghi:

• Tập hợp các biến có liên quan sử dụng chung 1 tên

 – Tên biến “chung” có thể chứa các biến với các kiểu dữ liệu

khác nhau

• Nhiều tr ường dữ liệu

• Kết hợp với con tr ỏ để tạo các danh sách liên kết, ngăn xếp,

hàng đợi và cây

70

KiKiểểuu bbảảnn ghighi trongtrong CC

Ví dụ:

struct Student { 

char name[40] ;

int grade;

 };

• struct mô tả định ngh ĩ a cấu trúc Student

• Student là tên cấu trúc và được sử dụng để khai báo biến dữ

liệu có kiểu l à cấu trúc• chứa 2 tr ường dữ liệu

71

Cách định ngh ĩ a:

• Khai báo biến:

struct Student oneStudent, Class[ 50 ], *sPtr;• Kết hợp định ngh ĩ a và khai báo biến:

struct Student {

char name[40];

int grade;

} oneStudent, Class[ 50 ], *sPtr;

Page 19: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 19/20

72

Các thao tác hợp lệ trên cấu trúc

• Gán một cấu trúc cho một cấu trúc cùng kiểu

• Lấy địa chỉ  (&) của một cấu trúc• Truy cập các thành phần của 1 cấu trúc

• Sử dụng hàm sizeof để xác định kích thước của cấu trúc

73

Khởi tạo cấu trúc sử dụng danh sách

• Ví dụ:

struct Student oneStudent = { “Hoang Lan", 8 };

Các lệnh gán

• Ví dụ:

struct Student myFriend = oneStudent;

• Có thể định ngh ĩ avàkhởi tạo biến myFriend như sau:

struct Student myFriend;

myFriend.name = “Hoang Lan”;

myFriend.grade = 8;

74

Truy cập các thành phần của cấu trúc

• Sử dụng dấu (.) đi kèm với tên biến cấu trúc

struct Student myFriend;

printf( "%s", myFriend.name );

• Mũi tên (->) được sử dụng cho con tr  ỏ tr ỏ đến

biến cấu trúc

struct Student *sPtr = &myFriend;

printf( "%s",sPtr->name );

• myFriend.name tương đương với

( *sPtr ).name75

typedef : Định ngh ĩ a kiểu

• Tạo ra tên khác (bí danh) cho một kiểu dữ liệu đã định

ngh ĩ a

• typedef không tạo ra kiểu dữ liệu mới

• Ví dụ:

typedef struct Student * StudentPtr;

StudentPtr sPtr;

>  Định ngh ĩ a tên kiểu mới StudentPtr có cùng kiểu với kiểu

struct Student *

• Ví dụ: typedef char line[80];

line str; // tương ứng char str[80];

Page 20: 3. Thuat Toan-Cau Truc Du Lieu

8/2/2019 3. Thuat Toan-Cau Truc Du Lieu

http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 20/20

76

Đọc thêm: Kiểu union, kiểu enum trong ngôn ngữ lập

trình C

77

BBààii ttậập 3.4p 3.4

Nhập vào một danh sách lớp sinh viên gồm 2 thông tin:

Họ tên và điểm.

Hiển thị danh sách sinh viên

Tính điểm trung bình cộng điểm của các sinh viên.

Tìm và hiển thị tên các sinh viên đạt điểm lớn hơn hoặc

bằng giá tr ị trung bình cộng vừa tính được.

Tìm và hiển thị tên sinh viên có điểm cao nhất lớp.

Yêu cầu:

• Sử dụng kết hợp kiểu mảng và kiểu struct

• Cấp phát động cho mảng