Programowanie w języku Delphi

For-in

  • 2010-10-31 18:27
  • 5 komentarzy
  • 3559 odsłon
  • Oceń ten tekst jako pierwszy
For-in - pętla języka Delphi

Nowością w Delphi 2005 jest nowa wersja pętli for, która umożliwia operowanie na zbiorach, tablicach czy ciągach znakowych. Odpowiednikiem pętli for-in w innych językach programowania jest pętla foreach (np. w PHP). Przykładowo, chcielibyśmy przeanalizować, przeszukać każdy element tablicy. Możemy w tym celu skorzystać ze zwykłej pętli for:

program Loop_app;
 
{$APPTYPE CONSOLE}
 
uses SysUtils;
 
var
  I : Integer;
 
const
  A : array[1..10] of String = ('Jeden', 'Dwa', 'Trzy', 'Cztery',
  'Pięć', 'Sześć', 'Siedem', 'Osiem', 'Dziewięć', 'Dziesięć');
 
begin
  for I := Low(A) to High(A) do
  begin
     Writeln(IntToStr(i) + ': ' + A[i]);
  end;
 
  Readln;
end.


W programie użyłem wcześniej omówionych konstrukcji, czyli pętli For oraz tablicy deklarowanej jako stała. Zobaczmy teraz, w jaki sposób można napisać tak samo działający program z użyciem składni for-in:

program Loop_app;
 
{$APPTYPE CONSOLE}
 
uses SysUtils;
 
var
  S : String;
 
const
  A : array[1..10] of String = ('Jeden', 'Dwa', 'Trzy', 'Cztery',
  'Pięć', 'Sześć', 'Siedem', 'Osiem', 'Dziewięć', 'Dziesięć');
 
begin
  for S in A do
  begin
    Writeln(S);
  end;
 
  Readln;
end.


Składnia for-in posiada prostą konstrukcję. Najpierw podaje się nazwę zmiennej, do której zostanie przypisany aktualny element zbioru lub tablicy. Po słowie kluczowym in należy umieścić nazwę tablicy/zbioru. Wydaje mi się że taka konstrukcja jest czytelniejsza.

Przy użyciu pętli for mamy możliwość odczytania wartości zmiennej I, która określa numer iteracji. Takie rozwiązanie możemy także wprowadzić w naszym przykładzie, deklarując dodatkową zmienną I:

begin
  I := 1;
 
  for S in A do
  begin
    Writeln(IntToStr(i) + ': ' + S);
 
    Inc(i);
  end;
 
  Readln;
end.


Konstrukcja for-in w połączeniu z łańcuchami


Konstrukcja for-in może być wykorzystywana wraz z tablicami (co zaprezentowałem w poprzednich przykładach) oraz zbiorach czy ciągach znakowych String. Do każdego znaku ciągu można odwołać się podając numer indeksu w nawiasie kwadratowym, podobnie jak odwołujemy się do elementu tablicy. Czyli np. do pierwszego znaku ciągu można odwołać się w ten sposób:

  S := 'Delphi';
  Writeln(S[1]); // wyświetlona litera: D


Operacji na poszczególnych znakach ciągu S można dokonać za pomocą konstrukcji for-in:

program Loop_app;
 
{$APPTYPE CONSOLE}
 
uses SysUtils;
 
var
  S : String;
  C : Char;
 
begin
  Write('Wpisz tekst: ');
  Readln(S);
 
  Writeln('---');
 
  for C in S do
  begin
    Writeln(C);
    Sleep(1000);
  end;
end.


Ten prosty program w pętli wyświetla każdy znak ciągu znakowego S, jeden pod drugim w odstępach sekundowych.

Zobacz też:

5 komentarzy

montgomerry 2009-01-30 13:58

Czy istnieje jakaś zasadnicza różnica pomiędzy pętlą 'for' a pętlą 'for-in', poza pewną wygodą tej ostatniej w pewnych przypadkach?

Format 2008-10-22 15:58

Czyli stosujemy tę pętle w tedy, gdy wartość elementu zbioru/tablicy jest ważniejsza od jej indexu...

Marooned 2006-01-13 16:35

a.. bo ja patrzyłem na linki z głównej i for-in było nad while a linki różne.. ok

Adam Boduch 2006-01-12 18:17

Eee, poprzez For-in tez jest dostep :) Po prostu umieszczona zostala w 2 kategoriach.

Marooned 2006-01-12 17:28

Czemu ta pętla jest głęboko w Delphi/../../.. a np. While w od razu w Delphi/ ?