Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Teste logice si de egalitate AutoLISP

autocad



+ Font mai mare | - Font mai mic



Teste logice si de egalitate AutoLISP

Programele AutoLISP pot face un salt pe baza valorii unei expresii test.

Obiective

in acest capitol veti studia:

Cum se poate schimba controlul desfasurarii unui program pe baza unei expresii test.



Cum sa folositi testele de egalitate si testele logice ca expresii test.

Diferenta dintre simbolul t si simbolul nil.

Cum sa determinati tipul de date al unui obiect.

Ramificarea programului

Aceasta diagrama simpla ilustreaza principiul ramificarii programului.

Figura 2. Ramificarea programului bazata pe testul de conditie

in aceasta diagrama, daca valoarea variabilei x este egala cu sirul de tip text 'Hello, world', atunci programul se va ramifica in expresia y si va continua; daca nu , se va ramifica in expresia z si va continua.

Functiile care realizeaza testele conditionale sint folosite pentru ramificatii in interiorul programelor AutoLISP. Cele doua functii de baza pentru testele conditionale sint:

if

cond

Unele valori sau seturi de valori sint testate cu if sau cond iar programul se ramifica conform rezultatelor testului. AutoLISP-ul dispune de o varietate de functii care testeaza valorile pe baza anumitor criterii sau unele valori pe baza celorlalte. in acest capitol ne concentram atentia asupra unora dintre cele mai utilizate functii de acest tip.

> <

equal

and

or

not

logand

t si nil

in AutoLISP, simbolul t este echivalentul pentru 'adevarat' in orice test conditional. Simbolul nil este echivalentul lui 'fals'.

Daca o expresie AutoLISP nu se evalueaza, atunci expresia este nil sau falsa. Daca o expresie nil este folosita intr-un test conditional, atunci va fi executata o ramificatie pentru o conditie falsa.

Daca o expresie AutoLISP evalueaza orice altceva decit nil, atunci expresia este t sau adevarata. Daca o expresie t este folosita intr-un test conditional, atunci va fi executata ramificatia pentru o conditie adevarata.

t si nil se exclud mutual. Daca o expresie este t, atunci nu poate fi nil. Daca o expresie este nil, atunci nu poate fi t.

exercitiul nr 17: obiectele si expresiile pot fi t sau nil

in acest exercitiu:

Veti invata sa determinati daca valoarea returnata a unei functii este t sau nil.

Instructiuni

intr-un desen nou, desenati o entitate de tip linie.

Introduceti expresiile in coloana din stinga a tabelului.

Determinati daca expresiile sint t sau nil.

Verificati casuta adecvata din tabel.

Expresie

t

nil

(setq ename (entnext))

!ename

(setq ename (entnext ename))

!ename

(command 'erase' 'last' '')

(command 'u')

Tabelul 19. Expresiile pot fi t sau nil

Functii care testeaza egalitatea

Functia = are doua sau mai multe argumente cu orice tip de date. Aceasta functie verifica daca toate argumentele au valori echivalente. Daca da, functia returneaza t; daca nu, returneaza nil.

De exemplu, aceasta expresie verifica daca valorile numarului real 4.0 si expresia (+ 2.0 2.0) sint echivalente

Command: (= 4.0 (+ 2.0 2.0))
T

Aceasta expresie verifica daca 4.0 este echivalent cu expresia (+ 1.5 2.0)

Command: (= 4.0 (+ 1.5 2.0))
nil

Functia < verifica daca primul ei argument este numeric mai mic decit al doilea argument.

Command: (< 45 50)
T

Functia equal este in esenta aceeasi cu functia =.

Exercitiu

Introduceti expresiile care urmeaza.

Legati doua variabile de valori numerice. Folositi variabilele ca argumente la citeva functii si verificati rezultatele.

Command: (setq x 1)
1

Command: (setq y 1.5)
1.5

Verificati daca x este mai mic decit y.

Command: (< x y)
T

Verificati daca x este mai mare decit y.

Command: (> x y)
nil

Verificati daca y este mai mare sau egal cu 1,5.

Command: (>= y 1.5)
T

Verificati daca x este mai mic sau egal cu y.

Command: (<= x y)
T

Verificati daca x nu este egal cu y.

Command: (/= x y)
T

Acest tabel arata functiile care verifica egalitatea in AutoLISP.

Functie

Test

Egal cu

Nu este egal cu

<

