Bài tập Turbo Pascal kiểu xâu - Phần 5

Đề: Trong sách giáo khoa Tin Học 11 có một bài thuộc kiểu dữ liệu xâu là nhập vào một xâu rồi tìm và thay thế tất cả xâu con 'anh' thành 'em' hoặc thay 'em' thành 'anh'. Bài này khá là đơn giản nên mìn đã nghĩ ra một bài khác dạng thế này nhưng phức tạp hơn đó là: Viết chương trình nhập vào một xâu, sau đó thay thế tất cả xâu con 'anh' thành 'em''em' thành 'anh'.

#TEST

Input: 'anh yeu em nhu em yeu anh'
Output: 'em yeu anh nhu anh yeu em'

#Hướng dẫn

So với bài trong sgk thì bài này phức tạp hơn một chút. Mình đã giải quyết bài này bằng cách chia xâu nhập vào thành nhiều xâu nhỏ hơn, mỗi xâu nhỏ sẽ chứa xâu con 'anh' hoặc 'em' như vậy sẽ dễ dàng thay thế hơn. Sau khi thay thế xong ta sẽ nối lại và được kết quả.

#Chương trình

{giai bai tap turbo pascal - phan 5 - khanh blog}
PROGRAM string3;
uses crt;
var s,s1,s2: string;
vt1,vt2: integer;

BEGIN
   clrscr;
   write('Nhap xau s :'); readln(s);
   while (pos('anh',s)<>0) or (pos('em',s)<>0) do
      begin
         vt1:=pos('anh',s);
         vt2:=pos('em',s);
         if ((vt1>vt2)and(vt1<>0)and(vt2<>0) )or (vt1=0)  then
            begin
               s1:=copy(s,1,vt2+2);
               delete(s,1,vt2+2);
               insert('anh',s1,vt2);
               delete(s1,vt2+3,2);
               s2:=s2+s1;
               end;

         if ((vt2>vt1)and(vt1<>0)and(vt2<>0)) or (vt2=0)  then
            begin
               s1:=copy(s,1,vt1+3);
               delete(s,1,vt1+3);
               insert('em',s1,vt1);
               delete(s1,vt1+2,3);
               s2:=s2+s1;

            end;
      end;
   writeln(s2);
   readln;

END.
Giải thích:
Ta sẽ thực hiện một vòng lặp while do, điều kiện thực hiện là (pos('anh',s)<>0) or (pos('em',s)<>0), tức là khi nào trong xâu còn xâu con 'anh' hoặc 'em' thì còn thực hiện. Mỗi lần ta sẽ cắt ra một xâu con rồi thay thế 'anh' thành 'em' hoặc ngược lại rồi cộng vào xâu s2 - Ta cứ làm như thế đến khi xâu s không còn xâu 'anh' hay 'em' nào nữa.

Tiếp theo ta sẽ lấy vị trí xuất hiện đầu tiên của hai xâu con 'anh' và 'em' trong xâu lớn vào hai biến vt1 vt2:
vt1:=pos('anh',s);
vt2:=pos('em',s);

Tiếp theo là phần quan trọng nhất, sẽ có 4 trường hợp cho các vị trí xuất hiện của xâu con 'anh' và 'em' trong xâu lớn là:
1. Xâu 'em' có vị trí xuất hiện nhỏ hơn xâu 'anh' ((vt2>vt1)and(vt1<>0)and(vt2<>0))
Như vậy ta sẽ sẽ copy từ vị trí 1 tới vt2+2 (s1:=copy(s,1,vt2+2)), sẽ copy được xâu có xâu con 'em'.
Sau khi copy ta sẽ xóa phần đã copy tại xâu s đi (delete(s,1,vt2+2))
Chèn xâu 'anh' vào xâu s1 tại vị trí xuất hiện xâu 'em' (insert('anh',s1,vt2))
Tiếp theo là xóa xâu 'em' đi, như vậy là vừa thay thế 'em' thành 'anh' (delete(s1,vt2+3,2))
Cộng xâu s1 vào s2 (s2:=s2+s1)

2. Xâu 'anh' có vị trí xuất hiện nhỏ hơn xâu 'em' ((vt2>vt1)and(vt1<>0)and(vt2<>0))
Ta sẽ copy từ vị trí 1 tới vt1+3 (s1:=copy(s,1,vt1+3)) , khi đó ta copy được xâu có xâu con 'anh'
Tiếp theo ta sẽ xóa phần vừa copy ở xâu s đi (delete(s,1,vt1+3))
Chèn xâu 'em' vào xâu s1 tại vị trí xuất hiện xâu 'anh' (insert('em',s1,vt1))
Tiếp theo là xóa xâu 'anh' đi, như vậy là vừa thay thế 'anh' thành 'em' (delete(s1,vt1+2,3))
Cộng xâu s1 vào s2 (s2:=s2+s1)

3. (vt1=0) tức là không có xâu 'anh', trường hợp này tương tự trường hợp 1
4. (vt2=0) tức là không có xâu 'em', trường hợp này tương tự trường hợp 2

Comments

Post a Comment



» Vui lòng không spam vì nó sẽ bị xóa ngay sau đó.
» Nếu chèn code hãy mã hóa trước khi chèn vào nhận xét.
» Nếu thủ thuật Blog không áp dụng được thì hãy để lại URL blog để mình tiện kiểm tra.