You are on page 1of 16

6/!Jotusvldkf!

qpetubxjbojb

82

Wejcie oznacza wprowadzanie danych do komputera na uytek programu. Wprowadzane dane s przypisywane zmiennym mwimy, e s wprowadzane do zmiennych.
Oznacza to, e dana, jak wpisuje uytkownik w odpowiedzi na danie wprowadzenia,
staje si wartoci zmiennej, przechowywan w pamici komputera. Potem korzysta si
z tej zmiennej w dowolnym procesie, jaki wykonuje program.
Dane mona wprowadza tylko do zmiennej. Wprowadzajc warto do zmiennej
powodujemy umieszczenie tej wartoci w komrce pamici przypisanej tej zmiennej.
Jeli zmienna ma ju warto, to nowa warto, ktr wprowadzamy, zajmie jej
miejsce. Stara warto zniknie na zawsze.
Przypisanie okrelonej wartoci do zmiennej realizuj instrukcje podstawiania. S one
jednymi z najczciej uywanych instrukcji w programach. W jzyku AutoLISP istniej
dwie standardowe instrukcje podstawiania: setq oraz set obie z nich zostan teraz
dokadnie omwione.
Programy omwione w tym rozdziale:
PROG_005.LSP
Funkcja do obliczania redniej arytmetycznej z podanego zbioru liczb rzeczywistych.
Przykad zastosowania instrukcji podstawiania setq.
PROG_006.LSP
Modyfikacja programu PROG_005.LSP.
Inny sposb zwrotu wartoci przez funkcj.
Przykad zastosowania instrukcji podstawiania set.

83

