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

Đề: Nhập vào một xâu kí tự từ bàn phím sau đó hãy thay thế chuỗi hai dấu chấm liên tiếp trong xâu thành chuỗi ba dấu chấm và thay chuỗi nhiều hơn ba dấu chấm liên tiếp thành chuỗi ba dấu chấm.
Giải thích: Trong xâu sẽ có những kí tự bình thường như số và chữ nhưng xen kẽ trong xâu sẽ có thêm những chuỗi dấu chấm. Nếu bạn thấy trong xâu có 1 dấu chấm đứng riêng lẻ thì bỏ qua, nếu bạn thấy có chuỗi hai dấu chấm liên tiếp thì thay nó thành chuỗi ba dấu chấm, nếu bạn thấy có chuỗi ba dấu chấm thì bỏ qua, nếu bạn thấy có chuỗi nhiều hơn ba dấu chấm thì thay nó thành chuỗi ba dấu chấm.

#TEST

Input:............Khanhblog.Khanh..Blog...Khanh...........Blog..Khanh.............
Output:...Khanhblog.Khanh...Blog...Khanh...Blog...Khanh...

#Cách1

program dau_cham;
uses crt;
var s : string;
    i,k,d: integer;

begin
clrscr;
writeln('Nhap xau: '); readln(s);
s:=s+'k';
d:=1;
while d <= length(s)  do
begin
   for i := d to length(s) do
       begin
       d:=i+1;
          if (s[i] = '.') and (s[i+1] = '.') then k:=k+1 else
             begin
                if (k=1) or (k>2) then
                   begin
                      insert('..',s,i);
                      delete(s,i-k,k);
                      k:=0;
                      break;
                   end;
                if (k=2) then k:=0;
             end;
       end;
end;
delete(s,length(s),1);
write(s);
Readln;
end.

Giải thích:
  • Chúng ta sẽ có một biến d (ban đầu ta gán d:=0)  dùng để đánh dấu vị trí mà chúng ta đã thay thế dấu chấm, sử dụng vòng while do để chạy, nếu d > length(s) thì ta dừng lại.
  • Trong vòng lặp while do sẽ có một vòng lặp For do chạy từ d đến length(s), trong vòng lặp đó ta sẽ làm một vài công việc như sau: Ban đầu ta sẽ tăng biến đánh dấu d lên 1; Tiếp theo ta sẽ kiểm tra xem có bao nhiêu hai dấu chấm kề nhau bằng biến K. Nếu có x dấu chấm kề nhau thì sẽ có k dấu chấm (k=n-1); Khi phát hiện ra phần tử thứ i của xâu không phải là dấu chấm thì ta tiến hành thay thế. Ta sẽ chỉ thay thế với trường hợp k=1 (có hai dấu chấm) và k>2 (có nhiều hơn 3 dấu chấm), đối với trường hợp k=2 (3 dấu chấm) thì ta bỏ qua.
  • Ở phần đầu của chương trình mình đã cộng thêm một kí tự 'k' ở cuối xâu s, điều này giúp bạn đếm được những chuỗi dấu chấm nằm ở cuối xâu. Cho nên ở cuối chương trình mình đã xóa đi một kí tự ở cuối xâu.

#Cách2

program dau_cham_v2;
uses crt;
var s: string;
begin
clrscr;
writeln('Nhap xau: '); readln(s);

{thay the nhieu dau cham lien tiep bang 3 dau cham}
while pos('....',s) <> 0 do
   begin
      insert('...',s,pos('....',s));
      delete(s,pos('....',s),4);
   end;
   
{thay 3 dau cham thanh 3 dau phay}
while pos('...',s) <> 0 do
   begin
      insert(',,,',s,pos('...',s));
      delete(s,pos('...',s),3);
   end;

{thay the toan bo 2 dau cham thanh 3 dau phay}
while ((pos('..',s) <> 0)) do
   begin
      insert(',,,',s,pos('..',s));
      delete(s,pos('..',s),2);
   end;
   
{thay the toan bo 3 dau phay thanh 3 dau cham}
while (pos(',,,',s) <> 0) do
   begin
      insert('...',s,pos(',,,',s));
      delete(s,pos(',,,',s),3);
   end;

writeln(s);
readln;
end.


Giải thích:
  • Ban đầu ta sẽ thay thế tất cả chuỗi bốn dẫu chấm liên tiếp thành chuỗi ba dấu chấm liên tiếp, cứ tiếp tục như vậy cho tới khi không còn chuỗi bốn dấu chấm liên tiếp nào. Như vậy là ta đã giải quyết xong trường hợp có nhiều hơn ba dấu chấm vì mỗi lần thay bốn dấu chấm thành ba dấu chấm là ta đã loại đi được một dấu chấm.
  • Tiếp theo là thay thế toàn bộ chuỗi ba dấu chấm trong xâu thành chuỗi ba dấu phẩy. Lí do cho việc này là ở bước tiếp theo ta sẽ phải sử dụng hàm Pos('..',s) để kiểm tra vị trí xuất hiện của chuỗi hai dấu chấm nhưng nếu có chuỗi ba dấu chấm thì nó sẽ cho kết quả tương tự hàm pos('...',s). Do đó chũng ta cần thay thế toàn bộ chuỗi ba dấu chấm thành chuỗi ba dấu phẩy.
  • Tiếp theo nữa là thay thế toàn bộ chuỗi hai dấu chấm thành chuỗi ba dấu phẩy. Một số người thắc mắc vì sao không chèn luôn chuỗi ba dấu chấm vào cho nhanh. Nhưng vấn đề là sau khi thay thế được chuỗi hai dấu chấm đầu tiên rồi thì làm sao để thay thế chuỗi hai dấu chấm tiếp theo khi mà hàm pos luôn cho giá trị là vị trí xuất hiện đầu tiên.
  • Cuối cùng là thay thế toàn bộ chuỗi ba dấu phẩy thành chuỗi ba dấu chấm, như vậy là chúng ta đã hoàn thành.

Theo mình thấy thì cách này là không hiểu quả với trường hợp xâu nhập vào có kí tự dấu phẩy.

#Lưu ý

Có thể với một vài trường hợp xâu nhập vào nào đó thì chương trình sẽ cho ra kết quả không đúng. Nếu bạn thấy thì hãy báo cho mình biết nhé. 

Comments