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

edytuj

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

Definiowanie zakresu

edytuj

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

edytuj
Zapis zakresów w językach programowania
sposób zapisu języki programowania miejsce stosowania
w1..w2 Pascal definicja typu okrojonego, definiowanie granic indeksów tablic
Modula-2 definicja typu okrojonego, w literale zbiorowym, bitowym
Ada instrukcja iteracyjna, wycinek tablicy – podtablica
Perl, D, Windows PowerShell wycinek tablicy – podtablica
range w1..w2 Ada definicja podtypu/typu okrojonego
w1 to w2 Pascal, Ada, BASIC instrukcja iteracyjna
Visual Basic (Visual Studio 2008) instrukcja iteracyjna, zapis skrócony listy wartości
w2 downto w1 Pascal instrukcja iteracyjna
w1 to: w2 Smalltalk konstruktor klasy
range(w1,w2) Python, PHP instrukcja iteracyjna
w1,w2 Fortran instrukcja iteracyjna
from w1 by w2 Algol 68 instrukcja iteracyjna
w1:w2[:step] Fortran, Python, S-Lang wycinek tablicy – podtablica
w1:w2 MATLAB wycinek tablicy – podtablica, wyrażenie
w1:w2 Icon, Snobol wycinek łańcucha, listy
w1 w2 Common Lisp wycinek tablicy – podtablica

Zakresy w zastosowaniach

edytuj

Definiowanie typów okrojonych

edytuj
Osobny artykuł: Typ okrojony.

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

edytuj

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

edytuj

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ą

edytuj

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

edytuj

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

edytuj

Zobacz też

edytuj