Zakres (programowanie)

Zakres (programowanie), także przedział, wycinek, to zdefiniowanie w kodzie źródłowym pewnego przedziału wartości wyodrębnionego z wartości określonego typu bazowego.

Zastosowania zakresu

Zakresy w kodzie źródłowym stosuje się do:

Definiowanie zakresu

Zdefiniowanie zakresu w kodzie źródłowym składa się z określenia dwóch wybranych wartości pewnego typu bazowego:

  • wartości początkowej (mniejszej)
  • wartości końcowej (większej).

Wartości graniczne mogą zostać zapisane jako:

Od powyższych zasad istnieje odstępstwo w przypadku definiowania zakresu dla sterowania przebiegiem instrukcji iteracyjnej. W tym przypadku wartość początkowa – jeżeli dany język programowania dopuszcza taką sytuację – może być większa od wartości końcowej, a granice przedziałów zwykle nie muszą być wartością znaną na etapie kompilacji, lecz mogą być wyznaczane w trakcie wykonywania programu na podstawie obliczeń.

Przykład w języku Pascal:

 type miesiąc=1..12; {zakres od 1 do 12 liczb całkowitych}
 var i : miesiąc;
 …
 for i=1 to 6 do … {zakres od 1 do 6}

W wielu językach istnieją pewne ograniczenia dotyczące typu bazowego dla którego można stosować zakresy. Np. w języku Pascal, w kontekstach kodu źródłowego, w których stosuje się zakresy, dopuszcza się aby typem bazowym był wyłącznie jeden z typów porządkowych.

Zapis zakresów

Zapis zakresów w językach programowania
sposób zapisujęzyki programowaniamiejsce stosowania
w1..w2Pascaldefinicja typu okrojonego, definiowanie granic indeksów tablic
Modula-2definicja typu okrojonego, w literale zbiorowym, bitowym
Adainstrukcja iteracyjna, wycinek tablicy – podtablica
Perl, D, Windows PowerShellwycinek tablicy – podtablica
range w1..w2Adadefinicja podtypu/typu okrojonego
w1 to w2Pascal, Ada, BASICinstrukcja iteracyjna
Visual Basic (Visual Studio 2008)instrukcja iteracyjna, zapis skrócony listy wartości
w2 downto w1Pascalinstrukcja iteracyjna
w1 to: w2Smalltalkkonstruktor klasy
range(w1,w2)Python, PHPinstrukcja iteracyjna
w1,w2Fortraninstrukcja iteracyjna
from w1 by w2Algol 68instrukcja iteracyjna
w1:w2[:step]Fortran, Python, S-Langwycinek tablicy – podtablica
w1:w2MATLABwycinek tablicy – podtablica, wyrażenie
w1:w2Icon, Snobolwycinek łańcucha, listy
w1 w2Common Lispwycinek tablicy – podtablica

Zakresy w zastosowaniach

Definiowanie typów okrojonych

Typ okrojony definiuje się jako ograniczenie ciągłe dostępnych wartości pewnego typu bazowego, stosując w jego definicji zapis zakresu.

Przykład w języku Ada:

 subtype miesiac is INTEGER range 1..12;

Definiowanie granic indeksów

W definicjach struktur danych zakres definiujący granice indeksów

  • ustala ilość elementów danej struktury (i tym samym wielkość pamięci jaką musi zarezerwować translator)
  • określa sposób odwoływania się (identyfikowania) do poszczególnych, pojedynczych elementów.

Tak jest np. w języku Pascal, w którym indeksy mogą być danymi typu porządkowego (z wyjątkiem Longint), np.

 type sp=array[1..12] of Real;

Nie wszystkie języki dopuszczają taki sposób zapisu indeksów. W pewnych językach jednak wartość początkowa zakresu może być narzucona, nie definiuje się indeksów w postaci zakresu lecz liczbę elementów struktury danych, np. języki C i Visual Basic, a zakres indeksów liczony jest od wartości dolnej narzuconej przez język, np. od 0 do LICZBA_ELEMENTÓW – 1; lub od 1 do LICZBA_ELEMENTÓW.

Odwołania do podtablic

Odwołania takie występują w niewielu językach programowania, częściej w systemach obliczeniowych. W tym przypadku zakres indeksuje określoną tablicę tworząc pewną nową, mniejszą podtablicę, wycinek. Taka konstrukcja może występować w wyrażeniach, na tych samych zasadach obowiązujących w danym systemie co tablica macierzysta. Jeszcze rzadziej występuje konstrukcja pozwalająca wybrać w takim odwołaniu krok – czyili wybrać co drugi, trzeci, ... n-ty element.

Sterowanie instrukcją iteracyjną

Zakres w instrukcji iteracyjnej zdeterminowany jest przez pewien zakres określający ilość powtórzeń iteracji. Zakres ten określa również wartości, które przyjmuje pewna zmienna sterująca. W tym przypadku konkretny algorytm może również wymagać definiowania:

  • zakresów odwrotnych, tj. takich w których wartość początkowa jest większa od wartości końcowej, tak aby zachować wymaganą kolejność przypisywanych do zmiennej sterującej wartości – taka konstrukcja jest dostępna w większości języków programowania
  • zdefiniowania kroku – dostępna w pewnych językach.

Przykład w języku Pascal:

 for i=10 downto 1 do …

Skracanie zapisu

Zakres może być również wygodnym sposobem skrócenia zapisu literałów złożonych, np. tablicowych, zbiorowych, list itp.. Zastosowanie zakresu spowoduje, że do takiego złożonego literału zostaną włączone wszystkie wartości objęte przez wymieniony zakres.

Przykład w języku Modula-2:

 VAR a : BITSET
 (* ustawienie (na wartość 1), bitów nr: 1, 3, 4, 5, 6, 7, 8, 12, 14 *)
 a:={1, 3..8, 12, 14};

Takie rozwiązania może również stosować w instrukcji wyboru.

Przykład w języku Visual Basic:

 Select Case Zmienna
   Case 1
     ...
   Case 2, 5 To 10, 12, 16 To 20
     ...
   Case Else
     ...
 End Select

Bibliografia

Zobacz też