Ćw.lab.1: Wprowadzenie do programowania - w oparciu o język Matlab c.d.

1.3. Pisanie najprostszych programów.

Użyte w poniższych ćwiczeniach elementy języka Matlab opisane są w rozdziale 8 podręcznika [1].


Zad.4: Pisanie programu w edytorze Matlab-a

Utwórz folder dla swoich programow (np. na Pulpicie) i nadaj mu jako nazwę swoje nazwisko wraz z literką imienia.
Ustaw ten swój folder jako bieżący folder Matlaba czyli Current Directory (w linii u góry pod menu)

Otwórz EDYTOR MATLABa - z Menu File-New lub File-Open lub ikonami:
i napisz poniższy program (skrypt) obliczania objętości V sześcianu, o danym boku L i zapisz do swojego foldera (ustawionego jako bieżący) do pliku "pr1.m".

.
a = input('Długość boku L=')
V=a^3
a, V

W programie użyto funkcji input(..), która pozwala wprowadzać z klawiatury zarówno dane liczbowe jak i teksty:

Funkcja input(..). Składnia oraz objaśnienie
Przykład

Wprowadzanie danych liczbowych z klawiatury:

zmienna = input('żądanie danych')

Wyświetla tekst żądania danych a następnie wpisana z klawiatury liczba zostaje podstawiona do zmiennej. Zamiast liczby można wpisać wyrażenie Matlaba

Przykł.1:


  F=input('Siła nacisku=');
  L=input('Długość dźwigni=');
  Moment_sily=F*L

Wprowadzanie danych tekstowych z klawiatury:

zmienna = input('żądanie danych','s')

Wyświetla żądanie danych, oczekuje na wpisanie przez użytkownika
łańcucha znakowego (lub pojedynczego znaku) i przypisuje go zmiennej

Przykł.2:


znak=input('Tak/Nie - naciśnij T lub N','s')

Uruchom ten program w Matlabie. Instrukcje trzeba kończyć średnikiem [;] - aby pozbyć się niepotrzebnego wyswietlania "echa" działania każdej instrukcji. Popraw to i sprawdź efekt. Drugą wadą jest bardzo nieeleganckie i mylące wyświetlanie wyników, bez objaśnień (a czy L?).

Postaramy się więc ulepszyć program, korzystając m.in. z operacji na tekstach.


Zad.5: Komentarze. Funkcja DISP i operowanie na tekstach

Funkcja disp(..). Składnia oraz objaśnienie
Przykład

Wyświetlanie wyników:

disp(wyrażenie)

Wyświetla wartość wyrażenia arytmetycznego albo tekstowego w sposób podobny jak umieszczenie samego wyrażenia, nie zakończonego średnikiem.

Przykł.3:


disp(['Liczba=',num2str(x),'  Kwadrat liczby=',num2str(x^2)]);

- w tym przypadku posklejano wyrażenia typu tekstowego (string), umieszczając je we wspólnym nawiasie prostokątnym i oddzielając przecinkami. Przed sklejaniem przekonwertowano wyrażenia o wartościach liczbowych na teksty przy pomocy funkcji num2str(..)

Program powinien mieć objaśnienia swojej treści czyli KOMENTARZE rozpoczynające się znakiem procentu [%]. Linie komentarzy umieszczone na poczatku pliku (przed instrukcjami) wyświetlą się jako jego opis gdy wpiszemy: "help nazwa_pliku", a dodatkowo program po uruchomieniu też powinien się przedstawić.
Oprócz tego dobrze jest na początku wymazać zmienne z pamięci komendą clear oraz oczyścić ekran komendą clc. Uzupełnij program dopisując na początku trzy linie jak pokazano niżej.

% Program PR1a.M oblicza objętość sześcianu
disp('Obliczanie objętości sześcianu');
clear; clc
a = input('Długość boku L=');
V=a^3;
disp( . . . . . . );

W poleceniu disp(..) masz skleić wyprowadzane teksty z liczbami w jedną linię. Jednak w tym celu trzeba najpierw przekonwertować liczby na tekst funkcją num2str(..).
Przeczytaj przykład 3 jak to zrobić i wpisz w miejsce kropek argument funkcji disp( . . . ) sklejony w jedno wyrażenie tekstowe, które w jednej linii wyświetla napisy i wyniki, na przykład tak:

Sześcian o boku L=... ma objętość V=..."

Wpisz: help pr1 a następnie jeszcze raz uruchom program.


Zad.6: Zastosowanie funkcji fprintf(..) do sformatowanego wyprowadzania danych

Funkcja fprintf(..). Składnia oraz objaśnienie
Przykład

Sformatowane wyprowadzanie wyników (jak w języku C):

fprintf('opis_formatu', lista_wyrażeń)

Wyprowadza na ekran lub do pliku napisy oraz wartości wyrażeń zgodnie z podanymi formatami.

Opis_formatu może zawierać:

  1. dowolny tekst - kopiowany na wydruk,
  2. opisy pól dla wyprowadzania wartości z listy_wyrażeń, rozpoczynane znakiem % po której następuje liczbowy opis pola wydruku, zakończony literą oznaczającą typ wyprowadzanej wartości, np.:
    %8.2f - pole dla 8 znaków (cyfr i kropki) a w tym dwu znaków po kropce;
  3. znaki sterujące złożone z litery poprzedzonej znakiem \
    na przykład: \n - przejdź do nowej linii

