CSL-CROOK - Złożona instrukcja FIND
Instrukcja FIND (znajdź), podobnie jak instrukcje opisane wcześniej, wykonują serie badań na elementach wybranego zbioru. Zmienna indeksowa przyjmuje przy tym kolejno wartości indeksu obiektu każdego elementu. Instrukcja ta powoduje ponadto wykonanie operacji selekcji spośród podzbioru elementów spełniających wymagania łańcucha badań obiektu spełniającego pewne kryterium dodatkowe.
Ogólna postać instrukcji FIND
Instrukcja FIND ma następującą postać:
- FIND <zmienna> <zbiór> <kryterium> <część adresowa>
- ....
- .... (łańcuch badań)
Gdzie:
- zmienna - nazwa zmiennej typu INTEGER
- zbiór - nazwa zbioru
- część adresowa - o postaci e1 @ e2
- kryterium - może być jednym z następujących:
- ANY (wybrany losowo)
- FIRST (pierwszy)
- LAST (ostatni)
- MAX (<wyrażenie>)
- MIN (<wyrażenie>)
Kryteria te są szczegółowo opisane w następnych punktach tego opracowania. łańcuch badań jest realizowany na każdym elemencie zbioru, przy czym zmienna przyjmuje kolejno wartości indeksu obiektu poszczególnych elementów, aż do momentu znalezienia obiektu spełniającego wymagania zarówno łańcucha badań jak i kryterium dodatkowego lub do zakończenia badania całego zbioru. Jeżeli łańcuch badań daje w wyniku fałsz dla każdego z elementów zbioru lub jeżeli w zbiorze nie ma ani jednego obiektu, wówczas sterowanie przechodzi do instrukcji z etykietą e2 pozostawiając zmienną jako wartość nieokreśloną. W przeciwnym razie po wykonaniu instrukcji zmienna zachowuje wartość indeksu obiektu wybranego elementu zbioru pozostając dalej do dyspozycji następnych instrukcji a sterowanie przechodzi do instrukcji o etykiecie e1. łańcuch badań może być opuszczony. W takim przypadku obiekt zostanie wybrany zawsze, chyba że zbiór jest pusty.
Instrukcja FIND ... ANY
Instrukcja ta ma następującą postać:
- FIND i Z1 ANY e1 @ e2
Instrukcja ta powoduje wybór losowy jednego z obiektów spełniających wymagania łańcucha badań. W tym celu najpierw zostaje wygenerowana liczba losowa określająca wybór jednego z elementów pełnego zbioru. Poczynając od tego elementu następuje zwyczajne badanie zbioru. Przeszukiwanie trwa do momentu napotkania pierwszego obiektu, dla którego wynik łańcucha badań jest prawdą lub do zakończenia badania wszystkich elementów zbioru.
Instrukcja FIND ... FIRST
Postać instrukcji:
- FIND i Z1 FIRST e1 @ e2
- ....
- .... (łańcuch badań)
Obiektem wybranym jest pierwszy obiekt w zbiorze, dla którego wynik łańcucha badań jest prawdą. Poczynając od pierwszego obiektu w zbiorze badane są po kolei następne obiekty aż do znalezienia pierwszego z nich, dla którego łańcuch badań daje prawdę.
Instrukcja FIND ... LAST
Postać instrukcji:
- FIND i Z1 LAST e1 @ e2
- ....
- .... (łańcuch badań)
Wybrany obiekt jest ostatnim elementem zbioru Z1 dającym prawdę jako wynik łańcucha badań. Badanie zbioru Z1 rozpoczyna się od ostatniego jego elementu i przebiega do początku zbioru poprzez testowanie kolejnych jego elementów. Tak prowadzone badanie ulega zakończeniu po znalezieniu pierwszego elementu zbioru dającego prawdę w łańcuchu badań.
Instrukcja FIND ... MAX
Postać instrukcji:
- FIND i Z1 MAX (<wyrażenie>) e1 @ e2
- ....
- .... (łańcuch badań)
Badany jest każdy obiekt należący do zbioru Z1 i jeżeli wynik łańcucha badań jest prawdą, wówczas następuje obliczenie wartości wyrażenia. Obiekt dal, którego wartość tego wyrażenia jest największa spośród uzyskanych, jest obiektem poszukiwanym.
Instrukcja FIND ... MIN
Postać instrukcji:
- FIND i Z1 MIN (<wyrażenie>) e1 @ e2
- ....
- .... (łańcuch badań)
Instrukcja ta daje podobny efekt jak instrukcja FIND...MAX z tą różnicą, że wybrany obiekt odpowiada najmniejszej z otrzymanych wartości wyrażenia.
Pogrążanie instrukcji FIND
Instrukcja FIND z pustą częścią adresową może występować jako badanie wewnątrz łańcucha badań. Zastosowanie tej własności jest budowanie instrukcji FIND pogrążonej wewnątrz drugiej instrukcji FIND.
- FIND ......
- ...
- FIND .....
- ....
- ....
- ....
- ....
W niektórych przypadkach, np. kiedy FIND występuje w łańcuchu badań instrukcji FIND...MAX lub FIND...MIN, poszukiwany wynik wewnętrznej instrukcji FIND wymaga zapisywania dla następnych powtórzeń łańcucha badań. W tych przypadkach programista musi przewidzieć zapamiętanie każdego wyniku wewnętrznej instrukcji FIND oraz wydobycie żądanego wyniku dla realizacji zewnętrznego łańcucha badań.
Źródło: Translator języka CSL-CROOK dla minikomputera MERA-400 w systemie operacyjnym CROOK-4, Instrukcja Programisty (wersja-17/2), Janusz Gocałek, Jacek Klauziński, Poznań, 1985