intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Giáo trình lập trình nâng cao - Chương 2

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:49

146
lượt xem
43
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tài liệu tham khảo Giáo trình lập trình nâng cao trên ngôn ngữ Pascal soạn theo chương trình đã được Bộ giáo dục và đào tạo phê chuẩn - Chương 2 Các kiểu dữ liệu có cấu trúc

Chủ đề:
Lưu

Nội dung Text: Giáo trình lập trình nâng cao - Chương 2

  1. 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 Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 20
  2. 1. D li u ki u b n ghi (record) 1.1 Khái ni m cơ b n Ki u b trí d li u thông d ng nh t mà con ngư i nghĩ ra là b trí dư i d ng b ng. B ng ñư c coi là m t ñ i tư ng (ñ qu n lý ho c nghiên c u), b ng bao g m m t s c t và m t s dòng. S c t, dòng trong b ng ph thu c vào ph n m m qu n lý mà chúng ta s d ng. Trong t ng c t d li u có tính ch t gi ng nhau. Các ph n m m qu n tr d li u như Excel, Foxpro... ñ u ng d ng khái ni m b ng và Pascal cũng không ph i là ngo i l . ð có ñư c m t b ng trư c h t Pascal xây d ng nên m t dòng g i là "b n ghi", t p h p nhi u dòng s cho m t b ng, m i b ng ñư c ghi vào b nh dư i d ng m t t p. B n ghi (Record) là m t c u trúc bao g m m t s (c ñ nh ho c thay ñ i) các ph n t có ki u khác nhau nhưng liên quan v i nhau. Các ph n t này g i là các trư ng (Field). Ví d b ng ñi m c a l p h c bao g m các trư ng Hoten, Ngaysinh, Gioitinh, Lop, Diachi, Toan, Ly, Hoa,...., d li u ñi n vào các trư ng hình thành nên m t b n ghi (Record). Có th có nh ng trư ng trong m t b n ghi l i là m t b n ghi, ví d trư ng Ngaysinh trên có th là m t b n ghi c a ba trư ng là Ngay, Thang, Nam. B n ghi không ph i là ki u d li u ñã có s n trong Pascal mà do ngư i s d ng t ñ nh nghĩa do ñó chúng ph i ñư c khai báo ph n TYPE. B n ghi bao g m hai lo i: * B n ghi có c u trúc không ñ i : là lo i b n ghi mà c u trúc ñã ñư c ñ nh nghĩa ngay t khi khai báo và gi nguyên trong su t quá trình x lý. * B n ghi có c u trúc thay ñ i: là lo i b n ghi mà c u trúc c a nó (tên trư ng, s trư ng, ki u trư ng) thay ñ i tuỳ thu c vào nh ng ñi u ki n c th . Lo i b n ghi này khi khai báo thì v n khai báo ñ y ñ song khi x lý thì s trư ng có th gi m ñi (so v i c u trúc ñã khai báo) ch không th tăng lên. ði m m nh c a B n ghi là cho phép xây d ng nh ng c u trúc d li u ña d ng ph c v công vi c qu n lý, tuy v y mu n lưu tr d li u ñ s d ng nhi u l n thì ph i k t h p ki u B n ghi v i ki u T p. 1.2 Khai báo Ki u d li u c a các trư ng trong Record có th hoàn toàn khác nhau và ñư c khai báo sau tên trư ng, nh ng trư ng có cùng ki u d li u có th khai báo cùng trên m t dòng phân cách b i d u ph y "," . Cu i m i khai báo trư ng ph i có d u ";" . Ki u d li u Record ñư c khai báo như sau: TYPE = RECORD : Ki u; : Ki u; ...... : Ki u; END; Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 21
  3. Ví d 2.1 Khai báo ki u d li u BANGDIEM bao g m m t s trư ng nh m ph c v vi c qu n lý ñi m. TYPE BANGDIEM = RECORD Hoten: String[25]; Gioitinh: Char; Lop: String[5]; Diachi: String[30]; Toan,Ly,Hoa: Real; END; V i khai báo như trên dung lư ng b nh dành cho các trư ng (tính b ng Byte) s là: Hoten 26, Gioitinh 1, Lop 6, Diachi 31, Toan 6, Ly 6, Hoa 6. (Các trư ng ki u String bao gi cũng c n thêm 1 Byte ch a ký t xác ñ nh ñ dài chu i). T ng ñ dài c a Record b ng 26+1+6+31+18=82 Bytes. Có th dùng hàm Sizeof(tên ki u) ñ xác ñ nh ñ dài m t ki u d li u, ví d : Write(sizeof(bangdiem)) s nh n ñư c s 82 Ví d 2.2 Xây d ng ki u d li u qu n lý h sơ công ch c. Chúng ta s t o ra b n ki u d li u m i ñ t tên là Diadanh, Donvi, Ngay và Lylich. Type Diadanh = Record Tinh, Huyen, Xa, Thon: String[15]; End; Donvi = Record Truong: String[30]; Khoa, Bomon: String[20] End; Ngay = Record Ng: 1..31; Th: 1..12; Nam: Integer; End; Lylich = Record Mhs: Word; Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 22
  4. Hoten: String[25]; Ngaysinh: Ngay; Quequan: Diadanh; Coquan: Donvi; End; Trong cách khai báo trên trư ng Ngaysinh thu c ki u Ngay, Quequan thu c ki u Diadanh, Coquan thu c ki u Donvi, nói cách khác ba trư ng này l i chính là ba Record. ð kh c ph c cách khai báo nhi u ki u b n ghi như trên có th s d ng các b n ghi l ng nhau. Ki u b n ghi l ng nhau có th khai báo tr c ti p, nghĩa là không c n khai báo riêng r các b n ghi con. Ví d 2.3 Uses crt; Type Lylich=record Mhs:word; Hoten:string[25]; Ngaysinh:record Ng:1..31; Th:1..12; Nam:Integer; End; Quequan:record Tinh,Huyen,xa,thon:string[15]; End; Coquan:record Truong:string[30]; Khoa, Bomon:string[20]; End; End; ................. Ngoài cách khai báo ki u r i m i khai báo bi n, Pascal cho phép khai báo tr c ti p bi n ki u b n ghi theo cú pháp sau: Var Tên bi n:Record Tên trư ng 1:ki u trư ng; Tên trư ng 2:ki u trư ng; ................. Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 23
  5. End; 1.3 Truy nh p vào các trư ng c a b n ghi Sau khi ñã khai báo ki u d li u ta ph i khai báo bi n, gi s c n qu n lý danh sách cán b m t trư ng ñ i h c chúng ta ph i khai báo m t bi n ch a danh sách vi t t t là DS. Khi ñó ta ph i khai VAR DS: Lylich; Gi ng như hai ki u d li u M ng và Chu i, vi c x lý ñư c th c hi n trên các ph n t c a m ng ho c chu i. ñây m c dù DS là m t bi n nhưng chúng ta không th x lý chính bi n ñó mà ch có th x lý các trư ng c a bi n DS. ð truy nh p vào trư ng c n vi t: ..…. Ví d ñ nh p d li u cho trư ng Hoten ta vi t các l nh: Write(' Ho va ten can bo: '); Readln(DS.hoten); L nh Readln(DS.hoten); cho phép ta gán H tên cán b vào trư ng Hoten c a b n ghi hi n th i. ð nh p ngày tháng năm sinh chúng ta ph i truy nh p vào các trư ng con Readln(Ds.Ngay.Ngays); Readln(Ds.Ngay.Thang); Readln(Ds.Ngay.Nam); L nh vi t d li u ra màn hình cũng có cú pháp gi ng như l nh nh p. Writeln(DS.Hoten); Writeln(Ds.Ngay.Ngays); ........... Chú ý: Khi khai báo bi n DS ki u LYLICH chúng ta có th nh p d li u vào bi n DS nhưng ch nh p ñư c m t b n ghi nghĩa là ch nh p d li u ñư c cho m t ngư i. N u mu n có m t danh sách g m nhi u ngư i thì ph i có nhi u b n ghi, ñ th c hi n ñi u này chúng ta có th xây d ng m t m ng các b n ghi. Trình t các bư c như sau: * ð nh nghĩa ki u d li u b n ghi * Khai báo bi n m ng v i s ph n t là s ngư i c n qu n lý, ki u ph n t m ng là ki u B n ghi ñã ñ nh nghĩa. (xem ví d 2.4) V i t t c các trư ng khi truy nh p ta luôn ph i ghi tên bi n r i ñ n tên trư ng m , tên trư ng con, … ñi u này không ch làm m t th i gian mà còn khi n cho chương trình không ñ p, Pascal kh c ph c như c ñi m này b ng cách ñưa vào l nh WITH... DO. 1.4 L nh WITH...DO Cú pháp c a l nh: WITH DO Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 24
  6. Khi s d ng l nh WITH...DO chu i l nh vi t sau DO ch c n vi t tên trư ng có liên quan mà không c n vi t tên bi n. Xét ví d nh p ñi m cho l p h c v i gi thi t l p có nhi u nh t là 40 h c sinh. Ví d 2.4: Program Nhapdiem; Uses CRT; Type BANGDIEM = RECORD Hoten: String[25]; Gioitinh: ('T','G'); (* ki u li t kê, 'T' = Trai, 'G' = Gái *) Lop: String[5]; Diachi: String[50]; Toan,Ly,Hoa: Real; End; Var DS_LOP: Array[1..40] of BANGDIEM (*danh sách l p là m ng 40 ph n t *) i,j: Integer; lam: Char; BEGIN clrscr; lam:='C'; i:=1; Repeat With DS_LOP[i] Do Begin Write(' Ho va ten hoc sinh: '); Readln(Hoten); Write(' Trai hay gai T/G: '); Readln(Gioitinh); Write(' Thuoc lop: '); Readln(Lop); Write(' Cho o thuong tru: '); Readln(Diachi); Write(' Diem toan: '); Readln(Toan); Write(' Diem ly: '); Readln(Ly); Write(' Diem hoa: '); Readln(Hoa); End; i:=i+1; Write(' NHAP TIEP HAY THOI ? C/K '); Readln(lam); Until upcase(lam)='K'; clrscr; For j:=1 to i-1 do With DS_LOP[j] DO Writeln(Hoten:15,' ',Gioitinh:2,' ',Lop:4,' ',Diachi:10,' Toan:', Toan:4:2,' Ly:',Ly:4:2,' Hoa:',Hoa:4:2); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 25
  7. Repeat Until Keypressed; END. Ví d 2.4 s d ng m ng DS_LOP g m 40 ph n t , m i ph n t là m t Record. M i l n nh p xong d li u cho m t ph n t l i h i "Nhap tiep hay thoi?", như v y s ph n t c th c a m ng tuỳ thu c vào câu tr l i C hay là K. V n ñ ñáng quan tâm ñây là cách s d ng l nh With ... Do, ví d 2.4 s d ng bi n m ng DS_LOP vì v y trư c tiên ph i truy nh p vào ph n t th i c a m ng DS_LOP (1
  8. With ds[i] do Begin Write('Ma ho so: '); Readln(mahoso); Write('Ho va ten: '); readln(hoten); With ngaysinh do Begin Write('Ngay sinh: '); readln(ngay); Write('Thang sinh: '); readln(thang); Write('Nam sinh: '); readln(nam); End; End; Write('Nhap tiep hay thoi? C/K '); readln(tl); If upcase(tl)='C' then i:=i+1; Until upcase(tl)='K'; clrscr; Writeln('DANH SACH CAN BO CO QUAN'); For j:= 1 to i do Begin With ds[j] do Begin Write(mahoso,' ',hoten,' '); With ngaysinh do Writeln(ngay,' ',thang,' ',nam); End; End; Readln; END. Trong ví d 2.5 ñ nh p d li u vào b n ghi và vi t d li u (t c là danh sách cán b cơ quan) ra màn hình, chương trình c n ph i s d ng hai l nh With .. Do l ng nhau, l nh th nh t v i bi n DS, còn l nh th hai v i bi n Ngaysinh. Tuy nhiên n u có m t chút tinh ý thì các kh i chương trình nh p và vi t d li u ra màn hình có th thu g n l i, ví d kh i vi t d li u ra màn hình s như sau: Writeln('DANH SACH CAN BO CO QUAN'); For j:= 1 to i do With ds[j] do Writeln(mahoso,' ',hoten,' ',ngaysinh.ngay,' ',ngaysinh.thang,' ',ngaysinh.nam); 1.5 B n ghi có c u trúc thay ñ i Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 27
  9. a. Xây d ng ki u d li u B n ghi có c u trúc c ñ nh dùng ñ mô t m t ñ i tư ng mà các cá th c a nó (t c là các xu t hi n c a ñ i tư ng) có các thu c tính (các trư ng) như nhau. Ví d DS là b n ghi mô t m t lo i ñ i tư ng là "h c viên ", m i xu t hi n c a DS ng v i m t h c viên c th và t t c các h c viên ñ u có các thu c tính như nhau bao g m (xem ví d 2.5) Mahoso, Hoten, Ngay, Thang, Nam. Trong th c t nhi u khi ta g p nh ng ñ i tư ng mà thu c tính c a chúng l i g m hai lo i: - Thu c tính chung cho m i xu t hi n - Thu c tính riêng cho m t s xu t hi n ñ c bi t Dư i ñây là m t s ví d minh ho : - Ki u d li u qu n lý vé ngành ñư g s t Trên m t tuy n ñư ng s t có nhi u ñoàn tàu ch y trong ngày, có nh ng chuy n t c hành ch d ng l i m t vài ga d c ñư ng, có nh ng chuy n tàu thư ng d ng l i t t c các ga l . V i tàu t c hành, hành khách ch ñư c mang theo hành lý không quá 20 Kg và s có su t ăn trên tàu. V i tàu thư ng hành khách ph i mua vé hàng hoá n u có v n chuy n hàng hoá và không có su t ăn trên tàu. * Thu c tính chung: tên ñoàn tàu (TDT), tuy n ñư ng (TD), gi ñi (GD), lo i tàu (LT) (ví d : t c hành - TH, tàu thư ng - TT) * Thu c tính riêng v i tàu t c hành: S xu t ăn (SXA), s ga l d ng d c ñư ng (SGD), còn tàu thư ng có thu c tính riêng là cư c hàng hoá (CHH). Như v y vi c xây d ng các b n ghi d li u s ph i chú ý ñ n các thu c tính chung cho các lo i tàu và các thu c tính riêng c a t ng lo i (xem ví d 2.6). Ví d 2.6: Type QLDS = record Ten_doan_tau: string[3]; Tuyen_duong: string[15]; Gio_di: real; Case Loai_tau : (Toc_hanh, Tau_thuong) of Toc_hanh: (So_xuat_an:Word; So_ga_do: Byte); Tau_thuong: (cuoc_hang_hoa:real); End; Ví d 2.6 cho ta m t ki u d li u b n ghi có c u trúc thay ñ i m t m c, s thay ñ i ñây th hi n qua thu c tính Loai_tau. Như v y t ng s trư ng c a m i bàn ghi tuỳ thu c vào ñoàn tàu ñó thu c lo i gì. N u là tàu t c hành thì m i b n ghi có 5 trư ng, còn tàu thư ng ch có 4 trư ng. ð dài c a các b n ghi ñư c tính căn c vào ñ dài c a các trư ng có trong b n ghi ñó. Như ñã bi t ñ dài t ng trư ng ñư c tính như sau: Ten_doan_tau: 4, Tuyen_duong: 16 Gio_di: 6 Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 28
  10. So_xuat_an: 2 So_ga_do: 1 Ve_hang_hoa: 6 B n ghi v i tàu t c hành s là 4+16+6+2+1 = 29 Byte B n ghi v i tàu thư ng là: 4+16+6+6 = 32 Byte - Các bư c ñ nh nghĩa ki u b n ghi có c u trúc thay ñ i: - ð ñ nh nghĩa m t ki u b n ghi có c u trúc thay ñ i, chúng ta khai báo các thu c tính chung trư c, ti p ñó tìm trong các thu c tính chung m t thu c tính dùng ñ phân lo i. - Thu c tính phân lo i có th bao g m m t ho c m t s ch tiêu phân lo i, t t c các ch tiêu c a thu c tính phân lo i ph i ñ t trong c p d u m -ñóng ngo c ñơn, ví d : Loai_tau : (Toc_hanh, Tau_thuong) - S d ng toán t Case .. . of ñ phân lo i, ví d : Case Loai_tau : (Toc_hanh, Tau_thuong) of Toc_hanh: ..... Tau_thuong:.... - V i m i ch tiêu phân lo i, chúng ta có th khai báo tên m t s trư ng thay ñ i ho c khai báo m t b n ghi con v i c u trúc thay ñ i, ví d : Case Loai_tau : (Toc_hanh, Tau_thuong) of Toc_hanh: (So_xuat_an, So_ga_do: Word); Tau_thuong: ( Case Cuoc :(cuoc_hanh_ly,cuoc_hang_hoa) of ............ ); - Các trư ng thay ñ i n u có cùng ki u d li u thì tên trư ng vi t cách nhau b i d u ph y. - D li u các trư ng phân lo i ph i thu c ki u ñơn gi n, c th là: ki u nguyên, th c, logic, chu i, li t kê, kho ng con. ð phân lo i chúng ta dùng toán t Case … Of. C n chú ý r ng toán t Case .. Of ñây không gi ng như c u trúc Case .. Of ñã nêu trong ph n các c u trúc l p trình nghĩa là cu i ph n khai báo không có t khoá "End;" Trong vùng nh c p phát cho chương trình s có hai ño n dành cho hai lo i trư ng, ño n th nh t dành cho các trư ng c ñ nh, trong ví d 2.6 ño n này có dung lư ng là 26 byte. ðo n th hai dành cho các trư ng thay ñ i, ño n này s có dung lư ng b ng dung lư ng c a ch tiêu phân lo i l n nh t. Trong ví d 2.6 trư ng phân lo i là Loai_tau, ch tiêu phân lo i là toc_hanh và Tau_thuong. V i ch tiêu Toc_hanh, chúng ta khai báo hai trư ng thay ñ i là So_xuat_an và So_ga_do còn v i ch tiêu Tau_thuong có m t trư ng là Cuoc_hang_hoa. Như v y dung lư ng c a trư ng thay ñ i c a tàu t c hành c n 3 byte còn tàu thư ng c n 6 byte, ño n nh dành cho trư ng thay ñ i s có dung lư ng 6 byte. Chương trình qu n lý ñư ng s t ñư c thi t k bao g m m t chương trình con l y tên là NHAP dùng ñ nh p d li u cho các ñoàn tàu, ph n thân chương trình chính s yêu c u nh p s chuy n tàu trên toàn tuy n và cho hi n d li u ra màn hình (xem ví d 2.7). Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 29
  11. Ví d 2.7 Program quan_ly_duong_sat; Uses crt; Type doan_tau = record ten_doan_tau:string[3]; tuyen_duong:string[15]; gio_di:real; loai:string[10]; Case loai_tau: (toc_hanh,tau_thuong) of toc_hanh:(so_xuat_an:word;so_ga_do:byte); tau_thuong:(cuoc_hang_hoa:real); End; dt = array[1..5] of doan_tau; Var dt1:dt; n,i,j:byte;tg:doan_tau; Procedure Nhap(m:byte;var qlds:dt); Begin For i:= 1 to m do with qlds[i] do Begin Write('Loai tau: ');readln(loai); if loai ='toc hanh' then Begin write('ten doan tau: '); readln(ten_doan_tau); write('tuyen duong: '); readln(tuyen_duong); write('gio xuat phat: '); readln(gio_di); write('so xuat an: '); readln(so_xuat_an); write('so ga do doc duong: '); readln(so_ga_do); writeln; end else if loai = 'tau thuong' then Begin write('ten doan tau: '); readln(ten_doan_tau); write('tuyen duong: '); readln(tuyen_duong); write('gio xuat phat: '); readln(gio_di); write('tien cuoc hang hoa: '); readln(cuoc_hang_hoa); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 30
  12. writeln; End; End; End; Begin clrscr; write('co bao nhieu doan tau tren toan tuyen: '); readln(n); writeln; nhap(n,dt1); clrscr; writeln('danh sach tau chay toan tuyen'); for i:= 1 to n-1 do {sap xep du lieu tang dan theo loai tau} for j:= i+1 to n do with dt1[i] do if dt1[i].loai < dt1[i+1].loai then begin tg:=dt1[i]; dt1[i]:=dt1[j]; dt1[j]:=tg; end; Writeln(' DANH MUC CAC DOAN TAU TREN TUYEN'); for i:= 1 to n do with dt1[i] do writeln(loai:10,' ',ten_doan_tau:3,' ',tuyen_duong:10,' ',gio_di:4:2,' ',so_xuat_an:3,' ',so_ga_do:3,cuoc_hang_hoa:10:2); readln; END. - Ki u d li u qu n lý ñi m c a sinh viên SV là ki u d li u b n ghi dùng ñ qu n lý ñi m c a sinh viên. Các trư ng c ñ nh c a SV bao g m: MHS (mã h sơ), HOTEN (h và tên), NS (ngày sinh), GIOI (nam, n ), Khoa (Sư ph m - SP, Kinh t - KT, Cơ ñi n - CD). Các môn h c tuỳ thu c vào khoa mà sinh viên ñang theo h c, gi s chúng ta quy ñ nh khoa Sư ph m có các môn: Toán, Lý, Tin cơ b n, l p trình nâng cao, khoa Kinh t có các môn: K toán máy, Marketing, khoa Cơ ñi n có các môn: Cơ h c máy, S c b n v t li u, Hình ho . T t c sinh viên n u là Nam thì h c thêm môn Bơi l i, n u là N thì h c thêm Th d c ngh thu t. Rõ ràng là chúng ta không th t o ra ki u b n ghi c ñ nh cho sinh viên trong toàn trư ng, b i l s môn h c không gi ng nhau. Các trư ng MHS, HOTEN, NS là chung cho m i sinh viên, trư ng KHOA và GIOI dùng ñ phân lo i sinh viên t ñó xác ñ nh các môn h c. Vì r ng m i ki u b n ghi ch có th khai báo duy nh t m t trư ng phân lo i ngang hàng v i các trư ng c ñ nh nên cùng m t lúc chúng ta không th phân lo i theo c KHOA và GIOI. Gi i pháp duy nh t là ch n m t trư ng phân lo i v i hai ch tiêu phân lo i ñ i di n cho Khoa và Gioi, gi s tên trư ng phân lo i bây gi l y tên là MONHOC và hai ch tiêu phân lo i là PL1 và PL2. PL1 ñ i di n cho Gioi còn PL2 ñ i di n cho Khoa. Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 31
  13. Các ch tiêu phân lo i l i có th tr thành thu c tính phân lo i v i m t s ch tiêu nào ñó mà chúng ta g i là ch tiêu con ch ng h n xem PL1 là thu c tính phân lo i v i hai ch tiêu con là Nam và Nu, PL2 là thu c tính phân lo i v i ba ch tiêu con là SP,KT,CD. M i ch tiêu con bao g m m t s trư ng c th ho c nó l i ñư c s d ng như trư ng phân lo i m i.... M t b n ghi ki u SV có th có c u trúc thu c m t trong các d ng sau: * Sinh viên khoa Sư ph m 1/ Mhs, Hoten, Ns, Boi_loi, Toan, Ly, Tincoban, Lap_trinh_nang_cao 2/ Mhs, Hoten, Ns, The_duc, Toan, Ly, Tincoban, Lap_trinh_nang_cao * Sinh viên khoa Cơ ñi n 3/ Mhs, Hoten, Ns, Boi_loi, Co_hoc_may, Suc_ben_vat_lieu, Hinh_hoa 4 / Mhs, Hoten, Ns, The_duc, Co_hoc_may, Suc_ben_vat_lieu, Hinh_hoa * Sinh viên khoa Kinh t 5 / Mhs, Hoten, Ns, Boi_loi, Ke_toan_may, Marketing 6 / Mhs, Hoten, Ns, The_duc, Ke_toan_may, Marketing Có th nh n th y r ng tên các trư ng phân lo i không có trong c u trúc b n ghi. N u chúng ta mu n trong m i b n ghi l i có c tên khoa và gi i tính thì ph i ñưa thêm vào các trư ng c ñ nh m i. Ki u d li u b n ghi SV ñư c khai báo như sau: Ví d 2.6 Type SV = record Mhs: Byte; Hoten: String[20]; NS : Record Ngay:1..31; Thang: 1..12; Nam: Word; End; Case monhoc:(pl1,pl2) of pl1:( case gioi:(nam,nu) of Nam: (Boi_loi:real); Nu: (The_duc: real)); pl2:( case KHOA: (SP,CD,KT) of SP: (Toan, Ly, Tincb, Ltnc: Real); CD: (Co_hoc_may, Suc_ben_vat_lieu, Hinh_hoa:real); KT: (Ke_toan_may, Marketing:real)); End; T cách khai báo trên chúng ta rút ra m t s nh n xét quan tr ng sau ñây: Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 32
  14. Nh n xét 1 Trong m t ki u record các trư ng c ñ nh ñư c khai báo trư c, trư ng phân lo i khai báo sau, như v y trư ng phân lo i ph i là trư ng khai báo cu i cùng. Các trư ng thay ñ i khai báo bên trong trư ng phân lo i. Nh n xét 2 M i ki u d li u Record có c u trúc thay ñ i ch ñư c phép có duy nh t m t trư ng phân lo i, nghĩa là không th có hai toán t case .... of ngang hàng khi khai báo. N u chúng ta khai báo ki u SV như trong ví d 2.8 sau ñây thì s nh n ñư c thông báo l i : Error in Expression Ví d 2.8 Type SV = record Mhs: Byte; Hoten: String[20] NS : Record Ngay:1..31; Thang: 1..12; Nam: Word; End; Case GIOI: (Nam, Nu) of Nam: Boi_loi:real; Nu:The_duc: real; Case KHOA: (SP,CD,KT) of SP: (Toan, Ly, Tin_cb, Ltnc: Real); CD: (Co_hoc_may, Suc_ben_vat_lieu, Hinh_hoa:real); KT: (Ke_toan_may, Marketing:real); End; L i xu t hi n do chúng ta ñã ch n hai trư ng phân lo i là GIOI và KHOA ngang hàng nhau. ð kh c ph c l i này chúng ta ph i l a ch n l i c u trúc c a Record. Thay vì có hai trư ng phân lo i cùng c p chúng ta ch n m t trư ng là MONHOC, ch tiêu phân lo i là PL1 và PL2. Lúc này tên môn h c c th s tuỳ thu c vào giá tr mà PL1 và PL2 có th nh n (xem ví d 2.9) Nh n xét 3 Vì m i trư ng l i có th là m t b n ghi cho nên bên trong trư ng phân lo i l i có th ch a các trư ng phân lo i khác, ñây là trư ng h p b n ghi thay ñ i nhi u m c. V i ki u d li u SV ñã ñ nh nghĩa chúng ta xây d ng chương trình qu n lý ñi m c a sinh viên như ví d 2.9 sau ñây. Ví d 2.9 Program QUAN_LY_DIEM; Uses crt; Type Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 33
  15. SV = record Mhs: Byte; Hoten: String[20]; NS : Record Ngay:1..31; Thang: 1..12; Nam: Word; End; Case monhoc:(pl1,pl2) of pl1:( case gioi:(nam,nu) of Nam: (Boi_loi:real); Nu: (The_duc: real)); pl2:( case KHOA: (SP,CD,KT) of SP: (Toan, Ly, Tincb, Ltnc: Real); CD: (Co_hoc_may, Suc_ben_vat_lieu, Hinh_hoa:real); KT: (Ke_toan_may, Marketing:real)); End; Var Ds:Array[1..100] of sv; tg:sv; i,j,k:byte; pl,tk:string[3]; tl,gt:char; BEGIN clrscr; i:=1; writeln(' Nhap diem cho sinh vien '); Repeat With ds[i] do Begin Write('Nhap ma ho so '); readln(mhs); Write('Nhap ho va ten '); readln(hoten); With ns do Begin Write('Nhap ngay sinh '); readln(ngay); Write('Nhap thang sinh '); readln(thang); Write('Nhap nam sinh '); readln(nam); End; Write('Cho biet gioi tinh nam "T" - nu "G" '); Readln(gt); if upcase(gt)='T' then ds[i].gioi:=nam else ds[i].gioi:=nu; Case ds[i].gioi of nam: begin Write('Nhap diem mon boi loi '); Readln(boi_loi); end; nu: begin Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 34
  16. Write('Nhap diem mon The duc '); readln(the_duc); end; End; {ket thuc Case ds[i].gioi...} Write('Nhap ten khoa '); Readln(tk); for k:= 1 to length(tk) do tk[k]:=upcase(tk[k]); { chuy n tên khoa thành ch in} if tk='SP' then ds[i].khoa:=sp else if tk='CD' then ds[i].khoa:=cd else ds[i].khoa:=kt; Case ds[i].khoa of sp:Begin Write('Nhap diem mon Toan '); Readln(toan); Write('Nhap diem mon Ly '); Readln(ly); Write('Nhap diem mon Tin Co ban '); Readln(tincb); Write('Nhap diem mon Lap trinh nang cao '); Readln(ltnc); End; cd: Begin Write('Nhap diem mon Co hoc '); Readln(co_hoc_may); Write('Nhap diem mon Suc ben vat lieu '); Readln(suc_ben_vat_lieu); Write('Nhap diem mon Hinh hoa '); Readln(hinh_hoa); End; kt: Begin Write('Nhap diem mon Ke toan may '); Readln(ke_toan_may); Write('Nhap diem mon marketing '); Readln(marketing); End; End; {ket thuc Case..} {Sap xep du lieu tang dan theo ten Khoa} for j:=1 to i-1 do for k:=j+1 to i do if ds[j].khoa
  17. if upcase(tl)='C' then Begin Writeln('DU LIEU DA NHAP '); For j:= 1 to i do with ds[j] do Begin write(mhs:3,' ',hoten:20); with ns do write(' ',ngay,'/',thang,'/',nam); case ds[j].khoa of sp:writeln(' Khoa SP ',toan:4:1,ly:4:1,Tincb:4:1,ltnc:4:1); cd:writeln(' Khoa CD ', co_hoc_may:4:1, suc_ben_vat_lieu:4:1, hinh_hoa:4:1); kt:writeln(' Khoa KT ',ke_toan_may:4:1,marketing:4:1); end; End; End; Readln; END. Ví d 2.9 tuy ñã ch y hoàn ch nh song có m t s như c ñi m sau: * T ch c chương trình chưa h p lý * D li u ñưa ra màn hình chưa ñ p B n ñ c có th thi t k l i b ng cách ñưa vào chương trình con Nhap và chương trình con Hien. Chương trình con Hien có th thi t k ñ d li u ñưa ra dư i d ng b ng theo m u sau ñây: DANH SACH SINH VIEN TRUONG ........ Ma ho so Ho va Ten Gioi Khoa So mon hoc Tong diem Trung binh ....... b. Truy nh p Vi c truy nh p vào các trư ng c ñ nh c a b n ghi có c u trúc thay ñ i hoàn toàn gi ng như b n ghi thư ng. Còn vi c truy nh p và các trư ng thay ñ i c n ph i chú ý m t s ñi m sau: - Không dùng phép gán ho c nh p d li u t bàn phím cho các trư ng phân lo i. N u trong ví d 2.9 chúng ta ñưa vào l nh monhoc:='Toan'; thì s nh n ñư c thông báo l i: Type Mismatch còn n u ñưa vào l nh Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 36
  18. Read(monhoc); thì s nh n ñư c thông báo: Cannot Read or Write Variables of this Type - L nh With ... Do có tác d ng v i t t c các trư ng k c các trư ng thay ñ i bên trong các trư ng phân lo i. C th trong ví d 2.9 v i l nh With ds do chúng ta có th ñưa vào tr c ti p l nh Write('Nhap diem mon boi loi '); Readln(boi_loi); - Tên các trư ng phân lo i không th ñưa ra màn hình như là m t tên trư ng bình thư ng nghĩa là cũng gi ng như trong m c 2.2 không th vi t l nh Write(monhoc). Trong trư ng h p c n thi t chúng ta có th s d ng các bi n trung gian. 2. D li u ki u t p (file) 2.1 Khái ni m v t p T p d li u là m t dãy các ph n t cùng ki u ñư c s p x p m t cách tu n t . T p d li u ñư c c t gi b nh ngoài (ñĩa m m ho c ñĩa c ng) dư i m t tên nào ñó, cách ñ t tên tuân theo quy ñ nh c a DOS nghĩa là ph n tên t p dài không quá 8 ký t và ph n ñuôi không quá 3 ký t . T p t p h p trong nó m t s ph n t d li u có cùng c u trúc gi ng như m ng (Array) song khác m ng là s ph n t c a t p chưa ñư c xác ñ nh. Trong Pascal có 3 lo i t p ñư c s d ng là: a. T p có ki u T p có ki u là t p mà các ph n t c a nó có cùng ñ dài và cùng ki u d li u. V i nh ng t p có ki u chúng ta có th cùng m t lúc ñ c d li u t t p ra ho c nh p d li u vào t p. b. T p văn b n (Text) T p văn b n dùng ñ lưu tr d li u dư i d ng các ký t c a b ng mã ASCII, các ký t này ñư c lưu thành t ng dòng, ñ dài c a các dòng có th khác nhau. Khi ghi m t s nguyên, ví d s 2003 (ki u word) vào t p văn b n, Pascal c n 4 byte cho b n ký t ch không ph i là 2 byte cho m t s . Vi c ghi các s nguyên ho c th c vào t p văn b n s ph i qua m t công ño n chuy n ñ i, ñi u này s do Pascal t ñ ng th c hi n. ð phân bi t các dòng Pascal dùng hai ký t ñi u khi n là CR - v ñ u dòng và LF - xu ng dòng m i. Trong b ng mã ASCII ký t CR = CHR(13) còn LF = CHR(10) c. T p không ki u T p không ki u là m t lo i t p không c n quan tâm ñ n ki u d li u ghi trên t p. D li u ghi vào t p không c n chuy n ñ i. Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 37
  19. Khi khai báo m t bi n ki u t p thì ñ ng th i ta cũng ph i t o ra m t m i liên h gi a bi n này và m t t p d li u lưu trên thi t b nh ngoài. Cách khai báo này ñã ñư c chu n hoá trong Pascal. Ki u d li u c a các ph n t trong bi n ki u t p có th là b t kỳ ki u nào tr ki u c a chính nó t c là tr ki u t p. Ví d n u ki u ph n t là m t m ng m t chi u c a các s nguyên ta có t p các s nguyên, n u ki u ph n t là Record ta có t p các Record... Tác d ng l n nh t c a ki u d li u t p là ta có th lưu tr các d li u nh p vào t bàn phím cùng các k t qu x lý trong b nh RAM ra t p ñ dùng nhi u l n. Các ki u d li u ñã h c ch x lý trong RAM và in k t qu ra màn hình ho c ra máy in, khi k t thúc chương trình ho c m t ñi n c d li u nh p vào và k t qu x lý ñ u b m t. d. Khai báo T p có ki u ñư c ñ nh nghĩa sau t khoá TYPE còn bi n ki u t p ñư c khai báo sau t khoá VAR. Th t c khai báo bi n ki u t p g m 2 cách: - ð nh nghĩa ki u t p v i t khoá FILE OF trong ph n mô t ki u sau t TYPE, ti p theo là khai báo bi n t p trong ph n khai báo bi n Ví d 2.10 Type MSN = Array[1..100] of integer; (*ñ nh nghĩa m ng 100 s nguyên*) TSN = File of MSN; (* ñ nh nghĩa d li u ki u t p TSN có các ph n t là m ng s nguyên *) CHUVIET = File of String[80]; (* ñ nh nghĩa CHUVIET là t p các chu i có ñ dài 80 ký t *) BANGDIEM = Record Hoten: String[25]; Gioitinh: Char; Lop: String[5]; Diachi: String[50]; Toan,Ly,Hoa: Real; END; TBD = File of BANGDIEM; VAR Tep1: TSN; (* bi n tep1 có các ph n t là m ng s nguyên *) Tep2: CHUVIET; (* bi n Tep2 có các ph n t là chu i ký t *) Tep3: TBD; (* bi n Tep3 có các ph n t là record*) ........... - ð nh nghĩa tr c ti p bi n ki u t p trong ph n khai báo bi n Ví d 2.11 Var Tep4: File of Array[1..5] of String[80]; Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 38
  20. Tep5: File of BANGDIEM; Trong ph n khai báo này bi n Tep4 là m t bi n ki u t p, t p này có 5 ph n t , m i ph n t là m t chu i dài t i ña 80 ký t . Bi n Tep5 là m t bi n t p mà các ph n t c a nó có ki u Bangdiem. e. Truy nh p vào t p Các ph n t c a t p ñư c lưu gi tu n t thành m t dãy và vi c truy nh p vào t ng ph n t ph thu c vào thi t b ghi, ñ c c a máy vi tính. Turbo Pascal có th x lý hai lo i t p là: T p truy nh p tu n t và t p truy nh p tr c ti p. * T p truy nh p tu n t : ñ truy nh p vào m t ph n t nào ñó ta b t bu c ph i ñi qua các ph n t trư c ñó. N u mu n thêm các ph n t vào t p thì ch có th thêm vào cu i t p. T p ki u này d hình dung, d x d ng song không linh ho t, t n th i gian x lý. Vi c truy nh p tu n t thư ng ñư c th c hi n thông qua m t vòng l p. T p văn b n là t p thu c ki u này. * T p truy nh p tr c ti p: là t p có th truy nh p vào ph n t b t kỳ trong t p, trên nh ng thi t b nh ngoài c ñi n như băng t , băng ñ c l không th t o t p ki u này vì không th ñ c ngay vào giũa băng. Ch nh ng máy s d ng ñĩa (m m ho c c ng) thì m i có th t o t p truy nh p tr c ti p vì có th ñi u ch nh ñ ñ u t ñ t ñúng vào m t cung t ch a d li u nào ñó. Mu n truy nh p tr c ti p ph i dùng th t c Seek(s hi u ph n t ). f. M t p ð m m t t p chu n b lưu tr d li u Pascal x d ng hai th t c chu n sau ñây: ASSIGN(bi n t p, tên t p); (*liên k t bi n t p v i m t tên t p s ghi vào thi t b nh ngoài *) REWRITE(bi n t p); (* t o m t bi n t p r ng chu n b nh p d li u vào *) Trong ñó: * Bi n t p: là tên bi n t p ñã khai báo sau t khoá VAR * Tên t p: Là tên do ta ch n ñ ghi d li u vào ñĩa (theo quy ñ nh c a DOS). Tên t p có th bao g m c ñư ng d n t i thư m c mà chúng ta l a ch n. ðư ng d n và tên t p ph i ñ t trong d u nháy ñơn. Ví d : ASSIGN(f,'a:\baitap.txt'); Sau th t c REWRITE ta s có m t t p r ng vì chưa có ph n t nào ñư c ñ c vào. N u trên thi t b nh ngoài ta ñã có s n m t t p trùng tên v i tên ghi th t c ASSIGN thì t p ngoài s b xoá ñi. Sau hai th t c chu n b trên ñây, ñ ti n hành ghi d li u vào t p ta l i dùng th t c WRITE(....) như ñã bi t. Cách vi t: WRITE(bi n t p, các giá tr c n ghi vào t p); Bư c cu i cùng là ph i ñóng t p l i b ng th t c CLOSE(bi n t p); Trư ng ð i h c Nông nghi p 1 - Giáo trình L p trình nâng cao ..............................................................- 39
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2