(NB) Giáo trình Cấu trúc dữ liệu và giải thuật nhằm cung cấp cho sinh viên các thuật toán tổng quát, danh sách liên kết, và các giải thuật sắp xếp, tìm kiếm. Từ đó sinh viên sẽ từng bước cải tiến thuật toán để xây dựng được những chương trình hiệu quả và có tính ứng dụng cao. Mục đích của giáo trình là trang bị cho học viên những kiến thức và kỹ năng phân tích xây dựng được thuật toán kết hợp với giải thuật.
Trang 2Bà R a – Vũng Tàu, năm 2016 ị
TUYÊN B B N QUY NỐ Ả Ề
Tài li u này thu c lo i sách giáo trình nên các ngu n thông tin có thệ ộ ạ ồ ể
được phép dùng nguyên b n ho c trích dùng cho các m c đích v đào t o vàả ặ ụ ề ạ tham kh o.ả
M i m c đích khác mang tính l ch l c ho c s d ng v i m c đích kinhọ ụ ệ ạ ặ ử ụ ớ ụ doanh thi u lành m nh s b nghiêm c m.ế ạ ẽ ị ấ
Trang 3L I GI I THI U Ờ Ớ Ệ
Giáo trình c u trúc d li u và gi i thu t dùng cho h c sinh h Caoấ ữ ệ ả ậ ọ ệ
Đ ng và Trung c p c a ngh l p trình máy tính và h cao đ ng chuyên ngànhẳ ấ ủ ề ậ ệ ẳ công ngh thông tin ng d ng ph n m m trong trệ ứ ụ ầ ề ường Cao đ ng ngh T nhẳ ề ỉ
BR – VT. Nh m cung c p cho sinh viên các thu t toán t ng quát, danh sáchằ ấ ậ ổ liên k t, và các gi i thu t s p x p, tìm ki m. T đó sinh viên s t ng bế ả ậ ắ ế ế ừ ẽ ừ ướ c
c i ti n thu t toán đ xây d ng đả ế ậ ể ự ược nh ng chữ ương trình hi u qu và có tínhệ ả
ng d ng cao. M c đích c a giáo trình là trang b cho h c viên nh ng ki n
th c và k năng phân tích xây d ng đứ ỹ ự ược thu t toán k t h p v i gi i thu tậ ế ợ ớ ả ậ
Đ có th n m b t các ki n th c h c sinh c n để ể ắ ắ ế ứ ọ ầ ược trang b các ki nị ế
th c v môn l p trình căn b n. Ngôn ng l p trình đứ ề ậ ả ữ ậ ược ch n đ minh h aọ ể ọ các ki n th c trên là Dev C++. ế ứ
Trong qua trình biên so n giáo trình, ạ ch n ch n r ng trong giáo trình sắ ắ ằ ẽ còn nhi u khi m khuy t, tác gi mong mu n nh n đề ế ế ả ố ậ ược các ý ki n quí báuế đóng góp c a đ ng nghi p cũng nh b n đ c đ giáo trình này có th hoànủ ồ ệ ư ạ ọ ể ể thi n h n n a v m t n i dung cũng nh hình th c trong l n tái b n sau.ệ ơ ữ ề ặ ộ ư ứ ầ ả
Biên so nạ
Nguy n Th Maiễ ị
Trang 5M C L CỤ Ụ
TRANGCHƯƠNG TRÌNH MÔ ĐUN 8
BÀI 1GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 10
1 Mối liên hệ giải thuật và cấu trúc dữ liệu 10
1.1 Giải thuật 10
1.2 Dữ liệu 10
1.3 Mối quan hệ giữa cấu trúc dữ liệu và giải thuật 11
2 Kiểu dữ liệu, mô hình dữ liệu, kiểu dữ liệu trừu tượng 11
2.1.Khái niệm về kiểu dữ liệu 11
2.2 Mô hình kiểu dữ liệu 12
2.3 Kiểu dữ liệu trừu tượng 13
3 Thiết kế và phân tích giải thuật 13
3.1 Thiết kế thuật toán 13
3.2 Phân tích tính đúng đắn của giải thuật 13
3.3 Phân tích tính đơn giản 14
4 Một số ví dụ về thiết kế và phân tích giải thuật 14
BÀI 2LÀM VIỆC VỚI CON TRỎ 17
1 Biến con trỏ 17
1.1 Khái niệm con trỏ ( pointer ) 17
1.3 Gán địa chỉ của biến cho biến con trỏ 18
1.4 Cấp phát vùng nhớ cho biến con trỏ 19
1.5 Giải phóng vùng nhớ cho biến con trỏ 19
1.6 Một số phép toán trên con trỏ 20
2 Con trỏ và mảng một chiều 21
3 Con trỏ và mảng nhiều chiều 22
BÀI 3 LÀM VIỆC VỚI KIỂU CẤU TRÚC 25
1 Khái niệm cấu trúc 25
2 Khai báo kiểu cấu trúc 25
3 Truy nhập đến các thành phần trong biến cấu trúc 28
4 Nhập dữ liệu cho biến cấu trúc 28
BÀI 4LÀM VIỆC VỚI KIỂU TẬP TIN 32
1 Khái niệm về tập tin 32
2 Các kiểu vào ra với tệp: 33
2.1 Khai báo biến tập tin 33
2.2 Mở tập tin 34
2.3 Đóng tập tin 35
2.4 Kiểm tra đến cuối tập tin hay chưa? 35
2.5 Di chuyển con trỏ tập tin về đầu tập tin - Hàm rewind() 36
3 Các thao tác trên tệp: 36
Trang 63.1 Ghi dữ liệu lên tập tin văn bản 36
3.2 Đọc dữ liệu từ tập tin văn bản 37
BÀI 5 THÊM PHẦN TỬ TRONG DANH SÁCH ĐẶC 41
1 Định nghĩa 41
2 Khởi tạo danh sách 41
3 Thêm một phần tử vào danh sách 42
3.1.Thêm vào đầu danh sách: 42
3.2.Thêm vào cuối danh sách: 42
3.3 Thêm vào vị trí bất kỳ trong danh sách: 42
BÀI 6 XÓA PHẦN TỬ TRONG DANH SÁCH ĐẶC 44
1 Xóa phần tử đầu 44
2 Xóa phần tử cuối 45
3 Xóa phần tử tại vị trí bất kỳ trong danh sách: 45
BÀI 7LÀM VIỆC VỚI DANH SÁCH LIÊN KẾT 46
1 Định nghĩa: 46
2 Khai báo một nút 47
3 Khai báo một danh sách 47
4 Khởi tạo một nút mới 47
5 Khởi tạo một danh sách 48
6 Nhập một danh sách 48
7 Xuất một danh sách 49
BÀI 8CHÈN PHẦN TỬ TRONG DANH SÁCH LIÊN KẾT 50
1 Chèn một nút vào đầu danh sách 50
2 Chèn một nút vào cuối danh sách 51
3 Chèn một nút vào vị trí bất kỳ 51
BÀI 9 XÓA PHẦN TỬ TRONG DANH SÁCH LIÊN KẾT 53
1 Xóa nút đầu danh sách 53
2 Xóa nút cuối danh sách 53
3 Hủy danh sách 54
BÀI 10 LÀM VIỆC VỚI NGĂN XẾP 561.4 Lấy một phần tử ra khỏi ngăn xếp 58
1.5 Thêm một phần tử vào ngăn xếp 58
2.3 Lấy một phần tử ra khỏi ngăn xếp 59
2.4 Thêm một phần tử vào ngăn xếp 60
2.5 Xóa phần tử ở ngăn xếp 60
BÀI 11LÀM VIỆC VỚI HÀNG ĐỢI(QUEUE) 62
1 Biểu diễn hàng đợi dùng mảng: 63
2.4 Lấy phần tử ở ở đầu Queue 67
Trang 8 Trình bày được các ki u d li uể ữ ệ
Phân tích và xây d ng đự ược thu t toánậ
Phân tích được các lo i d li u, gi i thu t và k t h p đạ ữ ệ ả ậ ế ợ ược d li u và gi i ữ ệ ảthu t.ậ
Th c hi n đự ệ ược các thao tác trên các ki u d li uể ữ ệ
Cài đ t đặ ược các thu t toán s p x p và tìm ki m.ậ ắ ế ế
Cài đ t đặ ược các thu t toán trên các c u trúc d li u: m ng, danh sách, danhậ ấ ữ ệ ả sách liên k t đ n.ế ơ
Có tinh th n trách nhi m, ý th c t ch c k lu t, tác phong công nghi p, ầ ệ ứ ổ ứ ỷ ậ ệtinh th n h p tác trong công vi cầ ợ ệ
Có ý ch đ ng, đ c l p trong công vi c, t h củ ộ ộ ậ ệ ự ọ c p nh t ki n th c, nâng ậ ậ ế ứcao trình đ chuyên môn.ộ
Trang 94 Làm vi c v i ki u t p tinệ ớ ể ậ 5 Tích h pợ
Trang 10Ti p theo, các phế ương pháp phân tích, đánh giá đ ph c t p và th i gian th cộ ứ ạ ờ ự
hi n gi i thu t . Qua bài h c này s gi i thi u m t cách th t c th v c uệ ả ậ ọ ẽ ớ ệ ộ ậ ụ ể ề ấ trúc d li u và gi i thu t.ữ ệ ả ậ
M c tiêu: ụ
Trình bày được ki n th c c b n v c u trúc d li u, gi i thu t, ki uế ứ ở ả ề ấ ữ ệ ả ậ ể
d li u, mô hình d li u ữ ệ ữ ệ
Phân tích được gi i thu t ả ậ
S d ng đử ụ ược các phương pháp phân tích, thi t k gi i thu t.ế ế ả ậ
Rèn luy n tính c n th n, kiên trì, sáng t o. ệ ẩ ậ ạ
B o đ m an toàn và v sinh cho ngả ả ệ ười và thi t b trong phòng máy.ế ị
D li u ữ ệ raOut put
Trang 11D li u có th là d li u đ a vào (input data), d li u trung gian ho cữ ệ ể ữ ệ ư ữ ệ ặ
d li u đ a ra(output data). Do v y, vi c t ch c đ l u tr d li u ph c vữ ệ ư ậ ệ ổ ứ ể ư ữ ữ ệ ụ ụ cho chương trình có ý nghĩa r t quan tr ng trong toàn b h th ng chấ ọ ộ ệ ố ươ ngtrình. Vi c xây d ng c u trúc d li u quy t đ nh r t l n đ n ch t lệ ự ấ ữ ệ ế ị ấ ớ ế ấ ượng cũng
nh công s c c a ngư ứ ủ ườ ậi l p trình trong vi c thi t k , cài đ t chệ ế ế ặ ương trình.1.3. M i quan h gi a c u trúc d li u và gi i thu tố ệ ữ ấ ữ ệ ả ậ
M i quan h gi a c u trúc d li u và Gi i thu t có th minh h a b ng đ ngố ệ ữ ấ ữ ệ ả ậ ể ọ ằ ẳ
th c:ứ
C u trúc d li u + Gi i thu t = Chấ ữ ệ ả ậ ương trình
Nh v y, khi đã có c u trúc d li u t t, n m v ng gi i thu t th c hi n thìư ậ ấ ữ ệ ố ắ ữ ả ậ ự ệ
vi c th hi n chệ ể ệ ương trình b ng m t ngôn ng c th ch là v n đ th iằ ộ ữ ụ ể ỉ ấ ề ờ gian. Khi có c u trúc d li u mà ch a tìm ra thu t gi i thì không th cóấ ữ ệ ư ậ ả ể
chương trình và ngượ ạc l i không th có gi i thu t khi ch a có c u trúc dể ả ậ ư ấ ữ
li u. M t chệ ộ ương trình máy tính ch có th đỉ ể ược hoàn thi n khi có đ y đ cệ ầ ủ ả
C u trúc d li u đ l u tr d li u và Gi i thu t x lý d li u theo yêu c uấ ữ ệ ể ư ữ ữ ệ ả ậ ử ữ ệ ầ
c a bài toán đ t ra.ủ ặ
2. Ki u d li u, mô hình d li u, ki u d li u tr u tể ữ ệ ữ ệ ể ữ ệ ừ ượng
2.1.Khái ni m v ki u d li uệ ề ể ữ ệ
Ki u d li u T có th xem nh là s k t h p c a 2 thành ph n:ể ữ ệ ể ư ự ế ợ ủ ầ
Mi n giá tr mà ki u d li u T có th l u tr : V,ề ị ể ữ ệ ể ư ữ
T p h p các phép toán đ thao tác d li u: O.ậ ợ ể ữ ệ
T = <V, O>
M i ki u d li u thỗ ể ữ ệ ường được đ i di n b i m t tên (đ nh danh). M i ph n ạ ệ ở ộ ị ỗ ầ
t d li u cóki u T s có giá tr trong mi n V và có th đử ữ ệ ể ẽ ị ề ể ược th c hi n các ự ệphép toán thu c t p h pcác phép toán trong O.ộ ậ ợ
Đ l u tr các ph n t d li u này thể ư ữ ầ ử ữ ệ ường ph i t n m t s byte(s) trong b ả ố ộ ố ộ
nh , s byte(s) này g i là kích thớ ố ọ ướ ủc c a ki u d li u.ể ữ ệ
Trang 122.2. Mô hình ki u d li uể ữ ệ
H u h t các ngôn ng l p trình đ u có cung c p các ki u d li u c s Tùy ầ ế ữ ậ ề ấ ể ữ ệ ơ ởvào m iỗ
ngôn ng mà các ki u d li u c s có th có các tên g i khác nhau song ữ ể ữ ệ ơ ở ể ọchung quy
l i có nh ng lo i ki u d li u c s nh sau:ạ ữ ạ ể ữ ệ ơ ở ư
Ki u s nguyên:ể ố Có th có d u ho c không có d u và thể ấ ặ ấ ường có các kích
thước sau:
+ Ki u s nguyên 1 byteể ố
+ Ki u s nguyên 2 bytesể ố
+ Ki u s nguyên 4 bytesể ố
Ki u s nguyên thể ố ường được th c hi n v i các phép toán: O = {+, , *, /, ự ệ ớDIV, MOD, <,>, <=, >=, =, …}
Ki u s th cể ố ự : Thường có các kích thước sau:
+ Ki u s th c 4 bytesể ố ự
+ Ki u s th c 6 bytesể ố ự
+ Ki u s th c 8 bytesể ố ự
+ Ki u s th c 10 bytesể ố ự
Ki u s th c thể ố ự ường được th c hi n v i các phép toán: O = {+, , *, /, <, >, ự ệ ớ
<=, >=, =, …}
Ki u ký t :ể ự Có th có các kích thể ước sau:
+ Ki u ký t byteể ự
+ Ki u ký t 2 bytesể ự
Ki u ký t thể ự ường được th c hi n v i các phép toán: O = {+, , <, >, <=, >=, ự ệ ớ
=, ORD,CHR, …}
Ki u chu i ký t :ể ỗ ự Có kích thước tùy thu c vào t ng ngôn ng l p trìnhộ ừ ữ ậ
Ki u chu i ký t thể ỗ ự ường được th c hi n v i các phép toán: O = {+, &, <, >, ự ệ ớ
<=, >=, =,Length, Trunc, …}
Trang 13 Ki u lu n lý:ể ậ Thường có kích thước 1 byte
Ki u lu n lý thể ậ ường được th c hi n v i các phép toán: O = {NOT, AND, OR,ự ệ ớ XOR, <, >,<=, >=, =, …}
2.3. Ki u d li u tr u tể ữ ệ ừ ượng
Ki u d li u tr u tể ữ ệ ừ ượng là m t mô hình toán h c cùng v i m t t p h pộ ọ ớ ộ ậ ợ các phép toán trên nó. Có th nói ki u d li u tr u tể ể ữ ệ ừ ượng là m t ki u d li uộ ể ữ ệ
do chúng ta đ nh nghĩa m c khái ni m (conceptual), nó ch a đị ở ứ ệ ư ược cài đ t cặ ụ
th b ng m t ngôn ng l p trình. ể ằ ộ ữ ậ
Khi cài đ t m t ki u d li u tr u tặ ộ ể ữ ệ ừ ượng trên m t ngôn ng l p trình c th ,ộ ữ ậ ụ ể chúng ta ph i th c hi n hai nhi m v : ả ự ệ ệ ụ
Bi u di n ki u d li u tr u tể ễ ể ữ ệ ừ ượng b ng m t c u trúc d li u ho c m tằ ộ ấ ữ ệ ặ ộ
ki u d li u tr u tể ữ ệ ừ ượng khác đã được cài đ t.ặ
Vi t các chế ương trình con th c hi n các phép toán trên ki u d li u tr uự ệ ể ữ ệ ừ
tượng mà ta thường g i là cài đ t các phép toán.ọ ặ
3. Thi t k và phân tích gi i thu tế ế ả ậ
3.1. Thi t k thu t toán.ế ế ậ
Người ta thường dùng phương pháp chia nh bài toán hay chi n thu t chia đ ỏ ế ậ ể
tr đ thi t k gi i thu t.ị ể ế ế ả ậ
N u g i bài toán là m t modul chính thì ta chia modul chính thành các modul ế ọ ộcon r i l i chia các modul con thành các modul con nh h n cho đ n khi ta ồ ạ ỏ ơ ế
được các modul đã bi t cách gi i r i. > Chi n thu t chia đ trế ả ồ ế ậ ể ị
3.2. Phân tích tính đúng đ n c a gi i thu tắ ủ ả ậ
Ta ph i ch ng minh gi i thu t là đúngả ứ ả ậ
Người ta thường làm : Cho chương trình ch y th v i m t b d li u đã bi t ạ ử ớ ộ ộ ữ ệ ế
k t quế ả
N u k t qu chế ế ả ương trình khác v i k t qu đã bi t thì ch c ch n chớ ế ả ế ắ ắ ương trình sai; n u b ng thì cũng ch a có k t lu n, do đó đây ch là phế ằ ư ế ậ ỉ ương pháp tìm ra cái sai mà ch a ch ng minh cái đúngư ứ
Trang 14 Cho ch y chạ ương trình r i xem k t qu có phù h p v i th c t không, n u ồ ế ả ợ ớ ự ế ếphù h p thì hiợ v ng đúng, còn không thì ch c ch n saiọ ắ ắ
Đ ch ng minh tính chính xác thì ph i dùng toán h c – hay dùng qui n p (r tể ứ ả ọ ạ ấ khó)
Tính hi u qu th hi n v hai m tệ ả ể ệ ề ặ
Không gian (Chương trình bé chi m ít b nh ) ế ộ ớ
Th i gian (Chờ ương trình ch y nhanh)ạ
4. M t s ví d v thi t k và phân tích gi i thu t ộ ố ụ ề ế ế ả ậ
Ví d 1: ụ Tìm s l n nh t trong m t dãy các s t aố ớ ấ ộ ố ừ 1,…, an
Input : S nguyên dố ương N và dãy a1, a2, , , aN
Output : Tìm Max là giá tr l n nh t c a dãy đã choị ớ ấ ủ
Kh i t o Max=aở ạ 1. V i m i i, n u aớ ỗ ế i > Max thì thay giá tr Max= aị i
Phân tích gi i thu t nh sau:ả ậ ư
Trang 15Ví d 2 ụ : Thi t k và phân tích gi i thu t gi i phế ế ả ậ ả ương trình b c 2.ậ
Input: Các h s a,b,c.ệ ố
Ouput: Nghi m c a phệ ủ ương trình
Yêu c u ph i có công th c tính Delta = bầ ả ứ 2 – 4ac
Phân tích gi i thu t nh sau:ả ậ ư
Thi t k và phân tích gi i thu t các bài toán sauế ế ả ậ :
1.1: Gi i phả ương trình b c nh tậ ấ
Trang 161.2: Tìm giá tr l n nh t và nh nh t c a hai s a,bị ớ ấ ỏ ấ ủ ố
1.3: Tính t ng : s=1+2+3+…+ nổ
Yêu c u đánh giáầ
Phân tích được gi i thu t ả ậ c a các bài toánủ
S d ng đử ụ ược các phương pháp phân tích, thi t k gi i thu t.ế ế ả ậ
Trang 17BÀI 2LÀM VI C V I CON TRỆ Ớ Ỏ
Gi i thi u:ớ ệ
Con tr là đ c tr ng và là m t trong nh ng s c m nh l n nh t trongỏ ặ ư ộ ữ ứ ạ ớ ấ
l p trình C++. Vì th vi c tìm hi u và v n d ng con tr là đi u không thậ ế ệ ể ậ ụ ỏ ề ể thi u đ i v i m t l p trình viên. Bài vi t này s giúp cho ngế ố ớ ộ ậ ế ẽ ườ ọi đ c có cái nhìn sâu s c h n v con tr trong l p trình C. Qua đó s giúp các b n s d ngắ ơ ề ỏ ậ ẽ ạ ử ụ con tr m t cách linh ho t, tránh đỏ ộ ạ ược nh ng sai sót và làm vi c m t cáchữ ệ ộ
hi u qu ệ ả
M c tiêu:ụ
Trình bày được khái ni m con trệ ỏ
Nêu được các thao tác trên con trỏ
Th c hi n đự ệ ược khai báo bi n con trế ỏ
Trình bày và v n d ng các phép toán trên bi n con tr vào các bài toánậ ụ ế ỏ
Trình bày và v n d ng đậ ụ ược con tr vào m ng m t chi u và m ng nhi uỏ ả ộ ề ả ề chi uề
Rèn luy n tính c n th n, kiên trì, sáng t o, đ c l p và ho t đ ng nhóm. ệ ẩ ậ ạ ộ ậ ạ ộ
B o đ m an toàn và v sinh cho ngả ả ệ ười và thi t b trong phòng máy.ế ị
N i dung :ộ
1. Bi n con trế ỏ
1.1. Khái ni m con tr ( pointer ) ệ ỏ
Con tr là bi n dùng đ ch a đ a ch c a bi n khác ho c có th là m t ỏ ế ể ứ ị ỉ ủ ế ặ ể ộhàm. Do có nhi u lo i đ a ch nên cũng có nhi u lo i bi n con tr Con tr ề ạ ị ỉ ề ạ ế ỏ ỏ
ki u int dùng đ ch a đ a ch c a ki u int. Con tr ki u float dùng đ ch a ể ể ứ ị ỉ ủ ể ỏ ể ể ứ
đ a ch ki u float.ị ỉ ể
Mu n s d ng đố ử ụ ược pointer, trước tiên ph i có đả ược đ a ch c a bi n mà ta ị ỉ ủ ế
c n quan tâm b ng phép toán l y đ a ch & . K t qu c a phép l y đ a ch & ầ ằ ấ ị ỉ ế ả ủ ấ ị ỉ
Trang 18Sau đó, n u ta mu n con tr ptr ch đ n ki u d li u gì cũng đế ố ỏ ỉ ế ể ữ ệ ược. Tác d ng ụ
c a khai báo này là ch dành ra 2 bytes trong b nh đ c p phát cho bi n con ủ ỉ ộ ớ ể ấ ế
tr ptr. ỏ
1.3. Gán đ a ch c a bi n cho bi n con tr ị ỉ ủ ế ế ỏ
Toán t & dùng đ đ nh v con tr đ n đ a ch c a m t bi n đang làm vi c. ử ể ị ị ỏ ế ị ỉ ủ ộ ế ệ
Cú pháp: <Tên bi n con tr >=&<Tên bi n> ế ỏ ế
Gi i thíchả : Ta gán đ a ch c a bi n ị ỉ ủ ế Tên bi n ế cho con tr ỏTên bi n con tr ế ỏ.
Ví dụ: Gán đ a ch c a bi n a cho con tr pa, gán đ a ch c a bi n b cho con ị ỉ ủ ế ỏ ị ỉ ủ ế
tr pb. ỏ
pa=&a; pb=&b;
L u ýư : Khi gán đ a ch c a bi n tĩnh cho con tr c n ph i l u ý ki u d li uị ỉ ủ ế ỏ ầ ả ư ể ữ ệ
c a chúng. Ví d sau đây không đúng do không tủ ụ ương thích ki u: ể
int Bien_Nguyen;
Trang 19
Con_Tro_Thuc=&Bien_Nguyen;
Phép gán đây là sai vì Con_Tro_Thuc là m t con tr ki u float (nó ch có thở ộ ỏ ể ỉ ể
ch a đứ ược đ a ch c a bi n ki u float); trong khi đó, Bien_Nguyen có ki u int.ị ỉ ủ ế ể ể 1.4. C p phát vùng nh cho bi n con tr ấ ớ ế ỏ
Trước khi s d ng bi n con tr , ta nên c p phát vùng nh cho bi n con ử ụ ế ỏ ấ ớ ếtrỏ
này qu n lý đ a ch Vi c c p phát đả ị ỉ ệ ấ ược th c hi n nh các hàm ự ệ ờ
malloc(), calloc() trong th vi n alloc.h. ư ệ
Cú pháp các hàm:
void *malloc(size_t size): C p phát vùng nh có kích th c là size. ấ ớ ướ
void *calloc(size_t nitems, size_t size): C p phát vùng nh có kích th c là ấ ớ ướnitems*size.
1.5. Gi i phóng vùng nh cho bi n con tr ả ớ ế ỏ
M t vùng nh đã c p phát cho bi n con tr , khi không còn s d ng ộ ớ ấ ế ỏ ử ụ
n a, ta s thu h i l i vùng nh này nh hàm free(). ữ ẽ ồ ạ ớ ờ
Cú pháp: void free(void *block)
Ý nghĩa: Gi i phóng vùng nh đ c qu n lý b i con tr block. ả ớ ượ ả ở ỏ
Ví dụ: ví d trên, sau khi th c hi n xong, ta gi i phóng vùng nh cho 2 Ở ụ ự ệ ả ớ
bi n con tr pa & pb: ế ỏ
Trang 20Ta cũng có th ép ki u con tr theo cú pháp: ể ể ỏ
(<Ki u k t qu >*)<Tên con tr > ể ế ả ỏ
Ch ng h n, ví d trên đẳ ạ ụ ược vi t l i: ế ạ
int a, *p, *a ; float *f;
a = 5 ; p = &a ; q = p ; /* đúng */
f = (float*)p; /* Đúng nh ép ki u*/ ờ ể
C ng, tr con tr v i m t s nguyên ộ ừ ỏ ớ ộ ố
Ta có th c ng (+), tr () 1 con tr v i 1 s nguyên N nào đó; k t qu tr v ể ộ ừ ỏ ớ ố ế ả ả ề
là 1 con tr Con tr này ch đ n vùng nh cách vùng nh c a con tr hi n t i ỏ ỏ ỉ ế ớ ớ ủ ỏ ệ ạ
Trang 212. Con tr và m ng m t chi uỏ ả ộ ề
Gi a m ng và con tr có m t s liên h r t ch t ch Nh ng ph n t ữ ả ỏ ộ ự ệ ấ ặ ẽ ữ ầ ử
c a m ng có th đủ ả ể ược xác đ nh b ng ch s trong m ng, bên c nh đó chúng ị ằ ỉ ố ả ạcũng có th để ược xác l p qua bi n con tr ậ ế ỏ
Ví dụ 1 : int A[5] ; * p ;
P = A ;
+ M ng b trí 5 ô nh liên ti p ( m i ô chi m 2 byte ).ả ố ớ ế ỗ ế
+ Tên m ng là 1 h ng đ a ch ( không thay đ i đả ằ ị ỉ ổ ược ), chính là đ a ch c a ị ỉ ủ
ph n t đ u tiên. => A tầ ử ầ ương đương v i &A[0]ớ
(A + i ) tương đương v i &A[i]ớ
*(A + i ) tương đương v i A[i]ớ
p = A => p = &A[0] ( p tr t i ph n t A[0])ỏ ớ ầ ử
*(p + i ) tương đương v i A[i].ớ
=>b n cách vi t nh sau là tố ế ư ương đương : A[i], * ( A + i ), * ( p + i ), p[i]
printf(" a[%d] = " , i ) ; scanf( " %d ", p + i );
}/* sapxep tăng dan */
Trang 22if (*(a + i)> * ( a + j ) )
{
t = * ( a + i ) ; *(a + i ) = * ( a + j) ;
*(a + j ) = t ;}
printf(" mang sau khi sap xep");
for ( i = 0; i < n ; i ++ ) printf("%5d",a[i]);
s= 0 ; for ( i=0 ; i < n ; ++i )
s= s+ a[ i];
printf ("\n Tong = %5d ", s );
getch ( );
}
3. Con tr và m ng nhi u chi uỏ ả ề ề
Ta có th s d ng con tr thay cho m ng nhi u chi u nh sau: ể ử ụ ỏ ả ề ề ư
Gi s ta có m ng 2 chi u và bi n con tr nh sau: ả ử ả ề ế ỏ ư
Trang 23a[1][0] được qu n lý b i contro_int+m; ả ởa[1][1] được qu n lý b i contro_int+m+1; ả ở
a[n][m] được qu n lý b i contro_int+n*m;ả ở
Tương t nh th đ i v i m ng nhi u h n 2 chi u.ự ư ế ố ớ ả ề ơ ề
Trang 24 Nh p vào m ng m t chi u m t dãy s nguyên ậ ả ộ ề ộ ố a1,a2,a3…an
Tính trung bình c a các nguyên t đã nh p vàoủ ử ậ
Tìm và in giá tr l n nh t, nh nh t c a m ngị ớ ấ ỏ ấ ủ ả
Xu t ra dãy các s chăn, s lấ ố ố ẻ
Yêu c u đánh giáầ
Bi tế được khai báo bi n con trế ỏ và các phép toán trên con trỏ
Áp d ng các phép toán trên bi n con tr vào các bài toánụ ế ỏ
Áp d ng đụ ược con tr vào m ng m t chi u và m ng nhi u chi uỏ ả ộ ề ả ề ề
Vi t đế ược chương trình và ch y, ki m tra đạ ể ược k t quế ả
Trang 25BÀI 3 LÀM VI C V I KI U C U TRÚCỆ Ớ Ể Ấ
Gi i thi u:ớ ệ
Bên c nh nh ng ki u d li u có s n nh char, int, float,… C cũng cho ạ ữ ể ữ ệ ẵ ưphép chúng ta t đ nh nghĩa ki u d li u đ phù h p v i m c đích cũng nh ự ị ể ữ ệ ể ợ ớ ụ ư
t o mã ngu n t i u nh t. Bài vi t này s ti p t c trình bày v ki u d li u ạ ồ ố ư ấ ế ẽ ế ụ ề ể ữ ệ
người dùng t đ nh nghĩa là struct. ự ị
M c tiêu:ụ
Trình bày được khái ni m bi n c u trúcệ ế ấ
Khai báo được bi n ki u c u trúcế ể ấ
Truy c p đậ ược đ n các thành ph n c a c u trúcế ầ ủ ấ
Nh p d li u đậ ữ ệ ược cho bi n c u trúcế ấ
V n d ng ki u c u trúc làm các bài toán trong l p trìnhậ ụ ể ấ ậ
Rèn luy n tính c n th n, kiên trì, sáng t o, đ c l p và ho t đ ng nhóm. ệ ẩ ậ ạ ộ ậ ạ ộ
B o đ m an toàn và v sinh cho ngả ả ệ ười và thi t b trong phòng máy.ế ị
Trang 26 Tên_c u_trúc là m t tên h p l đấ ộ ợ ệ ược dùng làm tên c u trúc;ấ
danh sách các bi n c u trúc: li t kê các bi n có ki u c u trúc v a khai báo, ế ấ ệ ế ể ấ ừ
Khai báo các thành ph n: là m t danh sách các khai báo tên và ki u d li uầ ộ ể ữ ệ
c a các thành ph n t o nên c u trúc này. ủ ầ ạ ấ
+ Ði m thi (diem) c a h c sinh. ể ủ ọ
+ Kèm theo khai báo ki u c u trúc, chúng ta đ nh nghĩa hai bi n: hs là m tể ấ ị ế ộ
+ Ki u_đã_có là ki u d li u mà ta mu n đ i tên.ể ể ữ ệ ố ổ
+ Tên_ki u_m i là tên m i mà ta mu n đ t.ể ớ ớ ố ặ
Xét câu l nh sau:ệ
struct hoc_sinh {
char ho_ten[20];
float diem;
Trang 284. Nh p d li u cho bi n c u trúcậ ữ ệ ế ấ
Ví d : ụ L p chậ ương trình nh p vào h tên c a h c sinh, đi m toán, lý. Tínhậ ọ ủ ọ ể trung bình chung c a các đi m nh p vào.ủ ể ậ
Trang 29printf(" hoten diem toan diemly diem ");
for(i=0;i<n;i++)
printf("\n %s %3f %3f %3f", dshs[i].hoten, dshs[i].toan, dshs[i].ly, dshs[i].diem);
Trang 30dshs[i].diem=dshs[i].toan+dshs[i].ly;
} printf(" danh sach hoc sinh vua nhap");
printf(" hoten diem toan diemly diem ");
for(i=0;i<n;i++)
printf("\n %s %3f %3f %3f", dshs[i].hoten, dshs[i].toan, dshs[i].ly, dshs[i].diem);
getch();
return 0;
}
Câu h i, bài t pỏ ậ
3.1. Trình bày đ nh nghĩa và cách khai báo bi n c u trúcị ế ấ
3.2. L p chậ ương trình nh p m t b n ghi g m h tên, tu i. ậ ộ ả ồ ọ ổ
In k t qu v a nh p ra màn hìnhế ả ừ ậ
Trang 31 S p x p m ng theo th t tăng d n c a tu iắ ế ả ứ ự ầ ủ ổ
3.3. Vi t chế ương trình nh p m t b n ghi bao g m các thành ph n sau: h tên, ậ ộ ả ồ ầ ọnăm sinh, quê quán, h s lệ ố ương, lương, thưởng, ph c p, t m ng, còn ụ ấ ạ ứ
nh n. Trong đó các thành ph n đậ ầ ược tính nh sau:ư
Lương = h s lệ ố ương * 650
Thưởng = 10% lương
Ph c p = 15% lụ ấ ương
T m ng = 25% lạ ứ ươngCòn nh n = lậ ương +thương +ph c p – t m ngụ ấ ạ ứ3.4. Vi t chế ương trình t o m t danh sách bao g m: ạ ộ ồ h tên, năm sinh, quê ọquán, đi m tóan, đi m lý, đi m hóa, t ng đi m, x p l ai. Trong đó: t ng ể ể ể ổ ể ế ọ ổ
đi m = đi m tóan+ đi m lý+đi m hóaể ể ể ể
x p l ai : = Gi i n u t ng đi m >=27ế ọ ỏ ế ổ ể
= Khá n u t ng đi m <27 và >=21ế ổ ể
= Trung bình n u t ng đi m <21ế ổ ể
3.5.Vi t chế ương trình qu n lý hàng hóa 1 c a hàng g m : mã m t hàng, tênả ử ồ ặ
m t hàng, s lặ ố ượng, đ n giá, thành ti n. Nh p vào danh sách n m t hàng. ơ ề ậ ặ
Bi t : Thành ti n = s lế ề ố ượng * đ n giáơ
In các m t hàng v a nh pặ ừ ậ
S p x p danh sách theo th t gi m d n c a thành ti n.ắ ế ứ ự ả ầ ủ ề
Yêu c u đánh giáầ
Trình bày được khái ni m bi n c u trúcệ ế ấ
Khai báo được bi n ki u c u trúcế ể ấ
Truy c p đậ ược đ n các thành ph n c a c u trúcế ầ ủ ấ
Nh p d li u đậ ữ ệ ược cho bi n c u trúcế ấ
Vi t đế ược chương trình và ch y, ki m tra đạ ể ược k t quế ả
Trang 32BÀI 4LÀM VI C V I KI U T P TINỆ Ớ Ể Ậ
Trình bày được khái ni m v i t p tinệ ớ ậ
Trình bày và th c hi n đự ệ ược các ki u vào ra v i t p tinể ớ ậ
Th c hi n đự ệ ược các thao tác trên t p tinậ
S d ng ki u d li u t p tin đ đ c và ghi t p văn b nử ụ ể ữ ệ ậ ể ọ ệ ả
Rèn luy n tính c n th n, kiên trì, sáng t o, đ c l p và ho t đ ng nhóm. ệ ẩ ậ ạ ộ ậ ạ ộ
B o đ m an toàn và v sinh cho ngả ả ệ ười và thi t b trong phòng máy.ế ị
N i dung ộ
1. Khái ni m v t p tinệ ề ậ
Là m t lo i d li u có th ghi lên đĩa đ dùng nhi u l n.Trong C ch cóộ ạ ữ ệ ể ể ề ầ ỉ
m t lo i File, nh ng c u trúc c a m i File có th khác nhau. C u trúc này ộ ạ ư ấ ủ ỗ ể ấ
được hình thành khi ta ghi d li u lên File, nó ph thu c vào hàm mà ta dùng ữ ệ ụ ộ
đ ghi d li u lên đĩa.ể ữ ệ
Có 3 lo i d li u ki u t p tin:ạ ữ ệ ể ậ
T p tin văn b n (Text File): là lo i t p tin dùng đ ghi các ký t lên đĩa, các ậ ả ạ ậ ể ự
ký t này đự ượ ưc l u tr dữ ướ ại d ng mã Ascii
T p tin đ nh ki u (Typed File): là lo i t p tin bao g m nhi u ph n t cóậ ị ể ạ ậ ồ ề ầ ử cùng ki u: char, int, long, c u trúc… và để ấ ượ ưc l u tr trên đĩa dữ ướ ại d ng m tộ chu i các byte liên t c.ỗ ụ
T p tin không đ nh ki u (Untyped File): là lo i t p tin mà d li u c a chúngậ ị ể ạ ậ ữ ệ ủ
g m các c u trúc d li u mà ngồ ấ ữ ệ ười ta không quan tâm đ n n i dung ho c ế ộ ặ
Trang 33ki u c a nó,ch l u ý đ n các y u t v t lý c a t p tin nh đ l n và các y uể ủ ỉ ư ế ế ố ậ ủ ậ ư ộ ớ ế
t tác đ ng lên t p tin mà thôi.ố ộ ậ
Bi n t p tin:ế ậ là m t bi n thu c ki u d li u t p tin dùng đ đ i di n cho ộ ế ộ ể ữ ệ ậ ể ạ ệ
m tt p tin. D li u ch a trong m t t p tin độ ậ ữ ệ ứ ộ ậ ược truy xu t qua các thao tác ấ
v i thông s là bi n t p tin đ i di n cho t p tin đó.ớ ố ế ậ ạ ệ ậ
Con tr t p tin:ỏ ậ Khi m t t p tin độ ậ ược m ra đ làm vi c, t i m i th i ở ể ệ ạ ỗ ờ
đi m, s có m t v trí c a t p tin mà t i đó vi c đ c/ghi thông tin s x y ra. ể ẽ ộ ị ủ ậ ạ ệ ọ ẽ ả
Người ta hình dung có m t con tr đang ch đ n v trí đó và đ t tên nó là con ộ ỏ ỉ ế ị ặ
tr t p tin.ỏ ậ
Sau khi đ c/ghi xong d li u, con tr s chuy n d ch thêm m t ph n t ọ ữ ệ ỏ ẽ ể ị ộ ầ ử
v phía cu i t p tin. Sau ph n t d li u cu i cùng c a t p tin là d u k t ề ố ậ ầ ử ữ ệ ố ủ ậ ấ ếthúc t p tin EOF (End Of File).ậ
2. Các ki u vào ra v i t p:ể ớ ệ
Mu n thao tác trên t p tin, ta ph i l n lố ậ ả ầ ượt làm theo các bước:
Trang 342.2. M t p tinở ậ
Cú pháp: FILE *fopen(char *Path, const char *Mode)
Trong đó:
+ Path: chu i ch đỗ ỉ ường d n đ n t p tin trên đĩa.ẫ ế ậ
+ Type: chu i xác đ nh cách th c mà t p tin s m Các giá tr có th c aỗ ị ứ ậ ẽ ở ị ể ủ
wb T o ra t p tin nh phân đ ghiạ ậ ị ể
ab N i vào t p tin nh phânố ậ ị
r+, r+t M m t t p tin văn b n đ đ c/ghi. T p tin ph i có trên đĩa ở ộ ậ ả ể ọ ậ ả
n u không s có l i.ế ẽ ỗw+, w+t T o ra t p tin văn b n đ đ c ghi. N u t p tin đã có trên đĩa ạ ậ ả ể ọ ế ậ
s b xóa.ẽ ịa+, a+t M t p tin đ đ c/ghi b sung theo ki u văn b n. N u t p tinở ậ ể ọ ổ ể ả ế ậ
ch a có thì t o m i.ư ạ ớr+b M ra t p tin nh phân đ đ c/ghiở ậ ị ể ọ
w+b T o ra t p tin nh phân đ đ c/ghiạ ậ ị ể ọ
a+b N i vào hay t o m i t p tin nh phânố ạ ớ ậ ị
Hàm fopen tr v m t con tr t p tin. Chả ề ộ ỏ ậ ương trình c a ta không th thay ủ ể
đ i giá tr c a con tr này. N u có m t l i xu t hi n trong khi m t p tin thì ổ ị ủ ỏ ế ộ ỗ ấ ệ ở ậhàm này tr v con tr NULL.ả ề ỏ
Trang 35N u m t p tin đ ghi, n u t p tin đã t n t i r i thì t p tin s b xóa và m t ế ở ậ ể ế ậ ồ ạ ồ ậ ẽ ị ộ
t p tin m i đậ ớ ượ ạc t o ra. N u ta mu n ghi n i d li u, ta ph i s d ng ch đế ố ố ữ ệ ả ử ụ ế ộ
“a”. Khi m v i ch đ đ c, t p tin ph i t n t i r i, n u không m t l i s ở ớ ế ộ ọ ậ ả ồ ạ ồ ế ộ ỗ ẽ
xu t hi n.ấ ệ
2.3. Đóng t p tinậ
Hàm fclose() được dùng đ đóng t p tin để ậ ược m b i hàm fopen(). Hàm này ở ở
s ghi d li u còn l i trong vùng đ m vào t p tin và đóng l i t p tin.ẽ ữ ệ ạ ệ ậ ạ ậ
Cú pháp: int fclose(FILE *f)
Trong đó f là con tr t p tin đỏ ậ ược m b i hàm fopen(). Giá tr tr v c a hàm ở ở ị ả ề ủ
là 0 báo r ng vi c đóng t p tin thành công. Hàm tr v EOF n u có xu t hi n ằ ệ ậ ả ề ế ấ ệ
Ý nghĩa: Ki m tra xem đã ch m t i cu i t p tin hay ch a và tr v EOF ể ạ ớ ố ậ ư ả ề
n u cu i t p tin đế ố ậ ược ch m t i, ngạ ớ ượ ạ ả ềc l i tr v 0
Trang 362.5. Di chuy n con tr t p tin vể ỏ ậ ề đ u t p tin Hàm rewind()ầ ậ
Khi ta đang thao tác m t t p tin đang m , con tr t p tin luôn di chuy n v ộ ậ ở ỏ ậ ể ềphía cu i t p tin. Mu n cho con tr quay v đ u t p tin nh khi m nó, ta s ố ậ ố ỏ ề ầ ậ ư ở ử
Trong đó, tham s c ch a mã Ascii c a m t ký t nào đó. Mã này đố ứ ủ ộ ự ược ghi lên
t p tin liên k t v i con tr f. Hàm này tr v EOF n u g p l i.ậ ế ớ ỏ ả ề ế ặ ỗ
3.1.2. Hàm fputs()
Hàm này dùng đ ghi m t chu i ký t ch a trong vùng đ m lên t p tin văn ể ộ ỗ ự ứ ệ ậ
b n.ả
Cú pháp: int puts(const char *buffer, FILE *f)
Trong đó, buffer là con tr có ki u char ch đ n v trí đ u tiên c a chu i ký t ỏ ể ỉ ế ị ầ ủ ỗ ự
được ghi vào. Hàm này tr v giá tr 0 n u buffer ch a chu i r ng và tr v ả ề ị ế ứ ỗ ỗ ả ềEOF n u g p l i.ế ặ ỗ
Trang 37%[.s ch s th p phân] ố ữ ố ậ
f
Ghi s th c có <s ch s th p phân> theo quy t c làm ố ự ố ữ ố ậ ắtròn s ố
%x Ghi s nguyên h th p l c phânố ệ ậ ụ
%e ho c %E ho c %g ặ ặ
ho c %Gặ
Ghi s th c d ng khoa h c (nhân 10 mũ x)ố ự ạ ọ
Ví dụ: Vi t ch ng trình ghi chu i ký t lên t p tin văn b n D:\\Baihat.txtế ươ ỗ ự ậ ả
Trang 38 Hàm này dùng đ đ c d li u t t p tin văn b n đang để ọ ữ ệ ừ ậ ả ược m đ làm vi c.ở ể ệ
Hàm này được dùng đ đ c m t chu i ký t t t p tin văn b n đang để ọ ộ ỗ ự ừ ậ ả ược
m ra và liên k t v i con tr f cho đ n khi đ c đ n ký t ho c g p ký t ở ế ớ ỏ ế ọ ủ ự ặ ặ ự
xu ng dòng ‘\n’ (ký t này cũng đố ự ược đ a vào chu i k t qu ) hay g p ký t ư ỗ ế ả ặ ự
k t thúc EOF (ký t này không đế ự ược đ a vào chu i k t qu ).ư ỗ ế ả
Trong đó:
buffer (vùng đ m): con tr có ki u char ch đ n cùng nh đ l n ch a các kýệ ỏ ể ỉ ế ớ ủ ớ ứ
t nh n đự ậ ược
n: giá tr nguyên ch đ dài l n nh t c a chu i ký t nh n đị ỉ ộ ớ ấ ủ ỗ ự ậ ược
f: con tr liên k t v i m t t p tin nào đó.ỏ ế ớ ộ ậ
Ký t NULL (‘\0’) t đ ng đự ự ộ ược thêm vào cu i chu i k t qu l u trong ố ỗ ế ả ưvùng đêm
Hàm tr v đ a ch đ u tiên c a vùng đ m khi không g p l i và ch a g p kýả ề ị ỉ ầ ủ ệ ặ ỗ ư ặ
t k t thúc EOF. Ngự ế ượ ạc l i, hàm tr v giá tr NULL.ả ề ị
3.2.3. Hàm fscanf()
Hàm này dùng đ đ c d li u t t p tin văn b n vào danh sách các bi n ể ọ ữ ệ ừ ậ ả ếtheo đ nh d ng.ị ạ
Cú pháp:fscanf(FILE *f, const char *format, varlist)
Trong đó: format: chu i đ nh d ng (gi ng hàm scanf()); varlist: danh sách các ỗ ị ạ ố
bi n m i bi n cách nhau d u ph y (,).ế ỗ ế ấ ẩ
Ví dụ : Vi t ch ng trình chép t p tin D:\Baihat.txt trên sang t p tin ế ươ ậ ở ậ
D:\Baica.txt
#include<stdio.h>
Trang 39while (! feof(f1)){
fputc(ch,f2);
ch=fgetc(f1);
}fcloseall();
Ghi các ph n t v a nh p vào t p văn b n v i tên mang.txtầ ử ừ ậ ệ ả ớ
Câu 4.2.M i sinh viên c n qu n lý ít nh t 2 thông tin: mã sinh viên và h tên. ỗ ầ ả ấ ọ
Vi t chế ương trình cho phép l a ch n các ch c năng: nh p danh sách sinh viên ự ọ ứ ậ
Trang 40t bàn phím r i ghi lên t p tin SinhVien.dat, đ c d li u t t p tin ừ ồ ậ ọ ữ ệ ừ ậ
SinhVien.dat r i hi n th danh sách lên màn hình, tìm ki m h tên c a m t ồ ể ị ế ọ ủ ộsinh viên nào đó d a vào mã sinh viên nh p t bàn phím.ự ậ ừ
Yêu c u đánh giáầ
Trình bày và th c hi n đự ệ ược các ki u vào ra v i t p tinể ớ ậ
Th c hi n đự ệ ược các thao tác trên t p tinậ
S d ng ki u d li u t p tin đ đ c và ghi t p văn b nử ụ ể ữ ệ ậ ể ọ ệ ả
Vi t đế ược chương trình và ch y, ki m tra đạ ể ược k t quế ả