Tổ chức tính toán
Tổ chức tính toánNguyễn Xuân HuyBài tập 1: Chiều dàiđủ của một xâu gọn s là số kí tự trong dạng khai triển của xâu đó. Thí dụ chiềudài đủ của xâu gọn s=A2(C2A)3(AB4)0D3 là 14. Viết thủ tục tính chiều dài đủ củamột xâu gọn cho trước.Bài giải:Trướchết ta gọi thủ tục XauGon để tạo ra bảng phục vụ cho việc tổ chức tính toán.Với thí dụ đã cho ta thu được bảng như trong Hình 1. Bây giờ ta chỉ việc thực hiệnpha 2 bằng cách sửa lại thủ tục ThucHien như sau. Thay vì in các ký tự của dạngkhai triển ta đếm số kí tự được in và tích luỹ trong biến d. Giá trị cuối cùngcủa d sẽ chính là chiều dài đủ của xâu gọn. Như vậy ta sẽ thay các lệnh ghi tệpwrite(g,Kt[i]) trong thủ tục ThucHien bằng lệnh inc(d). Vì các lệnh ghi tệpđược đặt trong vòng for cho nên ta chỉ thay dòng lệnh for j := 1 to Lap[i] dowrite(g,Kt[i]);bằng dòng lệnhd := d + Lap[i];Thủ tục mới có tên là Len.Procedure Len;Số hiệu dòng (n) Kí tự (kt) Số lần lặp(lap)Lặp từ dòng (tu) 1 A 22 C 23 A 14 * 3 25 D 3Hình 1. Bảng hoàn chỉnh ứng với xâu gọns = A2(C2A)3(AB4)0D3. Var i,j: byte;Begind := 0; for i := 1 to n do Dem[i] := 0;i := 1;while i <= n dobeginif Kt[i] = '*' thenbegininc(Dem[i]);if Dem[i] < Lap[i] then i := Tu[i]elsebeginDem[i] := 0;inc(i);end;endelsebegind := d + Lap[i];inc(i);end; end;End;Để bạn đọc tiện theo dõichúng tôi viết lại các thủ tục của pha 1.Const DauTu = ['(','A' 'Z','á 'z'];ChuSo = ['0' '9'];MN = 250;VarKt: array[0 MN] of char;Tu: array[0 MN] of byte;Lap: array[0 MN] of word;s: string;ii,n: byte;d: longint;Procedure Loi;Beginwriteln('Loi cu phap');readln;halt;End;Function DocSo: word;Var m: word; BeginDocSo := 1;if not (s[ii] in ChuSo) then exit;m := 0;while s[ii] in ChuSo dobeginm := m*10 + ord(s[ii]) - ord('0');inc(ii);end;DocSo := m;End;Procedure XauDon;Begininc(n);Kt[n] := s[ii];inc(ii);Lap[n] := DocSo;if Lap[n] = 0 then dec(n);End;Procedure XauGon;Var g: byte;Begin while s[ii] in DauTu doif s[ii] = '(' thenbeging := n;inc(ii);XauGon;if s[ii] <> ')' then Loi;inc(ii);inc(n);Kt[n] := '*';Tu[n] := g+1;Lap[n] := DocSo;if Lap[n] = 0 then n := gelse if Lap[n] = 1 then dec(n);endelse XauDon;End;Procedure TinhLen;Begins := s + #; ii := 0;n := 0; XauGon;Len;writeln(d);End;Bài tập 2. Xâu gọnlật của một xâu gọn s là xâu gọn u sao cho dạng khai triển của u có thể nhậnđược bằng cách viết dạng khai triển của s theo thứ tự ngược. Thí dụ xâu gọn lậtcủa s=A2(C2A)3(AB4)0D3 là u=D3(AC2)3A2. Viết thủ tục xây dựng xâu gọn lật củamột xâu gọn cho trước.Bài giải Bài này cũng có thể giải bằngkỹ thuật hai pha. Cụ thể là sau khi gọi pha thứ nhất để tạo bảng ta chuyển sangpha thứ hai để tạo xâu lật từ bảng đó. Tuy nhiên chúng ta sẽ giải theo một cáchkhác nhằm nhấn mạnh vai trò của đặc tả trong lập trình. Kí hiệu s là xâu lậtcủa xâu gọn s. Dựa vào tính chất đối xứng gương ta có:(Cm) = Cm.Lật của một xâu đơn là chính xâu đó. Thí dụ: (A4) = A4.(uv) = vu.Lật của tổng hai xâu bằng tổng các lật của xâu thứ hai với xâu thứ nhất. Thídụ: (A4B2) = (B2)(A4) = B2A4.((u)m) = (u)m. Lật của lặp của một xâu bằng lặp củalật của xâu đó. Thí dụ: ((A4B2)5) = ((A4B2))5 = (B2A4)5.Vận dụng các tính chất trênta có thể tạo xâu lật u bằng cáchduyệt trực tiếp xâu gọn s cho trước. Ta duyệt xâu gọn s từ trái qua phải. Mỗilần gặp một đơn vị ta lật đơn vị đó rồi viết tiếp vào bên trái của xâu kết quả u. Mỗi đơn vị có thể là một trong hailoại xâu gọn con: xâu đơn và xâu phức. Xâu đơn, như ta biết được đặc tả qua Cm trong đó C là một chữ cái và m làmột số tự nhiên, m có thể vắng mặt.Xâu phức có dạng (u)m, trong đó u làmột xâu gọn và m là một số tự nhiên, m có thể vắng mặt. Như vậy đặc trưng củaxâu đơn là kí tự đầu tiên phải là một chữ cái, còn đặc trưng của xâu phức là kítự đầu tiên phải là dấu mở ngoặc (. Thủ tục XauLatDon dùng để xử lý các xâu con đơn, còn thủ tục XauLatPhuc tạo một xâu lật cho xâu condạng phức. Điểm khó trong xử lý xâu lật phức là phải ghi nhận vị trí bắt đầucủa nó trong xâu kết quả để sau này, khi tạo ra xâu lật ta chèn được đúng vịtrí đó. Mỗi khi bắt đầu xử lý xâu lật phức ta ghi nhận chiều dài hiện hành củaxâu kết quả u vào một biến g. Sau khi tạo xong xâu lật phức w ta gọi thủ tụcInsert(w,u,length(u)-g+1) để chèn w vào trước vị trí thứ g của u. Thủ tụcInsert(w,u,i) chèn xâu con w vào xâu u tại vị trí i.Procedure XauLat; Var g: byte;Beginwhile s[ii] in DauTu doif s[ii] = '(' thenbeging := length(u);inc(ii);XauLat;if s[ii] <> ')' then Loi;XauLatPhuc(g);endelse XauLatDon;End;Thủ tục XauLatDon khi đó sẽnhư sau:Procedure XauLatDon;Var w: string; Beginw := '';repeatw := w + s[ii];inc(ii);until not (s[ii] in ChuSo); u := w + u;End;Thủ tục XauKatPhuc có dạng:Procedure XauLatPhuc(g:byte);Var w: string;Beginu := '(' + u;w := '';repeatw := w + s[ii];inc(ii);until not (s[ii] in ChuSo);Insert(w, u, length(u)-g+1);End;Trước khi gọi thủ tục XauLatbạn cần khởi trị như sau:Procedure TaoXauLat;Beginii := 1;s := s + '#';{s la xau cho truoc}u := ''; {chua xau lat}XauLat;End; Nguyễn Xuân Huy . Viết thủ tục tính chiều dài đủ củamột xâu gọn cho trước.Bài giải:Trướchết ta gọi thủ tục XauGon để tạo ra bảng phục vụ cho việc tổ chức tính toán. Với thí. Tổ chức tính toánNguyễn Xuân HuyBài tập 1: Chiều dàiđủ của một xâu gọn s là số kí