Giáo trình Lập trình nâng cao trên ngôn ngữ Pascal - Chương 2: Các kiểu dữ liệu có cấu trúc
Trong chương này không trình bày chi tiết các kiểu dữliệu có cấu trúc ñơn giản như
kiểu mảng, chuỗi. Nội dung trọng tâm của chương là kiểu bản ghi (Record) có cấu trúc thay
ñổi, kiểu tệp và kiểu tập hợp. Chương này bạn ñọc cần nắm ñược các vấn ñềsau:
Cách thức ñịnh nghĩa một kiểu dữliệu mới
Khai báo biến với các kiểu dữliệu do người lập trình tự ñịnh nghĩa
Cách sửdụng toán tửCASE khi khai báo bản ghi có cấu trúc thay ñổi
Cách thức ghi và ñọc dữliệu cho ba loại tệp: tệp văn bản, tệp có kiểu và tệp
không kiểu, chú trọng cách ghi dữliệu kiểu sốvào tệp văn bản và lấy sốliệu ra
ñểxửlý
Xửdụng dữliệu kiểu tập hợp trong lập trình
hông chứa một phần tử nào cả thì nó ñược gọi là tập rỗng và ñược ký hiệu là []. Trong ví dụ 2.28, a là một biến tập hợp rỗng. Tập hợp rỗng ñược xem là cùng kiểu với mọi kiểu tập hợp. 3.3 Các phép tính trên tập hợp Các phép tính giới thiệu sau ñây chỉ thực hiện ñược trên các tập hợp cùng kiểu, nghĩa là các phần tử của mọi tập hợp phải cùng thuộc một kiểu cơ bản. a. Phép gán Phép gán ñược dùng ñể hình thành nên một tập hợp. Có thể gán một tập hợp cho một biến tập hợp cùng kiểu hoặc gán một biến tập hợp cho một biến tập khác cùng kiểu. (xem ví dụ 2.28) b. Phép hợp Phép hợp ñược ký hiệu bởi toán tử " + ". Hợp của hai tập hợp A và B khi ñó có thể viết là A + B Hợp của hai tập A và B là một tập hợp gồm các phần tử thuộc A hoặc thuộc B. Giả sử các tập A, B, C ñược hình thành như sau: A := [1..8,10..15]; Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 63 B := [5..9, 20,30]; C := A + B; Tập C ñược hình thành bởi phép hợp A và B nên sẽ gồm các phần tử [1..15,20,30] c. Phép giao Giao của hai tập A và B ký hiệu là A*B là một tập hợp gồm các phần tử ñồng thời thuộc cả A và B. C := A*B; tập C sẽ có các phần tử [5, 6, 7, 8] d. Phép trừ Phép trừ hai tập hợp A và B ký hiệu là A - B cho ta một tập gồm các phần tử thuộc A nhưng không thuộc B C := A - B; tập C sẽ có các phần tử [1..4, 10..15] còn [1..5] - [1..10] = [ ] e. Phép thuộc về Phép thuộc về ký hiệu là IN là một phép thử xem một giá trị hay một biến (không phải là biến tập) có thuộc về một tập khác hay không? Nếu có giá trị phép thử là True, ngược lại phép thử cho kết quả False. Ví dụ 2.28 T1:= ['a'..'z']; T2:= [true,false]; T3 := 'c'; Write( T3 in T1); cho kết quả True Write(false in T2); cho kết quả True Wite('1' in T1 ); cho kết quả False 3.4. Các phép so sánh trên tập Các phép so sánh nói trong mục này chỉ ñược thực hiện trên các tập cùng kiểu. Kết quả của phép so sánh thuộc kiểu Boolean nghĩa là cho ra một trong hai giá trị True hoặc False. a. Phép bằng, ký hiệu là = Hai tập A và B gọi là bằng nhau nếu mọi phần tử của A ñều thuộc B và mọi phần tử của B ñều thuộc A không phụ thuộc vào thứ tự các phần tử. Ví dụ phép so sánh [1..6] = [1,2,4,5,3,6] cho kết quả True ['a', 'b', 'c'] = ['A', 'B', 'C'] cho kết quả False b. Phép không bằng, ký hiệu là Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 64 Hai tập A và B gọi là không bằng nhau nếu tập A có ít nhất một phần tử không thuộc tập B hoặc tập B có ít nhất một phần tử không thuộc tập A. [1..6] [1,2,4,5,3,6] cho kết quả False ['a', 'b', 'c'] ['A', 'B', 'C'] cho kết quả True c. Phép nhỏ hơn hoặc bằng, ký hiệu là <= Tập A gọi là nhỏ hơn hoặc bằng tập B nếu mọi phần tử của tập A ñều thuộc tập B. [1..6] <= [1,2,4,5,3,6,8,9] cho kết quả True [1..6] <= [1,2,4,5,3] cho kết quả False d. Phép lớn hơn hoặc bằng, ký hiệu là >= Tập A gọi là lớn hơn hoặc bằng tập B nếu mọi phần tử của tập B ñều thuộc tập A. [1..6] >= [1,2,4,5] cho kết quả True [1,5] >= [1,2,4,5] cho kết quả False Chú ý: Trong Pascal không tồn tại các phép so sánh nhỏ hơn Các ví dụ về dữ liệu kiểu tập hợp Ví dụ 2.29 : Tìm số nguyên tố Ta ñã biết số nguyên tố là các số chỉ chia hết cho 1 và chính nó (ngoại trừ số 1) ñể tìm các số nguyên tố trong khoảng từ 1 ñến n chúng ta sử dụng nguyên lý sàng Eratosthène. Nguyên lý này có thể phát biểu như sau: nếu a là một số nguyên tố trong tập [1..n] thì không thể tồn tại một số b thuộc tập [1..n] mà b là bội số của a. Nói cách khác nếu ta ñã tìm ñược a là một số nguyên tố thì ta phải loại trừ khỏi tập [1..n] tất cả các số là bội số của a. Program Tim_so_nguyen_to; Uses crt; Const n=255; Type Songuyen = 1..n; {ñịnh nghĩa kiểu dữ liệu Songuyen gồm n số} Var snt,sang: set of songuyen; so:songuyen; i:integer; Begin clrscr; Writeln('Cac so nguyen to tu 2 den ',n); snt:=[];{Tập snt ban ñầu là tập rỗng} sang:=[2..n]; {Xác lập tập Sang gồm số nguyên tố ñầu tiên (2) và các số khác} so:=2; {Gán vào biến So số nguyên tố ñầu tiên = 2} Repeat While not (so in sang) do so:=so+1; snt:=snt+[so]; {Bổ xung số nguyên tố vừa tìm ñược vào tập Snt} Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 65 i:=so; Write(so,' '); {Viết số nguyên tố vừa tìm ñược ra màn hình} While i<=n do Begin sang:=sang-[i]; i:=i+so; {Xoá các số là bội số của số nguyên tố vừa tìm ñược} End; Until sang = []; Readln; End. Ví dụ 2.30 Trò chơi gieo xúc xắc: nguyên tắc chơi như sau: người chơi chọn một số trong khoảng từ 1 ñến 6, máy sẽ gieo 3 con xúc xắc ñể ñược 3 số. Nếu số của người chơi nằm trong tập số mà máy ñã gieo thì người chơi thắng, ngược lại người chơi thua. Nếu ba lần chơi mà người chơi ñều thắng thì tuyên bố người chơi trúng số ñộc ñắc. Program xuc_xac; Uses crt; Var xucxac: set of 1..6; So,i,dem,a,b,c:1..6;tl:char; Begin Clrscr; Repeat clrscr; For i:= 1 to 3 do Begin Textcolor(5); Write('Moi ban chon mot so tu 1 den 6 '); readln(so); a:=random(6); b:=random(6); c:=random(6); xucxac:=[a,b,c]; Writeln('So ma ban da chon ',so); Writeln('So ma may da gieo ',a,' ',b,' ',c); If so in xucxac then Begin textcolor(14); writeln('Ban thang van thu ',i); Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 66 dem:=dem+1; End else Writeln('Ban thua van thu ',i); If dem = 3 then Writeln('Ban trung doc dac - Xin chuc mung'); End; Writeln; Write('Choi tiep hay thoi? C/K '); Readln(tl); Until upcase(tl)='K'; End. Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 67 Bài tập ứng dụng chương 2 1. Nhập vào thư viện n ñầu sách (n<=50), các thông số cần ñưa vào là: Tên sách, Tên tác giả, Năm xuất bản, Tên nhà xuất bản, Số trang, Giá tiền. Hiện danh mục sách ñã nhập lên màn hình. 2. Dữ liệu tuyển sinh gồm các trường: SBD, HOTEN, TOAN, LY, HOA, TONG, KETQUA. Lập chương trình nhập dữ liệu cho một phòng thi không quá 40 thí sinh, số liệu trong trường Tong = Toan+Ly+Hoa, trường Ketqua ñiền vào chữ "DO" nếu tổng >=20, còn lại là "TRUOT". Hiện lên màn hình những người DO 3. Dữ liệu quản lý hàng hoá bao gồm: Mã hàng, Tên hàng, Số lượng, ðơn giá, Ngày nhập, Số chứng từ. Lập chương trình nhập hàng vào kho, sau mỗi mặt hàng nhập lại hỏi: "Nhap tiep hay thoi? C/K ". Nếu bấm "K" thì kết thúc nhập và hiện danh mục hàng ñã nhập lên màn hình. 4. TOADO là kiểu bản ghi chứa toạ ñộ (cột,dòng) của ba ñiểm trên màn hình. Lập chương trình kiểm tra xem ba ñiểm này có thẳng hàng không, nếu không thẳng hàng thì tạo nên tam giác gì (Vuông, Cân, ...) 5. Dữ liệu quản lý vé xe lửa gồm: Số toa, số ghế, giá vé, ga ñi, ga ñến, ðã bán vé chưa. Mỗi toa tầu có 50 ghế ñánh số thứ tự từ 1 ñến 50. Lập chương trình nhập vào những ghế ñã bán vé, thông báo còn bao nhiêu chỗ chưa bán vé. 6. Dữ liệu quản lý hàng hoá bao gồm: Mã hàng, Tên hàng, Số lượng, ðơn giá, Ngày nhập, Số chứng từ. Ngày nhập bao gồm Ngay, Thang, Nam. Lập chương trình nhập hàng vào kho, kết thúc nhập khi mã hàng bằng dấu "*" . Cho một tháng nào ñó, hiện những hàng ñã nhập trong tháng ñó. 7. Dữ liệu quản lý ñất ñai bao gồm hai trường Chủ ñất và ðất. Chủ ñất bao gồm: Mã hồ sơ, Họ tên, Mã ñất, ðịa chỉ. ðất bao gồm: Mã ñất, Diện tích, Loại ñất, Mục ñích sử dụng. Nếu mục ñích sử dụng là trồng trọt thì có thuế nông nghiệp Nếu mục ñích sử dụng là công ích (trường học, bệnh viện, sân vận ñộng) thì không phải nộp thuế. Nếu mục ñích sử dụng là kinh doanh bất ñộng sản thì có thuế ñất và thuế môn bài. Nhập dữ liệu cho n người (n<=30) sau ñó hiện lên màn hình 10 người sử dụng nhiều ñất nhất. Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 68 8. Viết chương trình nhập vào tệp văn bản F một số dòng văn bản, ñếm xem trong tệp các ký tự a,b,....z mỗi ký tự xuất hiên bao nhiêu lần? 9. Thông tin về thí sinh thi ñại học bao gồm Hoten, namsinh, diemthi, ketqua. Thông tin trên ñược ghi trong một tệp văn bản, mỗi trường trên một dòng. Lập chương trình in ra màn hình mỗi thí sinh trên một dòng Ví dụ: Trong tệp In ra màn hình Tran Tam 1980 8 Kha Tran Tam 1980 8 Kha 10. Dữ liệu quản lý hàng hoá bao gồm: Mã hàng, Tên hàng, Số lượng, ðơn giá, Ngày nhập, Số hoá ñơn. Lập chương trình nhập dữ liệu từ bàn phím và ghi vào tệp có kiểu. Cho biết một số hoá ñơn, hiện lên màn hình số liệu ứng với hoá ñơn ñó. 11. T1 và T2 là các tệp văn bản, nội dung T1, T2 nhập từ bàn phím, hãy nối T1 với T2 thành T3, hiện T3 lên màn hình. 12. T1 là tệp văn bản chứa 15 ký tự dạng số Integer. Lập chương trình chuyển T1 thành tệp số nguyên T2, tính tổng các số và viết kết quả lên màn hình. 13. Giả sử thư mục hiện hành là C:\TP\BIN. Cho biết một tên tệp từ bàn phím, kiểm tra xem trong thư mục hiện hành có tệp ñó chưa, nếu có thì hiện nội dung tệp, nếu chưa thì mở tệp mới ñể ghi dữ liệu. 14. Hai tập A và B gọi là liên thông nếu chúng có ít nhất một phần tử chung. Nếu các cặp tập hợp sau là liên thông (A,B), (B,C), (C,D), (D,E) thì ta nói có một ñường nối từ A ñến E. Lập chương trình tìm ñường nối giữa n ñiểm A1, A2, ... An trên màn hình biết rằng toạ ñộ giữa các các ñiểm lần lượt là (x1, y1), (x2, y2), ... (xn, yn). In ra tất cả ñường nối theo mẫu: A1 -> A2 ->... -> An Nếu giữa các cặp ñiểm Ai, Aj không có ñường nối thì trả lời không có. Ví dụ: A1(1,2) , A2(2,3) ,A3(3,4), A4(4,1), A5(5,6) A1 -> A5 không có ñường nối A1 -> A2 có hai ñường nối A1 -> A2 A1 -> A4 -> A3 ->A2
File đính kèm:
- Giáo trình Lập trình nâng cao trên ngôn ngữ Pascal - Chương 2_Các kiểu dữ liệu có cấu trúc.pdf