Opisy pól są uwzględniane po kolei (od lewej do prawej) dla kolejnych wyrażeń z listy. Ta sama funkcja może wyniki wyprowadzać do pliku - jeśli ma trzy parametry zamiast dwu. Pierwszy parametr jest wtedy identyfikatorem pliku. Ale o tym będzie w innym miejscu

Przykł.4:


x=123.76;
fprintf('Liczba=%8.2f \nKwadrat liczby=%14.4f', x, x^2)

Lista wyrażeń zawiera tu dwa elementy: x, x^2

Dla pierwszego czyli x jest pierwszy opis pola czyli: %8.2f,
a dla drugiego: x^2- drugi opis pola: %14.4f,
\n - to rozkaz przejścia do nowej linii.

Wynik działania tej funkcji fprintf:

Liczba=  123.76
Kwadrat liczby=    15316.5376

Zastąp funkcję disp(..) funkcją sformatowanego wyprowadzania wyników fprintf(..):

% Program PR1b.M oblicza objętość sześcianu
disp('Obliczanie objętości sześcianu');
clear; clc
a = input('Długość boku L=');
V=a^3;
fprintf('Sześcian o boku L=%7.3f ma objętość V=%12.4f ',a,V);

Po zapisaniu zmian jeszcze raz uruchom program. Objaśnij elementy funkcji fprintf
Zauważ, że wyświetlane nazwy zmiennych (np.: L) nie muszą być takie same jak nazwy zmiennych wewnątrz programu (np.: a), jednak programista powinien mieć listę zmiennych z wszelkimi objaśnieniami, dotyczącymi: nazw wewnętrznych i zewnętrznych, typów, ról, zakresów, .. itd.


Zad.7: Program z pętlą WHILE ... END

Uzupełnij program pętlą WHILE ... END tak aby działał wielokrotnie a zatrzymał się po wprowadzeniu zera jako danej - podobnie jak w podanym przykładzie. Zapisz z nazwą PR1c.m i uruchom.

Pętla typu WHILE:


	while wyrażenie
	  . . . . . instrukcje
	end

Powtarza wykonywanie instrukcji tak długo jak długo wyrażenie
ma wartość logiczną true (czyli prawda) lub jest różne od zera

Przykł.5:


clear; clc
fprintf('\nProgram oblicza pierwiastki z dodatnich liczb');
fprintf('\nZero kończy obliczenia');
x=1
while x > 0
    x=input('Podaj liczbę:'); 
    fprintf('Pierwiastek=%9.2f\n',sqrt(x))
end

Zad.8: Program z instrukcją IF ... ELSE ... END

Przekopiuj z poniższej tabeli do nowego okienka w edytorze program (Przykł. 6) z instrukcjami IF ...ELSE ... END. Zapisz jako pr2.m, przeanalizuj i uruchom ten program.

Instrukcja IF czyli rozgałęzienie warunkowe w programie:

	if warunek
	  instrukcje wykonywane
	  gdy warunek spełniony
	  ... 
	else
	  instrukcje wykonywane
	  gdy warunek NIE spełniony
	  ... 
	end

Pozwala wykonać jeden z dwu możliwych bloków instrukcji zależnie od spełnienia lub nie spełnienia określonego warunku, w postaci relacji (np.: 2*x>sin(y)) lub złożonego wyrażenia logicznego. Rolę warunku może pełnić wyrażenie arytmetyczne wtedy, jego wartość niezerowa jest traktowana jako "prawda" natomiast wartość zerowa jako "fałsz".

Wyrażenia logiczne są objaśnione tutaj

Przykł.6:


% Wykorzystano 3 zagnieżdżone instrukcje IF
% do wybrania jednej z czterech możliwości:
clear; clc;
fprintf('Słowna ocena temperatury:')
t=input('Ile stopni jest na termometrze za oknem:');
if t<0
    disp('Mróz!');
else
    if t<12
	disp('Chłodno!');
    else
	if t>25
	    disp('Gorąco!');
	else
	    disp('Ciepło');
	end
    end
end

Zad.9: Program z pętlą FOR ... END

Przekopiuj z poniższej tabeli do nowego okienka w edytorze program (Przykł. 7) z pętlą FOR ... END. Przeanalizuj i uruchom ten program

TABELA 5. Pętla FOR ... END

Pętla typu FOR:

for zm = pocz : przyrost : konc

instrukcje
powtarzane w pętli
end

instrukcje umieszczone między for i end będą wykonane dla każdej wartości zmiennej zm. Zmienna ta przyjmuje najpierw wartość pocz a przy każdym następnym obiegu pętli jest zwiększana o przyrost, ale nie może przekroczyć wartości konc.

Przykł.7:


% tabela i wykres funkcji cosinus kwadrat
% dla kąta od zera do 180 stopni
clear; clc; i=0;
fprintf('\nFunkcja cosinus kwadrat\n');
fprintf('alfa        F(alfa)');
for alfa=0:5:180
    i=i+1; 
    X(i)=alfa*pi/180;
    Y(i)=cos(X(i))^2;
    fprintf('\nalfa=%5.1f  Y=%7.4f',alfa,Y(i));
end
plot(X,Y); grid on;

Dalej

Powrót do str. gł.