Mai mic decit

<=

Mai mic sau egal cu

>

Mai mare decit

>=

Mai mare sau egal cu

minusp

Mai mic decit zero

zerop

Egal cu zero

equal

Egal cu

eq

Au aceeasi legatura

Tabelul 20. Functii de egalitate

Functii care verifica tipul de date

AutoLISP-ul dispune de citeva functii care verifica tipul de date ale unui simbol sau expresii.

Functie

Test

ATOM

Este argumentul un atom?

LISTP

Este argumentul o lista?

BOUNDP

Este argumentul legat de o valoare?

NULL

Este argumentul nil?

NUMBERP

Este argumentul un numar?

Tabelul 21. Functii care testeaza tipul de date

Exemplu

Introduceti expresiile care urmeaza.

Legati trei variabile de trei tipuri de date diferite: un simbol, un numar real si o lista.

Command: (setq x 'abc)
ABC

Command: (setq y 1.0)
1.0

Command: (setq z '(1 2 3))
(1 2 3)

Folositi variabilele ca argumente la functii care testeaza tipul de date. Examinati rezultatele functiilor.

Sint aceste variabile atomi?

Command: (atom x)
T

Command: (atom y)
T

Command: (atom z)
nil

Sint aceste variabile liste?

Command: (listp x)
nil

Command: (listp y)
nil

Command: (listp z)
T

Combinarea functiilor type cu functiile '='

Puteti verifica tipul de date al unui obiect in AutoLISP folosind fie functia =, fie functia equal cu functia type.

Exemplu

Introduceti expresiile care urmeaza.

Legati doua variabile cu tipuri de date diferite: un numar intreg si un numar real.

Command: (setq x 1)
1

Command: (setq y 1.5)
1.5

Folositi functiile type si = pentru a verifica tipul lor de date.

Command: (= (type x) 'INT)
T

Command: (equal (type x) 'REAL)
nil

Command: (equal (type y) 'REAL)
T

Functii logice

Exista citeva functii de test logic in AutoLISP. in acest capitol vom studia patru dintre cele mai importante functii: not, and, or si logand.

Functia not

Functia not solicita un argument. Daca argumentul este nil, atunci expresia returneaza t; daca nu, aceasta returneaza nil.

Functia not este o functie a carei valoare returnata este opusul argumentului ei. Dati-i nil si va returna t. Dati-i t si va returna nil.

Exemplu

Command: (not nil)
T

Command: (not t)
nil

Functia and

Functia and solicita unul sau mai multe argumente. Daca unul dintre argumente este nil, ea returneaza nil. Daca toate argumentele sint t , atunci returneaza t.

Functia and opreste procesarea de indata ce gaseste un argument nil. Unele programe sint scrise in acord cu acest comportament. De exemplu, puteti fi siguri ca programul nu va gasi o instructiune intr-o lista de argumente ale functiei and daca nici unul dintre argumentele anterioare nu este nil.

Exemplu

Command: (and 1 2 3)
T

Command: (and 1 2 nil)
nil

Functia or

Functia or solicita unul sau mai multe argumente. Daca unul dintre argumente este t, functia returneaza t. Daca toate argumentele sint nil, atunci functia returneaza nil.

Functia or opreste procesarea de indata ce gaseste un argument t. Unele programe sint scrise in conformitate cu acest comportament. De exemplu, puteti fi siguri ca programul nu va gasi o instructiune intr-o lista de argumente ale functiei or daca nici unul dintre argumentele anterioare nu este t.

Exemplu

Command: (or 1 2 3)
T

Command: (or 1 2 nil)
T

Command: (or nil nil nil)
nil

Functia logand

Functia logand are doua sau mai multe argumente care ar trebui sa fie numere intregi. Functia returneaza un numar intreg.

Functia logand realizeaza o comparatie AND bit cu bit a bitilor din argumentele care sint numere intregi. Daca un bit este setat la valoarea 'adevarat' in toate argumentele functiei logand, atunci acel bit este setat la valoarea 'adevarat' si in valoarea returnata.

Numerele intregi 7, 3 si 15 sint reprezentate in biti in tabelul de mai jos.

Intreg

1 bit

2 bit

4 bit

8 bit

16 bit

X

X

X

X

X

X

X

X

X

Tabelul 22. Biti setati la valoarea 'adevarat' in trei numere intregi.

Aceasta expresie va returna un numar intreg in care toti bitii care sint setati la valoarea 'adevarat' in toate cele trei argumente vor fi setati la valoarea 'adevarat". in acest caz, bitii pentru valorile 1 si 2 vor fi returnati ca 'adevarat' de catre expresie, deoarece sint singurii biti setati 'adevarat' in toate cele trei argumente.

Command: (logand 7 15 3)
3

Functia logand va fi de folos atunci cind va fi folosita impreuna cu functiile 'entity access' mai tirziu in acest curs, in special cu valorile binare cum ar fi codurile grupului 70 DXF pentru Polylines si Block Definitions .

Recapitulare

Ramificarea unui program depinde de valoarea unui test conditional.

Toate obiectele si expresiile din AutoLISP sint t sau nil.

AutoLISP dispune de o varietate de functii care testeaza tipul de egalitate si tipul de date ale obiectelor si expresiilor.

Puteti testa tipul exact de date al unui obiect combinind functiile type si =.

Functiile logice not, and si or verifica daca una sau mai multe expresii sint t sau nil.

Functia logand realizeaza o comparatie AND bit cu bit a unei liste de numere; aceasta functie va fi de ajutor in combinatie cu functiile de tip entity access mai tirziu.

Expresii test si expresii conditionale

Functiile de egalitate si functiile logice sint folosite in expresii test. Expresiile test sint folosite in expresii conditionale si iterative formate din functii ca if si while. Ele verifica daca exista o anumita conditie si arata AutoLISP-ului ce functie sa execute care depinde de conditie, sau de rezultatul testului.

NOT| Orice atom, simbol sau expresie poate fi folosita ca expresie test deoarece orice obiect in LISP are o valoare: fie nil, fie altceva.

Obiective

in acest capitol veti studia:

Cum sa folositi expresiile conditionale pentru a face salt la diferite seturi de expresii in cadrul programului AutoLISP

Sintaxa functiilor if si cond.

Cum sa folositi functia progn pentru a executa multiple s- expresii in cadrul functiei if.

Expresii conditionale

Expresiile conditionale controleaza desfasurarea unui program AutoLISP. Folosim expresiile test pentru a verifica daca o anumita conditie exista, iar rezultatul expresiei test este folosit pentru a comuta expresia conditionala. Expresia conditionala poate opta pentru executia programului in oricare din cele citeva directii posibile. Fiecare directie va avea un set de expresii de evaluat in AutoLISP.

Cele mai folosite expresii conditionale in AutoLISP sint functiile if si cond.

Functia if

Functia if are doua argumente obligatorii si un al treilea argument care este optional.

Daca valoarea primului argument este t, adica oricare in afara de nil, AutoLISP-ul evalueaza al doilea argument.

Daca valoarea primului argument este nil, AutoLISP-ul sare peste al doilea argument. Daca exista cel de-al treilea argument optional, AutoLISP-ul il evalueaza.

Simplificind putin lucrurile, functia if ar arata cam asa:

(if
(I_return_true)
(do_this)
(else_do_this)
)

Exemplu

Introduceti expresiile care urmeaza:

Legati variabila x de o valoare a lui 1. Legati valoarea lui y bazata pe valoarea lui x.

Command: (setq x 1)
1

Command: (if (= x 1) (setq y 1) (setq y 0))
1

Command: !y
1

Legati variabila x de o valoare a lui 0. Legati variabila y bazata pe valoarea x.

Command: (setq x 0)
0

Command: (if (= x 1) (setq y 1) (setq y 0))
0

Command: !y
0

exercitiul 18: ramificarea programului folosind functia if

in acest exercitiu :

Veti folosi functia if.

Veti scrie o functie pentru a comuta SNAP pe on sau off in functie de setarea curenta.

Etape de lucru

intr-un fisier nou, folositi editorul de text pentru a crea o functie numita c:snaptog.

Introduceti codul de mai jos.

Functia ar trebui sa comute modul SNAP in functie de valoarea curenta.

(defun c:snaptog (/ snapval)

(setq snapval (getvar 'SNAPMODE')) ;get current SNAPMODE

(if

(= 1 snapval) ;if it's on

(setvar 'SNAPMODE' 0) ;turn it off

(setvar 'SNAPMODE' 1) ;otherwise, turn it on

(prin1) ;quiet exit

Salvati functia intr-un fisier numit snaptog.lsp din directorul student.

incarcati fisierul in AutoCAD.

Desenati citeva entitati tip Line si Circle.

Folositi SNAPTOG pentru a comuta SNAP pe on sau off cind desenati entitatile.

NOT| incercati sa apelati SNAPTOG in cadrul unei comenzi LINE sau CIRCLE.

Expresii multiple in cadrul functiei if.

Functia if permite executia unei singure expresii dupa ce a fost evaluata expresia test.

Puteti face ca expresii multiple sa apara ca o singura expresie la functia if prin amplasarea acestora in cadrul expresiei progn.

Functia progn evalueaza pe fiecare dintre argumentele sale, pe rind si returneaza valoarea ultimului argument. Expresii multiple aflate in cadrul functiei progn apar sub forma unei simple expresii la o functie de apelare.

in acest exemplu, daca variabila x este egala cu 1, atunci valorile vor fi atribuite ambelor variabile y si z. Asignarea este realizata de doua s-expresii.

Exemplu

Command: (setq x 1)
1

Command: (if (= x 1) (progn (setq y 2) (setq z 3)) (setq y 0))
3

Command: !y
2

Command: !z
3

exercitiul 19: expresii multiple in cadrul functiei if

in acest exercitiu:

Veti modifica functia existenta de la exercitiul 18.

Veti folosi functia progn.

Veti executa s-expresii multiple prin apelarea unei functii if.

Etape de lucru

1. in editorul de text, deschideti fisierul snaptog.lsp din directorul student.

2. Redenumiti functia c:modetog.

3. Cu ajutorul functiei progn, adaugati codul care comuta SNAPMODE si GRIDMODE pe baza valorii curente a lui SNAPMODE.

4. Salvati fisierul pe disc ca modetog.lsp.

5. incarcati programul modificat in AutoCAD.

6. Testati comanda MODETOG.

Functia cond

Functia cond cere un argument obligatoriu si un numar oarecare de argumente optionale.

Fiecare argument al functiei cond poate fi un set de expresii incluse intr-o lista externa.

Functia cond evalueaza prima expresie in fiecare din listele de argumente, pe rind, pina ce o expresie evalueaza 'adevarat'. Atunci functia cond evalueaza expresiile care urmeaza primei expresii din cadrul argumentului si returneaza.

Functia cond este de preferat functiei if ori de cite ori exista mai mult de doua cazuri de testat, adica mai mult de doua ramificari in orice punct din program.

Exemplu

Aceasta definitie a functiei va introduce valori diferite in zona liniei de comanda, in functie de valoarea numerica a variabilei x.

Fiti atenti in mod special la modul in care pot fi construite argumentele la functia cond. Prima expresie dintr-un argument este expresia test si expresiile care urmeaza dupa test vor fi evaluate daca argumentul test este adevarat.

Functia cond opreste testarea argumentelor de indata ce gaseste un argument a carui expresie test este adevarata, adica nu este nil.

(defun testx (x)

(cond

(= x 0)

(prompt 'anX equals 0.')

(< x 0)

(prompt 'anX is less than 0.')

(> x 0)

(prompt 'anX is greater than 0.')

(prin1)

Recapitulare

Functia if testeaza o expresie si se ramifica spre oricare dintre cele doua s-expresii.

Functia progn este folosita pentru a executa s-expresii multiple in cadrul functiei if.

Functia cond poate testa mai multe expresii si poate executa orice numar de s-expresii intr-o ramificatie data.

exercitiul 20: utilizarea functiei cond pentru ramificarea programului

in acest exercitiu:

Veti folosi functia cond in cadrul unei functii noi.

Veti testa o variabila pentru egalitate numerica.

Veti executa toate trei ramificatiile expresiei cond.

Etape de lucru

Creati o noua functie intr-un nou fisier cu ajutorul editorului de text.

Numiti aceasta functie testx.

Functia cere un argument obligatoriu.

intr-o instructiune cond, folositi testele de egalitate pentru a vedea daca valoarea argumentului este egala, mai mica sau mai mare decit 0.

Daca este satisfacut un test de egalitate, folositi functia prompt pentru a semnaliza utilizatorul.

(prompt 'anX equals 0.')

Salvati fisierul ca testx.lsp in directorul student.

incarcati fisierul in AutoCAD.

Folositi functia testx cu valorile argumentelor 0, 1 si -1.

Aceasta pagina a fost lasata libera in mod intentionat.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1185
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved