# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Xóa kí tự trong xâu

## ducquan1008

Viết chương trình nhập vào một xâu bất kì gồm các kí tự từ 'A' đến 'Z', in ra màn hình xâu sau khi đã xoá bỏ tất cả các kí tự 'A'.

----------


## suemall

Cách 1 thì dùng xâu s2:=''
S2:='';
For i:=1 to length(S1) do
IF S_<>'A' then S2:=S2+S1;
write(S2);
Các bạn hãy thử viết chương trình nhưng không dùng xâu S2, dùng thủ tục Delete xem sao nhé!_

----------


## cstk235

```
var   i:integer;
      s:string;

begin
      readln(s);
      for i:=length(s) downto 1 do
            if s[i]='a' then delete(s,i,1);
      writeln(s);
      readln
end.
```

----------


## bluedragon0702

bẠN HANG_VT AH, cám ơn bạn. Tại sao bạn lại nghĩ ra vòng lặp lùi, mà nếu dùng thủ tục Delete thì vòng lặp tiến sẽ không xóa được các kí tự 'A' liền nhau.

----------


## myphamchatluong

Cách khác, dùng vòng lặp tiến:


```
var s:string;i:byte;
begin
         write('Nhap xau s: ');
         readln(s);
         i:=1;
         while (i<=length(s)) do
                 if s[i]='A' then delete(s,i,1)
                    else inc(i);
         write('Xau moi la:',s);
         readln;
end.
```

Cách này tương tự cách chị Hằng thôi, chỉ là đổi lại vòng lặp tiến.

----------


## manhhung2206

bạn Binh_nguyen thu làm cách dùng vòng lặp For tiến xem sao

----------


## ViệtNet

Tại sao mình viết chương trình như thế này thì không được nhỉ
For i:=1 to length(S) do
While S_='A' then Delete(S,i,1);
write(S);

Còn viết vòng For như thế này thì tất nhiên là không được rồi
For i:=1 to length(S) do if S='A' then Delete(S,i,1); thì sẽ không xóa hết các chữ 'A' liền nhau
Vì sau khi xóa thì độ dài của xâu sẽ thay đổi, mỗi lần xóa sẽ giảm 1 đơn vị._

----------


## thienan

"If ... Then ..." hoặc là "While ... Do ..." chứ bạn.
For i:=1 To Length(s) Do
If s_ = 'A' Then Begin Delete(s,i,1); Dec(i); End;
Write(s);

Xem cách này thử xem, mình chưa thử._

----------


## huong2211hd

> Cách khác, dùng vòng lặp tiến:
> 
> 
> ```
> var s:string;i:byte;
> begin
>          write('Nhap xau s: ');
>          readln(s);
>          i:=1;
> ...


tương tự nhưng mà hem có đúng 




> "If ... Then ..." hoặc là "While ... Do ..." chứ bạn.
> For i:=1 To Length(s) Do
> If s_ = 'A' Then Begin Delete(s,i,1); Dec(i); End;
> Write(s);
> 
> Xem cách này thử xem, mình chưa thử._


_

a ơi , trong vòng for , k đc giảm hoặc tăng biến chạy [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]_

----------


## trungvu

> Còn viết vòng For như thế này thì tất nhiên là không được rồi
> For i:=1 to length(S) do if S_='A' then Delete(S,i,1); thì sẽ không xóa hết các chữ 'A' liền nhau
> Vì sau khi xóa thì độ dài của xâu sẽ thay đổi, mỗi lần xóa sẽ giảm 1 đơn vị._


_

Giải thix của bạn k đúng , code của mình n giảm nhưng vẫn đúng đây thôi_

----------


## BMG

> Giải thix của bạn k đúng , code của mình n giảm nhưng vẫn đúng đây thôi


 uh thế mình mới bảo là code của bạnlà đúng còn viết vòng For tiến thì ko đúng

----------


## seotn

Code nè bạn[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]


```
Var St:String; i:Byte;
Begin
    Write('Nhap xau:'); Readln(St);
    For i:=1 to length(St) do
        If St[i] in ['a'..'z'] then exit;
    For i:=length(St) downto 1 do
        If St[i]='A' then Delete(St,i,1);
    Writeln('Xau sau khi chuan hoa:');
    Write(St);
    Readln;