BvupMJTQ!!qsbluzd{oz!lvst

Instrukcja podstawiania setq posiada nastpujcy format:


(setq sym1 expr1 [sym2 expr2] ...)

Funkcja przypisuje warto argumentu expr1 symbolowi sym1, warto argumentu


expr2 symbolowi sym2, itd. Jest to podstawowa dla AutoLISPu funkcja suca do
przypisania wartoci. Przy jednokrotnym wywoaniu funkcja setq moe dokona wielu
przypisa, lecz zwraca tylko warto ostatniego argumentu expr.
Poniej, w poszczeglnych punktach, podane zostan sposoby przypisania poszczeglnych typw danych.

6/2/2/ Qs{zqjt
Qs{zqjtbojf!mjd{c!dbl
bojf!mjd{c!dblpxjuzdi
bojf!mjd{c!dblpxjuzdi
j!s{fd{zxjtuzdi
j!s{fd{zxjtuzdi
(setq x 5)

Przypisuje symbolowi x warto 5 i zwraca 5.


Aby si przekona, e rzeczywicie symbol x ma warto 5, naley dokona jego ewaluacji (czyli wyznaczy jego warto).
Command: !x

Jest to rwnowane zapisowi:


Command: (eval x)

5
(setq y 5.0)

Przypisuje symbolowi y warto 5.0 i zwraca 5.0.


(setq z (+ x y))

Oblicza warto wyraenia (+ x y) => 10.0, a nastpnie warto t podstawia pod


symbol z.
(setq x1 5.0e2)

Przypisuje symbolowi x1 warto 500.0 i zwraca 500.0.

6/!Jotusvldkf!qpetubxjbojb

84

(setq x2 5.e2)

Przypisuje symbolowi x2 warto 500.0 i zwraca 500.0.


(setq x3 .5)

Powoduje wypisanie bdu AutoLISPu:


error: invalid dotted pair

Prawidowy zapis tego wyraenia powinien wyglda tak:


(setq x3 0.5)

Przypisuje symbolowi x3 warto 0.5 i zwraca 0.5.


(setq x4 2.)

Przypisuje symbolowi x4 warto 2.0 i zwraca 2.0.


(setq
x5 1
x6 2
x7 3
);setq

Przypisuje symbolowi x5 warto 1, symbolowi x6 warto 2, symbolowi x7 warto


3 oraz zwraca warto ostatniego argumentu, tj. 3.

6/2/3/!Qs{zqjtbojf!tubzdi!
6/2/3/!Qs{zqjtbojf!tubzdi!{oblpxzd
tbojf!tubzdi!{oblpxzdi
{oblpxzdi
Stae znakowe s to stae reprezentujce na przykad znaki alfanumeryczne. Zapisuje si
je ujmujc dany znak w dwa cudzysowy.
"a" oznacza liter a
"1" oznacza cyfr 1 (cyfr, nie liczb)
(setq znak1 "a")

Przypisuje symbolowi znak1 kod litery "a" i zwraca "a".


(setq znak2 "1")

Przypisuje symbolowi znak2 kod cyfry "1" i zwraca "1".


Oczywicie wiesz na pewno, e komputer nie potrafi przechowywa w swojej pamici
adnej litery "a". Moe jednak przechowywa liczby. Dlatego wszystkie litery alfabetu
i znaki specjalne zostay po prostu ponumerowane i to ten numer (kod) danego znaku
jest przechowywany w pamici.

85

BvupMJTQ!!qsbluzd{oz!lvst
S rne sposoby numerowania (kodowania) znakw. Jednym z najbardziej popularnych jest chyba kod ASCII (czytaj aski jest to skrt od American Standard of Code
Interchanged Information). Z tabel kodw ASCII, czyli tym, jakimi liczbami reprezentowane s jakie znaki, moesz si zapozna w dodatku C tej ksiki.
S jednak takie znaki, ktrych nie da si wprost umieci midzy cudzysowami. Su
one do sterowania wypisywaniem tekstu np. przejcie do nowej strony, tabulator,
znak nowej linii. Pomagamy sobie wtedy za pomoc kreski ukonej, tzw ukonika (ang.
backslash czytaj bekslesz). Obok niego stawiamy umown liter, ktra przypomina znaczenie danego znaku.
Przykadowo:
"\n" nowa linia (ang. new line)
"\r" powrt karetki (ang. carriage return)
"\b" cofacz (ang. backspace)
"\t" tabulator poziomy (ang. tabulator)
"\a" sygna dwikowy (ang. alarm)
(setq nowa_linia "\n")

Przypisuje symbolowi nowa_linia kod nowej linii i zwraca "\n".


(setq return "\r")

Przypisuje symbolowi return kod powrotu karetki i zwraca "\r".


Mimo, e widzimy kilka znakw, zapis reprezentuje jeden znak. Czytamy to tak.
Dwa najbardziej zewntrzne cudzysowy mwi nam, e mamy do czynienia ze znakiem.
W rodku za czytamy \ bekslesz: aha, bdzie to co niezwykego. Potem nastpuje
np. litera n. Skoro ma to by co niezwykego, to patrzymy, co na licie niezwykoci
oznacza litera n jest to skrt od new line (nowa linia). Prawda, e jest to proste?
Poniewa pomagalimy sobie stosujc znaki takie jak cudzysowy, kreska ukona, wic
jak zakodowa sam znak cudzysowu? Za pomoc trzech cudzysoww?
(setq znak3 """)

Zapis taki spowoduje wypisanie bdu AutoLISPu:


>1 brak 1 prawego nawiasu.

Nie. Interpreter AutoLISPu zasygnalizuje bd, dlatego musimy doda kresk ukon.
(setq znak3 "\"")

Przypisuje symbolowi znak3 kod cudzysowu i zwraca "\"".

6/!Jotusvldkf!qpetubxjbojb

86

Zapis ten rozumiemy tak: dwa zewntrzne cudzysowy czyli wewntrz jest znak.
Potem bekslesz, czyli uwaga!, a potem cudzysw. Bekslesz jest w tym wypadku
ostrzeeniem, bo znak cudzysowu jest ju raz w tej konstrukcji uywany w innym
znaczeniu (ogranicznik).
Poniej wida, e podobnie radzimy sobie w wypadku bekslesza, apostrofu i w kilku
innych wypadkach:
(setq
bekslesz "\\"
apostrof "\'"
znak_nul "" ;NUL znak o kodzie 0
znak_osemkowo "\nnn" ;znak o kodzie osemkowym nnn
);setq

Wrd znakw ASCII jest jeden bardzo wyjtkowy. Jest to znak o kodzie 0 zwany
znakiem NUL. Powyej widzimy sposb jego zapisu.
Mona take stae znakowe zapisywa bezporednio podajc midzy cudzysowami
bekslesz, a nastpnie liczbowy kod znaku, zamiast samego znaku. Kod znaku musi by
wwczas liczb w zapisie semkowym.
Np. poniewa w kodzie ASCII litera "a" reprezentowana jest przez liczb 141 w zapisie
semkowym, dlatego ponisze zapisy s rwnowane:
(setq znak "a") <=> (setq znak "\141")

6/2/4/ Qs{z
Qs{zqjtbojf!tu
qjtbojf!tubzd
qjtbojf!tubzdi!ufltupxz
bzdi!ufltupxzdi
i!ufltupxzdi
)bdvdix!{oblx*
)bdvdix!{oblx*
W jzykach programowania bardzo czsto posugujemy si staymi tekstowymi bdcymi cigami znakw. Zwane s one czasem napisami, czasem acuchami znakw lub
po prostu stringami.
A zatem:
String, czyli staa tekstowa, to cig znakw ujty w cudzysowy.
Oto przykady:
"taki sobie string"
"Rozpoczecie ladowania programu glownego"
"Podaj wspolczynniki rownania kwadratowego a, b, c: "

A oto przypisanie staej tekstowej do symbolu:


(setq string1 "dowolny ciag znakow")

87

BvupMJTQ!!qsbluzd{oz!lvst
Poniewa string jest cigiem znakw, wic obowizuj podobne zasady jak opisane
przy staych znakowych. Jeli chcemy w tekcie (stringu) zastosowa znak nowej linii,
wystarczy wpisa \n w danym miejscu. Na przykad:
"Zakonczenie wczytywania danych.\nRozpoczecie obliczen."

Zdziwie si moe, dlaczego nie ma teraz dwch cudzysoww po obu stronach znaku
\n? Nic w tym dziwnego nie ma take cudzysoww obok liter Z a k itd.
Ogranicznikiem stringu s znaki cudzysowu "". Poniewa cudzysw ma takie szczeglne znaczenie dla stringu, dlatego nie mona ju go uy dodatkowo wewntrz stringu.
Problem ten rozwiemy tak jak w przypadku staych znakowych za pomoc znaku
bekslesz:
(princ "\nCMG \"KOMAG\" Gliwice.")(princ)

co na ekranie pojawi si jako CMG "KOMAG" Gliwice.


AutoLISP jest jzykiem o tzw. swobodnym formacie, gdzie w prawie kadym miejscu
instrukcji mona przerwa pisanie, przej do nastpnej linii i kontynuowa instrukcj.
To sowo prawie dotyczy midzy innymi pisania stringw. Tutaj nie mona przerwa
pisania znakiem nowego wiersza (naciskajc ENTER), gdy moe si to zakoczy np. tak:
(princ "\nCMG \"KOMAG\"
Gliwice.")
(princ)

co na ekranie pojawi si jako:


CMG "KOMAG"

Gliwice.

Co zrobi, jeli string jest za dugi, e nie mieci si w jednej linijce? Jest na to sposb.
Mona posuy si wbudowan funkcj AutoLISPu strcat, ktra zwraca acuch
bdcy wynikiem konkatenacji (poczenia) dowolnej liczby osobnych acuchw.
(princ
(strcat
"\nOto przyklad, jak w jezyku AutoLISP"
"\nmozna polaczyc dowolna liczbe osobnych lancuchow"
"\nw celu otrzymania jednego lancucha."
);strcat
);princ
(princ)

co na ekranie pojawi si jako:


Oto przyklad, jak w jezyku AutoLISP
mozna polaczyc dowolna liczbe osobnych lancuchow
w celu otrzymania jednego lancucha.

Nastpne wywoanie funkcji princ spowoduje, e dane wyjciowe bd wypisane


bezporednio po wyrazie "lancucha.", poniewa na kocu tekstu nie byo znaku
sterujcego \n.

6/!Jotusvldkf!qpetubxjbojb

88

Przy bezporednim przypisywaniu symbolowi acucha znakw tekstowych za


pomoc instrukcji setq lub set, istnieje ograniczenie jego dugoci do 132
znakw. Moliwe jest jednak tworzenie duszych acuchw przez wykorzystanie
funkcji strcat do zczenia kilku acuchw tekstowych, a nastpnie przypisanie
symbolowi tak uzyskanego acucha.

6/2/5/!Qs{zqjt
6/2/5/!Qs{zqjtbojf!mjtu
2/5/!Qs{zqjtbojf!mjtu
Przypisanie symbolowi listy odbywa si nastpujco:
(setq
lista (list 1 2.0 "AutoCAD")
x lista
);setq




W linii  pod symbol lista podstawilimy list (1 2.0 "AutoCAD"), utworzon przy
pomocy funkcji list. W linii  pod symbol x podstawilimy warto symbolu lista. Tak
wic zarwno lista jak i x maj warto (1 2.0 "AutoCAD").
List do symbolu moemy rwnie przypisa nastpujco:
(setq lista '(1 2.0 "AutoCAD"))

Tworzenie list bdzie dokadnie omwione w punkcie Dziaania na listach.

Instrukcja podstawiania set posiada nastpujcy format:


(set sym expr)

Instrukcja podstawiania set tym rni si od instrukcji podstawiania setq, e oba jej
argumenty podlegaj ewaluacji.
Przeledmy to na dwch przykadach:

Qs{zlbe!2
(setq
x nil
y nil
);setq
(setq x 'y) wartoci zmiennej x jest identyfikator y.
(set x 2) wartoci wartoci zmiennej x (czyli y) jest 2.
!x => Y
!y => 2

89

BvupMJTQ!!qsbluzd{oz!lvst
W przykadzie tym, najpierw nadajemy zmiennym x i y wartoci nil. Nastpnie zmiennej x przypisujemy identyfikator y. Znak apostrofu przed zmienn y zapobiega jej ewaluacji. Na kocu, wykorzystujc instrukcj przypisania set, nadajemy symbolowi x warto 2. Poniewa symbol x ewaluuje si do symbolu y, tak wic po tych wszystkich
operacjach wartoci symbolu x jest Y, natomiast wartoci symbolu y jest 2.

Qs{zlbe!3
(setq
x nil
y nil
);setq
(setq x 'y) wartoci zmiennej x jest identyfikator y.
(set 'x 2) wartoci zmiennej x jest 2.
!x => 2
!y => nil

W przykadzie tym, najpierw nadajemy zmiennym x i y wartoci nil.


Nastpnie zmiennej x przypisujemy identyfikator y. Znak apostrofu przed zmienn y zapobiega jej ewaluacji. Na kocu, wykorzystujc instrukcj przypisania set, nadajemy
symbolowi x warto 2. Poniewa symbol x poprzedzony jest znakiem apostrofu,
zapobiega to jego ewaluacji do symbolu y, tak wic po tych wszystkich operacjach
wartoci symbolu x jest 2, natomiast wartoci symbolu y jest nil.
No c, chyba zamieszaem Ci mocno w gowie tymi dwoma przykadami. Pora wic
na wyjanienie, do czego naprawd moe si przyda instrukcja podstawiania set.

6/3/2/ [xspu!xbsup!dj!
[xspu!xbsup!dj!qs{f{!gvold
qs{f{!gvoldk$
qs{f{!gvoldk$
qpe!qpebozn!jefouzgj
qpe!qpebozn!jefouzgjlbupsfn
zn!jefouzgjlbupsfn
Kiedy opanujesz ju troch AutoLISP (dotyczy to szczeglnie definiowania i wykorzystania funkcji), zauwaysz na pewno, e jeli jaka funkcja zwraca wynik swojego
dziaania, to jest to albo wynik nie przypisany do adnego identyfikatora, albo identyfikator jest stay przez wszystkie kolejne wywoania funkcji. Oczywicie, problem ten
jest bardzo atwo rozwiza. Przypumy, e mamy funkcj LICZ_SREDNIA, ktrej
zadaniem jest obliczenie redniej arytmetycznej z podanego zbioru liczb rzeczywistych.
Zbir ten jest podawany jako argument funkcji i ma on posta listy.
Funkcja LICZ_SREDNIA moe wic wyglda nastpujco:
;**************************************************PROG_005
;Funkcja LICZ_SREDNIA oblicza srednia arytmetyczna
;z podanego zbioru liczb rzeczywistych.
;

6/!Jotusvldkf!qpetubxjbojb
;Funkcja wywolywana jest z jednym argumentem:
;lista_liczb - zbior liczb podany w postaci listy
;
np. (1 7 -5.0 12.5 20 ...)
;
;Funkcja zwraca obliczona srednia.
;
;Przyklad wywolania funkcji:
;(setq dane (list 1 2 3 4))
;(setq wynik (LICZ_SREDNIA lista_1))
;!wynik => 5
;
;-------------------------------------------------;
(defun LICZ_SREDNIA (lista_liczb /
dlugosc suma licznik liczba
)
(progn
;---------;okreslenie dlugosci listy lista_liczb
(setq dlugosc (length lista_liczb))

;---------;obliczenie sumy liczb
(setq
suma 0

licznik 0

);setq
;
(repeat dlugosc

(progn
(setq
liczba (nth licznik lista_liczb)
suma (+ suma liczba)

licznik (1+ licznik)

);setq
);progn
);repeat dlugosc
;---------;obliczenie i zwrot sredniej
(/ suma dlugosc)

;---------;
(princ)

;---------);progn
);LICZ_SREDNIA
;
;**************************************************KONIEC

Wykonanie powyszego programu moe by nastpujce:


Command: (load "prog_005")

LICZ_SREDNIA
Command: (setq lista (list 1 2 3 4 5))

(1 2 3 4 5)
Command: (setq srednia (LICZ_SREDNIA lista))

8:

91

BvupMJTQ!!qsbluzd{oz!lvst
3
Command: !srednia

3
Command:

Omwmy teraz wyrnione linie programu:


 Uywajc funkcji length, obliczamy dugo listy podanej w argumencie
lista_liczb inaczej jest to ilo liczb, z ktrych liczymy redni. Obliczon
warto podstawiamy pod zmienn dlugosc.
 Zerujemy zmienn suma.
 Zerujemy zmienn licznik. Zmiennej tej nadajemy warto 0 rwnie dlatego, e
pierwszy element na licie ma numer (indeks) 0.
 Tutaj rozpoczynamy ptl repeat. Ptla ta bdzie powtarzana tyle razy, ile wynosi warto zmiennej dlugosc.
 Za pomoc funkcji nth pobieramy z listy lista_liczb element o numerze
(indeksie) licznik. Pobran warto podstawiamy pod zmienn liczba.
 Obliczamy sum liczb.
 Zwikszamy warto zmiennej licznik o 1. Gdybymy tego nie zrobili, wwczas
przez cay czas dziaania ptli repeat zmienna liczba miaaby warto pierwszego elementu listy.
 Obliczamy i zwracamy redni arytmetyczn z podanych liczb.
Instrukcja princ zostaa tutaj wzita w komentarz. Wynika to z faktu, e funkcja
zwraca warto ostatniego wyraenia w naszym przypadku jest to (/ suma
dlugosc). Gdyby funkcja princ nie zostaa wzita w komentarz, wwczas to ona
byaby ostatnim wyraeniem funkcji. Poniewa, jak ju powiedziaem wczeniej,
funkcja princ zwraca nil, warto zmiennej x byaby wic rwna nil.
Tak wic oto wyglda jeden ze sposobw przekazywania wartoci zwrotnej przez
funkcj. A teraz zostanie podany inny sposb z wykorzystaniem instrukcji podstawiania set.
;**************************************************PROG_006
;Funkcja LICZ_SREDNIA_A oblicza srednia arytmetyczna
;z podanego zbioru liczb rzeczywistych.
;
;Funkcja wywolywana jest z dwoma argumentami:
;lista_liczb - zbior liczb podany w postaci listy
;
np. (1 7 -5.0 12.5 20 ...)
;wartosc_zwrotna - lancuch z nazwa zmiennej, pod ktora
;
zostanie podstawiona obliczona srednia
;
;Funkcja zwraca obliczona srednia.
;
;Przyklad wywolania funkcji:
;np. gdy lista_1 = (1 2 3 4 5)

6/!Jotusvldkf!qpetubxjbojb
;(LICZ_SREDNIA_A lista_1 "#wynik")
; !#wynik => 3
;
;-------------------------------------------------;
(defun LICZ_SREDNIA_A (lista_liczb wartosc_zwrotna /

dlugosc suma licznik liczba
srednia
)
(progn
;---------;okreslenie dlugosci listy lista_liczb
(setq dlugosc (length lista_liczb))
;---------;obliczenie sumy liczb
(setq
suma 0
licznik 0
);setq
;
(repeat dlugosc
(progn
(setq
liczba (nth licznik lista_liczb)
suma (+ suma liczba)
licznik (1+ licznik)
);setq
);progn
);repeat dlugosc
;---------;obliczenie i zwrot sredniej
(setq srednia (/ suma dlugosc))

(set (read wartosc_zwrotna) srednia)

;---------(princ)

;---------);progn
);LICZ_SREDNIA_A
;
;**************************************************KONIEC

Wykonanie tego programu moe wyglda nastpujco:


Command: (load "prog_006")

LICZ_SREDNIA_A
Command: (setq lista (list 1 2 3 4 5))

(1 2 3 4 5)
Command: (LICZ_SREDNIA_A lista "#wynik")

Command: !#wynik

3
Command:

92

93

BvupMJTQ!!qsbluzd{oz!lvst

Omwmy teraz wyrnione linie programu. Linie te zawieraj zmiany, jakie zostay
dokonane w kodzie rdowym programu w stosunku do programu PROG_005:
 W linii tej dokonano dwch zasadniczych zmian: zmieniono nazw funkcji na
LICZ_SREDNIA_A oraz dodano dodatkowy argument wywoania funkcji
wartosc_zwrotna.
Jeli dokonujesz zmian w kodzie rdowym funkcji (dotyczy to szczeglnie
zmiany liczby argumentw), ktra zostaa ju zastosowana w Twoich programach
lub umieszczona w bibliotekach, zmie nazw funkcji na inn. Moe si bowiem
zdarzy tak, e jaki Twj program napisany wczeniej korzysta ze starej postaci
funkcji. Tak wic zaoszczdzisz sobie duo czasu i nerww, zmieniajc nazw
funkcji na inn ni przegldajc poprzednie programy w celu wyszukania i zmiany
wywoania starej funkcji.

 Obliczamy redni i wynik podstawiamy pod zmienn srednia.


 To tutaj uywamy instrukcji podstawiania set. Ewaluacja pierwszego wyraenia,
tj. (read wartosc_zwrotna) daje nazw identyfikatora zmiennej #wynik,
ewaluacja drugiego wyraenia, tj. srednia daje 3.
W wyraeniu pierwszym zostaa uyta standardowa funkcja AutoLISPu read.
Funkcja ta ma format (read string) i zwraca pierwszy obiekt typu lista lub atom
napotkany w argumencie string, po konwersji na odpowiedni typ danych.
W naszym przypadku argumentem funkcji string jest "#wynik", ktry podlega
konwersji na symbol #wynik.
Znak "#" uyty w nazwie zmiennej pomaga nam w identyfikacji, e jest to
zmienna zwracana przez funkcj. Zachcam do takiego oznaczania zmiennych
(oczywicie moesz uy innego znaku), byle tylko zmienne te rniy si od
zmiennych globalnych i lokalnych. Klasyfikacja i zasig zmiennych zostanie
podana w rozdziale Definiowanie wasnych funkcji.

 Poniewa rednia zostaa podstawiona pod podany identyfikator, moemy tutaj


zastosowa instrukcj princ, ktra zapobiega wypisywaniu echa ostatniej
wykonanej instrukcji przez funkcj.

6/3/3/!Ezobnjd
6/3/3/!Ezobnjd{of!uxps{fojf!{njfoo
3/3/!Ezobnjd{of!uxps{fojf!{njfoozdi
{of!uxps{fojf!{njfoozdi
Wyobramy sobie nastpujc sytuacj:
Niech dany bdzie ukad hydrauliczny jak na rysunku.
Sie rurocigw opisana na wzach 19, skada si z rur o numerach 18, pompy 9
oraz trjnikw 10 i 11. Zarwno wzy jak i elementy maj swoje opisy w bazie
danych. Istnieje funkcja UTWORZ_GALEZIE, dzielca automatycznie podany ukad
na poszczeglne gazie. Kryterium podziau na gazie jest umieszczenie w danym
wle elementu typu trjnik.

6/!Jotusvldkf!qpetubxjbojb

94

Funkcja UTWORZ_GALEZIE operuje na nastpujcych zmiennych:


wz_galezi_n lista wzw nalecych do danej gazi
el_galezi_n lista elementw nalecych do danej gazi
Przykadowo, podany wyej ukad moe zosta podzielony nastpujco (sowo "moe"
odnosi si tylko do kolejnoci numeracji gazi):
wz_galezi_1 (1 2)
el_galezi_1 (9 1 10)
wz_galezi_2 (2 3 4)
el_galezi_2 (10 2 3)
wz_galezi_3 (2 5 6)
el_galezi_3 (10 4 5 11)
wz_galezi_4 (6 7)
el_galezi_4 (11 6)
wz_galezi_5 (6 8 9)
el_galezi_5 (11 7 8)

Dla innego ukadu liczba gazi bdzie inna, nie jestemy te w stanie okreli jej
grnej granicy. Tym samym nie moemy przewidzie liczby zmiennych dla danego
ukadu. Problem ten mona rozwiza za pomoc funkcji set, strcat, rtos oraz read.

95

BvupMJTQ!!qsbluzd{oz!lvst
Przykadowy wygld funkcji UTWORZ_GALEZIE moe by nastpujcy:
;=================================================START
;
(defun UTWORZ_GALEZIE ( / zmienne_lokalne)
(progn
;---------;czynnosci wstepne
(setq

nr_galezi 1
wz_galezi nil
el_galezi nil
);setq
;---------;podzial ukladu na galezie
(while jeszcze1 ;dopoki T - tworzymy galezie

(progn
;---------(while jeszcze2 ;dopoki T - tworzymy dana galaz

(progn
inne_instrukcje
(setq

wz_galezi .....
el_galezi .....
);setq
);progn
);while jeszcze2
;---------;wlasciwe podstawienie
(set

(read
(strcat
"wz_galezi_"
(rtos nr_galezi 2 0)
);strcat
);read
wz_galezi
);set
(set

(read
(strcat
"el_galezi_"
(rtos nr_galezi 2 0)
);strcat
);read
el_galezi
);set
;---------;zmiana wartosci zmiennych
(setq

nr_galezi (1+ nr_galezi)
wz_galezi nil
el_galezi nil
);setq

6/!Jotusvldkf!qpetubxjbojb
;---------);progn
);while jeszcze1
;---------(princ)
;---------);progn
);UTWORZ_GALEZIE
;
;=================================================KONIEC
Powysza funkcja jest to tylko przykadowy algorytm. Nie prbuj jej wic uruchamia w takiej postaci.

Omwmy teraz wyrnione fragmenty algorytmu:


 W tej czci kodu wykonujemy czynnoci wstpne: ustalamy numer gazi
pocztkowej nr_galezi na 1 oraz kasujemy zawarto zmiennych wz_galezi oraz
el_galezi.
 Wchodzimy w pierwsz ptl while i rozpoczynamy proces tworzenia gazi.
Ptla ta bdzie wykonywana tak dugo, dopki zmienna jeszcze1 bdzie miaa
warto T (prawda).
 Wchodzimy w drug ptl while i rozpoczynamy proces tworzenia konkretnej
gazi. Ptla ta bdzie wykonywana tak dugo, dopki zmienna jeszcze2 bdzie
miaa warto T.
 W tej czci kodu dokonujemy uzupenienia listy wzw i elementw o kolejne
numery przynalene do tworzonej gazi.
 W tej czci kodu, bdc ju poza ptl wewntrzn, a wic gdy proces
tworzenia danej gazi ju si zakoczy, dokonujemy utworzenia zmiennej
wz_galezi_n i przypisania jej wartoci innej zmiennej wz_galezi.
Proces ten przebiega nastpujco:
Niech dane bd nastpujce wartoci:
nr_galezi = 1
wz_galezi = (1 2)

Wwczas:
(rtos nr_galezi 2 0) <=> (rtos 1 2 0) => "1"
(strcat "wz_galezi_" "1") => "wz_galezi_1"
(read "wz_galezi_1") => WZ_GALEZI_1
(set WZ_GALEZI_1 wz_galezi) => (1 2)
!wz_galezi_1 => (1 2)

 W tej czci kodu dokonujemy utworzenia zmiennej el_galezi_n i przypisania


jej wartoci zmiennej el_galezi. Schemat postpowania jest identyczny jak
w punkcie .

96

97

BvupMJTQ!!qsbluzd{oz!lvst
 W tej czci kodu przygotowujemy si do utworzenia nowej gazi: zwikszamy
warto zmiennej nr_galezi o 1 oraz kasujemy zawarto zmiennych: wz_galezi
i el_galezi.

Rozdzia ten zapozna Ci z instrukcjami podstawiania stosowanymi w jzyku AutoLISP. Funkcja setq jest podstawow instrukcj podstawiania. Funkcja set jest stosowana sporadycznie, powiniene jednak wiedzie w jakich przypadkach naley jej uy.
W nastpnym rozdziale omwimy operatory arytmetyczne, porwnania i logiczne.

You might also like