I na koniec (1) pozwolę sobie na małe podsumowanie. Mam wrażenie, że większość adeptów
programowania czytając o pętlach zatrzymuje się na pętli for to do
, dalej już nie czytając. A przecież pozostałe się przydają.
Tutaj krótszym rozwiązaniem niewątpliwie było użycie for downto do
. Chociaż ja sam jednak nadal bym używał while do
. Po prostu, tak jak wspomniałem, jest to zapis bardziej algorytmiczny
.
I na koniec (2) małe rozwinięcie twojego tematu jako przykład, że pętla while do
może być niezastąpiona:
Przyjmijmy, że nasze memo to miejsce, gdzie trafiły komunikaty z systemu. Niektóre, uważamy za mało istotne, więc je usuwamy (czyli to co robimy z liniami, które zawierają jakiś znak).
W tym przypadku pętla for downto do
świetnie się sprawdzi, bo znamy początkową liczbę linii z komunikatami w memo (Idziemy od góry do dołu).
A teraz wyobraź sobie, że w trakcie usuwania
linii, system coś nam podrzuci, czyli doda kolejną linię w memo. Pętla for downto do
nie zauważy w ogóle tego faktu i zignoruje te dodane linie. Pętla while do
przy każdym przebiegu sprawdza, czy ponad tym co już przeleciała jeszcze coś jest i weźmie to pod uwagę przy ewentualnym usuwaniu.
Konkluzja: pamiętaj o tym, że nie jedno for
tworzy pętle. :)
I na koniec (3), już jako swojego rodzaju przekomarzanie się:
simplex napisał(a)
Pętli for to do nie za bardzo można tutaj zastosować, bo Memo1.Lines.Count może się zmieniać wraz z przebiegiem pętli, a po skasowaniu jednej linii indeks następnej zmniejszy się o 1 i nie zostanie ona w ogóle sprawdzona.
var
i: Integer;
begin
for i:= 0 to Memo1.Lines.Count - 1 do
if Pos(Edit1.Text, Memo1.Lines[Memo1.Lines.Count - 1 - i]) > 0 then
begin
Memo2.Lines.Add(Memo1.Lines[Memo1.Lines.Count - 1 - i]);
Memo1.Lines.Delete(Memo1.Lines.Count - 1 - i);
end;
Wiem, że to jest odwracanie kota ogonem, ale dowód, że jeśli się bardzo chce, to wszystko można :)