End.
```

----------


## 4B1601

> uh thế mình mới bảo là code của bạnlà đúng còn viết vòng For tiến thì ko đúng


nhưng bạn giải thix tại sao for ... to sai mà for ...downto lại đúng . Giải thix k hợp lí

----------


## beprongviet

> tương tự nhưng mà hem có đúng 
> 
> 
> 
> a ơi , trong vòng for , k đc giảm hoặc tăng biến chạy [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]


 Bài em sai chỗ nào hở chị, em chưa tìm ra được?

----------


## banhmysaigon

> nhưng bạn giải thix tại sao for ... to sai mà for ...downto lại đúng . Giải thix k hợp lí


 Thì mình viết chương trình bằng vòng FOr to thì kết quả sai. Những kí tự 'A' liền nhau không xóa hết. Voéi vòng for - to thì biến i tự động tăng từ 1 đến length(S) còn For- downto thì bạn cho biến i giảm từ length(S) về 1, sau mỗi lần xóa thì hàm length(S) đã cho giá trị thay đổi.
Nếu bạn gán l:=length(S) và vòng FOr bạn dùng
For I:=l downto 1 do ........ thì chương trình sẽ không đúng

----------


## sangame

> Thì mình viết chương trình bằng vòng FOr to thì kết quả sai. Những kí tự 'A' liền nhau không xóa hết. Voéi vòng for - to thì biến i tự động tăng từ 1 đến length(S) còn For- downto thì bạn cho biến i giảm từ length(S) về 1, sau mỗi lần xóa thì hàm length(S) đã cho giá trị thay đổi.
> Nếu bạn gán l:=length(S) và vòng FOr bạn dùng
> For I:=l downto 1 do ........ thì chương trình sẽ không đúng


for ... do í 
i tăng nhưng n giảm . Khi chưa xóa hết thì i>n r` 


thôi , bài đơn giản mà , mình k bàn nữa , loãng topic , lại bị mod xóa bài vì sp

----------


## stylehanquoc

Dùng Pos kết hợp lặp repeat hoặc While là ổn mà. 
Dùng pos để tìm ra vị trí của A đầu tiên trong xâu, xóa đi, tìm tiếp tới khi không còn A nào trong xâu nữa. In kq.

----------


## tuyetbanggia

> Tại sao mình viết chương trình như thế này thì không được nhỉ
> For i:=1 to length(S) do
> While S_='A' then Delete(S,i,1);
> write(S);
> 
> Còn viết vòng For như thế này thì tất nhiên là không được rồi
> For i:=1 to length(S) do if S='A' then Delete(S,i,1); thì sẽ không xóa hết các chữ 'A' liền nhau
> Vì sau khi xóa thì độ dài của xâu sẽ thay đổi, mỗi lần xóa sẽ giảm 1 đơn vị._


_

Trong vòng lặp for có vị trí đầu cuối luôn phải là cố định, bạn delete 1 ptu của xâu thì length của xâu bị giảm đi rồi. Chương trình chạy được không báo lỗi chắc là để Q-, R-. Để Q+, R+ chả báo lỗi loạn lên ấy chứ._

----------


## akakavn

> Bài em sai chỗ nào hở chị, em chưa tìm ra được?


test lại thử . Tất cả các test đều sai từ đơn giản -> phức tạp

----------


## trangna

> test lại thử . Tất cả các test đều sai từ đơn giản -> phức tạp


 Chị cho em thử cái test, em tìm hoài chưa ra.
P/s: code chỉ xóa "A" chứ không xóa "a" đâu nha.

----------


## nguyentruong17

> Thì mình viết chương trình bằng vòng FOr to thì kết quả sai. Những kí tự 'A' liền nhau không xóa hết. Voéi vòng for - to thì biến i tự động tăng từ 1 đến length(S) còn For- downto thì bạn cho biến i giảm từ length(S) về 1, sau mỗi lần xóa thì hàm length(S) đã cho giá trị thay đổi.
> Nếu bạn gán l:=length(S) và vòng FOr bạn dùng
> For I:=l downto 1 do ........ thì chương trình sẽ không đúng


 Tại sao vòng for lùi lại sai nhỉ? Bạn cho test được không? Theo lí thuyết thì không thể sai được. Kì lạ thật.

----------


## 53caugiay

> Tại sao vòng for lùi lại sai nhỉ? Bạn cho test được không? Theo lí thuyết thì không thể sai được. Kì lạ thật.


- test aaaaaaaaaaaaba 
- nếu gán n=length(s) nhưng giảm n khi s_='a' thì k sai 

@ Nguyên : c sr , c toàn thử test 'a' k àh 

THÔI , BÀN HOÀI , CÓ CODE TỐI ƯU R`_

----------


## tvhp2015

> - test aaaaaaaaaaaaba 
> - nếu gán n=length(s) nhưng giảm n khi s_='a' thì k sai 
> 
> @ Nguyên : c sr , c toàn thử test 'a' k àh 
> 
> THÔI , BÀN HOÀI , CÓ CODE TỐI ƯU R`_


_
Thế cuối cùng thì sai ở đâu? Bạn đưa test để cm nó đúng hay sai thế?_

----------


## bell.lina

> Thế cuối cùng thì sai ở đâu? Bạn đưa test để cm nó đúng hay sai thế?


nếu gán n:=length(s)
for i:=n downto .... 
mà k thêm lệnh dec(n) thì code sai

----------


## HuaAnh

http://forum.***************/topic/371341-xoa-ky-tu-khoang-trang-trong-chuoi/

----------


## ngoclongnb1609

Bạn có thể dùng lệnh pos để xử lí

----------

