2014-06-18 3 views
0

문장이나 문구에서 모든 모음을 제거하는 프로그램을 만들려고합니다. 구문 오류가 발생하지 않지만 '차가운'단어 나 두 개 이상의 모음이있는 단어를 추가하면 모두 제거되지는 않습니다. 왜 이런거야? 삭제하는 대신 카운트 다운 때까지 계산하는문구에서 모든 모음을 제거하려고 시도했습니다.

procedure TForm1.btnProcessClick(Sender: TObject); 

Var Sentence: string; 
K : integer; 
Begin 
Sentence :=uppercase(edtSentence.text); 
For k := 1 to length(sentence) do 
If (sentence[k] in ['A', 'E', 'I', 'O', 'U']) then 
begin 
Delete(sentence,k,1); 
Lbloutput.caption := sentence; 
end; 
+0

이렇게하면 문장이 모든 대문자로 바뀝니다.문장 자체를 확인하기 전에 각 문자를 대문자로 변환하는 것이 왜 변하지 않을까요? – alcalde

+1

또한 시작 ... 끝에 문제가 있습니다. 편지를 지울 때마다 자막을 지정하는 것 같습니다. 블록 밖으로 이동하면 한 번만 수행하면됩니다. – alcalde

답변

3

: 다음은 내 코드입니다.

For K := Length(Sentence.Text) DownTo 1 Do

+0

고마워요,하지만 왜 내가 그것을 어떻게 표현하지 못하니? – user108104

+1

디버거에서 코드를 단계별로 실행하고'K'의 값과'Sentence'에서 가리키는 문자에주의하십시오 –

+6

한 문자를 제거했지만 여전히 루프 색인 변수를 증가시킬 때 실제로 다음 문자를 건너 뜁니다 캐릭터;) 이것은 정말 고전적인 허점입니다. 목록, 배열 또는 기타 등등에서 항목을 제거하려면 역순으로 수행해야합니다. 그렇지 않으면 while 루프 대신 for 루프를 사용해야합니다. – Frazz

0

당신은 모든 문자를 통해 루프 및 그 방법으로 제거 할 수 있습니다, 또는 당신은 StringReplace와 사용할 수 있습니다 : -

루프 읽어야합니다. 유일한 단점은 모든 모음에 대해 별도로 사용해야한다는 것입니다.

procedure TForm1.btnProcessClick(Sender: TObject); 
Var Sentence: string; 
Begin 
Sentence:=edtSentence.text; //No need to capitalize the string 
Sentence:=StringReplace(Sentence, 'a', '', [rfReplaceAll, rfIgnoreCase]); 
Sentence:=StringReplace(Sentence, 'e', '', [rfReplaceAll, rfIgnoreCase]); 
Sentence:=StringReplace(Sentence, 'i', '', [rfReplaceAll, rfIgnoreCase]); 
Sentence:=StringReplace(Sentence, 'o', '', [rfReplaceAll, rfIgnoreCase]); 
Sentence:=StringReplace(Sentence, 'u', '', [rfReplaceAll, rfIgnoreCase]); 
end; 
0

다른 대답은 올바른 대체 솔루션입니다. 그러나 귀하의 질문 중 일부는 "왜 이거지?"였습니다.

기본적으로 "for K : = [...]"는 "for"루프의 지속 기간 동안 문장의 길이가 고정되어 있다고 가정하지만 Delete() 변경 사항을 호출하는 작업은 변경됩니다 문장의 길이, 그래서 그렇게함으로써, 당신은 자신의 발 아래에서 양탄자를 당기고 있어요.

이 코딩 문제에 대해 생각하는 방식은 공항 체크인 대기열을 사용하는 경우와 유사합니다.

  • 당신은 큐에있는 사람의 수를 계산 ("... 기장 (문장)에";와 그주의 "에 대한 ..."이 한 번만 발생, 루프가 시작되기 전에)

  • 당신은 앞에서부터 순서대로 큐를 스캔 :

  • 누군가가 의심스러운-찾고에 도착 ("K에 대한 = 1 [...]"), 당신은 "(큐에서 그들을 끌어 삭제 ([...] ")

  • 뽑힌 사람 뒤에 모두 셔플 한 곳 (문장을 지우고, 문자를 지울 때).

  • 하지만 (잘못) 사람이 꺼내 곳을 넘어 하나 인 큐에있는 다음 장소에 스캔을 다시는/그녀의 그를하지 다음 사람로했다. 그래서 대기열에있는 테러범을 그리워합니다.

  • 그뿐만 아니라 스캔을 시작하기 전에 얼마나 많은 사람들을 스캔할지 결정했습니다 ("[길이 ... (길이)]"). 그러나 대기열은 내가 가진 사람들의 수에 의해 단축되었습니다 그래서 결국에는 더 이상 오래 살지 않는 곳을 처리하는 시점에 도달하게됩니다. 조사 창에서 문장 [K]을 보면, 지금까지 삭제 된 문자 수보다 큰 위치에서 # 0으로 평가됩니다. 당신의 루프 처리가 잠재적으로 당신이 처리하고있는 물건의 길이를 변경할 때마다

그래서, 각 변경 후 길이를 재 - 확인하고 올바른 지점에서 처리를 다시 확인하십시오. 이것은, btw, while 루프가 만들어진 것들 중 하나입니다.

관련 문제