CATEGORII DOCUMENTE |
Buclele de program reprezinta un concept important pentru orice limbaj de programare. Buclele permit instructiunilor programului sa fie executate de nenumarate ori pe baza valorii unei espresii test.
in acest capitol veti studia:
Cum sa folositi buclele pentru a repeta un set de expresii.
Sintaxa functiilor repeat si while.
O bucla se explica astfel:
' Testati o expresie. Daca expresia este adevarata, atunci executati un set de instructiuni ale programului, pe rind, apoi testati expresia din nou. Daca este tot adevarata, executati toate instructiunile programului apoi testati din nou expresia la infini.
Asa lucreaza functia while. Functia repeat executa un set de expresii de un numar de ori prestabilit.
Ca exemplu sa presupunem ca avem un set de expresii pe care vrem sa-l executam de 5 ori. Este mai intelept sa scrieti setul de expresii o singura data in program si sa folositi unele functii care sa ceara AutoLISP-ului sa repete expresiile de 5 ori decit sa scrieti setul de expresii de 5 ori.
Ca exemplu (si nu unul stralucit) vom construi o functie simpla de numarare folosind functia repeat. Functia va adauga numarul intreg 1 la valoarea unei variabile ori de cite ori functia este apelata si apoi va tipari valoarea variabilei in zona liniei de comanda.
Functia repeat cere doua argumente si un numar oarecare de argumente optionale.
Primul argument trebuie sa fie un numar intreg (sau evaluat intr-un numar intreg). Acesta spune functiei repeat de cite ori sa execute al doilea argument pina la al n -lea argument.
Command: (repeat 3 (prompt
'anHello'))
Hello
Hello
Hellonil
nil de la sfirsit este valoarea returnata de functia repeat.
Introduceti expresiile care urmeaza.
Expresiile definesc functia count.
in functia count, dupa ce variabila num este legata de 0, valoarea lui num este vizualizata pe monitor si incrementata cu 1 pina la un total de 10 ori.
Command: (defun count ()
1> (setq num 0)
1> (repeat 10 (print num) (setq num
(1+ num)))
1> (prin1))
COUNT
Folositi functia count. Aceasta va introduce numerele de la 0 la 9 in zona liniei de comanda.
Command: (count)
0
1
2
3
4
5
6
7
8
9
O versiune ceva mai interesanta a functiei count va {TERGE ultimele trei entitati desenate si care sint vizibile pe monitor.
intr-un desen nou, desenati cel putin trei (3) entitati de orice fel.
Introduceti expresiile care urmeaza.
Command:
(defun count () (repeat 3 (command
'erase' 'l' '')))
COUNT
Folositi functia count pentru a sterge ultimele entitati din desen.
Command: (count)
Functia initget poate reface valorile permise pentru intrarea utilizatorului in timpul oricarei apelari a functiilor de tip getxxx, de exemplu functiile getpoint si getdist.
Apelati initget care are un numar intreg ca argument si/sau o lista de cuvinte cheie acceptabile, imediat dupa apelarea unei functii GETXXX.
Acest exemplu admite numai numere intregi cu exceptia lui 0, ca raspuns la getint.
(initget (+ 1 2 4))
(setq response (getint 'anEnter an integer: '))
Functia getkword reface un cuvint cheie de la utilizator bazat pe un sir de cuvinte cheie stabilite de functia initget.
Acest exemplu permite utilizatorului sa raspunda cu YES sau NO la cererea de comanda. Un raspuns nul sau un return nu sint admise.
(initget 1 'Yes No')
(getkword 'anContinue? Yes/No: ')
exercitiul 21[N.N.1]: buclare in program
in acest exercitiu:
Veti consolida cunostintele despre bucle de program.
Veti consolida cunostintele despre functia cond.
Veti folosi functia repeat pentru a executa un set de s-expresii de un numar stabilit de ori.
Veti scrie o functie care cere utilizatorului numarul de buclari de program.
Veti folosi instructiunea cond in cadrul buclei.
incepeti un desen nou in AutoCAD.
Desenati un Cerc cu centrul in punctul 5,5 sI o raza de o unitate.
in editorul text, deschideti fisierul numit displace.lsp din directorul student.
Creati functia c:displace. Folositi codul in displace.lsp ca baza pentru functie.
DISPLACE ar trebui sa execute urmatoarele:
Sa ceara utilizatorului o incrementare a deplasarii.
Sa ceara utilizatorului de cite ori sa execute deplasarea.
Sa ceara utilizatorului directia de deplasare.
Sa repete codul care restabileste ultima entitate desenata si care este vizualizata pe monitor si sa o deplaseze cu un increment adecvat de un numar de ori.
continuare pe pagina urmatoare
;No null, zero or negative response allowed
(initget (+ 1 2 4))
(setq increment (getdist 'anIncrement for movement: '))
;No null, zero or negative response allowed
(initget (+ 1 2 4))
(setq number_of_times (getint 'anNumber of times to displace: '))
;No null response allowed, setup keywords for response
(initget 1 'Up Down Right Left')
(setq direction (getkword 'anUp/Down/Left/Right: '))
(repeat number of times (command "MOVE" (entlast)"" (list 0.0 0.0 0.0)
(cond ;match direction of movement
((= direction 'Up') ;based on keyword supplied by user
(command (list 0.0 increment))
)
((= direction 'Down')
(command (list 0.0 (- 0.0 increment)))
)
((= direction 'Right')
(command (list increment 0.0))
)
((= direction 'Left')
(command (list (- 0.0 increment) 0.0))
)
)
(command '') ;second point of displacement
;for MOVE command prompt
Salvati fisierul text.
incarcati fisierul in AutoCAD.
Activati comanda DISPLACE.
Functia repeat este cea mai simpla functie de buclare utila daca stiti exact de cite ori trebuie sa repetati evaluarea grupului de expresii anterioare intrarii buclei.
Totusi veti intilni ocazii cind veti dori sa repetati ceva de un numar nedefinit de ori; adica numarul de repetitii nu poate fi determinat inaintea intrarii in bucla.
intr-un astfel de caz, functia while va da posibilitatea sa repetati un set de expresii de cite ori este necesar pina ce valoarea unei expresii test se schimba.
(setq x 0) ;set initial value for test
(while
(< x 10) ;while x is less than 10
(print x) ;print value of x
(setq x (+ 1 x)) ;add 1 to x and then
;go back to test expression
Figuae 3. Diagrama buclei functiei while
Pentru a iesi dintr-o bucla while, valoarea expresiei test trebuie sa fie egala cu nil. De aceea, daca expresia test este initial t, valoarea expresiei test trebuie sa se schimbe ca rezultat al unei atribuiri din cadrul corpului buclei.
Buclele repeta un set de expresii.
Buclele pot repeta de un numar de ori prestabilit sau pina ce valoarea expresiei test este nil.
Functia repeat repeta un set de expresii de un numar de ori stabilit.
Functia while repeta un set de s-expresii pina ce expresia test este egala cu nil.
exercitiul 21: utilizarea functiei while pentru buclare in progam
in acest exercitiu:
Veti consolida cunostintele despre buclele de program din AutoLISP.
Veti modifica o functie existenta de la exercitiul anterior.
Veti crea un program care deseneaza dreptunghiuri multiple.
Veti folosi functia while.
in editorul de text, incarcati fisierul rectangle.lsp.
Salvati fisierul ca mrectang.lsp in directorul student.
Faceti modificari in fisier.
Modificati functia c:rectangle pentru a cere utilizatorului sa deseneze dreptunghiuri multiple in timpul unei singure secvente de functionare.
Plasati corpul codului care cere colturile si deseneaza polilinia in cadrul unei functii while.
Un raspuns nul, adica un return la cererea 'first corner' va termina functia.
Numiti noua functie c:mrectangle pentru 'dreptunghiuri multiple'.
Salvati fisierul.
incarcati fisierul in AutoCAD.
Activati comanda MRECTANGLE.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1187
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved