|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Tłumaczenie: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
Funkcje definiowalne przez użytkownika oraz inne bezpośrednio dostępne w ZX Spectrum przy użyciu DEF, LEN, STR$, VAL, SGN, ABS, INT, SQR, FN
| SPIS TREŚCI |
|
DEF
LEN, STR$, VAL, SGN, ABS, INT,
SQR
FN
Rozważmy maszynę do robienia kiełbasek. Wkłada się z jednej strony kawał mięsa, przekręca dźwignię, a z drugiej strony wychodzi kiełbaska. Mięso wieprzowe da kiełbasę wieprzową, mięso rybne da kiełbasę rybną, a wołowina da kiełbasę wołową.
Funkcje są praktycznie nierozróżnialne od maszyny do kiełbasek, lecz jest pewna różnica: działają one na liczbach i łańcuchach, a nie na mięsie. Dostarczasz jedna wartość (zwaną argumentem), mielisz ją wykonując na niej jakieś obliczenia, a na końcu otrzymujesz inną wartość, wynik.
| Wprowadzanie mięsa → | Maszyna do kiełbasek |
→ Wyjście: kiełbaski |
| Wprowadzanie argumentu → | Funkcja | → Wyjście: wyniku |
Różne argumenty dają różne wyniki, a jeśli argument jest zupełnie nieodpowiedni, to funkcja zatrzyma się i da raport błędów.
Skoro możesz posiadać różne maszyny do robienia różnych produktów – jedną do kiełbasek, drugą do ścierek, a trzecią do paluszków rybnych itd., różne funkcje będą wykonywały różne obliczenia. Każda będzie posiadała swoją własną wartość w celu odróżnienia jej od innych.
Funkcję stosujesz w wyrażeniach przez wpisanie jej nazwy, za którą występuje argument, a kiedy to wyrażenie będzie obliczane, zostanie wyznaczony wynik funkcji.
Dla przykładu mamy funkcję o nazwie LEN, która wylicza długość łańcucha. Jej argumentem jest łańcuch, którego długość chcesz znaleźć, a wynikiem ta długość, zatem jeśli wpiszesz:
to komputer wypisze odpowiedź 8, czyli liczbę znaków w 'Sinclair'. (Aby otrzymać LEN, jak przy większości nazw funkcji, musisz użyć trybu rozszerzonego: naciśnij jednocześnie CAPS SHIFT i SYMBOL SHIFT, aby zmienić kursor z L na E , a następnie naciśnij klawisz K.)
Jeśli w jednym wyrażeniu wymieszasz funkcje i operacje, to funkcje będą wyliczane przed operacjami. Jednakże możesz obejść tę regułę, stosując nawiasy. Na przykład, oto dwa wyrażenia, które różnią się jedynie nawiasami, a mimo to obliczenia są wykonywane w całkowicie innej kolejności w każdym z nich (chociaż, co się czasami zdarza, wynik końcowy jest taki sam).
| LEN "Fred"+ LEN "Bloggs" | LEN ("Fred"+"Bloggs") |
| 4+LEN "Bloggs" | LEN ("FredBloggs") |
| 4+6 | LEN "FredBloggs" |
| 10 | 10 |
Oto kilka dalszych funkcji.
STR$ zamienia liczby na łańcuchy: jej argumentem jest pewna liczba, a wynikiem łańcuch, który pojawiłby się na ekranie, gdyby tę liczbę wyświetlić za pomocą rozkazu PRINT. Zwróć uwagę na zakończenie nazwy tej funkcji znakiem $, co pokazuje, że wynik jest łańcuchem. Na przykład, mógłbyś wpisać polecenie
które dałoby dokładnie taki sam efekt jak wpisanie
Albo mógłbyś wpisać
i otrzymałbyś odpowiedź 3, ponieważ
czyli 3 znaki.
VAL jest jakby odwrotnością STR$: zamienia ona łańcuchy w liczby. Na przykład:
W pewnym sensie VAL jest odwrotnością STR$, ponieważ jeśli weźmiesz dowolną liczbę i zastosujesz do niej funkcję STR$, a następnie VAL do wyniku, to otrzymasz z powrotem początkową liczbę. Jednakże, jeśli weźmiesz łańcuch, zastosujesz do niego VAL, a następnie STR$ do wyniku, to nie zawsze otrzymasz z powrotem oryginalny łańcuch.
VAL jest niesamowicie potężną funkcją, ponieważ łańcuch będący jej argumentem nie jest ograniczony do wyglądania jak goła liczba – może to być dowolne wyrażenie liczbowe. W ten sposób przykładowo
lub nawet:
Pracują tu dwa procesy. W pierwszym argument
VAL zostaje przeliczony jako łańcuch:
wyrażenie łańcuchowe
Może to być dosyć pogmatwane, jeśli przestaniesz się posługiwać rozumem; na przykład:
(Pamiętaj, że wewnątrz łańcucha cudzysłów musi być wpisany dwukrotnie. Jeśli wejdziesz w zagnieżdżenia łańcuchów, to odkryjesz, że cudzysłów musi być powtórzony czterokrotnie, a nawet ośmiokrotnie.)
Istnieje jeszcze jedna funkcja, raczej podobna do VAL, chociaż prawdopodobnie mniej przydatna. Nazywa się VAL$. Jej argumentem wciąż jest łańcuch, lecz wynikiem też jest łańcuch. Aby zrozumieć jej działanie, przypomnij sobie sposób działania VAL w dwóch krokach: najpierw jej argument zostaje przetworzony jako łańcuch, następnie usuwane są cudzysłowy, a to co zostanie jest przetwarzane jako liczba. Z VAL$ pierwszy krok jest taki sam, lecz po usunięciu cudzysłowów łańcucha w drugim kroku, to co pozostało jest przetwarzane jak kolejny łańcuch. Stąd:
(Zauważ, jak znów rozmnożyły się cudzysłowy.) Wykonaj:
i wydrukuj na ekranie każde z następujących
wyrażeń:
SGN jest funkcją znaku (czasami zwaną z łaciny signum – znak). To pierwsza oglądana przez ciebie funkcja, która nie ma nic wspólnego z łańcuchami, ponieważ zarówno jej argument jak i wynik są liczbami. Wynik wynosi +1, jeśli argument jest dodatni (większy od zera), 0, jeśli argument jest równy zero i -1, jeśli argument jest ujemny (mniejszy od zera).
ABS to kolejna funkcja, której argument i wynik są liczbami. Zamienia ona argument na liczbę dodatnią (lub zero), co staje się jej wynikiem, przez opuszczenie znaku, zatem przykładowo:
INT oblicza część całkowitą liczby, również ujemną. Funkcja ta zamienia liczbę ułamkową na liczbę całkowitą przez odrzucenie jej części ułamkowej, zatem przykładowo
Uważaj, gdy stosujesz tę funkcję do liczb ujemnych, ponieważ zawsze zaokrągla ona w dół: stąd przykładowo:
SQR oblicza pierwiastek kwadratowy liczby – wynik, który pomnożony przez siebie daje argument. Na przykład:
| SQR 4 = 2, ponieważ 2*2=4 SQR 0.25 = 0.5, ponieważ 0.5*0.5=0.25 SQR 2 = 1.4142136 (w przybliżeniu), ponieważ 1.4142136*1.4142136=2.0000001 |
Jeśli pomnożysz przez siebie dowolną liczbę (nawet ujemną), to wynik jest zawsze dodatni (lub równy zero dla zera). Oznacza to, iż liczby ujemne nie posiadają pierwiastków (w zbiorze liczb rzeczywistych, oczywiście – istnieją tzw. pierwiastki zespolone, ale to inna bajka), zatem jeśli zastosujesz SQR do ujemnego argumentu, otrzymasz raport błędu A Invalid Argument (A Nieprawidłowy Argument).
Możesz również samemu definiować funkcje. Dozwolona nazwa dla takiej funkcji składa się z FN i litery (jeśli wynik to liczba) lub FN litera i znak $ (jeśli wynik jest łańcuchem). Funkcje te są bardziej restrykcyjne na temat nawiasów: argument musi być umieszczony w nawiasach.
Funkcję definiujesz, umieszczając gdzieś w programie polecenie
DEF. Na przykład, oto definicja funkcji
DEF uzyskuje się w trybie
rozszerzonym, używając
x w nawiasach jest nazwą, za pomocą której chcesz się odwoływać do argumentu funkcji. Do tego zadania możesz użyć dowolnej jednoliterowej nazwy (lub w przypadku argumentu łańcuchowego – nazwy jednoliterowej z $).
Po znaku = następuje właściwa definicja funkcji. Może to być dowolne wyrażenie i może ono odwoływać się również do argumentu, wykorzystując nadaną mu przez ciebie nazwę (w tym przypadku jest to x) tak, jakby była to zwykła zmienna.
Gdy wprowadzisz ten wiersz, możesz wywołać
zdefiniowaną funkcję w taki sam sposób,
jak funkcje własne komputera, wpisując jej nazwę
| PRINT FN s(2) PRINT FN s(3+4) PRINT 1+INT FN s(LEN "kurczaki"/2+3) |
Po umieszczeniu w programie odpowiedniego polecenia DEF, możesz używać własnych funkcji w wyrażeniach tak samo swobodnie, jak funkcji komputera.
Uwaga: w niektórych dialektach języka BASIC należy w nawiasach umieszczać nawet argumenty funkcji własnych komputera. Tak nie jest w ZX Spectrum BASIC.
INT zawsze zaokrągla w dół. Aby zaokrąglić do najbliższej liczby całkowitej, dodaj najpierw .5 – mógłbyś napisać własną funkcję, która to robi:
Wtedy otrzymywałbyś przykładowo:
| FN r(2.9) = 3 FN r(2.4) = 2 FN r(-2.9) = -3 FN r(-2.4) = -2 |
Porównaj te wyniki z wynikami, gdy zamiast
Wpisz następujący program:
| 10 LET x=0: LET y=0: LET a=10 20 DEF FN p(x,y)=a+x*y 30 DEF FN q()=a+x*y 40 PRINT FN p(2,3),FN q() |
W programie tym występuje wiele subtelności.
Po pierwsze, funkcja nie jest ograniczona do jednego argumentu: może posiadać ich więcej lub nawet żadnego – lecz wciąż muszą pozostać nawiasy.
Po drugie, nie ma znaczenia, gdzie w programie umieścisz polecenia DEF. Gdy komputer wykona wiersz 10, po prostu przeskoczy wiersze 20 i 30, aby przejść do wiersza 40. Jednakże muszą one być gdzieś w programie. Nie można umieścić ich w rozkazie bezpośrednim (bez numeru wiersza).
Po trzecie, x i y są zarówno
nazwami zmiennych w programie jako całości oraz
nazwami argumentów funkcji
Teraz zmień wiersz 20 na:
Tym razem
Niektóre języki BASIC (ale nie ZX Spectrum BASIC) posiadają funkcje o nazwach LEFT$, RIGHT$, MID$ i TL$.
LEFT$(a$,n) daje podłańcuch a$ składający się z n pierwszych znaków.
RIGHT$(a$,n) daje podłańcuch a$ składający się z n ostatnich znaków.
MID$(a$,n1,n2) daje podłańcuch a$ składający się z n2 znaków poczynając od pozycji n1.
TL$(a$) daje podłańcuch a$ zawierający wszystkie znaki z wyjątkiem pierwszego.
Możesz napisać kilka funkcji użytkownika, które będą wykonywały to samo: np.
| 10 DEF FN t$(a$)=a$(2 TO ): REM TL$ 20 DEF FN l$(a$,n)=a$( TO n): REM LEFT$ |
Sprawdź, czy funkcje te dobrze działają z łańcuchami o długości
Zauważ, że nasza funkcja
Użyj funkcji
jeśli za x podstawisz dowolną liczbę dodatnią, i
bez względu na znak x (dlaczego ABS?).
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.