Professional Documents
Culture Documents
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
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)
5
(setq y 5.0)
6/!Jotusvldkf!qpetubxjbojb
84
(setq x2 5.e2)
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")
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")
Nie. Interpreter AutoLISPu zasygnalizuje bd, dlatego musimy doda kresk ukon.
(setq znak3 "\"")
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: "
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)
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)
6/!Jotusvldkf!qpetubxjbojb
88
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"))
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
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
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:
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
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.
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
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.
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)
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.