Giáo trình Lập trình nâng cao (Trên ngôn ngữ Pascal) - Dương Xuân Thành

pdf 207 trang Gia Huy 17/05/2022 2510
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình nâng cao (Trên ngôn ngữ Pascal) - Dương Xuân Thành", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_nang_cao_tren_ngon_ngu_pascal_duong_xua.pdf

Nội dung text: Giáo trình Lập trình nâng cao (Trên ngôn ngữ Pascal) - Dương Xuân Thành

  1. TR ƯNG ðI H C NƠNG NGHI P I - HÀ N I B MƠN CƠNG NGH PH N M M TS. D ƯƠ NG XUÂN THÀNH Giáo trình LP TRÌNH NÂNG CAO ( Trên ngơn ng Pascal ) (So n theo ch ươ ng trình đã đưc B GD& ðT phê chu n) Hà n i, 2005
  2. Li m đu Cu n giáo trình này đưc biên so n theo đúng đ c ươ ng chi ti t mơn h c đã đưc B Giáo d c và ðào t o phê chu n. Th i gian h c mơn h c này là 60 ti t trong đĩ cĩ 10 ti t th c hành trên máy. Tác gi là ng ưi đã tr c ti p gi ng d y l p trình Pascal trong nhi u n ăm cho sinh viên chuyên tin và sinh viên các ngành khác. ði t ưng s d ng giáo trình là sinh viên chuyên ngành Tin h c h đi h c chính quy, tuy nhiên giáo trình c ũng cĩ th s d ng nh ư là m t tài li u tham kh o cho sinh viên chuyên Tin h cao đng và nh ng ng ưi mu n nghiên c u nâng cao v l p trình. Mc đích biên so n cu n giáo trình là cung c p cho ng ưi đc m t tài li u đơ n gi n, cơ đng nh ng ki n th c v l p trình nâng cao. Ng ưi đc cĩ th t h c mà khơng nh t thi t ph i cĩ thày h ưng d n. Giáo trình bao g m 6 ch ươ ng và 4 ph l c. Ch ươ ng 1: Ch ươ ng trình con - Th t c và hàm , sinh viên đã đưc h c qua trong ch ươ ng trình Tin h c đi c ươ ng, do v y đây ch y u đi sâu vào khái ni m tham s , cách th c mà h th ng dành b nh cho vi c l ưu tr các tham s và vi c g i ch ươ ng trình con t ch ươ ng trình con khác. Ch ươ ng 2: Các ki u d li u cĩ c u trúc , t p trung vào các ki u d li u mà sinh viên ch ưa đưc h c nh ư b n ghi cĩ c u trúc thay đi, t p h p Ch ươ ng 3: ðơ n v ch ươ ng trình và th ư vi n chu n, là ch ươ ng ch ưa đưc h c Tin hc đi c ươ ng , đây h ưng d n cách thi t k các ðơ n v ch ươ ng trình (Unit), cách th c s dng các Unit và t o l p th ư vi n ch ươ ng trình . Ch ươ ng 4: Con tr và c u trúc đng , là m t ch ươ ng khĩ, vì nĩ v a liên quan đn qu n lý b nh , v a liên quan đn ki n th c c a mơn h c C u trúc d li u và Gi i thu t do vy trong ch ươ ng này đã trình bày nhi u ví d đ ng ưi đc tham kh o. Ch ươ ng 5: Gi i thu t đ quy , đưc trình bày “h ơi dài dịng” do đc thù c a tính đ quy. Bài tốn Tháp Hanoi đưc mơ t khác hồn tồn so v i t t c các sách v Pascal đã cĩ. Ch ươ ng 6: ð ho , ngồi vi c gi i thi u các th t c v thơng th ưng, cịn dành m t ph n tr ng tâm cho vi c x lý nh Bitmap. Trong ch ươ ng này cĩ s d ng m t vài ví d c a các tác gi khác (xem ph n tài li u tham kh o) nh ưng đã đưc c i ti n đi r t nhi u. Ph l c 1: B ng mã ASCII Ph l c 2: Tĩm t t các th t c và hàm c a Turbo Pascal 7.0 Ph l c 3: ðnh h ưng biên d ch Ph l c 4: Thơng báo l i Các ph l c đư a ra nh m giúp ng ưi l p trình ti n tra c u các th t c, hàm và x lý các l i khi Pascal thơng báo l i trên màn hình Do ph i bám sát đ c ươ ng và s h n ch v s trang tác gi nên trong giáo trình ch ưa đư a vào đưc ph n x lý âm thanh, l p trình h ưng đi t ưng Vi c biên so n l n đu khơng th tránh đưc thi u sĩt, tác gi mong nh n đưc s gĩp ý c a b n đc và đng nghi p đ l n xu t b n sau s t t h ơn. M i gĩp ý xin g i v đa ch : B mơn Cơng ngh Ph n m m, Khoa Cơng ngh Thơng tin, ði h c Nơng nghi p I , Trâu qu ỳ, Gia lâm, Hà n i. Xin trân tr ng c m ơn. Hà n i, tháng 5 n ăm 2005 Ts. D ươ ng Xuân Thành Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 2
  3. Ch ươ ng I Ch ươ ng trình con - Th t c và hàm Khái ni m ch ươ ng trình con đã đưc trình bày trong mơn h c Tin h c đi c ươ ng, do v y trong ch ươ ng này chúng ta nh c l i s ơ qua m t s khái ni m c ũ và dành th i gian cho vi c tìm hi u sâu v tham s (tham bi n và tham tr ), l i g i chươ ng trình con, cách th c b trí ch ươ ng trình con trong thân ch ươ ng trình m . Sau khi h c ch ươ ng này b n đc c n n m đưc các n i dung ch y u sau:  Th nào là bi n tồn c c, bi n đa ph ươ ng  Các bi n tồn c c và bi n đa ph ươ ng đưc b trí đâu  T m tác d ng c a t ng lo i bi n  Th t xây d ng các ch ươ ng trình con cĩ nh h ưng th nào đn tồn b ch ươ ng trình  Th nào là tính đ quy c a ch ươ ng trình con  L i g i ch ươ ng trình con th nào là đưc phép  Cách khai báo tr ưc đ g i ch ươ ng trình con khơng theo th t thi t k Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 3
  4. 1. Khái ni m v ch ươ ng trình con Ch ươ ng trình con trong Pascal đưc hi u là m t ch ươ ng trình n m trong lịng m t ch ươ ng trình khác. Ch ươ ng trình con g m hai lo i: Th t c (Procedure) và hàm (Function) . Các ch ươ ng trình con đưc dùng r ng rãi khi xây d ng các ch ươ ng trình l n nh m làm cho ch ươ ng trình d theo dõi, d s a ch a. M t đc đim n i b t c a ch ươ ng trình con là nĩ cĩ tính đ quy nh th mà nhi u bài tốn s đưc gi i quy t d dàng. Khi m t ch ươ ng trình con đưc g i thì các bi n đưc khai báo trong ch ươ ng trình con (ta g i là bi n c c b ) s đưc c p phát b nh . K t thúc ch ươ ng trình con, các bi n c c b đưc gi i phĩng, điu này s đưc l p l i m i khi ch ươ ng trình con đưc g i và nĩ đng ngh ĩa v i vi c th i gian x lý bài tốn s t ăng lên. Bn thân tên g i c a hai lo i ch ươ ng trình con đã nĩi lên ph n nào s khác nhau gi a chúng. Function (Hàm) là m t lo i ch ươ ng trình con cho k t qu là m t giá tr vơ h ưng. Khi gi tên Function v i các tham s h p l ta s nh n đưc các giá tr , b i v y tên hàm cĩ th đư a vào các bi u th c tính tốn nh ư là các tốn h ng. Procedure là lo i ch ươ ng trình con khi th c hi n khơng cho ra k t qu là m t giá tr , m i Procedure nh m th c hi n m t nhĩm cơng vi c nào đĩ c a ch ươ ng trình m , vì v y tên c a Procedure khơng th đư a vào các bi u th c tính tốn. B ng cách xây d ng các ch ươ ng trình con ng ưi l p trình cĩ th phân m nh ch ươ ng trình cho nhi u ng ưi cùng làm d ưi s ch đo th ng nh t c a ng ưi ch trì. Trong Turbo Pascal đã cĩ s n m t s ch ương trình con, ví d : sin(x), sqrt(x) là các Function, cịn read(), write(), gotoxy (x1,x2) là các Procedure. Trong m t ch ươ ng trình các ch ươ ng trình con đưc b trí ngay sau ph n khai báo bi n. C u trúc t ng quát m t ch ươ ng trình Pascal nh ư sau: PROGRAM tên_ch ươ ng_trình; USES tên các UNIT; (*khai báo các đơ n v ch ươ ng trình c n thi t*) LABEL (*khai báo nhãn*). CONST (*Khai báo h ng*) TYPE (* đnh ngh ĩa ki u d li u m i*) VAR (*khai báo bi n*) PROCEDURE Tên_CTC1 (danh sách tham s hình th c); Begin (*thân th t c th nh t*). End; PROCEDURE Tên_CTC2 (danh sách tham s hình th c); Begin (*thân th t c th hai*) End; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 4
  5. FUNCTION Tên_HAM1(danh sách tham s hình th c):ki u hàm; Begin (*thân hàm th nh t*) End; BEGIN (*b t đu ch ươ ng trình m *) END. Ghi chú: 1. Các ch ươ ng trình con v nguyên t c c ũng bao g m các ph n khai báo báo nh ư đi vi m t ch ươ ng trình m , ph n nào khơng c n thi t thì khơng khai. ðiu khác nhau c ơ b n là thân ch ươ ng trình con n m gia hai t khố Begin và End; (sau End là d u ";" ch khơng ph i là d u "." nh ư trong ch ươ ng trình m ) ngồi ra ch ươ ng trình con cịn cĩ th thêm ph n khai báo các tham s hình th c, các tham s hình th c đưc đt trong d u () và vi t ngay sau tên ch ươ ng trình con. 2. N u ch ươ ng trình con là Function thì cu i ch ươ ng trình c n cĩ l nh gán giá tr vào tên ch ươ ng trình con. 2. Tham s trong ch ươ ng trình con Các ch ươ ng trình con cĩ th khơng c n tham s mà ch cĩ các bi n riêng (bi n c c b). Trong tr ưng h p c n nh n các giá tr mà ch ươ ng trình m truy n cho thì ch ươ ng trình con c n ph i cĩ các tham s ( Parameter ). Tham s đưc khai báo ngay sau tên ch ươ ng trình con và đưc g i là tham s hình th c. Nh ng giá tr l ưu tr trong các bi n tồn c c c a ch ươ ng trình m , n u đưc truy n cho các th t c ho c hàm thơng qua l i g i tên chúng thì đưc g i là Tham s th c. Tham s hình th c bao g m hai lo i: 2.1 Tham bi n (Variabic parameter) Tham bi n là nh ng giá tr mà ch ươ ng trình con nh n t ch ươ ng trình m , các giá tr này cĩ th bi n đi trong ch ươ ng trình con và khi ch ươ ng trình con k t thúc các giá tr này s đưc tr v cho tham s th c. Cách khai báo tham bi n: Tên ch ươ ng trình con (Var tên tham bi n : ki u d li u); 2.2 Tham tr (Value parameter ) Nh ng tham s truy n vào cho ch ươ ng trình con x lý nh ưng khi quay v ch ươ ng trình m v n ph i gi nguyên giá tr ban đu thì đưc g i là tham tr . Cách khai báo tham tr : Tên ch ươ ng trình con (tên tham tr : ki u d li u); Dưi đây là m t ví d khai báo tham s : Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 5
  6. PROCEDURE VIDU(x,y,z: integer; lam:boolean; var qq: char); Câu l nh khai báo ch ươ ng trình con trên đây đng th i khai báo các tham s hình th c trong đĩ x, y,z, lam là các tham tr , v i x, y,z cĩ ki u integer, lam cĩ ki u boolean, qq là tham bi n vì nĩ đưc vi t sau t khố VAR. Ví d 1.1: Lp ch ươ ng trình tìm s l n nh t trong n s nguyên đưc nh p t bàn phím. Program Tim_cuc_dai; Uses Crt; TYPE dayso = array[1 100] of integer; (* ðnh ngh ĩa ki u d li u dayso là ki u m ng g m nhi u nh t là 100 ph n t *). VAR a: dayso (*khai báo bi n c a ch ươ ng trình m *) n: integer; PROCEDURE nhapso(m:integer; var x:dayso); (* Nh p dãy s c n tìm c c đi vào m ng m t chi u x[i]*) Var i : integer; (*khai báo bi n c c b c a ch ươ ng trình con*) Begin writeln('Nhap day so kieu integer); For i:=1 to m Do (* m đưc truy n t ch ươ ng trình m qua tham s th c n*) Begin write('a[', i , '] = '); realln (x[i]); End; End; FUNCTION Max(m: integer; b:dayso); integer; (* Hàm MAX dùng đ tìm s l n nh t trong dãy s đã nh p, ki u giá tr c a hàm là ki u integer *) VAR i,t: integer; (* Bi n riêng c a hàm Max *) Begin t:=b[1]; (* Gán ph n th nh t c a m ng b[i] cho bi n t *) For i:=2 to m Do if t<b [i] then t:=b[i]; Max:=t; (* Gán giá tr cho chính hàm Max*) End; BEGIN (* Thân ch ươ ng trình m *) Write('Ban can nhap bao nhieu so ? '); Readln(n); NHAPSO(N, A); (* G i ch ươ ng trình con NHAPSO v i 2 tham s th c là n và a. Hai tham s này s thay th cho hai tham s hình th c m, x trong ch ươ ng trình con *) Writeln (' So lon nhat trong day so da nhap = ', MAX(n,a):5); (* Vi t ra giá tr c a hàm MAX v i 2 tham s th c n,a đ dài s là 5 ký t *) Repeat until keypressed; END. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 6
  7. Ví d 1.1 là m t ch ươ ng trình bao g m hai ch ươ ng trình con, ch ươ ng trình con th nh t là m t th t c (Procedure), ch ươ ng trình con th hai là m t hàm (Function). Ch ươ ng trình m cĩ l nh đc s ph n t n c a m ng dayso (t c là s l ưng con s s nh p vào). Vì m ng Dayso đưc khai báo cĩ 100 ph n t nên khơng th đc vào nhi u quá 100 con s . Sau đĩ là l nh g i ch ươ ng trình con NHAPSO v i 2 tham s th c là n, a, đây a là tham bi n ngh ĩa là giá tr c a m ng a s đưc thay đi trong ch ươ ng trình con b i tham s hình th c x[i]. Ch ươ ng trình con nh p vào tham bi n x[i] ki u m ng n con s thơng qua tham tr m (m=n). Lnh vi t giá tr l n nh t c a dãy s cĩ kèm l i g i hàm MAX vì hàm MAX th c ch t trong tr ưng h p này ch là m t con s . Hàm MAX dùng đ tìm s l n nh t trong các s đã nh p, l i g i hàm trong ch ươ ng trình m kèm theo vi c truy n hai tham s th c là n và a thay th cho hai tham s hình th c là m và b. Tên hàm đưc dùng nh ư là m t bi n trong b n thân hàm khi ta dùng phép gán giá tr MAX:=t; Chú ý: 1. Ki u d li u trong khai báo tham s hình th c ch cĩ th là: s nguyên, s th c, ký t, ho c Boolean . N u mu n đư a các ki u d li u cĩ c u trúc vào trong khai báo tham s thì ph i đnh ngh ĩa tr ưc ki u d li u này ph n khai báo ki u sau t khố Type (xem ví d 1.1). 2. V i ki u d li u chu i, n u chúng ta khai báo tham s th c trong ch ươ ng trình m và tham bi n trong ch ươ ng trình con đu là STRING (khơng quy đnh đ dài t i đa c a chu i) thì khơng c n ph i đnh ngh ĩa tr ưc ki u d li u ph n TYPE. ð th y rõ v n đ chúng ta xét ví d sau đây: Ví d : 1.2 Program Chuong_trinh_me; Var s:string; m:byte Procedure Chuong_trinh_con( Var a:string; n:byte); Cách khai báo trên là đưc phép trong Pascal . Nu chúng ta quy đnh đ dài chu i nh ư m t trong ba d ng sau thì s b báo l i: Dng th nh t Program Chuong_trinh_me; Var s:string[30]; m:byte Procedure Chuong_trinh_con( Var a:string[30]; n:byte); Dng th hai Program Chuong_trinh_me; Var s:string[30]; m:byte Procedure Chuong_trinh_con( Var a:string; n:byte); Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 7
  8. Dng th ba Program Chuong_trinh_me; Var s:string; m:byte Procedure Chuong_trinh_con( Var a:string[30]; n:byte); Tuy nhiên cĩ m t ngo i l khi tham s hình th c trong các ch ươ ng trình con khơng ph i là tham bi n mà là tham tr thì cĩ th khai báo theo d ng th hai. Mu n quy đnh đ dài chu i trong các khai báo tham bin thì ph i khai báo ki u d li u theo m u sau: Program Chuong_trinh_me; Type S1 = string[30]; Var s:s1; m:byte Procedure Chuong_trinh_con( Var a:s1; n:byte); 3. Truy n tham s cho ch ươ ng trình con Tr l i ví d 1.1 ta th y trong m i ch ươ ng trình con cĩ nh ng tham s riêng c a mình. Ch ươ ng trình con nh p s đã s d ng hai tham s hình th c là m và x. Hai tham s này đưc chu n b đ nh n các giá tr mà ch ươ ng trình m truy n cho thơng qua l i g i ch ươ ng trình con v i các tham s th c là n và b. Vì m đưc khai báo ki u khơng cĩ t khố Var nên nĩ là tham tr , ngh ĩa là khi ch ươ ng trình con k t thúc thì giá tr c a tham s th c n v n khơng thay đi, tham s x là tham bi n vì nĩ đưc khai báo sau t khố Var. Khi tham s hình th c trong ch ươ ng trình con là tham bi n thì tham s th c trong ch ươ ng trình m ph i là bi n ch khơng th là h ng. Trong m i tr ưng h p c hai tham s th c và tham s hình th c đu ph i cùng ki u d li u. Các tham s th c truy n cho tham bi n thì giá tr c a nĩ cĩ th thay đi trong ch ươ ng trình con, khi ra kh i ch ươ ng trình con nĩ v n gi nguyên các giá tr đã thay đi đĩ. Trong ví d 1.1 tham s th c a là m t m ng c a n ph n t và t t c các ph n t đu cịn r ng, khi truy n a vào tham bi n x thì th i đim ban đu các ph n t c a x c ũng r ng. Phép gán trong ch ươ ng trình con NHAPSO s làm thay đi giá tr các ph n t c a x, sau kh i ra ch ươ ng trình con nĩ gi nguyên các giá tr đã gán t c là các giá tr ta nh p t bàn phím vào các ph n t c a mng. Khi tham s hình th c là tham tr thì tham s th c ph i là m t giá tr . Ch ươ ng trình con nh n giá tr này nh ư là giá tr ban đu và cĩ th th c hi n các phép tính làm bi n đi giá tr đĩ, quá trình này ch tác đng trong n i b ch ươ ng trình con, khi ra kh i ch ươ ng trình con giá tr c a tham s th c khơng bi n đi. C th trong ví d trên bi n n nh n giá tr đc t bàn phím trong ch ươ ng trình m và đưc truy n cho tham s m trong c hai ch ươ ng trình con. Sau li g i ch ươ ng trình con NHAPSO giá tr này cĩ th b thay đi nh ưng khi r i NHAPSO đn li g i hàm MAX thì n l i v n gi giá tr ban đu. Nh ư v y n u mu n b o v giá tr m t tham s nào đĩ khi truy n chúng cho ch ươ ng trình con thì ph i qui đnh chúng là tham tr . Cịn n u mu n nh n l i giá tr mà ch ươ ng trình con đã sinh ra thay th cho nh ng giá tr ban đu cĩ trong ch ươ ng trình m (ho c là dùng nh ng giá tr c a ch ươ ng trình con thay th cho bi n ch ưa đưc gán giá tr trong ch ươ ng trình m nh ư vi d 1.1) thì tham s ph i là tham bi n. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 8
  9. ð th y rõ h ơn ý ngh ĩa c a các tham s chúng ta xét ví d sau đây: Ng ưi m trao cho con trai m t chi c nh n và m t túi ti n. Tr ưc khi con đi làm ăn ph ươ ng xa m d n: "Chi c nh n là tín v t dùng đ nh n l i gia đình và h hàng khi con tr v , cịn túi ti n là v n ban đu cho con kinh doanh". Trong qúa trình làm ăn, ng ưi con cĩ th c m c chi c nh n nh ưng khi tr v nhà nh t thi t ph i mang chi c nh n đĩ v , cịn túi ti n khi quay v cĩ th nhi u lên c ũng cĩ th ít đi, th m chí khơng cịn đng nào. Trong ví d này chi c nh n đĩng vai trị tham tr , cịn túi ti n đĩng vai trị tham bi n. Vn đ đt ra là Pascal làm th nào đ đm b o các tính ch t c a tham tr và tham bi n. ðiu này s đưc làm rõ khi nghiên c u vi c b trí b nh (m c 5). Khi l a ch n tham s c n l ưu ý m t s đim sau: a. Ki u c a tham s trong ch ươ ng trình con ph i là các ki u vơ h ưng đơ n gi n đã đưc đnh ngh ĩa s n trong Pasacl ho c đã đưc đnh ngh ĩa trong ph n đu c a ch ươ ng trình m. Trong ch ươ ng trình con khơng th đnh ngh ĩa ki u d li u m i. b. Ch ươ ng trình con cĩ th c s c n tham s hay khơng? N u ch ươ ng trình con ch s dng các bi n tồn c c và bi n đa ph ươ ng c ũng đáp ng đưc yêu c u c a bài tốn thì khơng nên dùng tham s . N u ch ươ ng trình con th c hi n nhi u cơng vi c trên cùng m t lo i đi tưng ( đi t ưng đây cĩ th là h ng, bi n, hàm, th t c, ki u), ngh ĩa là l i g i ch ươ ng trình con đưc l p l i nhi u l n trên cùng m t ho c m t nhĩm đi t ưng thì c n dùng đn tham s . c. N u khơng mu n thay đi giá tr c a các tham s th c trong ch ươ ng trình m khi truy n nĩ cho ch ươ ng trình con thì ph i dùng tham s hình th c d ưi d ng tham tr (trong ph n khai báo ki u khơng cĩ t khố Var). N u c n thay đi giá tr c a tham s th c trong ch ươ ng trình m và nh n l i giá tr mà ch ươ ng trình con đã x lý thì tham s trong ch ươ ng trình con ph i là tham bi n (tên tham s ph i đt sau t khố Var). 4. Bi n tồn c c và bi n đ a ph ươ ng 4.1 Bi n tồn c c Bi n khai báo đu ch ươ ng trình m đưc g i là bi n tồn c c. Nĩ cĩ tác d ng trong tồn b ch ươ ng trình, k c các ch ươ ng trình con. Khi th c hi n ch ươ ng trình máy dành các ơ nh vùng d li u (Data) đ l ưu gi giá tr c a bi n. M r ng ra t t c các đi t ưng trong Pascal (Ki u d li u, H ng, Bi n, Hàm, Th tc) khai báo trong ch ươ ng trình m đưc g i là đi t ưng tồn c c. Nh ư v y m t kiu d li u đã đưc đnh ngh ĩa trong ch ươ ng trình m thì đươ ng nhiên đưc phép s d ng trong các ch ươ ng trình con c a nĩ. Trong ví d 1.1 bi n a và n là bi n tồn c c, hai bi n này cĩ th s d ng tr c ti p trong th t c NHAPSO và trong hàm MAX mà khơng c n khai báo l i. Pascal dành các ơ nh vùng Data (vùng d li u) cho các đi t ưng tồn c c. 4.2 Bi n đa ph ươ ng Nh ng đi t ưng khai báo trong ch ươ ng trình con ch cĩ tác d ng trong n i b ch ươ ng trình con đĩ, chúng đưc g i là đi t ưng đa ph ươ ng. ði t ưng hay đưc s d ng nh t là Bi n. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 9
  10. Bi n đa ph ươ ng cĩ th trùng tên v i bi n tồn c c song h th ng dành các ơ nh trong vùng nh ng ăn x p (Stack) đ l ưu gi các giá tr c a bi n. K t thúc ch ươ ng trình con h th ng s gi i phĩng ơ nh c a bi n đa ph ươ ng dùng vào vi c khác, giá tr c a các bi n l ưu tr trong các ơ nh này s khơng cịn. Tr ưng h p trong ch ươ ng trình con l i cĩ các ch ươ ng trình con khác thì bi n đa ph ươ ng c a ch ươ ng trình con c p trên l i đưc xem là bi n tồn c c đi v i ch ươ ng trình con cp d ưi. Mt bi n sau khi đưc khai báo trong m t ch ươ ng trình s ch cĩ t m tác d ng trong bn thân ch ươ ng trình đĩ và các ch ươ ng trình con c a nĩ. Bi n này khơng cĩ tác d ng trong các ch ươ ng trình cùng c p khác ho c trong các ch ươ ng trình con c a ch ươ ng trình khác. ðiu này cĩ ngh ĩa là các ch ươ ng trình con và ch ươ ng trình m cĩ th cĩ nhi u bi n trùng tên, nh ưng t m tác d ng thì khác nhau do đĩ tính tồn v n c a d li u luơn đưc b o đm. Ví d 1.3 Program Chuong_trinh_con; Uses crt; Var i,n:byte; c1:string[30]; Procedure Bien_dia_phuong; Var i,n:byte; c1:string[30]; Begin n:=3; C1:='Thu do Ha noi'; Writeln('Gia tri n trong chuong trinh con: ',n); Writeln('Chuoi C1 trong chuong trinh con: ',C1); end; Begin (* thân ch ươ ng trình m *) Clrscr; Bien_dia_phuong; Writeln; n:=0; for i:= 1 to 10 do n:= n+i; c1:='Happy Birth Day'; Writeln('Gia tri n trong chuong trinh me: ',n); Writeln('Chuoi C1 trong chuong trinh me: ',C1); Readln; End. Ví d 1.3 thi t k m t ch ươ ng trình m và m t ch ươ ng trình con d ưi d ng th t c. Ph n khai báo bi n trong c hai là nh ư nhau. Phép gán d li u vào bi n n và chu i C1 là khác nhau. Sau l i g i ch ươ ng trình con Bien_dia_phuong màn hình xu t hi n: Gia tri n trong chuong trinh con: 3 Chuoi C1 trong chuong trinh con: Thu do Ha noi Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 10
  11. Ti p đĩ là k t qu các l nh vi t trong ch ươ ng trình m : Gia tri n trong chuong trinh me: 55 Chuoi C1 trong chuong trinh me: Happy Birth Day Li g i ch ươ ng trình con đưc th c hi n tr ưc, k t qu là bi n n mang giá tr 3, cịn chu i C1 là ' Thu do Ha noi '. Khi tr v ch ươ ng trình m bi n n =55 cịn chu i C1 = ' Happy Birth Day' . ðiu này cĩ ngh ĩa là bi n n và C1 trong ch ươ ng trình con khơng nh h ưng đn bi n n và C1 trong ch ươ ng trình m . 5. Cách th c b trí b nh Khi m t ch ươ ng trình Pascal d ng EXE đưc ch y máy s c p phát m t vùng nh c ơ s 640 Kb. Vùng nh này s bao g m các ơ nh n m li n nhau ngh ĩa là đa ch các ơ nh t ăng liên t c. Phân lo i vùng nh Tên vùng Dung l ưng Cao Heap 0 - 655360 Bytes Stack Segment 16 - 64 Kb Data Segment 64 Kb Code Segment Mi đon cĩ 64 Kb Th p Program Segment Prefix 256 Bytes Hình 1.1 Ch ươ ng trình đưc b trí trong b nh nh ư sau: * Program Segment Prefix: ghi đa ch các hàm, bi n, th t c * Code Segment: l ưu mã ch ươ ng trình chính và mã các Unit liên quan đn ch ươ ng trình, vùng này cĩ th g m nhi u đon, m i đon 64 Kb. * Data Segment: l ưu tr các bi n, h ng, ki u c a ch ươ ng trình chính, vùng này ch cĩ 64 Kb nên n u ch ươ ng trình chính cĩ quá nhi u h ng, bi n thì cĩ th g p l i: Too many variables * Stack Segment: L ưu mã ch ươ ng trình con và bi n đa ph ươ ng * Heap: vùng nh t do dùng cho vi c c p phát đng Các tham tr và bi n c c b khai báo trong ch ươ ng trình con đưc b trí vào các ơ nh c a Stack. Khi ch ươ ng trình m g i và truy n tham s cho ch ươ ng trình con thì giá tr ca các tham s này s đưc sao chép vào các ơ nh đã b trí stack. M i bi n đi di n ra trong stack khơng nh h ưng đn các giá tr c a tham s th c trong ch ươ ng trình m . Vi các tham bi n, Pascal khơng b trí ơ nh riêng mà s d ng con tr tr vào đa ch ca ơ nh ch a bi n tồn c c. Khi ch ươ ng trình con làm thay đi giá tr c a các tham bi n thì Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 11
  12. cũng cĩ ngh ĩa là nĩ làm thay đi giá tr c a các bi n tồn c c trong ch ươ ng trình m . K t thúc ch ươ ng trình con ch các bi n đa ph ươ ng là b gi i phĩng cịn bi n tồn c c khơng b gi i phĩng cho nên chúng ta nĩi ch ươ ng trình con đã mang các giá tr m i v cho ch ươ ng trình m. Cn chú ý r ng Pascal 7.0 ch dành 16 Kb cho vùng Stack, dung l ưng này đáp ng đy đ các ng d ng thơng th ưng. V i nh ng ng d ng s d ng tính đ quy mà s l n g i đ quy là quá l n thì s cĩ th b l i: Stack Overflow (b nh ng ăn x p b tràn). Gp tr ưng h p này c n ph i m r ng vùng nh Stack b ng cách sau: Trên thanh th c đơ n ch n Options/Memory Size s xu t hi n c a s (hình 1.2) Memory Sizes Stack size 16384 Low heap limit 0 High heap limit 655360 OK Cancel Help F1 Help - Size of your program's stack segment (between 1024 and 65520) Hình 1.2 Stack size 16384: dung l ưng hi n th i c a Stack Size of your program's stack segment (between 1024 and 65520) Cĩ th thay đi dung l ưng Stack trong kho ng 1024 - 65520 Bytes Mu n thay đi dung l ưng c a Stack chúng ta ch vi c gõ dung l ưng m i thay vào v trí 16384 hi n th i. Các tham s : Low heap limit 0 High heap limit 655360 Là vùng nh t do dành cho c p phát đng, khơng nên nh m chúng v i giá tr t i thi u và t i đa c a Stack. 6. Tính đ qui c a ch ươ ng trình con Thơng th ưng l i g i m t ch ươ ng trình con ch đưc th c hi n khi ch ươ ng trình con đĩ đã đưc thi t k hồn ch nh. Tuy nhiên Pascal cho phép m t ch ươ ng trình con ngay trong quá trình xây d ng l i cĩ th g i t i chính nĩ, khơng nh ng th t m t ch ươ ng trình con cịn cĩ th g i t i các ch ươ ng trình con khác cùng c p ho c ch ươ ng trình con c p cao h ơn nĩ. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 12
  13. Mt ch ươ ng trình con cĩ th cĩ l i g i t i chính tên ch ươ ng trình con đĩ, tính ch t này đưc g i là tính " ð qui c a ch ươ ng trình con". ð quy cĩ th s d ng trong c Procedure và Function. Gi ng nh ư m ng trong Pascal t ươ ng đươ ng v i ma tr n trong tốn, đ quy trong Pascal t ươ ng đươ ng v i tính Quy n p trong tốn h c. V điu này chúng ta s đ c p đn trong ch ươ ng V “Gi i thu t ð quy”. 7. L i g i ch ươ ng trình con Mt ch ươ ng trình m cĩ th cĩ nhi u ch ươ ng trình con tr c thu c, bên trong m i ch ươ ng trình con l i cĩ th cĩ các ch ươ ng trình con riêng. Nĩi cách khác trong Pascal t n t i mt l p ch ươ ng trình con ngang c p nhau, m i ch ươ ng trình con này l i cĩ th đĩng vai trị ch ươ ng trình m c a m t l p ch ươ ng trình con khác. Khi thi t k , m i ch ươ ng trình con ph i là m t kh i riêng bi t khơng th l ng nhau ho c cĩ các l nh nh y Goto t ch ươ ng trình con này t i ch ươ ng trình con khác. 7.1 G i ch ươ ng trình con t trong ch ươ ng trình m Li g i ch ươ ng trình con cĩ th đt b t k ỳ ch nào trong ch ươ ng trình m . N u ch ươ ng trình con là m t th t c thì l i g i ch ươ ng trình con (t c là tên ch ươ ng trình con) cĩ th t o nên m t câu l nh, ví d : Readln; Gotoxy(5,8); Nu ch ươ ng trình con là hàm thì tên hàm khơng th t o nên m t câu l nh, nĩi khác đi tên hàm ph i n m trong m t bi u th c hay trong m t th t c nào đĩ, ví d v i hàm khai c ăn bc hai SQRT() chúng ta khơng th vi t sqrt(9); ðiu này là d hi u vì hàm cho ta giá tr vơ h ưng, giá tr này khơng ph i là m t l nh do đĩ Pascal khơng bi t ph i làm gì v i giá tr đĩ. Cách g i hàm nh ư sau là h p l : a:= sqrt(9) + 5; Witeln('Can bac hai cua 9 bang ',sqrt(9)); 7.2 G i ch ươ ng trình con t ch ươ ng trình con khác Các ch ươ ng trình con cùng c p cĩ th g i t i nhau và truy n tham s cho nhau. Nguyên t c g i là: nh ng ch ươ ng trình con xây d ng sau cĩ th g i t i các ch ươ ng trình con đã xây d ng tr ưc nĩ, đng th i các ch ươ ng trình con c p d ưi c ũng cĩ th g i t i các ch ươ ng trình con c p trên n u chúng cùng m t g c. ðiu này cĩ ngh ĩa là các ch ươ ng trình con xây d ng tr ưc khơng th g i t i các ch ươ ng trình con xây d ng sau n u khơng cĩ ch báo FORWARD (xem m c 8). Xét m t s ví d sau: Ví d 1.6 Program Goi_ctc; Uses crt; Type dayso=array[1 60] of byte; s1=string[30]; Var Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 13
  14. a:s1; b:dayso; i,j,n:byte; Procedure nhapso(m:byte; var c:dayso); Begin For i:=1 to m do Begin Write('c[',i,'] = '); readln(c[i]); End; End; Function tinhtong(m:byte; d:dayso):real; var tong:real; Begin tong:=0; for i:= 1 to m do Tong:=tong+d[i]; tinhtong:=tong; End; Procedure viet(k:byte; e:dayso); Begin Write('Tong cac phan tu mang = ',tinhtong(k,e):8:0); readln; End; BEGIN clrscr; write('Nhap so phan tu n '); readln(n); nhapso(n,b); viet(n,b); END. Ví d 1.6 thi t k ba ch ươ ng trình con là Nhapso, Tinhtong và Viet. Th t c Nhapso dùng đ nh p các ph n t vào m ng m t chi u. Hàm Tinhtong dùng đ tính t ng các ph n t mng và th t c Viet dùng đ hi n k t qu tính t ng lên màn hình. Ch ươ ng trình m g i ch ươ ng trình con Viet và truy n các tham s là s ph n t m ng n và giá tr c a các ph n t c a m ng ( m ng b ). Ch ươ ng trình con Viet l i g i hàm Tinhtong và truy n các tham s cho hàm này. ðây là tr ưng h p m t ch ươ ng trình con g i m t ch ươ ng trình con cùng c p. Vi c các ch ươ ng trình con g i t i nhau ph i tuân theo quy đnh sau đây: Mt ch ươ ng trình con ch cĩ th g i t i m t ch ươ ng trình con cùng c p đã thi t k tr ưc ch ươ ng trình con hi n th i. Trong ví d 1.6 n u chúng ta đư a hàm Tinhtong xu ng d ưi th t c Viet thì khi ch y ch ươ ng trình s b báo l i: Unknown Indentifier. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 14
  15. Ví d 1.7 d ưi đây trình bày cách th c mà m t ch ươ ng trình con c p d ưi g i t i m t ch ươ ng trình con c p trên cùng g c. Ví d 1.7 Program goi_ctc; Uses crt; Type dayso=array[1 60] of byte; Var b:dayso; i,n:byte; {Hai ch ươ ng trình con Nhapso và Tinhtong cùng c p v i th t c Xuly} Procedure nhapso(m:byte; var c:dayso); Begin For i:=1 to m do Begin Write('c[',i,'] = '); readln(c[i]); End; End; Function tinhtong(m:byte; d:dayso):real; Var tong:real; Begin tong:=0; for i:= 1 to m do Tong:=tong+d[i]; tinhtong:=tong; End; Procedure xuly(j:byte; ds:dayso); Procedure viet(k:byte; e:dayso); Var i:byte; Begin Writeln('Tong cac phan tu mang = ',tinhtong(k,e):8:0); Writeln('Day so sap xep giam dan '); for i:=1 to k do write(e[i],' '); readln; End; { K t thúc th t c Viet} Procedure sapxep(m:byte; d:dayso); Var p,q:byte; Tg:byte; Begin For p:= 1 to m-1 do Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 15
  16. For q:=p+1 to m do If d[p]<d[q] then Begin tg:=d[p]; d[p]:=d[q]; d[q]:=tg; End; viet(m,d); End; { K t thúc th t c sapxep} Begin {than thu tuc Xuly} Writeln('Thu tuc xu ly dung de sap xep va viet ket qua'); sapxep(j,ds); end; { K t thúc th t c Xuly} BEGIN {Than chuong trinh me} clrscr; write('Nhap so phan tu n '); readln(n); nhapso(n,b); xuly(n,b); END. Ví d 1.7 cĩ ba ch ươ ng trình con cùng c p là Nhapso, Tinhtong và Xuly. Trong th tc Xuly cĩ hai chươ ng trình con là Viet và Sapxep trong đĩ ch ươ ng trình con Viet đưc thi k tr ưc, Sapxep đưc thi t k sau. Ch ươ ng trình con Sapxep cĩ l i g i đn ch ươ ng trình con Viet cùng c p v i nĩ, m c đích c a l i g i này là truy n cho ch ươ ng trình con Viet nh ng d li u m ng đã s p x p gi m d n. Ch ươ ng trình con Viet cĩ l i g i đn hàm Tinhtong là m t ch ươ ng trình con c p cao h ơn nĩ, vì Tinhtong đã đưc thi t k tr ưc Xuly nên l i g i là h p lý. N u đo v trí c a hai ch ươ ng trình con Viet và Sapxep, ngh ĩa là đưa ch ươ ng trình con Viet xu ng sau Sapxep thì s b báo l i , v điu này chúng ta s nghiên c u m c 8. 8. Khai báo tr ưc b ng Forward Nh ư đã nêu trong m c 7 vi c các ch ươ ng trình con g i t i nhau b h n ch b i th t xây d ng các ch ươ ng trình con đĩ. Vì nh ng lý do khác nhau ng ưi ta khơng th thay đi th t xây d ng các ch ươ ng trình con nh ưng l i mu n các ch ươ ng trình con ph i g i đưc t i nhau khơng ph thu c vào th t xây d ng chúng. ð làm vi c này Pascal cho phép s d ng t khố Forward. Ngh ĩa đen c a t Forward là "phía tr ưc" th ưng đưc dùng đ báo hi u mt cái gì đĩ ta s g p sau này ví d : phía tr ưc 200 mét là cơng tr ưng. Cú pháp: Tên ch ươ ng trình con (danh sách tham s ); Forward; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 16
  17. Dịng khai báo trên đây ph i đưc đt trong ch ươ ng trình tr ưc khi xây d ng t t c các ch ươ ng trình con. Khi tên m t ch ươ ng trình con đã đưc khai báo v i cú pháp nêu trên thì vi c nĩ n m tr ưc hay sau m t ch ươ ng trình con s g i t i nĩ là khơng quan tr ng. S l ưng ch ươ ng trình con khái báo tr ưc v i t khố Forward là khơng h n ch . Cn l ưu ý r ng n u cĩ nhi u ch ươ ng trình con c n khai báo tr ưc thì m i tên ch ươ ng trình con ph i đi v i m t t khố Forward, khơng th ghép nhi u tên ch ươ ng trình con v i cùng m t t Forward. Ví d 1.8 Program Tu_khoa_Forward; uses crt; Type dayso=array[1 60] of byte; var a:string; b:dayso; i,j,n:byte; Function c2(m:byte; d:dayso):real; forward; Procedure c4(p:byte; var q:dayso); forward; Procedure c1(m:byte; var c:dayso); Begin For i:=1 to m do Begin Write('c[',i,'] = '); readln(c[i]); End; End; Procedure c3(k:byte; e:dayso); Var i:byte; Begin c4(k,e); writeln('Mang sau khi sap xep'); for i:= 1 to k do write(e[i],' '); writeln; Write('Tong cac phan tu mang = ',c2(k,e):8:0); readln; End; Function c2(m:byte; d:dayso):real; var tong:real; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 17
  18. Begin tong:=0; for i:= 1 to m do Tong:=tong+d[i]; c2:=tong; End; Procedure c4(p:byte; var q:dayso); Var i,j:byte; tg:integer; Begin for i:= 1 to (p-1) do for j:= i+1 to p do if q[i]>q[j] then Begin tg:=q[i]; q[i]:=q[j]; q[j]:=tg; End; End; BEGIN clrscr; write('Nhap so phan tu n '); readln(n); c1(n,b); c3(n,b); END. Ví d 1.8 cĩ 4 ch ươ ng trình con trong đĩ c1 và c3 thi t k tr ưc cịn c2 và c4 thi t k sau. Trong c3 cĩ l i g i đn c2 và c4 do v y ph i khai báo tr ưc c2 và c4 . N u khơng mu n khai báo tr ưc thì c n đư a c2 và c4 lên trên c3. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 18
  19. Bài t p ng d ng ch ươ ng 1 1. L p ch ươ ng trình tính di n tích tồn ph n và th tích các hình : Tr trịn, nĩn. Yêu c u: Thi t k menu theo m u sau, Menu cĩ th dùng con tr d ch chuy n đ ch n các ch c n ăng: Hinh Tru Hinh Non Ket thuc Vi c tính tốn di n tích, th tích m i hình ng v i m t ch ươ ng trình con Tt c các hình đu chung m t ch ươ ng trình con hi n k t qu . Ch c n ăng Ket thuc dùng đ quay v c a s Pascal. 2. L p m t ch ươ ng trình t o th c đơ n v i các ch c n ăng: Tính giai th a Tính t h p Tr v Dùng các ch ươ ng trình con đã l p đ gi i bài tốn sau: Cho n đim trên màn hình, qua hai đim b t k ỳ bao gi c ũng n i đưc b i m t đon th ng. Tính xem cĩ bao nhiêu đon th ng đưc t o ra. Tìm đon ng n nh t và dài nh t , chúng n i các đim nào? 3. Thi t k th c đơ n v i các ch c n ăng: 1.giai he pt bac nhat 2. giai pt bac hai 3.Ket thuc Yêu c u: B m s đ ch n ch c n ăng trên th c đơ n. Ch c n ăng Ket thuc dùng đ quay v c a s Pascal. Ch ươ ng trình cĩ 2 ch ươ ng trình con đ gi i h phươ ng trình b c nh t 2 n và gi i ph ươ ng trình b c 2 4. A,B là m ng hai chi u c a các s th c, s dịng và c t c a t ng m ng nh p t bàn phím, l p ch ươ ng trình bao g m các ch ươ ng trình con: nh p d li u vào m ng, ki m tra xem cĩ th nhân hai m ng hay khơng, n u cĩ thì ch y ch ươ ng trình con nhân hai m ng, n u khơng thì thơng báo khơng th nhân hai m ng. Hi n k t qu nhân d ưi d ng ma tr n. 5. Cho hai chu i s1, s2, vi t ch ươ ng trình bao g m các ch ươ ng trình con: NHAP dùng đ nh p vào s1, s2 các ký t c a bng mã g m c ch cái và ch s , TACH dùng đ tách riêng các ch s và ch cái, nh ng ch s tách ra l ưu vào m ng mt chi u theo th t c a s1 tr ưc, s2 sau. CONG dùng đ c ng các ch s tách ra t hai chu i Thơng báo k t qu theo m u: Chu i s1 sau khi tách: Chu i s2 sau khi tách: Tng các ch s : 6. L p ch ươ ng trình v i 4 ch ươ ng trình con dùng đ chuy n đi các s gi a 4 h đm: H 10 sang h 2, 8, 16 H 2 sang h 8, 10, 16 H 8 sang h 2, 10, 16 H 16 sang h 2, 8, 10 Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 19
  20. 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, kiu 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 tố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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 20
  21. 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. Bng đư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à mt 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 mt 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 mt b ng, m i b ng đưc ghi vào b nh d ưi d ng m t t p. Bn 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 bng đim c a l p h c bao g m các tr ưng Hoten, Ngaysinh, Gioitinh, Lop, Diachi, Toan, Ly, Hoa, , d li u đin 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 bn 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. Bn 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 điu 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. ðim 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 Bn 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 hồn tồ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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 21
  22. 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ý đim. TYPE BANGDIEM = RECORD Hoten: String[25]; Gioitinh: Char; Lop: String[5]; Diachi: String[30]; Toan,Ly,Hoa: Real; END; Vi 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). Tng đ 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 mi đ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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 22
  23. 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 lng 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; Ngồ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 bn 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 23
  24. 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 ca m ng ho c chu i. đây m c dù DS là m t bin 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); Lnh 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); Lnh 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 điu 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) Vi 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, điu 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 đim 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 24
  25. 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 đim 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 25
  26. 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 ln 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. Vn đ đáng quan tâm đây là cách s d ng l nh With Do, ví d 2.4 s d ng bi n mng 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<=i<=40), v i m i ph n t chúng ta ti p t c truy nhp vào các tr ưng c a chúng. Vi l nh With DS_LOP[i] Do chúng ta cĩ th nh p tr c ti p d li u vào các tr ưng Hoten, Gioitinh, Write(' Ho va ten hoc sinh: '); Readln(Hoten); Write(' Trai hay gai T/G: '); Readln(Gioitinh); ð vi t d li u ra màn hình chúng ta c ũng dùng l nh With 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); ði v i các b n ghi l ng nhau nh ư ví d 2.3 thì l nh With Do c ũng ph i l ng nhau, xét ví d sau: Ví d 2.5 Program Kieu_Record; Uses crt; Type Tencb=record Mahoso:word; Hoten:string[25]; Ngaysinh: Record ngay:1 31; thang:1 12; nam:integer; End; End; Var DS: array[1 50] of tencb; i,j:byte; tl:char; Begin Clrscr; i:=1; Repeat Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 26
  27. 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 27
  28. a. Xây d ng ki u d li u Bn 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à " hc 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ĩ nhiu đồ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 hố n u cĩ v n chuy n hàng hố và khơng cĩ su t ăn trên tàu. * Thu c tính chung: tên đồ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 hố (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 mt 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 đồ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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 28
  29. So_xuat_an: 2 So_ga_do: 1 Ve_hang_hoa: 6 Bn ghi v i tàu t c hành s là 4+16+6+2+1 = 29 Byte Bn 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 tố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 bi 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 tốn t Case Of. Cn chú ý r ng tố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 khố "End; " Trong vùng nh c p phát cho ch ươ ng trình s cĩ hai đon dành cho hai lo i tr ưng, đon th nh t dành cho các tr ưng c đnh, trong ví d 2.6 đon này cĩ dung l ưng là 26 byte. ðon th hai dành cho các tr ưng thay đi, đon này s cĩ dung l ưng b ng dung l ưng ca 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, đon 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 đồ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 tồn tuy n và cho hi n d li u ra màn hình (xem ví d 2.7). Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 29
  30. 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 30
  31. 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ý đim c a sinh viên SV là ki u d li u b n ghi dùng đ qu n lý đim 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ơ đin - 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: Tốn, Lý, Tin c ơ b n, l p trình nâng cao, khoa Kinh t cĩ các mơn: K tốn máy, Marketing, khoa C ơ đin cĩ các mơn: Cơ h c máy, S c bn 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 li, 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 tồ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 mi 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 hc. 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 vi 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 31
  32. 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 Mt 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 ơ đin 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 bn 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 32
  33. 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 Mi 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 tố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; Li 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. Vi ki u d li u SV đã đnh ngh ĩa chúng ta xây d ng ch ươ ng trình qu n lý đim 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 33
  34. 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 34
  35. 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<ds[j+1].khoa then Begin tg:=ds[j]; ds[j]:=ds[k]; ds[k]:=tg; End; End; {ket thuc with} writeln; Write('Nhap tiep hay thoi? C/K '); readln(tl); if upcase(tl)='C' then i:=i+1; Until upcase(tl)='K'; {Hien du lieu da nhap } Write('Co xem du lieu khong? C/K '); readln(tl); Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 35
  36. 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 hồn ch nh song cĩ m t s nh ưc đim 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 Bn đ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 hồn tồ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 đim 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 36
  37. 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 Tp 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 ngồ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 . Tp 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 Tp 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 tp. b. T p v ăn b n (Text) Tp 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 đon chuy n đi, điu 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 điu 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 Tp 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 37
  38. 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 ngồi. Cách khai báo này đã đưc chu n hố 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 đã hc 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 đin c d li u nh p vào và k t qu x lý đu b m t. d. Khai báo Tp cĩ ki u đưc đnh ngh ĩa sau t khố TYPE cịn bi n ki u t p đưc khai báo sau t khố 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 khố 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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 38
  39. 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ĩ kiu 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à: Tp truy nh p tu n t và t p truy nh p tr c ti p. * Tp 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 tp. 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. Tp v ăn b n là t p thu c ki u này . * Tp 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 ngồi c đin 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 điu 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 ngồ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 khố 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. Nu trên thi t b nh ngồi ta đã cĩ s n m t t p trùng tên v i tên ghi th t c ASSIGN thì tp ngồi s b xố đ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 hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 39
  40. Sau th t c này d li u s đưc l ưu trên đĩa và t p s b đĩng. 2.2 T p v ăn b n a. Khai báo t p v ăn b n Tp v ăn b n đưc khai báo tr c ti p trong ph n khai báo bi n: Var Bien_tep : Text; Ví d Var Hoso: Text; T1,T2,T3:Text; b. Truy nh p vào t p Truy nh p vào t p đưc hi u là nh p d li u vào t p, ghi l i d li u trên thi t b nh ngồi, đc d li u đã cĩ ra màn hình ho c máy in và x lý d li u đĩ. ði v i t p v ăn b n vi c ghi d li u vào t p cĩ th th c hi n qua hai c p th t c sau: - M t p m i đ ghi Assign(bien_tep, ðưng d n\ten_tep); Rewrite(bien_tep); Cp th t c trên dùng đ m m t t p m i chu n b nh n d li u, n u trong b nh ngồi đã cĩ t p trùng tên thì t p ngồi s b xố. N u b qua đưng d n thì t p s đưc l ưu vào th ư m c hi n hành t c là th ư m c mà t đĩ Pascal đã đưc kh i đng (C:\TP\BIN). Gi s chúng ta mu n l ưu t p v i tên là BT1.DAT vào th ư m c BAITAP trên đĩa A thì ph i vi t lnh: Assign(bien_tep, 'A:\BAITAP\BT1.DAT'); - M t p đã cĩ đ ghi thêm Assign(bien_tep, ten_tep); Append(Bien_tep); Cp th t c trên m m t t p đã l ưu trong thi t b nh ngồi đ nh p thêm d li u, n u tp khơng cĩ thì máy s thơng báo l i. D li u nh p thêm s đưc ghi vào cu i t p. - M t p đ đc d li u Dưi đây là c p th t c dùng đ m t p đã t n t i, chu n b cho vi c đc d li u t t p ra thi t b ngồi: Assign(bien_tep, ten_tep); Reset(bien_tep); c. Ghi d li u vào t p Sau khi đã m t p chúng ta cĩ th dùng th t c Write ho c Writeln đ ghi d li u vào tp. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 40
  41. Cú pháp: Write(Bien_tep, giá tr 1, giá tr 2, ); Ho c Writeln(Bien_tep, giá tr 1, giá tr 2, ); S khác nhau gi a Write và Writeln là ch th t c Write s ghi d li u liên t c trên các ơ nh , khơng cĩ các ký hi u v đu dịng và xu ng dịng. Th t c Writeln s đư a thêm vào cu i dịng các ký t điu khi n CR (v đu dịng) và LF (nh y xu ng dịng d ưi). Giá tr 1, giá tr 2 trong l nh ghi cĩ th là chu i ký t vi t t ưng minh, tên bi n ho c bi u th c, các giá tr ph i đưc phân cách ít nh t b ng m t kho ng tr ng. Th t c Writeln(Bien_tep); s t o nên m t dịng r ng khơng ch a ký t nào c . D li u tr ưc khi ghi vào t p v ăn b n cĩ th thu c các ki u đơ n gi n sau đây: S nguyên, s th c, ký t , chu i, logic. Dù thu c ki u gì thì khi đã ghi vào t p đu đưc chuy n đi thành ki u ký t . ðiu này c ũng đng ngh ĩa v i quy đnh r ng các ki u d li u cĩ c u trúc nh ư: Array , Set, Record, File khơng th l ưu tr trên t p v ăn b n. Khi cĩ th t c Close(bien_tep) Pascal s đư a thêm vào dịng cu i cùng ký hi u k t thúc t p EOF (End of File). Ví d 2.12 Var T1:text; Begin Assign(T1,'DULIEU.DAT'); Rewrite(T1); Writeln(t1,'Tep van ban'); Write(T1,123); Write(T1,' ',123.45); Writeln(T1); Close(T1); End. Ví d 1.13 t o ra t p v ăn b n DULIEU.DAT t p này s đưc l ưu tr t i th ư m c hi n hành t c là C:\TP\BIN. Lnh Writeln(t1,'Tep van ban'); s ghi vào bi n t p T1 (c ũng cĩ ngh ĩ là ghi vào t p DULIEU.DAT) dịng ch "Tep van ban" ti p đĩ là các ký t điu khi n CR, LF. Lnh Write(T1,123); s t đng chuy n đi s 123 thành ký t và ghi vào t p khơng kèm theo CR, LF. Lnh Write(T1,' ',123.45); ghi vào t p m t kho ng tr ng tr ưc dãy 123.45 ti p đĩ chuy n đi và ghi s 123.45 vào t p theo quy cách ng m đnh c a Pascal. D li u s đưc ghi vào t p nh ư sau Tep van ban 123 1.234500000E+02 (dịng tr ng) Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 41
  42. T ví d trên cĩ th nêu m t s nh n xét sau: * Các ký t nh p vào t p ph i n m trong c p d u nháy đơ n * Các s khơng c n đ trong d u nháy, Pascal s t đng chuy n đi chúng khi ghi vào t p. N u chúng ta khơng ch rõ quy cách đc ho c ghi s thì các s s đưc ghi theo quy cách chu n, c th là: - S nguyên s đưc ghi chính xác nh ư giá tr c a nĩ trong l nh Write( ) - S th c s đưc chuy n thành d ng khoa h c ngh ĩa là d ng s v i lu th a c ơ s 10, ví d 123.45 chuy n thành 1.234500000E+02. Trong cách vi t khoa h c Pascal ng m đnh nh ư sau: - Ph n nguyên là 1 ký t - Ph n l là 10 ký t k c d u ch m th p phân - Ph n cịn l i là 4 ký t cho lu th a c ơ s 10, Ví D : E+02 = 10 2 , E-03 = 10 -3 * Các s cĩ th ch rõ quy cách ghi nh ư sau Write(T1,123:5); Ghi vào t p s nguyên 123 v i đ dài 5 ký t , Pascal s đ tr ng hai v trí bên trái Write(T1,' ',123.45:6:2); S 123.45 đưc ghi vào t p v i đ dài 6 ký t và 2 ký t ch a s l d. ðc d li u t t p v ăn b n D li u l ưu tr trong t p v ăn b n cĩ th cho hi n lên màn hình b ng l nh TYPE c a DOS, b ng các phím ch c n ăng F3, F4 c a NC ho c đư a vào Word đ xem và s a ch a n u cn. Vi Pascal t p v ăn b n thu c lo i t p truy nh p tu n t , do v y n u c tình dùng l nh truy nh p ng u nhiên Seek( ) thì máy s báo l i: Error 63: Invalid File Type Sau khi ti n hành m t p con tr t p s đưc đt t i dịng đu, Cách th c mà Pascal dùng đ đc d li u là nh ư sau: dùng th t c Read, ho c Readln đ đc d li u t dịng hi n th i và gán vào bi n t ươ ng ng, vi t bi n đĩ ra màn hình ho c máy in. Read(Bien_tep, Dong); ho c Readln(Bien_tep, Dong); Write(Dong); ho c Writeln(Dong); Trong hai ví d trên Bi n trung gian là Dong, bi n này ph i đưc khai báo tr ưc và ph i thu c ki u String. ð cĩ th vi t tồn b d li u t m t t p v ăn b n ra các thi t b ngồi thì các l nh đc vi t trên ph i đưc l p đi l p l i t dịng 1 đn dịng cu i cùng ngh ĩa là ch ươ ng trình ph i s dng m t trong hai vịng l p: While not eof(Bien_tep) Do Begin Readln(Bien_tep, Dong); Writeln(Dong); Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 42
  43. End; Ho c For i := 1 to Filesize(Bien_tep) Do Begin Readln(Bien_tep, Dong); Writeln(dong); End; Nu trên m t dịng chúng ta đã ghi nhi u giá tr ng v i các bi n khác nhau thì khơng th đc riêng t ng bi n. Cách mà chúng ta ra l nh cho Pascal ghi d li u vào t p s nh h ưng rt nhi u đn vi c chúng ta g i d li u ra và x lý d li u đĩ. Ví d sau đây s gi i thích c th điu này. Ví d 2.14 Var F:text; Hoten:string[25]; heso:real; socon:byte; t:string; Begin Hoten:=' Tran Van Tam'; Heso:=4.25; Socon:= 2; {gán d li u cho các tr ưng} Assign(f,'hoso.txt'); Rewrite(f); Witeln(f,hoten,' ',heso:4:2,' ',socon); Close(f); Reset(f); Readln(f,t); { đc d li u t dịng hi n th i và gán vào bi n t } Writeln(t); Readln; End. Ch ươ ng trình trên đây cĩ nhi u điu c n ph i l ưu ý: - L nh ghi vào t p: Witeln(f,hoten,' ',heso:4:2,' ',socon); s ghi t t c d li u trên m t dịng. T r a n V a n T a m 4 . 2 5 2 CR LF EOF Nhìn vào hình v d dàng nh n th y r ng chu i Hoten chi m 13 Byte, Heso chi m 4 Byte và Socon chi m 1 Byte. Trong th c t các s ki u Real cĩ đ dài là 6 Bytes nh ưng vì chúng ta đã yêu c u Pascal ghi Heso dài 4 ký t trong đĩ cĩ hai s l nên khi ghi vào t p, Heso ch chi m 4 Bytes. Gi a các bi n cĩ hai kho ng tr ng do đĩ t ng chi u dài c a dịng là 20 Bytes. Lnh đc d li u t t p Readln(f,t) s đc c dịng hi n th i vào bi n t và l nh vi t Writeln(t) s đư a ra màn hình c dịng ngh ĩa là ta l i nh n đưc tồn b dịng nh ư trên. C n Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 43
  44. phân bi t r ng d li u vi t ra là các ký t c a b ng mã ch khơng ph i các ch và s nh ư ta đã nh p vào. Tr ưng h p bi n t khơng đ đ dài đ ch a h t c dịng thì s ký t th a s b c t b . - N u chúng ta vi t l nh đc: Readln(f,Hoten,' ',Heso,' ',socon); thì máy s báo l i: Error 106 : Invalid Numeric Format ngh ĩa là khơng th đc tr c ti p cùng m t lúc t t p ra màn hình c bi n ki u ký t và bi n ki u s . - N u chúng ta vi t l i l nh ghi d li u: Witeln(f,hoten); Writeln(f,heso:5:2,' ',socon); ngh ĩa là ghi riêng d li u ki u "ch " trên m t dịng cịn d li u ki u "s " trên dịng khác, gi a các s cĩ m t kho ng cách, sau đĩ dùng l nh đc: Readln(f,hoten); Readln(f,heso, Socon); thì li nh n đưc thơng báo l i dịng Readln(f,heso, Socon); Error 106 : Invalid Numeric Format ngh ĩa là các s ghi vào t p trên cùng m t dịng thì c ũng khơng th đc chúng nh ư là các bi n. - Chúng ta s a l i l nh ghi m t l n n a Witeln(f,hoten); Writeln(f,heso:5:2); Writeln(f,socon); Ri dùng l nh đc Readln(f,Hoten); Readln(f,Heso); Readln(f,socon); sau đĩ là l nh vi t Writeln(Hoten, ' ', Heso:5:2,' ',socon,' ' ,Heso*290000); thì ch ươ ng trình s khơng báo l i . ðn đây cĩ th rút ra k t lu n là: - Mu n l y l i ki u c a d li u nh p vào t p v ăn b n thì m i bi n ph i nh p trên m t dịng. - V i các bi n ki u s đã ghi riêng r trên m t dịng khi g i ra Pascal s t đng chuy n đi t d ng ký t thành d ng s và ta cĩ th đư a các s này vào các bi u th c tính tốn bình th ưng. Trong ví d trên chúng ta tính L ươ ng b ng cách l y Heso*290000. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 44
  45. - Trong b nh c a máy d li u đưc ghi liên t c trong các ơ nh , đ phân bi t các dịng Pascal dùng c p ký t điu khi n CR và LF. Nĩi cách khác d li u đưc l ưu tr liên t c ch khơng ph i d ưi d ng b ng, khi l y d li u ra chúng ta c ũng l y liên t c nh ưng l i cĩ th b trí trên màn hình sao cho tr c quan và d theo dõi. Ví d 2.15: xây d ng m t ch ươ ng trình đơ n gi n đ qu n lý cơng ch c. D li u nh p vào bao g m H tên, H s l ươ ng và S con. D li u xu t ra màn hình bao g m H tên, H s lươ ng, S con và L ươ ng tháng, L ươ ng tháng đây tính theo quy đnh c a nhà n ưc = heso*290000. Ch ươ ng trình đt ra hai kh n ăng l a ch n: a. N u t p d li u đã t n t i thì nh p thêm ng ưi b. N u t p ch ưa cĩ thì m t p m i Trong c hai tr ưng h p đu yêu c u cho bi t s ng ưi c n nh p. D li u in ra d ưi d ng b ng. Ví d 2.15 Program Quan_ly_can_bo; Uses crt; Var f:text; hoten:string[20]; c1,heso:real; c2,i,n,socon:byte; ten:string[12]; Begin clrscr; Write('Cho biet ten tep '); readln(ten); {$I-} assign(f,ten); reset(f); {$I+} if Ioresult=0 then Append(f) else rewrite(f); write('Nhap bao nhieu nguoi '); readln(n); for i:= 1 to n do Begin Write(' Ho ten ' ); Readln(hoten); Write( ' He so '); readln(heso); Write(' So con ' ); Readln(socon); Writeln(f,hoten); Writeln(f,heso:4:2); writeln(f,socon); End; close(f); Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 45
  46. assign(f,ten); reset(f); writeln(': : : : :'); writeln('| Ho va ten | Hs | socon| Luong |'); writeln(': : : : :'); while not eof(f) do begin readln(f,hoten); readln(f,heso); readln(f,socon); writeln('|',hoten:19,'|',heso:4:2,'| ',socon:4,' | ',heso*290000:10:2,' |'); end; readln; End. Ví d 2.15 cĩ s d ng đnh h ưng ch ươ ng trình d ch {$I+}, {$I-}. Khi đnh h ưng là {$I+} thì ch ươ ng trình s ki m tra l i vào ra IO (Input, Output) n u phát hi n th y l i thì dng ch ươ ng trình, đây là ch đ ng m đnh c a Pascal. N u đnh h ưng là {$I-} thì vi c ki m tra l i vào ra t m th i khơng th c hi n, ngh ĩa là n u phát hi n th y l i thì t m treo các th t c vào ra và tìm xem hàm IORESULT cho k t qu là gì. N u hàm này cho k t qu b ng 0 thì cĩ ngh ĩa là vi c ki m tra IO khơng cĩ gì sai sĩt và ch ươ ng trình ti p t c làm vi c. N u hàm Ioresult cho k t qu khác 0 thì cĩ ngh ĩa là vi c ki m tra IO phát hi n th y l i và ch ươ ng trình c n ph i đưc s a ch a. Ví d 2.16: T o t p v ăn b n Baitho.txt đ l ưu tr m t bài th ơ cĩ n dịng, dịng cu i cùng ghi " Nam 2003". Khi nh p bài th ơ c n h i tr ưc bài th ơ cĩ bao nhiêu dịng. Ví d 2.16 Program tep_van_ban; Uses crt; var i,n:integer; f:text; t:string; Begin clrscr; assign(f,'baitho.txt');rewrite(f); writeln('Bai tho gom bao nhieu cau? '); readln(n); writeln('Hay nhap bai tho cua ban'); for i:= 1 to n do begin write('Cau ',i,' '); readln(t); writeln(f,t); Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 46
  47. end; writeln(f,'Nam ', 2003); close(f); clrscr; gotoxy(15,5); i:=6; clrscr; writeln('Du lieu viet tu tep baitho.txt '); reset(f); while not eof(f) do begin readln(f,t); gotoxy(15,i); writeln(t); i:=i+1; end; readln; End. Ví d 2.16 cĩ th c i ti n theo nhi u cách đ cĩ đưc m t ch ươ ng trình đp dùng cho vi c l ưu tr v ăn b n, ch ng h n chúng ta s đư a vào các ch ươ ng trình con GHIMOI, GHITHEM và DOC ph c v vi c ghi d li u vào t p m i, ghi thêm d li u vào t p đã cĩ ho c đc t t p ra. Tr ưc khi ghi ho c đc c n ki m tra xem t p đã t n t i ch ưa, khi nh p v ăn bn vào t p khơng h n ch s dịng, mu n k t thúc vi c nh p thì khi b t đu m t dịng m i ch cn b m d u "*" v.v (xem ví d 2.17) Ví d 2.17: Program tep_van_ban; Uses crt; var i,j,n:integer; f:text; t:string; tl,tl1,tl2:char; ten:string[12]; Procedure Ghimoi(ten:string); Begin clrscr; assign(f,ten); rewrite(f); writeln('Hay nhap bai tho cua ban'); i:=1; repeat write('Cau ',i,' '); readln(t); if t<>'*' then writeln(f,t); Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 47
  48. i:=i+1; Until t='*'; close(f); End; Procedure Ghithem (ten:string); Begin clrscr; assign(f,ten); append(f); writeln('Hay bo xung bai tho cua ban'); i:=1; repeat write('Cau ',i,' '); readln(t); if t<>'*' then writeln(f,t); i:=i+1; Until t='*'; close(f); end; Procedure Doc(tep:string); Begin clrscr; gotoxy(15,5); i:=6; writeln('Du lieu viet tu tep ',tep); assign(f,tep); reset(f); while not eof(f) do begin readln(f,t); gotoxy(15,i); writeln(t); i:=i+1; end; readln; end; BEGIN { Thân ch ươ ng trình m } Clrscr; Write('cho biet ten tep '); Readln(ten); Write('Ban Ghi hay Doc du lieu G/D '); Readln(tl1); If upcase(tl1)='G' then Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 48
  49. Begin write('Ghi tep moi hay ghi them vao tep cu M/C '); Readln(tl2); If upcase(tl2)='M' then Ghimoi(ten) else Ghithem(ten); End Else Doc(ten); END. Trong ví d 2.17 cĩ s d ng m t bi n tồn c c là TEN, ki u bi n là string[12]. Khi l y Ten làm tham s th c đ truy n cho các ch ươ ng trình con thì c n chú ý đnh ngh ĩa ki u d li u tr ưc. C th n u chúng ta vi t dịng l nh: Procedure Doc(tep:string); Dưi d ng m i là Procedure Doc(tep:string[12]); thì máy s báo l i. 2.3 T p cĩ ki u Tp cĩ ki u là t p mà m i ph n t đu cĩ cùng đ dài và cùng ki u. Ki u các ph n t ca t p cĩ th là s nguyên, th c, ký t , chu i, m ng ho c b n ghi. Cách th c khai báo bi n ki u t p đã trình bày trong m c II. S khác nhau c ơ b n gi a t p cĩ ki u và t p v ăn b n là t p cĩ ki u cĩ th v a ghi vào v a đc ra, cịn v i t p v ăn b n chúng ta bu c ph i k t thúc ghi bng l nh Close(bien_tep) thì m i cĩ th đc t p, cịn khi đang đc t p chúng ta c ũng ph i k t thúc đc và đĩng t p thì m i cĩ th ghi thêm d li u vào t p. a. ðc và ghi - Ghi lên t p Write(bientep, bien1, bien2, ) bien1, bien2, là các bi n cùng ki u v i bi n t p. - ðc t p Read(Bientep, bien1, bien2, ) ðc t p th c ch t là đc các ph n t c a t p và gán cho các bien1, bien2, cùng ki u. Vi c đc di n ra trong b nh do đĩ ng ưi s d ng mu n bi t đưc các giá tr c th thì ph i vi t các bi n đã đc lên màn hình. Chú ý: Khác v i t p v ăn b n, vi c ghi và đc t p cĩ ki u khơng s d ng các l nh Writeln ho c Readln ngh ĩa là t p cĩ ki u khơng ghi d li u thành các dịng. Các ph n t c a t p cĩ ki u đưc ghi liên t c trong các ơ nh và ch cĩ ký hi u k t thúc t p EOF. Khi chúng ta đc ho c ghi xong m t ph n t thì con tr t p s t đng chuy n đn v trí k ti p. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 49
  50. b. Truy nh p vào t p Seek(bientep,i); i=0,1,2, Th t c Seek s đnh v con tr t i ph n t th i c a t p, Pascal quy đnh v trí các ph n t là 0, 1, 2 nh ư v y ph n t th nh t là ph n t cĩ v trí 0. Lnh Seek(bientep, 5); s đnh v con tr t p t i ph n t th 6. Các t p sau khi m theo ng m đnh con tr t p luơn đnh v t i ph n t đu tiên ngh ĩa là phn t cĩ s th t là 0. Trong quá trình đc n u chúng ta dùng m t c u trúc l p đ đc thì khi đc xong m t ph n t con tr t p s t đng chuy n đn ph n t k ti p. while not eof(BT) do {Ki m tra xem con tr t p đã n m ph n t cu i ch ưa} begin Read(bt,i); write(i:5); end; c. Các hàm x lý t p *. Filesize(bientep) cho bi t s ph n t cĩ trong t p *. FilePos(bientep) cho bi t v trí hi n th i c a con tr t p *. Eof(Bientep) cho giá tr True n u con tr t p v trí cu i t p (v trí cu i t p đơc hi u là v trí sau ph n t cu i cùng), n u con tr t p đnh v t i b t k ỳ ph n t nào c a t p thì hàm eof() c ũng cho giá tr False. Gi s t p DS cĩ 8 ph n t khi đĩ hàm Filesize(DS) s cho k t qu là s 8, cịn th t c Seek(DS,Filesize(DS)) s đnh v con tr t i ph n t th 8 (s th t c a ph n t này là 7) ngh ĩa là cu i t p (b i vì ph n t đu tiên cĩ s th t là 0). Ví d 2.18 To m t t p l y tên là TEPCK.DAT đ v a ghi v a s a d li u Program Tep_co_kieu; Uses crt; Var bt: file of byte; i:byte; n:real; Begin clrscr; assign(bt,'TEPCK.DAT'); rewrite(bt); for i:= 0 to 5 do write(bt,i); {ghi vào t p n ăm s nguyên} reset(bt); writeln(' Du lieu luu tru trong tep TEPCK.DAT '); while not eof(BT) do {vi t d li u t t p ra màn hình} begin Read(bt,i); write(i:5); Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 50
  51. end; writeln; seek(bt,3); { đnh v con tr t i ph n t th 4} textcolor(magenta); read(bt,i); { đc ph n t th c 4 vào bi n i} writeln('So cu trong tep o vi tri 3: ',i); i:=33; seek(bt,3); write(bt,i); {s a ph n t th 4, giá tr m i là 33} seek(bt,3); read(bt,i) Writeln('So moi trong tep o vi tri 3: ', i); writeln('Vi tri hien thoi cua con tro: ',filepos(bt)); readln; close(bt); End. Nh n xét: Ví d 2.18 cho th y khi ghi ho c đc d liu vào t p cĩ ki u thì chúng ta luơn luơn ph i dùng đn các bi n cĩ cùng ki u vĩi bi n t p. ðon ch ươ ng trình i:=33; seek(bt,3); write(bt,i); dùng đ ghi vào ph n t th 4 giá tr m i b ng 33. N u chúng ta vi t l i đon l nh này vi ý t ưng ghi tr c ti p giá tr 33 vào ph n t th 4 seek(bt,3); write(bt,33); thì Pascal s báo l i "Variable Indentifier Expertied" ngh ĩa là Pascal khơng hi u s 33 thu c ki u d li u gì. Ví d 2.19 Lp ch ươ ng trình đ nh p đim cho h c sinh và ghi k t qu vào t p cĩ tên là DIEM.DAT. Ch ươ ng trình đnh ngh ĩa m t ki u d li u m i là Bangdiem (Ki u Record) v i các tr ưng: Stt, Hoten, Diachi, Gioitinh, Lop, Toan, Ly, Hoa. Bi n t p Ds thu c lo i t p cĩ ki u. Ví d 2.19 ch m i làm cơng vi c là nh p d li u vào t p mà ch ưa đc d li u ra. Program Kieutep; Uses Crt; Type Bangdiem = Record Stt: Integer; Hoten, Diachi: String[25]; Gioitinh, Lop: string[5]; Toan,Ly,Hoa: Real; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 51
  52. End; Tepdiem = File of Bangdiem; Var DS: Tepdiem; NGUOI: Bangdiem; i,j: Integer; lam,TL: Char; Begin Assign(DS,'diem.dat'); Rewrite(DS); Nguoi.stt:=1; textbackground(white); textcolor(5); lam:='L'; TL:='C'; While lam='L' do Begin clrscr; i:=10; j:=5; gotoxy(i,j); write(' So thu tu: '); gotoxy(i,j+1); write(' Ho va ten: '); gotoxy(i,j+2); write(' Nam hay nu: '); gotoxy(i,j+3); write(' Thuoc lop: '); gotoxy(i,j+4); write(' Dia chi: '); gotoxy(i,j+5); write(' Diem Toan: '); gotoxy(i,j+6); write(' Diem Ly: '); gotoxy(i,j+7); write(' Diem Hoa: '); i:=i+15; With Nguoi do Begin Gotoxy(i,j); Readln(STT); Gotoxy(i,j+1); Readln(Hoten); Gotoxy(i,j+2); Readln(Gioitinh); Gotoxy(i,j+3); Readln(lop); Gotoxy(i,j+4); Readln(Diachi); Gotoxy(i,j+5); Readln(Toan); Gotoxy(i,j+6); Readln(Ly); Gotoxy(i,j+7); Readln(Hoa); End; Gotoxy(i,j+9); Write('Co ghi vao danh sach khong? C/K '); Readln(TL); If upcase(TL) ='C' then Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 52
  53. Begin Write(DS,NGUOI); NGUOI.STT:= NGUOI.STT+1; End; textbackground(white); textcolor(blue); Gotoxy(28,22); Write(' NHAP TIEP HAY THOI ? L/T '); Readln(lam); lam:=upcase(lam); textbackground(white); textcolor(5); End; Close(DS); End. Ví d 2.20 Nh p d li u qu n lý đim tuy n sinh trung c p vào t p, tính t ng đim và kt qu cho t ng ng ưi sau đĩ đc d li u ra màn hình Ví d 2.20 Program Diem_trung_cap; Uses crt; Type dong=record mhs:byte; hoten:string[12]; toan,ly,tong:real; ketqua:string[7]; end; ds = file of dong; Var nguoi:dong; dsl:ds; i,n:byte; Begin clrscr; assign(dsl,'dsl.txt'); rewrite(dsl); write('Nhap bao nhieu nguoi ? '); readln(n); for i:= 1 to n do Begin With nguoi do Begin write('Ma ho so ', i); mhs:=i;writeln; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 53
  54. write('Ho va ten '); readln(hoten); write('Diem toan '); readln(toan); write('Diem ly '); readln(ly); tong:=toan+ly; if tong>10 then ketqua:='Do' else ketqua:='Truot'; end; write(dsl,nguoi); writeln; End; close(dsl); clrscr; reset(dsl); writeln(' Du lieu luu tru trong tep DSL.TXT '); while not eof(dsl) do with nguoi do begin read(dsl,nguoi); writeln(mhs:3,hoten:15,toan:5:2,ly:5:2,tong:7:2,ketqua:6); end; readln; End. 2.4 Tp khơng ki u Nh ư đã bi t t p v ăn b n ch a đng trong nĩ ch các ký t c a b ng mã, t t c các ki u d li u khác đu ph i chuy n v ki u này. T p cĩ ki u địi h i kh t khe v ki u d li u c a bi n và c a t p. T p khơng ki u là lo i t p khơng quan tâm đn kiu d li u. S khác nhau gi a t p cĩ ki u và t p khơng ki u là ch sau khi đã khai báo bi n t p vi c m t p đ ghi ho c đ đc c n ch rõ đ l n (tính b ng Byte) c a t ng ph n t t p. ðiu này cĩ ngh ĩa là gi a các ph n t khơng cĩ ký hi u phân cách nh ư th ưng th y (t p v ăn b n là CR và LF, t p cĩ ki u là kho ng cách). a. Khai báo bi n t p ð khai báo m t bi n t p khơng ki u chúng ta dùng m u: Var Bientep: File; Ví d : Var BT:file; b. M t p đ ghi - đc Sau khi đã khai báo bi n t p, mu n m t p khơng ki u đ ghi chúng ta dùng c p th tc: Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 54
  55. Assign(bientep, tentep); Rewrite(Bientep, n); Cịn m t p đ đc là các th t c Assign(bientep, tentep); Reset(Bientep, n); đây n là đ l n tính theo Byte do ng ưi s d ng quy đnh đ ghi (ho c đc) d li u ca t ng ph n t ( Record ). Nu ch n n=1 ngh ĩa là m i ph n t cĩ đ dài 1 byte thì d li u ghi vào t p ch cĩ th thu c ki u Byte, char, shortint, cịn n u ch n n=2 thì d li u cĩ th là Integer, word. V i s th c Real ph i ch n n=6. Gi s m i ph n t ghi vào t p là m t chu i dài t i đa là 10 ký t thì ph i ch n n=11 bi vì m i chu i khi ghi vào b nh c n thêm m t byte đ ch a ký t cho bi t đ dài th c c a chu i. Nu b qua tham s n thì Pascal s dùng giá tr ng m đnh là 128. c. ðc và ghi t p khơng đnh ki u * ðc t p khơng đnh ki u BlockRead(bientep, biennho, i, j); Bn thân t khố BlockRead cho th y vi c đc t p khơng ki u là đc t ng kh i (block). Kh i đây đưc hi u là m t vùng nh l ưu tr d li u. Kh i cĩ th là m t bi n, m t chu i, m t Record hay m t m ng. - bientep: là bi n t p liên k t v i tên t p đã ch ra trong th t c assign( ) - biennho: là m t bi n đã đưc khai báo cùng ki u v i các ph n t c a t p, bi n nh đĩng vai trị vùng nh đm đ l ưu tr d li u đc t ph n t c a t p ra. T bi n nh này chúng ta cĩ th cho d li u hi n trên màn hình hay in ra máy in. - i là s ph n t quy đh cho m i l n đc - j là m t bi n ki u Word dùng đ ghi l i s ph n t th c s đã đưc đc. Tham s j cĩ th b n u khơng c n thi t. - Ghi t p khơng đnh ki u * BlockWrite(bientep, biennho, i); Th t c BlockWrite ch cĩ 3 tham s , ý ngh ĩa c a các tham s này c ũng gi ng nh ư v i th t c BlockRead d. Truy nh p t p khơng ki u Tp khơng ki u c ũng đưc truy nh p nh ư t p cĩ ki u ngh ĩa là c ũng dùng th t c Seek(bientep,n) đ truy nh p vào ph n t th n+1 c a t p. ðiu c n đc bi t l ưu ý là v i t p khơng ki u là m i l n con tr t p d ch chuy n nĩ s dch chuy n m t s byte đúng b ng s byte đã quy đnh trong l nh Rewrite() ho c Reset() Ví d 2.21 Program tep_khong_kieu1; Uses crt; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 55
  56. Var bt:file; a:array[1 15] of byte; i,j,k:byte; n:word; Begin Clrscr; assign(bt,'tep0kieu.dat'); rewrite(bt,1); { đ dài t ng ph n t là 1 byte} For i:= 1 to 15 do begin a[i] := i; blockwrite(bt,a[i],1); {ghi vào t p 15 s , m i l n ghi 1 s } end; j:=a[2]*a[3]; for i:= 0 to 14 do begin seek(bt,i); Blockread(bt,k,1); { đc t ng ph n t c a t p vào bi n K} textcolor(red); write(k,' '); end; writeln; seek(bt,filesize(bt)-1); {chuy n con tr đn ph n t cu i} blockwrite(bt,j,1); {s a giá tr ph n t cu i} seek(bt,filesize(bt)-1); blockread(bt,k,1); { đc l i ph n t cu i} write(k); { vi t ph n t cu i lên màn hình} close(bt); readln; end. Ví d 2.21 t o m t bi n t p khơng ki u là BT, bi n t p này k t n i v i m t t p l ưu tr d li u Tep0kieu.dat. ðu tiên ch ươ ng trình ghi lên t p 15 s nguyên (1 byte), sau đĩ đc d li u t t p và vi t chúng ra màn hình (ph n t cu i là 15). Ti p đĩ sa d li u ph n t cu i và l i vi t ph n t đĩ ra màn hình (bây gi là 6). Ví d 2.22 Ch ươ ng trình d ưi đây t o t p khơng ki u BT, các ph n t t p là chu i cĩ đ dài b ng 3, l nh m t p đ ghi ph i quy đnh đ dài ph n t b ng 4 vì trong b nh string[3] s chi m 4 bytes. Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 56
  57. Program tep_khong_kieu2; Uses crt; Var bt:file; a:array[1 30] of string[3]; i,j:byte; k:string[3]; Begin Clrscr; assign(bt,'tep0kieu.dat'); rewrite(bt,4); { đ l n c a m i ph n t là 4 bytes} For i:= 1 to 24 do begin a[i] := chr(i+64)+chr(i+65)+chr(i+66); blockwrite(bt,a[i],1); end; reset(bt,4); for i:= 0 to 23 do begin seek(bt,i); Blockread(bt,k,1); textcolor(green); write(k,' '); end; close(bt); readln; end. Ví d 2.23 Nh p vào t p các ph n t là Record và sau đĩ vi t chúng ra màn hình. Trong ph n khai báo Record chúng ta ch n Hoten là string[15] và Diem thu c ki u Real nh ư v y đ dài ca m i ph n t ph i là 15+1+6=22. Program tep_khong_kieu4; Uses crt; Type hs = record hoten:string[15]; diem:real; end; Var bt:file; k,nguoi:hs; i,j:byte; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 57
  58. Begin Clrscr; assign(bt,'tep0kieu.dat'); rewrite(bt,22); write('Nhap bao nhieu nguoi? '); readln(n); For i:= 1 to n do with nguoi do Begin write('Ho va ten : '); readln(hoten); Write('Diem tong : '); readln(diem); blockwrite(bt,nguoi,1); end; for i:= 0 to n-1 do begin seek(bt,i); Blockread(bt,k,1); textcolor(red); with k do writeln(hoten,' ',diem:5:2); end; close(bt); readln; end. ð tìm hi u thêm v t p khơng ki u chúng ta cĩ th m Help c a Pascal và xem trong đĩ ví d v vi c dùng t p khơng ki u đ sao chép d li u t t p này sang t p khác. 3. D li u ki u t p h p 3.1 Khái ni m t p h p a. Khái ni m t p h p Mt t p h p bao g m n ph n t cùng ki u d li u (0 <= n <= 255), ki u c a các ph n t ph i là ki u vơ h ưng đm đưc (nguyên, ký t , logic, li t kê, đon con). S th t các ph n t trong t p h p luơn n m trong kho ng 0 - 255. b. Khai báo ki u và gán d li u vào t p h p Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 58
  59. ð mơ t ki u t p h p, Pascal dùng t khố Set of ti p đĩ là ki u d li u c ơ b n c a các ph n t t o nên t p h p. Cách vi t ki u d li u này ph i tuân theo nh ng quy đnh mà Pascal đã thi t k : * V i Pascal 7.0 s ph n t khơng quá 256 và s th t c a các ph n t ph i t ăng d n * Ki u d li u c ơ b n c a các ph n t c a t p h p cĩ th vi t t ưng minh ho c thơng qua các giá tr c th . Ví d : Type a = set of Char; b = set of Byte; c = set of 1 100; d = set of 'a' 'z'; Maytinh = set of (Compact, Mitac, IBM, CMS); Trong ví d trên ki u d li u c a các ph n t c a t p h p a, b đưc khai báo t ưng minh, a là t p các ký t , b là t p các s nguyên. Ki u d li u các ph n t c a t p c và d đưc xác l p qua các giá tr vi t sau SET OF, t p c s là t p các s nguyên trong kho ng t 1 đn 100, t p d là t p các ch a các ch cái th ưng cịn Maytinh là t p h p c a 4 ph n t đã li t kê. ð th y rõ h ơn chúng ta xét ví d sau: Ví d 2.24 Program Taphop1; Uses crt; Type mau= set of (xanh, hong, tim, vang, den, nau); sn1 = set of 0 100; sn2 = 100 200; chucai1 = set of 'a' 'z'; chucai2 = set of 'A' 'Z'; Kytu = set of Char; Var a,b:mau; b1:sn1; b2 : set of sn2; c :chucai1; d:chucai2; e:kytu; i,j,k:word; tl : set of boolean; BEGIN clrscr; i:=300; j:=160; k:=i+j; a:=[xanh vang]; b:=[tim,nau]; b1:=[15,255,i+j,i*j]; b2:=[1, 200, 155, 123, 145]; c:=['z','à','k']; Trưng ði hc Nơng nghip 1 - Giáo trình Lp trình nâng cao - 59