Giaùo trỗnh Lỏỷp trỗnh Pascal cn baớn 58 Trang 58 BAèI 9. Dặẻ LIU KIỉU BAN GHI VAè KIỉU TP I. Kióứu baớn ghi: 1. Khaùi nióỷm vaỡ õởnh nghộa: Caùc kióứu cỏỳu truùc dổợ lióỷu nhổ kióứu maớng, tỏỷp hồỹp õóửu õổồỹc taỷo ra bũng mọỹt tỏỷp hồỹp caùc phỏửn tổớ coù cuỡng kióứu. óứ taỷo ra mọỹt kióứu cỏỳu truùc dổợ lióỷu mồùi vồùi caùc phỏửn tổớ dổợ lióỷu coù kióứu khaùc nhau, ngổồỡi ta õởnh nghộa ra baớn ghi (Record). RECORD laỡ mọỹt cỏỳu truùc bao gọửm nhióửu thaỡnh phỏửn. Caùc thaỡnh phỏửn coù thóứ thuọỹc caùc kióứu dổợ lióỷu khaùc nhau vaỡ õổồỹc goỹi laỡ caùc trổồỡng (Field), mọựi trổồỡng õóửu õổồỹc õỷt tón. óứ mọ taớ mọỹt kióứu T coù cỏỳu truùc Record vồùi danh saùch caùc trổồỡng coù tón laỡ S1, S2, ., Sn vaỡ coù caùc mọ taớ kióứu tổồng ổùng laỡ trổồỡng coù tón laỡ T1, T2, . Tn ta duỡng caùch vióỳt nhổ sau: Type T = Record S1 : T1; S2 : T2; . Sn : Tn; End; Vờ duỷ: Mọ taớ thồỡi gian DATE coù ba trổồỡng: Ngaỡy, Thaùng, Nm Type Date = Record Ngay: 1 31; Thang: 1 12; Nam: Word; End; 4 Vờ duỷ: óứ mọ taớ Nhỏn sổỷ cuớa phoỡng tọứ chổùc, ta duỡng caùc trổồỡng: HoDem, Ten, NgaySinh, Luong, . ồớ õỏy ta lỏỳy vờ duỷ coù 5 trổồỡng: Type NhanSu = Record HoDem: String[20]; Ten: String[7]; NgaySinh: Date; Giaùo trỗnh Lỏỷp trỗnh Pascal cn baớn 59 Trang 59 Luong: Real; CoGiaDinh: Boolean; End; Var NV, NV1: NhanSu; DS: Array[1 100] of NhanSu; {Danh sach tren la kieu mang mo ta nhan su cua mot co quan co duoi 100 nhan vien} ệ Ghi chuù: Ta coù thóứ vióỳt trổỷc tióỳp mọ taớ trổồỡng NgaySinh nóỳu nhổ chổa coù kióứu Date nhổ sau: Type NhanSu = Record HoDem: String[20]; Ten: String[7]; NgaySinh: Record Ngay: 1 31; Thang: 1 12; Nam: Word; End; Luong: Real; CoGiaDinh: Boolean; End; 2. Sổớ duỷng Record: Muọỳn truy cỏỷp mọỹt bióỳn kióứu Record, ta phaới truy cỏỷp theo thaỡnh phỏửn cuớa chuùng. Cuù phaùp õóứ truy cỏỷp õeùn mọỹt thaỡnh phỏửn naỡo õoù laỡ: <Tón bióỳn Record>.<Tón trổồỡng> 4 Vờ duỷ: NV.HoLot := Huynh Dinh; NV.Ten := Can; NV.NgaySinh.Ngay : = 4; NV. NgaySinh.Thang := 2; NV. NgaySinh. Nam := 1982; NV.Luong := 500000; NV.CoGiaDinh := False; Giaùo trỗnh Lỏỷp trỗnh Pascal cn baớn 60 Trang 60 4 Vờ duỷ 1: Nhỏỷp lyù lởch nhỏn vión cuớa mọỹt cồ quan. Uses CRT; Type Date = Record Ngay: 1 31; Thang: 1 12; Nam: Word; End; NhanSu = Record HoDem: String[20]; Ten: String[7]; NgaySinh: Date; Luong: Real; CoGiaDinh: Boolean; End; Var DS: Array[1 100] of NhanSu; i, SoNV: Byte; GD: Char; Begin ClrScr; Writeln( NHAP HO SO NHAN VIEN ); Write( So nhan vien tai co quan: ); Readln(SoNV); For i:=1 to SoNV do Begin ClrScr; Write( Ho dem: ); Readln(DS[i].HoDem); Write( Ho dem: ); Readln(DS[i].Ten); Write( Ngay sinh: / /); GotoXY(14,3); Readln(DS[i].NgaySinh.Ngay); GotoXY(17,3); Readln(DS[i].NgaySinh.Thang); GotoXY(20,3); Readln(DS[i].NgaySinh.Nam); Write( Luong: ); Readln(DS[i].Luong); Write( Co gia dinh (Y/N) ?: ); Readln(GD); – Giạo trçnh Láûp trçnh Pascal càn bn — – 61 — Trang 61 If Upcase(GD) = ‘Y’ then DS[i].CoGiaDinh := True Else DS[i].CoGiaDinh := False; End; Readln; End. Ư Ghi chụ: - Cạc biãún Record cng kiãøu cọ thãø gạn cho nhau. Vê dủ: NV := NV1; thay vç ta phi thỉûc hiãûn: NV.HoDem := NV1.HoDem; NV.Ten := NV1.Ten; - Cọ thãø dng phẹp so sạnh: If NV = NV1 then Write(‘ Cung mot nhan vien ! ‘); Hồûc: If (NV.HoDem = NV1.HoDem) and (NV.Ten = NV1.Ten) then Write(‘ Hai nhan vien cung ho ten !. ‘); - Khäng âỉåüc dng cạc thao tạc sau: + Cạc th tủc âc v ghi (Read, Readln, Write, Writeln) cho c mäüt biãún kiãøu Record nhỉ: Readln(NV), Writeln(NV); + Sỉí dủng cạc phẹp toạn quan hãû nhỉ: <, >, <=, >=. Nhỉng cọ thãø sỉí dủng phẹp toạn <> v = cho hai biãún Record cọ cng kiãøu. + Táút c cạc phẹp toạn säú hc v logic. 3. Cáu lãûnh With: Khi cáưn truy cáûp nhiãưu thnh pháưn ca mäüt biãún kiãøu Record, ta cọ thãø dng cáu lãûnh With âãø chỉång trçnh âỉåüc gn hån. Cụ phạp: WITH <Biãún kiãøu Record> DO <Cáu lãûnh> 4 Vê dủ 1: Theo nhỉ vê dủ 1, ta cọ thãø viãút ngàõn gn hån nhỉ sau: Uses CRT; Type Date = Record Ngay: 1 31; – Giaïo trçnh Láûp trçnh Pascal càn baín — – 62 — Trang 62 Thang: 1 12; Nam: Word; End; NhanSu = Record HoDem: String[20]; Ten: String[7]; NgaySinh: Date; Luong: Real; CoGiaDinh: Boolean; End; Var DS: Array[1 100] of NhanSu; i, SoNV: Byte; GD: Char; Begin ClrScr; Writeln(‘ NHAP HO SO NHAN VIEN ‘); Write(‘ So nhan vien tai co quan: ‘); Readln(SoNV); For i:=1 to SoNV do With DS[i] do Begin ClrScr; Write(‘ Ho dem: ‘); Readln(HoDem); Write(‘ Ho dem: ‘); Readln(Ten); Write(‘ Ngay sinh: / /’); With NgaySinh do Begin GotoXY(14,3); Readln(Ngay); GotoXY(17,3); Readln(Thang); GotoXY(20,3); Readln(Nam); End; Write(‘ Luong: ‘); Readln(Luong); Write(‘ Co gia dinh (Y/N) ?: ’); Readln(GD); If Upcase(GD) = ‘Y’ then Giaùo trỗnh Lỏỷp trỗnh Pascal cn baớn 63 Trang 63 CoGiaDinh := True Else CoGiaDinh := False; End; Readln; End. ệ Ghi chuù: Nhổ vỏỷy chuùng ta coù thóứ lọửng caùc chố thở With . Do . vaỡo vồùi nhau õóứ truy nhỏỷp vaỡo caùc trổồỡng ồớ sỏu trong Record phổùc taỷp nhổ bióỳn Ds[i]. Cuù phaùp nhổ sau: With A do With B do Vồùi A, B õóửu õổồỹc mọ taớ laỡ Record song B laỡ mọỹt trổồỡng cuớa A thỗ ta coù thóứ coù caùch vióỳt nhổ sau: With A do With A, B do With B do Begin Begin . . End; End; 4 Vờ duỷ 2: oaỷn chổồng trỗnh ồớ vờ duỷ 1 coù thóứ vióỳt laỷi: . For i:=1 to SoNV do With DS[i], NgaySinh do Begin ClrScr; Write( Ho dem: ); Readln(HoDem); Write( Ho dem: ); Readln(Ten); Write( Ngay sinh: / /); GotoXY(14,3); Readln(Ngay); GotoXY(17,3); Readln(Thang); GotoXY(20,3); Readln(Nam); Write( Luong: ); Readln(Luong); Write( Co gia dinh (Y/N) ?: ); Readln(GD); If Upcase(GD) = Y then – Giạo trçnh Láûp trçnh Pascal càn bn — – 64 — Trang 64 CoGiaDinh := True Else CoGiaDinh := False; End; . 4. Record cọ cáúu trục thay âäøi: Cạc kiãøu Record trçnh by trãn l kiãøu Record cäú âënh vç säú thnh pháưn cng nhỉ cáúu trục ca Record l â cäú âënh. Bãn cảnh âọ Pascal cn cho phẹp láûp cạc Record cọ mäüt pháưn cáúu trục thay âäøi âỉåüc . Trỉåïc hãút, ta xẹt thê dủ sau: trong mủc NhanSu , nãúu ta xẹt thãm trỉåìng NgheNghiep thç s cọ nhiãưu trỉåìng håüp xy ra, chàóng hản: - Cäng nhán : Cáưn ghi r ngnh gç ? Báûc thåü máúy ? - K sỉ : Ngnh gç ? Trçnh âäü thỉûc tãú ? - Bạc sé : Chun khoa gç ? - Cạ biãût : Khäng ghi gç thãm ? Tuy ta cọ thãø láûp mäüt Record gäưm âáưy â cạc trỉåìng kãø trãn nhỉng ráút cäưng kãưnh (trong khi âọ cọ thãø mäüt ngỉåìi åí mäüt thåìi âiãøm no âọ chè cọ mäüt ngnh nghãư) v chiãúm nhiãưu ä nhåï. Tiãúp theo ta cọ thãø láûp ra bäún kiãøu Record giäúng nhau pháưn âáưu (HoDem, Ten, NgaySinh, Luong, CoGiaDinh) nhỉng chè khạc nhau pháưn cúi l nghãư nghiãûp (NgheNghiep), tỉïc l s cọ cạc trỉåìng tỉång ỉïng våïi bäún nghãư khạc nhau. Cạch ny cng lm cäưng kãưnh chỉång trçnh vç ta phi dng âãún bäún kiãøu Record. Ngän ngỉỵ Pascal cho phẹp láûp Record cọ dảng sau âãø tiãút kiãûm ä nhåï v cho phẹp linh hoảt sỉí dủng: Type Nghe = (CongNhan, KySu, BacSi, CaBiet); Nganh = (KhaiThac, CoKhi, CheBien, Nuoi, KinhTe); Khoa = (Noi, Ngoai, Nhi, Phu); NhanSu = Record HoDem: String[20]; Ten: String[7]; NgaySinh: Date; Luong: Real; Giaùo trỗnh Lỏỷp trỗnh Pascal cn baớn 65 Trang 65 CoGiaDinh: Boolean; CASE NgheNghiep: Nghe Of CongNhan: (NganhCN: Nganh; BacTho: Byte); KySu: (NganhKS: Nganh; TrinhDoTT: (Kem, TB, kha, Gioi)); BacSi: (ChuyenKhoa: Khoa); CaBiet: (); END; { Of Record } Var NV, NV1: NhanSu; Begin . With NV do Begin HoDem := Vo Thanh; Ten := Chau; NgheNghiep := CongNhan; NganhCN := CoKhi; BacTho := 3; End; . With NV1 do Begin HoDem := Huynh Dinh; Ten := Can; NgheNghiep := KySu; NganhKS := KinhTe; TrinhDoTT := Kha; End; . END. F Giaới thờch minh hoaỷ trón: - HoDem, Ten, NgaySinh, CoGiaDinh laỡ caùc thaỡnh phỏửn cọỳ õởnh cuớa Record NhanSu. - NganhCN, NganhKS, BacTho, TrinhDoTT, ChuyenKhoa laỡ caùc thaỡnh phỏửn thay õọứi cuớa Record NhanSu. – Giạo trçnh Láûp trçnh Pascal càn bn — – 66 — Trang 66 - Trong khai bạo mäüt kiãøu Record, nãúu cọ thnh pháưn thay âäøi thç phi âỉåüc âàût sau cạc thnh pháưn cäú âënh va ì chè âỉåüc phẹp cọ mäüt trỉåìng thay âäøi . - Pháưn thay âäøi nàòm sau cng trong danh sạch v âỉåüc bàõt âáưu bàòng cáu lãûnh CASE . (Pháưn thay âäøi ny lải cọ thãø chỉïa Record khạc cọ kiãøu cáúu trục thay âäøi). Ư Ghi chụ: - Pháưn thay âäøi l mäüt trỉåìng gi l trỉåìng âạnh dáúu (Tag Field) v âỉåüc dàût trong cáu lãûnh CASE (Vê dủ trãn l NgheNghiep). ỈÏng våïi mäùi giạ trë ca trỉåìng âạnh dáúu, ta cọ cạc biãún dảng ca Record våïi danh sạch cạc trỉåìng tỉång ỉïng âỉåüc âàût sau cạc nhn ca lãûnh CASE v ton bäü danh sạch ny phi âỉåüc âàût trong hai dáúu ngồûc âån () ngay c khi nọ räùng nhỉ trỉåìng håüp CaBiet åí vê dủ trãn. - Trỉåìng mä t phi l cạc kiãøu âån gin (Byte, Integer, Word, LongInt, Real, Double, Char, Boolean) . - Táút c cạc tãn biãún trong pháưn thay âäøi âãưu bàõt büt phi khạc nhau. Theo vê dủ trãn, Nganh trong hai trỉåìng håüp ca NgheNghiep l CongNhan v KySu âỉåüc k hiãûu bàòng hai tãn khạc nhau l: NganhCN v NganhKS. . trỗnh Pascal cn baớn 58 Trang 58 BAèI 9. Dặẻ LIU KIỉU BAN GHI VAè KIỉU TP I. Kióứu baớn ghi: 1. Khaùi nióỷm vaỡ õởnh nghộa: Caùc kióứu cỏỳu truùc dổợ. NhanSu , nãúu ta xẹt thãm trỉåìng NgheNghiep thç s cọ nhiãưu trỉåìng håüp xy ra, chàóng hản: - Cäng nhán : Cáưn ghi r ngnh gç ? Báûc thåü máúy ? - K sỉ