Upload
ftung0
View
242
Download
0
Embed Size (px)
Citation preview
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
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.
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;
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.
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).
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.
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),…
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
8/2/2019 3. Thuat Toan-Cau Truc Du Lieu
http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 9/20
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]
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
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
8/2/2019 3. Thuat Toan-Cau Truc Du Lieu
http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 13/20
8/2/2019 3. Thuat Toan-Cau Truc Du Lieu
http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 14/20
8/2/2019 3. Thuat Toan-Cau Truc Du Lieu
http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 15/20
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 ỏỏ
8/2/2019 3. Thuat Toan-Cau Truc Du Lieu
http://slidepdf.com/reader/full/3-thuat-toan-cau-truc-du-lieu 17/20
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;
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];
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