[ Pobierz całość w formacie PDF ]
.Obydwie też posiadajÄ… jednÄ… zmiennÄ… lo-kalnÄ…  wynik  oznaczajÄ…cÄ… obliczonÄ… silni¹ oraz b¹dÄ…cÄ… wartoÅ›ciÄ… zwrotnÄ… funkcji. 23/!Efgjojpxbojf!x btozdi!gvoldkj 516Po zaÅ‚adowaniu programu możesz sprawdzić, do jakiej liczby można obliczać silni¹ zapomocÄ… zwykÅ‚ej funkcji, a do jakiej za pomocÄ… funkcji rekurencyjnej.PrzykÅ‚adowy sposób testowania funkcji.(setq x1 (SILNIA_ZW liczba))(setq x2 (SILNIA_REK liczba))W przypadku x1 oczekujemy przekroczenia zakresu liczb rzeczywistych, w przypadkux2 oczekujemy komunikatu o przepeÅ‚nieniu stosu AutoLISPu.Jest to oczywiÅ›cie tak prosty przykÅ‚ad, że jego struktura rekurencyjna nie daje żadnejszczególnej korzyÅ›ci.Ale nawet tutaj widać, że myÅ›lÄ…c w ten sposób o zagadnieniu,można je troch¹ uproÅ›cić.W bardziej skomplikowanych przykÅ‚adach rekurencja możesi¹ rzeczywiÅ›cie opÅ‚acić.Nie wyobrażaj sobie jednak, że takie analizowanie na wiele si¹ przyda podczasprogramowania funkcji rekurencyjnych.SÄ… one zwykle zbyt skomplikowane na to, abymyÅ›leć na takim poziomie szczegółowoÅ›ci.I w tym wÅ‚aÅ›nie wyraża si¹ sens rekurencji.Pozwala nam ona w sposób niesÅ‚ychanie zwarty opisać skomplikowany proces, któregoanalizowanie  na sucho na pewno spowodowaÅ‚oby potworne zamieszanie.AutoLISP pozwala na definiowanie funkcji wewnÄ…trz innej funkcji.Definicja funkcjiwewn¹trznej jest taka sama, jak wszystkich innych funkcji AutoLISPu.Poniżej przedsta-wiono przykÅ‚ad konstrukcji tego typu funkcji.;*************************************************PROG_085;Przyklad definicji funkcji wewnatrz innej funkcji.;;-------------------------------------------------;Funkcja zatrzymujaca realizacje programu,;dopoki uzytkownik nie nacisnie klawisza ENTER.;(defun CZEKAJ ()(progn;----------(getstring "\nNacisnij ENTER.")(princ);----------);progn);CZEKAJ;;-------------------------------------------------; 517 BvupMJTQ! !q3bluzd{oz!lv3t(defun C:TEST_1 ( / x)(progn;----------;definicja funkcji FUNKCJA_1;(defun FUNKCJA_1 ()(progn;----------(initget 1)(setqx (getint"\nPodaj dowolna liczba calkowita: ");getint);setq(CZEKAJ);----------(princ);----------);progn);FUNKCJA_1;----------;kod funkcji C:TEST_1;(textpage)(princ "Rozpoczecie wykonywania funkcji C:TEST_1.")(princ "\nDefinicja funkcji FUNKCJA_1.")(princ "\nWywolanie funkcji FUNKCJA_1.")(FUNKCJA_1)(princ "\nWartosc zmiennej x = ")(prin1 x)(princ ".")(princ "\nZakonczenie wykonywania funkcji C:TEST_1.")(CZEKAJ);----------(princ);----------);progn);C:TEST_1;;-------------------------------------------------;(defun C:TEST_2 ( / x)(progn;----------;definicja funkcji FUNKCJA_1;(defun FUNKCJA_1 ()(progn;----------(setqx (getstring"\nPodaj dowolny ciag znakow: ");getstring);setq(CZEKAJ) 23/!Efgjojpxbojf!x btozdi!gvoldkj 518;----------(princ);----------);progn);FUNKCJA_1;----------;kod funkcji C:TEST_2;(textpage)(princ "Rozpoczecie wykonywania funkcji C:TEST_2.")(princ "\nDefinicja funkcji FUNKCJA_1.")(princ "\nWywolanie funkcji FUNKCJA_1.")(FUNKCJA_1)(princ "\nWartosc zmiennej x = ")(prin1 x)(princ ".")(princ "\nZakonczenie wykonywania funkcji C:TEST_2.")(CZEKAJ);----------(princ);----------);progn);C:TEST_2;;-------------------------------------------------;*************************************************KONIECWykonanie programu może przebiegać nast¹pujÄ…co:Command: (load "prog_085")µ!µ!µ!µ!C:TEST_2Command: test_1µ!µ!µ!µ!Rozpoczecie wykonywania funkcji C:TEST_1.Definicja funkcji FUNKCJA_1.Wywolanie funkcji FUNKCJA_1.Podaj dowolna liczba calkowita: 5µ!µ!µ!µ!Nacisnij Enter.µ!µ!µ!µ!Wartosc zmiennej x = 5.Zakonczenie wykonywania funkcji C:TEST_1.Nacisnij ENTER.µ!µ!µ!µ!Command: test_2µ!µ!µ!µ!Rozpoczecie wykonywania funkcji C:TEST_2.Definicja funkcji FUNKCJA_1.Wywolanie funkcji FUNKCJA_1.Podaj dowolny ciag znakow: AutoCADµ!µ!µ!µ!Nacisnij ENTER.µ!µ!µ!µ! 519 BvupMJTQ! !q3bluzd{oz!lv3tWartosc zmiennej x = "AutoCAD".Zakonczenie ywkonywania funkcji C:TEST_2.Nacisnij ENTER.µ!µ!µ!µ!Command: !xµ!µ!µ!µ!nilCommand:Omówmy teraz konstrukcj¹ programu.Funkcje C:TEST_1 i C:TEST_2 zawierajÄ… definicj¹ funkcji FUNKCJA_1.Jej zada-niem jest pobranie liczby caÅ‚kowitej lub Å‚aÅ„cucha znaków, w zależnoÅ›ci od tego, którÄ…funkcj¹ TEST_X wywoÅ‚ujemy.Funkcje TEST_1 i TEST_2 dziaÅ‚ajÄ… tak samo: na po-czÄ…tku definiujÄ… funkcj¹ FUNKCJA_1 (tym samym poprzedni kod zostaje zniszczony),wywoÅ‚ujÄ… wyżej zdefiniowanÄ… funkcj¹, a po jej zakoÅ„czeniu wyÅ›wietlajÄ… wartośćzmiennej x.Tak wi¹c każdorazowe wywoÅ‚anie funkcji TEST_X powoduje ponownezdefiniowanie funkcji FUNKCJA_1.Zastosowaniem tego typu konstrukcji mogÄ… być funkcje definiujÄ…ce obsÅ‚ug¹ poszcze-gólnych skÅ‚adników okien dialogowych oraz funkcje wÅ‚asnej obsÅ‚ugi bÅ‚¹dów, definio-wane wewnÄ…trz funkcji głównych.Funkcje omówione poniżej umożliwiajÄ… nam definicj¹ tzw.funkcji anonimowych orazuÅ‚atwiajÄ… przetwarzanie struktur listowych.Funkcje te sÄ… standardowym wyposażeniemj¹zyka AutoLISP.Funkcja lambda jest odmianÄ… funkcji definiowanej przez użytkownika.Jej format jestnast¹pujÄ…cy:(lambda arguments expr.)Jest to funkcja bez nazwy (tzw.anonimowa), której wÅ‚asnoÅ›ci sÄ… identyczne jak funkcjidefun.Brak jest nazwy funkcji, która może być użyta jako identyfikator.Funkcjalambda znajduje zastosowanie w poÅ‚Ä…czeniu z funkcjami apply i/lub mapcar przyzÅ‚ożonym przetwarzaniu list np.wewnÄ…trz p¹tli repeat, while, for.Funkcja apply posiada format:(apply function list) 23/!Efgjojpxbojf!x btozdi!gvoldkj 51:Funkcja ta umożliwia wykonanie innej funkcji okreÅ›lonej w argumencie function, którejargumentami sÄ… elementy zawarte w liÅ›cie podanej w argumencie list.Funkcja applydziaÅ‚a zarówno z funkcjami wewn¹trznymi (obiekty typu SUBR), jak też z funkcjamidefiniowanymi przez użytkownika, przy użyciu funkcji defun lub lambda.Funkcja foreach posiada format:(foreach name list expr.)Kolejne elementy argumentu list sÄ… przypisywane zmiennej name, a nast¹pnie każdyargument expr jest poddawany ewaluacji dla każdego elementu listy.Funkcja zwracarezultat ostatniego wyliczonego wyrażenia.Funkcja mapcar posiada format:(mapcar function list1.listn)Wyrażenie z funkcjÄ… mapcar zwraca list¹, której elementami sÄ… wyniki ewaluacjiwyrażenia function z argumentami branymi z kolejnych pozycji poszczególnych listpoczynajÄ…c od argumentu list1 do listn.Liczba argumentów listn musi odpowiadaćliczbie argumentów, której wymaga function.FunkcjÄ…, która ma być wykonywana przy wywoÅ‚aniu mapcar, może być funkcjaanonimowa, zdefiniowana za pomocÄ… funkcji lambda.Jest to przydatne, gdy cz¹śćargumentów funkcji ma wartoÅ›ci staÅ‚e lub podawane w inny sposób.Poniżej przedstawiono cztery przykÅ‚ady wykorzystujÄ…ce wyżej wymienione funkcje.Q3{zl be!2W przykÅ‚adzie tym, wykorzystujÄ…c funkcj¹ apply, budujemy funkcj¹ SUMA_Z_LISTY, której zadaniem jest zsumowanie wszystkich elementów listy podanejw argumencie wywoÅ‚ania funkcji lista.;*************************************************PROG_086;Wykorzystanie funkcji APPLY.;Obliczenie sumy wszystkich elementow listy [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • wpserwis.htw.pl