Pętle iteracyjne i decyzyjne
Transkrypt
Pętle iteracyjne i decyzyjne
Laboratorium 4 Algorytmy i Systemy Obliczeniowe Pętle iteracyjne i decyzyjne 1. Pętla iteracyjna for Pętlę iteracyjną for stosuje się do wykonywania wyrażeń lub ich grup określoną liczbę razy. Licznik pętli w pakiecie MatLab może być zwiększany bądź zmniejszany w sposób ściśle określony (domyślnie zwiększany co 1): for indeks = start:krok:stop powoduje zwiększenie/zmniejszenie wartości licznika indeks o wartość krok przy każdym obiegu pętli. Składnię i sposób działania pętli iteracyjnej for w systemie obliczeniowym MatLab przedstawiono w ćwiczeniu 1. Ćwiczenie 1 Napisać program, który będzie wizualizował na wykresach funkcje kwadratowe wraz z ich miejscami zerowymi. f(x) = 3,125x2+6,25x+2 - Dwa miejsca zerowe w dziedzinie liczb rzeczywistych f(x) = 3,125x2+5x+2 - Jedno miejsce zerowe w dziedzinie liczb rzeczywistych f(x) = 3,125x2+2x+6,25 - Dwa miejsca zerowe w dziedzinie liczb zespolonych Skrypt programu: clear clc %współczynniki kolejnych funkcji kwadratowych przechowane w macierzy 3x3 Wsp = [3.125 6.25 2;... 3.125 5 2;... 3.125 2 6.25]; %pętla iteracyjna for for indeks = 1:3 a = Wsp(indeks,1); %przypisanie wartości współczynnika a dla %kolejnych wartości indeks b = Wsp(indeks,2); %przypisanie wartości współczynnika b dla %kolejnych wartości indeks c = Wsp(indeks,3); %przypisanie wartości współczynnika c dla %kolejnych wartości indeks rownanie = ['f(x)=' num2str(a) 'x^2+' num2str(b) 'x+' num2str(c)]; delta = b^2-4*a*c; %obliczenie wyróżnika delta %obliczenie miejsc zerowych i przypisane komunikatów w zależności %od wartości delty if(delta>0) x0 = [(-b-delta^0.5)/(2*a) (-b+delta^0.5)/(2*a)]; y0 = [0 0]; info = 'Dwa miejsca zerowe w dziedzinie liczb rzeczywistych'; miejsca0 = ['x_1=' num2str(x0(1)) ', x_2=' num2str(x0(2))]; elseif(delta==0) x0 = -b/(2*a); y0 = [0 0]; miejsca0 = ['x_1=x_2=' num2str(x0)]; info = 'Jedno miejsce zerowe w dziedzinie liczb rzeczywistych'; 1 Laboratorium 4 Algorytmy i Systemy Obliczeniowe else x0 = [(-b-delta^0.5)/(2*a) (-b+delta^0.5)/(2*a)]; y0 = [0 0]; miejsca0 = ['x_1=' num2str(x0(1)) ', x_2=' num2str(x0(2))]; info = 'Dwa miejsca zerowe w dziedzinie liczb zespolonych'; end xw = -b/(2*a); %współrzędna x wierzchołka paraboli x = linspace(xw-1,xw+1,100); %wyznaczenie dziedziny y = a*x.^2+b*x+c; %obliczenie przeciwdziedziny subplot(1,3,indeks) %rozdzielenie wykresów w jednym wierszu %i w trzech kolumnach plot(x,y) %rysowanie paraboli grid on %rysowanie siatki if ~(delta<0) %rysowanie miejsc zerowych gdy delta nie jest %mniejsza od 0 hold on %zablokowanie osi wykresu plot(x0,y0,'or') end xlabel('Oś OX') %podpisanie osi OX ylabel('Oś OY') %podpisanie osi OY title({rownanie info miejsca0}) %podpisanie wykresu end Wynik działania programu: f(x)=3.125x 2+5x+2 f(x)=3.125x 2+6.25x+2 Dwa miejsca zerowe w dziedzinie liczb rzeczywistych Jedno miejsce zerowe w dziedzinie liczb rzeczywistych x 1=x 2=-0.8 x 1=-1.6, x 2=-0.4 2 9 3 Oś OY 1 0.5 0 -0.5 2.5 8.5 2 8 Oś OY 1.5 Oś OY f(x)=3.125x 2+2x+6.25 Dwa miejsca zerowe w dziedzinie liczb zespolonych x 1=-0.32-1.3775i, x 2=-0.32+1.3775i 1.5 1 7 0.5 6.5 -1 -2 -1.5 -1 -0.5 Oś OX 0 7.5 0 6 -1.5 -1 -0.5 Oś OX 0 -1 -0.5 0 Oś OX 0.5 Rys. 1. Wykresy funkcji kwadratowej Pętlę iteracyjną for można zagnieżdżać. Zagnieżdżenie dwóch pętli iteracyjnych for przedstawiono w ćwiczeniu 2. Ćwiczenie 2 Iteracyjne wypełnienie macierzy o wymiarach 10 na 10 wartościami tabliczki mnożenia: clear clc tabliczka = zeros(10,10); for indeksW = 1:10 %pierwsza pętla, iterująca po wierszach macierzy 2 Laboratorium 4 Algorytmy i Systemy Obliczeniowe %tabliczka for indeksK = 1:10 %druga pętla, iterująca po kolumnach macierzy %tabliczka tabliczka(indeksW,indeksK) = indeksW*indeksK; end end disp('Tabliczka mnożenia:'); disp(num2str(tabliczka)) Wynik działania programu: Tabliczka 1 2 2 4 3 6 4 8 5 10 6 12 7 14 8 16 9 18 10 20 mnożenia: 3 4 6 8 9 12 12 16 15 20 18 24 21 28 24 32 27 36 30 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 2. Pętla decyzyjna while Pętla decyzyjna while powtarza wykonywanie wyrażenia bądź ich grup, aż do spełnienia warunku. Pętlę decyzyjną while można zagnieżdżać. Składnię i przykład działania pętli decyzyjnej while w systemie obliczeniowym MatLab przedstawiono w ćwiczeniu 3. Ćwiczenie 3 Napisz prosty program, który znajdzie i wypisze wszystkie kolejne wartości potęg liczby 2 mniejsze od 10000. Skrypt programu: clear clc potegi = []; %inicjacja tablicy do przechowywania wartości potęg wynik = 2; wykladnik = 1; %pętla decyzyjna while while wynik < 10000 potegi = [potegi wynik]; %wstawienie nowego wyniku do tablicy wykladnik = wykladnik+1; %obliczenie nowego wykładnika wynik = 2^wykladnik; %obliczenie nowej wartości potęgi end disp('Wartości kolejnych potęg liczby 2 mniejsze od 10000:') disp(num2str(potegi)); Wynik działania programu: Wartości kolejnych potęg liczby 2 mniejsze od 10000: 3 Laboratorium 4 Algorytmy i Systemy Obliczeniowe 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 3. Polecenie break i continue Polecenie break wewnątrz pętli for lub while kończy jej wykonanie, nawet, jeśli warunek pętli jest spełniony. Słowo kluczowe continue kontynuuje działanie pętli for lub while od początkowej instrukcji w ciele pętli, jeśli warunek wykonywania pętli jest spełniony. Przykład stosowania słów kluczowych break i continue przedstawiono w ćwiczeniu 4. Ćwiczenie 4 Losowanie 6 liczb z 49 bez powtórzeń. Skrypt programu: clear clc liczbyLotto = []; dubel = false; %kontynuacja pętli while jeśli ilość liczb Lotto jest mniejsza od 6 while length(liczbyLotto)<6 los = floor(49 *rand())+1; %losowanie kolejnej liczby z 49 for id = 1:length(liczbyLotto) if los==liczbyLotto(id) dubel = true; break %przerwanie pętli for end end if dubel dubel = false; continue %kontynuacja pętli while end liczbyLotto = [liczbyLotto los]; %zapisanie unikatowej liczby end disp('Wylosowane liczby Lotto:') disp(num2str(liczbyLotto)) Wynik działania programu: Wylosowane liczby Lotto: 40 45 7 31 5 14 4. Zadania do samodzielnego wykonania Wytyczna 1: Przed przystąpieniem do rozwiązywania zadań należy: 1. Utworzyć nowy folder i nazwać go (imię_nazwisko_Lab_numer); 2. Do utworzonego katalogu skopiować wzorzec raportu dołączony do instrukcji, zamienić jego nazwę według wzorca podanego w punkcie 1; 3. Otworzyć raport i wypełnić go swoimi danymi; 4. Uruchomić środowisko obliczeniowe MatLab; 4 Laboratorium 4 Algorytmy i Systemy Obliczeniowe 5. W środowisku obliczeniowym MatLab w oknie Current Directory lub Current Folder (zależy od wersji systemu obliczeniowego) zlokalizować katalog utworzony w punkcie 1. 6. Wszystkie pliki powiązane z zadaniami należy zapisywać w tej lokalizacji. Wytyczna 2: Przed przystąpieniem do każdego z zadań należy wykonać następujące czynności: 1. Wyczyścić przestrzeń Workspace ze wszystkich zmiennych (polecenie: clear); 2. Wyczyścić przestrzeń Command Window ze wszystkich poleceń (polecenie: clc); Wytyczna 3: Wytyczna dotyczy osób pracujących na stanowiskach komputerowych zapewnionych przez Uczelnię. Po ocenieniu przez prowadzącego zajęcia należy: 1. Zarchiwizować wyniki swoich prac na własnym zewnętrznym nośniku danych, lub przesyłając je na własny adres e-mail, czy dysk działający w chmurze bądź w inny legalny sposób; 2. Trwale usunąć z przestrzeni dyskowej katalog utworzony według wytycznej 1 w punkcie 1. Zadanie 1 Wykorzystać pętlę iteracyjną for i napisać program, który będzie wizualizował na wykresach funkcje liniowe wraz z ich miejscami zerowymi. 1. f(x) = vix+vn - Funkcja rosnąca, jedno miejsce zerowe 2. f(x) = -vnx+vi - Funkcja malejąca, jedno miejsce zerowe 3. f(x) = vivn - Funkcja stała, brak miejsc zerowych Gdzie: 𝑣𝑖 – liczba liter imienia, 𝑣𝑛 – liczba liter nazwiska. Styl wizualizacji funkcji ma być zbliżony do wizualizacji przedstawionej w ćwiczeniu 1 (układ wykresów, podpisy wykresów oraz podpisy osi wykresów funkcji). 5