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:
- definiowania typów okrojonych, zakresowych
- definiowania granic wymiarów liniowych struktur danych
- tworzenia odwołań do podtablic, wycinków
- sterowania przebiegiem instrukcji iteracyjnych
- skracania zapisu pewnych literałów złożonych.
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
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
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
- Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, ISBN 83-204-1101-7
- Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994 r., ISBN 83-85060-53-7, ISSN 0867-6011
- Niklaus Wirth, Modula-2, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0828-8
- A. Nico Habermann, Dewayne E. Perry, Ada dla zaawansowanych, Wydawnictwa Naukowo-Techniczne, Warszawa 1989 r., seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1058-4
- Ryszard K. Kott, Krzysztof Walczak. Programowanie w języku Fortran 77, Wydawnictwa Naukowo-Techniczne, Warszawa 1991, ISBN 83-204-1362-1