Chuyªn Tin 10 CHƯƠNG 8 : DỮ LIỆU KIỂU LIỆT KÊ, KIỂU ĐOẠN CON, DỮ LIỆU KIỂU TẬP HỢP- DỮ LIỆU KIỂU BẢN GHI I / Dữ liệu kiểu liệt kê ( Enumerated ): 1 ) Khai báo kiểu : Type Tên_kiểu = (danh sách tên các giá trị ); Var Tên_biến : Tên_Kiểu; Trong đó tên giá trị phải đặt theo đúng qui cách của Tên , thí dụ như : Không bắt đầu bằng chữ số , không chứa kí tự #, kí tự ngoặc ‘(‘ , ‘)’, kí tự dấu trừ ‘-’,kí tự dấu cách ‘ ‘, 2 ) Thí dụ : Type ColorE = (Red, Blue,Green,Yellow); DateE = (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); Var Mau : ColorE; Ngay : DateE; Biến Mau có kiểu ColorE , kiểu này chỉ có 4 giá trị Red, Blue,Green,Yellow. Biến Ngay có kiểu DateE, kiểu này có 7 giá trị Sunday,Monday ,Tuesday, Wednesday, Thursday, Friday, Saturday . 3) Cách xử dụng biến kiểu Liệt kê : + Giá trị của biến có thể nhận được thông qua lệnh gán Thí dụ : Mau := Green; + Muốn hiện giá trị của biến liệt kê trên màn hình phải qua thủ tục hiện gián tiếp . Thí dụ Procedure Hiện (Mau : ColorE); Begin Case Mau of Red : Witeln(‘Red ‘); Blue : Witeln(‘Blue ‘); Green : Witeln(‘Green ‘); Yellow: Witeln(‘Yellow ‘); End; End; + Kiểu liệt kê cũng thuộc loại vô hướng đếm được (như Boolean,Char,Integer,Byte, Word ) vì vậy có thể xử dụng các hàm Ord,Succ,Pred . Thí dụ : Trong các kiểu nêu trên ta có : Ord(Red) =0, Succ(Red)=Blue, Pred(Tuesday)= Monday Giá trị của biểu thức Pred(Friday)=Saturday là False . Giá trị của biểu thức Pred(Friday)=Thursday là True + Có thể lấy 1 giá trị của danh sách các giá trị thông qua Tên_kiểu . Thí dụ : ColorE(0) là Red , DateE(1)=Monday II / Dữ liệu kiểu đoạn con ( Sub Range ): III / Dữ liệu kiểu tập hợp ( Set Of ): IV / Dữ liệu kiểu bản ghi ( Kiểu Record): Bài 1 : 250 Chuyªn Tin 10 Bài toán “Rủ nhau đi cắm trại “ : Quan hệ rủ nhau đi cắm trại , cho bằng biểu thức : Thí dụ : AB>CEF . Ta hiểu các biểu thức này có nghĩa là : Mỗi kí tự ( Khác dấu ‘>‘) là tên một học sinh . Khi có đủ các học sinh ở vế trái của biểu thức thì sẽ rủ thêm được các học sinh ở vế phải tham gia trại . Cho biết nhóm đầu tiên khởi xướng là FC .Các quan hệ và nhóm khởi xướng cho trong File ‘CAMTRAI.TXT’ tổ chức : + Dòng đầu là số N là số quan hệ rủ nhau + N dòng tiếp theo , Mỗi dòng là 1 quan hệ + Dòng cuối cùng là nhóm khởi xướng Hỏi những học sinh nào sẽ đi cắm trại . File CAMTRAI.TXT 5 AB>CEF C>AD EG>D CD>B D>E FC Bài 2 : Cho N tập hợp số nguyên ( Kiểu Byte) (2<=N<=10) . Nếu 2 tập hợp có chung ít nhất 1 phần tử , ta nói rằng chúng có đường đi sang nhau ( liên thông nhau ). Trong N tập hợp đã cho ,hãy tìm mọi đường đi từ một tập thứ nhất tới tập thứ hai ( có thể thông qua các tập khác ). Dữ liệu cho từ File ‘DUONGDI.TXT’ Tổ chức như sau : + Dòng đầu là số N + N dòng tiếp theo ,dòng i gồm các số nguyên của tập i , hai số liền nhau cách nhau dấu cách ( #32 ) BÀI CHỮA Bài 1 : Uses Crt; Const Max = 20; Fi = 'Camtrai.txt'; Type KTH = Set of char; KMTH = Array[1 Max] of KTH; KDD = Array[1 Max] Of Boolean; Var i,N,sn : Byte; KQ : KTh; P,T : KMTH; D : KDD; S : String; Ok : Boolean; Procedure Hien(x : KTH); Var ch : Char; Begin For ch:='A' to 'Z' do If ch in x then Write(ch); End; Procedure Sach(Var S : String); Var i : Byte; Begin i := 1; While i<= Length(S) do Begin 251 Chuyªn Tin 10 If S[i]=' ' then Begin Delete(S,i,1); Dec(i); End; Inc(i); End; End; Procedure Nhap; Var F : Text; phu,k : Byte; vt,S : String; Begin Assign(F,Fi); Reset(F); Readln(F,N); For i:=1 to N do Begin Readln(F,S); Sach(S); phu := Pos('>',S); Vt := Copy(S,1,phu-1); T[i] := []; For k := 1 to Length(Vt) do T[i] := T[i]+[Vt[k]]; S := Copy(S,phu+1,Length(S) ); P[i] := []; For k := 1 to Length(S) do P[i] := P[i]+[S[k]]; Hien(T[i]);Write('>'); Hien(P[i]); Writeln; End; Readln(F,S); Close(F); KQ := []; For i:=1 to Length(S) do KQ := KQ+[S[i]]; Sn := Length(S); Hien(KQ); Writeln; End; Procedure Ketnap(i : Byte); Var ch : Char; Begin If (T[i]<=KQ) and (Not D[i]) then Begin KQ := KQ+P[i]; D[i] := True; Ok := True; End; End; Procedure Duyet; Var i : Byte; 252 Chuyªn Tin 10 Begin FillChar(D,Sizeof(D),False); Ok := True; While Ok do Begin Ok := False; For i:=1 to N do Ketnap(i); End; End; BEGIN Clrscr; Nhap; Duyet; Hien(KQ); Readln END. Bài 2 : {Phuong phap de qui + Vet can.Co the them d/k : do dai duong di L=hang so} Uses Crt; Const Max = 20; Fi = 'Duongdi.txt'; Fo = 'Duongdi.out'; Type KTH = Set of Byte; KMTH = Array[1 Max] of KTH; KDD = Array[1 Max] of Boolean; KNG = Array[1 Max] Of Byte; Var TH : KMTH; X : KTH; CX : KDD; NG : KNG; N,L : Byte; Dem : LongInt; Procedure Hien(X : KTH); Var i : Integer; Begin For i:=0 to 255 do If i in X then Write(i:4); Writeln; End; Procedure Nhap; Var i,k : Byte; x : Byte ; F : Text; Begin Assign(F,Fi); Reset(F); Readln(F,N); i := 1; While Not SeekEof(F) do Begin TH[i] := []; While not SeekEoLn(F) do 253 Chuyªn Tin 10 Begin Read(F,x); TH[i] := TH[i]+[x]; End; Readln(F); Hien(TH[i]); Inc(i); End; Close(F); End; Function C(i,j : Byte): Boolean; Begin If ((TH[i]*TH[j])<>[]) then C := True Else C:= False; End; Var F : Text; Procedure Thong(i,j :Byte); Var k,h : Byte; Begin For k:=1 to N do If (k<>i) then If (CX[k]) and C(NG[L],k) then Begin Inc(L); NG[L] := k; CX[k] := False; If (k<>j) then Thong(k,j) Else Begin Inc(dem); Write(F,'Duong di ',dem,' : '); Write( 'Duong di ',dem,' : '); For h:=1 to L do Write(NG[h]:4); For h:=1 to L do Write(F,NG[h]:4); Writeln;Writeln(F); End; Dec(L); CX[k] := True; End; End; Procedure Tim; Var i,j : Byte; Begin Assign(F,Fo); Rewrite(F); Dem := 0; For i :=1 to N do For j := 1 to N do Begin FillChar(CX,Sizeof(CX),True); FillChar(NG,Sizeof(NG),0); L := 1; NG[L] := i; CX[i] := False; Thong(i,j); End; 254 Chuyªn Tin 10 Close(F); End; BEGIN Clrscr; Nhap; Tim; Readln END. 255 . ). Dữ liệu cho từ File ‘DUONGDI.TXT’ Tổ ch c như sau : + Dòng đầu là số N + N dòng tiếp theo ,dòng i gồm các số nguyên của tập i , hai số liền nhau c ch nhau dấu c ch ( #32 ) BÀI CH A Bài 1 : Uses. Begin For ch: ='A' to 'Z' do If ch in x then Write (ch) ; End; Procedure Sach(Var S : String); Var i : Byte; Begin i := 1; While i<= Length(S) do Begin 251 Chuyªn Tin. Tên_kiểu = (danh s ch tên các giá trị ); Var Tên_biến : Tên_Kiểu; Trong đó tên giá trị phải đặt theo đúng qui c ch của Tên , thí dụ như : Không bắt đầu bằng ch số , không ch a kí tự #, kí tự