[ Pobierz całość w formacie PDF ]

położeń (x). Znalezione punkty narysować na wykresie. Program wykonać w dwóch
wariantach: z wykorzystaniem pętli "for" oraz instrukcji "if", oraz jedynie za pomocą
wbudowanych funkcji Matlaba (m.in. "sortrows"). Dane do programu: "k", "a", "b".
46
wersja 1.0 listopad 2011
SÅ‚awomir Milewski PK WIL L-5 www.L5.pk.edu.pl/~slawek slawek@L5.pk.edu.pl
Przykładowy efekt graficzny działania programu dla "k=3", "a=-3*pi" i "b=6".
wiczenie nr 12*1 do samodzielnego wykonania
Zmodyfikować tak program z zadania nr 11, aby na wykresie zaznaczane były wszystkie
maksima i minima o "tych samych" wartościach (czyli w ocenie programu różniących się o
bardzo niewiele) funkcji.
wiczenie nr 13**2 do samodzielnego wykonania
Zmodyfikować tak program z zadania 12, aby program zaznaczał na wykresie także wszystkie
maksima i minima lokalne.
Jako ostatni przykład działania instrukcji warunkowej "if" zaprezentowany zostanie program
obliczający silnię liczby naturalnej (n!). Silnia może być obliczana dwojako. Pierwszy sposób,
wynikajÄ…cy z tzw. definicji iteracyjnej silni, to obliczenie iloczynu kolejnych liczb naturalnych
od 2 do n. Z zaprogramowaniem tego sposobu Czytelnik nie powinien mieć żadnych
problemów. Ciekawszy jednak jest tzw. sposób rekurencyjny, czyli
1 dla n d"1
ñø
n!=
òøn(n -1)! dla n >1
óø
Rekurencja (wzajemne wywoływanie) polega na tym, iż silnia liczona jest przy
wykorzystaniu& silni. Jednakże jest to zawsze silnia z liczby o 1 mniejszej - dlatego też
rekurencja trwa tak długo, aż nie dojdzie do silni z 1 - wtedy wynik jest znany (1). Definicję
powyższą można przenieść w skali 1:1 do Matlaba dlatego, iż w Matlabie dopuszczalne jest
wywoływanie rekurencyjne funkcji - jednakże po pięćsetnym wykorzystaniu rekurencji tej
1
zadanie o podwyższonym stopniu trudności
2
zadanie o znacznie podwyższonym stopniu trudności
47
wersja 1.0 listopad 2011
SÅ‚awomir Milewski PK WIL L-5 www.L5.pk.edu.pl/~slawek slawek@L5.pk.edu.pl
samej funkcji wystąpi błąd i przerwanie działania funkcji.. To pozwala obliczyć silnię
maksymalnie z liczby 499. Zaprogramujmy więc powyższe:
function s = silnia(n)
if n
s = 1;
else
s = n*silnia(n-1);
end
Prawda, że proste? Teraz nie pozostało nic innego do zrobienia, jak zapisać program i
przetestować go w OP - wyniki możemy porównać z działaniem wbudowanej funkcji
Matlaba - "factorial":
>> silnia(0)
>> silnia(1)
>> silnia(2)
>> silnia(3)
>> silnia(4)
>> silnia(5)
>> silnia(10)
>> factorial(10)
W dalszym ciągu opracowania zapoznamy się z drugim rodzajem pętli: o nieokreślonej
liczbie przebiegów. Pętla ta potrzeba jest wtedy, gdy nie jesteśmy w stanie określić w czasie
pisania programu, ile razy będą się musiały wykonać instrukcje w niej zawarte. Dlatego też
zawsze w przypadku takich pętli to właśnie od efektów działania tych instrukcji zależy, czy
pętla ma się zatrzymać, czy dalej "kręcić". Warunek działania (działania, a nie przerwania!)
definiowany jest na jej początku, po słowie kluczowym "while" (które tłumaczymy "podczas
gdy" - dlatego też jest to warunek działania pętli). Instrukcje zawarte w pętli należy umieścić
pomiędzy nagłówkiem pętli (while), a instrukcją "end":
while warunek
&
&
end
Ponieważ wiele razy stosowana była już pętla "for", spróbujmy odtworzyć jej działanie, ale z
wykorzystaniem pętli "while". Proszę uruchomić następujący skrypt:
clc
i = 1;
while i
disp('pętla się kręci...')
i = i + 1;
end
i = 1;
while i
48
wersja 1.0 listopad 2011
SÅ‚awomir Milewski PK WIL L-5 www.L5.pk.edu.pl/~slawek slawek@L5.pk.edu.pl
disp(['pętla się kręci, i jest równe ' num2str(i)])
i = i + 1;
end
i
Zawiera on dwie pętle "while". Każda z nich "jest liczona" za pomocą parametru "i" - nie jest
on jednak związany z pętlą (tak, jak to było w przypadku pętli "for"), i dlatego też sami
musimy zadbać o to, aby ustawić jego wartość startową ("i=1"), napisać warunek działania
("i
zadziałają tak, jak odpowiedniki w postaci pętli "for", wcześniej już uruchamiane. Czy
wszystko jest takie same? Na koniec programu wypisywana jest wartość zmiennej "i". W
przypadku pętli "for" miałaby ona wartość "10", tutaj jest o "1" większa. Dlaczego? Dlatego,
iż program musiał ją fizycznie zwiększyć, aby przekonać się, że "i=11" nie spełnia warunku
działania pętli. W przypadku pętli "for", pętla sama sprawdzała, czy wartość "i" już dosięgła
wartości końcowej parametru sterującego, zadeklarowanej w jej nagłówku.
Oczywiście pisanie pętli "while" zamiast pętli "for" nie ma dużego sensu. Jakie więc może
ona mieć zastosowanie? Rozpatrzymy następujący przykład: napisać program, który będzie
losował liczby całkowite z przedziału od "a" do "b" tak długo, aż ich suma będzie większa niż
lub równa 1000. W przypadku takiego zagadnienia nie wiemy z góry, ile takich losowań
będzie potrzebnych, bo to zależy od tego, jak wielki jest przedział i jak duże liczby będą z
niego losowane. Dlatego też tego zadania nie da się - przynajmniej w sposób racjonalny -
zrealizować za pomocą pętli "for". Pozostaje pętla "while". Proszę uruchomić następujący
skrypt:
clc
a = 2;
b = 10;
suma = 0;
ile = 0;
while suma
suma = suma + round(rand(1,1)*(b-a) + a);
ile = ile + 1;
end
disp(['Suma wynosi = ' num2str(suma)]);
disp(['Wylosowano liczb = ' num2str(ile)]);
Proszę zwrócić uwagę, iż nagłówek pętli zawiera wyrażenie logiczne będące
przeciwieństwem sformułowania, które padło w tekście zadania - to dlatego, iż - jeszcze raz
to podkreślam - pętla musi mieć zdefiniowany warunek działania, a nie przerwania, jak to się
intuicyjnie nasuwa. A pętla ma działać wtedy, gdy suma będzie mniejsza niż 1000. Z kolei ma
się przerwać, gdy suma będzie większa lub równa 1000 - jedno oczywiście wynika z drugiego.
Proszę zapisać program i uruchomić go kilka razy dla różnych zestawów wartości zmiennych
"a" i "b", wprowadzanych w kodzie programu. Ale proszę pamiętać: chociaż "b" musi być
dodatnie!
A teraz zróbmy mały eksperyment: proszę w skrypcie zdefiniować "a" i "b" ujemne, np. "a=-
10" i "b= -1". Proszę uruchomić program - i zajrzeć do OP - nic się nie pokazało, program
wciąż pracuje. Co się stało? Skoro przedział zawiera tylko liczby ujemne, to tylko liczby
49
wersja 1.0 listopad 2011
SÅ‚awomir Milewski PK WIL L-5 www.L5.pk.edu.pl/~slawek slawek@L5.pk.edu.pl
ujemne są losowane - w takim wypadku nie ma najmniejszych szans stworzyć sumy, która
przekroczy wartość 1000 - suma będzie też ujemna. Co zatem zrobić, aby zapętlony program
odblokować? Zamknąć Matlab? Nie ma takiej potrzeby - proszę przejść do Matlaba i nacisnąć [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • alwayshope.keep.pl
  •