Sunteți pe pagina 1din 13

1

LUCRAREA 10

Comenzi de control a execuiei unui program.

Dei, de obicei, cerem calculatorului execuia secvenial a unor
comenzi avem situaii cnd nu dorim acest lucru. n una din aceste
situaii, n funcie de o condiie executm fie o secven de instruciuni,
fie alt secven de instruciuni. n alt situaie dorim execuia repetat a
unei secvene de instruciuni. Pentru a dirija n modul dorit execuia
fluxului de comenzi MATLAB s-au introdus comenzi speciale care
constituie scopul lucrrii.
Comand de ramificare if are mai multe forme. Prima form i
cea mai simpl este:

if condiie
secvena de instruciuni
end

unde condiie este o expresie logic ce se evalueaz. Efectul unei astfel
de comenzi este: dac condiie este adevrat se execut secvena de
instruciuni i apoi se trece la execuia comenzilor ce urmeaz dup end.
Dac condiie nu este adevrat se trece la execuia comenzi de dup end.
Exemplu:

>> x=5;
>> ind=2;
>> if ind<25
ind=ind+1;
end
>> ind
ind =
3

Efectul execuie lui if se vede prin faptul c ind a fost mrit cu 1 deoarece
x<25. Altfel ind ar fi rmas neschimbat.
Observaie. Toate comenzile din secvene din cadrul comenzilor de
control trebuie s se termine cu ;
2
Comanda if cu clauza else este utilizat cnd se dorete execuia
unei secvene pe condiie adevrat i a altei secvene pe condiie fals:

if condiie
secvena 1 de comenzi
else
secvena 2 de comenzi
end

Secvena 1 se execut dac condiie este adevrat iar secvena 2
dac condiie este fals. De exemplu:

>> interval =0.9;
>> if interval<1
xinc=interval/10;
else
xinc=0.1;
end
>> xinc
xinc =
0.0900
Datorit unor condiii complexe, uneori este necesar mbricarea
comenzilor if. Pentru aceste cazuri exist opiunea elseif:

if conditie1
Secvena 1 de comenzi
elseif conditie2
secvena 2 de comenzi
elseif conditie3
secvena 3 de comenzi
..
Else
Secvena n de comenzi
Exemplu:

>> n=7;
>> ind=1;
>> if n>10
ind=10;
elseif n>5
ind=5;
3
else
ind=0;
end
>> ind
ind =
5
n cazul unor ramificri multiple pentru a preveni scrierea unor
secvene if mbricate complexe se utilizeaz comanda switch-case:

switch expresie
case valoare1
scvena 1 de comenzi
case valoare2
secvena 2 de comenzi
.
otherwise
secvena n de comenzi
end

Exemplul de la if else se poate implementa i cu switch case:

>> interval=0.9;
>> switch interval<1
case 1
xinc=interval/10;
case 0
xinc=0.1;
end
>> xinc
xinc =
0.0900

Pentru scrierea buclelor cu numr de cicluri cunoscut se utilizeaz
comanda for.

for variabila=expresie
secvena de comenzi
end

Observaii:
4
- Dac rezultatul evalurii expresiei este o matrice vid, atunci se sare
direct la prima comand dup end fr s se execute secvena de
comenzi;
- Dac rezultatul evalurii expresiei este o matrice cu n coloane atunci
secvena de comenzi se va executa de n ori. Variabila va lua pe rnd
ca valoare coloana k la execuia k i poate fi utilizat cu aceast
valoare n secvena de comenzi;
- Dac rezultatul evalurii expresiei este un vector cu n elemente,
atunci secvena de comenzi se va executa de n ori, la a k-a execuie
variabila lund ca valoare elementul de ordin k din vector;
- Dac rezultatul evalurii expresiei este un scalar secvena de
comenzi se va executa o singur dat, iar variabila va lua ca valoare
acel scalar;
- Nu se poate termina o bucl for prin modificarea variabilei;
- Se poate utiliza n expresie operatorul : ;
- Variabila va avea la sfrit ca valoare ultima coloan,respectiv
ultimul element.
Vom calcula valoarea n! :

>> n=6;
>> fact=1;
>> for ind=1:n
fact=fact*ind;
end
>> fact
fact =
720
Observaie. Exemplul de mai sus este pur didactic. Ca regul
general atunci cnd exist funcii predefinite care calculeaz o valoare
este bine s le utilizai pe acelea. Nu exist o funcie special pentru
factorial. Dar funcia gamma dat de:
1
0
( )
t a
gamma a e t dt


verific gamma(n+1)=n! i este bine s o utilizm. De asemenea exist
funcia prod(v) care calculeaz produsul elementelor vectorului v i deci
prod(1:n) va calcula n! :

>> gamma(7)
ans =
720

5
>> prod(1:6)
ans =
720

Buclele for se pot mbrica. n exemplul urmtor vom nlocui
elementele unei matrici cu restul mpririi lor la 3:

>> A=[1 5 9;-3 7 0;6 9 4]
A =
1 5 9
-3 7 0
6 9 4
>> [l,c]=size(A);
>> for i=1:l
for j=1:c
A(i,j)=rem(A(i,j),3);
end
end
>> A
A =
1 2 0
0 1 0
0 0 1

Observaie. Acelai rezultat se obine (mult mai rapid!!!) i prin
comanda:

>> A=rem(A(:,:),3);

Asupra optimizrilor execuiei comenzilor vom reveni n alt lucrare.
Exist situaii cnd ciclurile se execut att timp ct este
ndeplinit o condiie. Pentru aceast bucl exist definit comanda
while.

While conditie
Secvena de comenzi
End

Observaie. La buclele while exist posibilitatea ca pentru o condiie dat
s se cicleze la infinit. Pentru a evita acest lucru este bine s introducei
un numr maxim de iteraii:
6

it=1;
itmax=1000;
while condiie & (it<itmax)
secvena de comenzi
it=it+1;
end

n toate manualele de specialitate drept exemplu pentru bucla
while este dat calculul lui eps (acurateea relativ a reprezentrii n
virgul flotant n dubl precizie). Valoare lui eps reprezint distana
dintre 1 i urmtorul numr real n dubl precizie mai mare ca 1
reprezentabil :

>> it=0;
>> itmax=100;
>> xeps=1;
>> while (((1+xeps)>1)&(it<itmax))
xeps=xeps/2;
it=it+1;
end
>> it-1
it =
52
>> xeps=xeps*2
xeps =
2.2204e-016

Numrul de mpriri la 2 este cu 1 mai mic dect it i deci
eps=2
-52
2.2204x10
-16
.
Uneori este util s ieim forat dintr-o bucl. Pentru aceasta se va
folosi comanda break care d controlul la prima comand de dup end-ul
buclei.

>> x
x =
1 0 7 NaN 8
>> for ind=1:length(x)
if x(ind)==NaN
break
end
7
x(ind)=rem(x(ind),5);
end
>> x
x =
1 0 2 NaN 8
Se observ faptul c prelucrarea s-a oprit la NaN, altfel n loc de 8
ar fi fost 3 (restul mpririi lui 8 la 5).


Aplicaii

1.Fie secvena if urmtoare:
if x<10
y=2*x;
elseif x<100
y=100-x;
elseif x<1000
y=1000-x/2;
else
y=sqrt(x)
a) Dac x=5 ct este y?
b) Dac x=50 ct este y?
c) Dac x=500 ct este y?
d) Dac x=5000 ct este y?

2. Scriei o secven if care pornind de la o variabil x s se introduc n
variabila y unul din irurile : scalar,vector sau matrice dup cum
este x este scalar,vector sau matrice.

3. n variabila lungime se afl valoarea numeric a unei msurri de
lungime. Unitatea de lungime cu care s-a fcut msurarea poate fi: ft
pentru picior, in pentru inci, m pentru metru i mm pentru milimetru
memorat n variabila unitate. Sa se creeze o secven switch-case care
pune n lungime_metrii valoarea n metrii ai msurtorii.

4. Fiind dat un vector v s se construiasc un vector w ale crui elemente
sunt date de:
( )
( ) ( ) 1 1
2
v i v i
w i
+ +
=
8
Pentru elementul w(1) se va considera c elementul v(0)=0 (v(0)nu
exist). Analog, deoarece v(end+1) nu exist se va considera c este 0.
5.n teoria semnalelor formula:
( ) ( ) ( ) ( ) ( )
1
1 2
2
y k x k x k x k = + +
definete un filtru de medie cu 3 puncte. Filtrele sunt utilizate pentru
nlturarea zgomotului din semna. Folosind un semnal sinusoidal cu
zgomot aleatoriu comparai graficele semnalului i a semnalului filtrat.
Intervalul de timp va fi de 10 s.

6. S se determine indicii (linie,coloan) ale elementului maxim i a celui
minim dintr-o matrice.

7. Problema rcirii sticlei cu bere. Temperatura de afar i din nefericire
i a berii este de 30
o
C. Exist un frigider care n interior are temperatura
de 10
o
C. Punem bineneles sticla n frigider. Dup cte minute ajunge la
temperatura de 14
o
C ca s o putem rcori cu ea?



Indicaii

1.Definim nti pe x i apoi introducem secvena if.

>> x=5;
>> if x<10
y=2*x;
elseif x<100
y=100-x;
elseif x<1000
y=1000-x/2;
else
y=sqrt(x);
end
>> y
y =
10

Analog pentru celelalte valori ale lui x.

9
2. vom utiliza funcia [l,c]=size(x) pentru a vedea dac x este scalar,
vector sau matrice. Aceast funcie introduce n l numrul de linii, iar n
c numrul de coloane ale matricii x. n MATLAB orice variabil este o
matrice. Dac l=c=1 este vorba evident de un scalar. Dac l=1 sau c=1
este vorba evident de un vector i x este o matrice n rest.

3. Pentru transformare::
- pentru inci metru y=0.0254*x;
- pentru picior metru y=0.3048*x;
- pentru milimetru metru y=x/1000.
Este bine de utilizat i clauza otherwise n cazul nostru nseamn faptul
c unitatea nu exist i s introducem n acest caz NaN n y pentru a
semnala c transformarea unitilor nu s-a putut efectua.

4. Se va construi vectorul vx cu size(vx)=size(v)+2, care are ca prim i
ultim element pe 0. Apoi se va defini w cu formula:
( )
( ) ( ) 1 1
1
2
v i v i
w i
+ +
=
Vom avea grij, ca bucla s nceap de la 2 i s se termine la
length(vx)-1.

5. Un semnal sinusoidal este dat de exemplu de formula:
2
sin
5
s t

=



unde t este timpul. Zgomotul poate fi obinut n MATLAB cu:
>> z=0.1*randn(size(t));
Semnalul sinusoidal cu zgomot x va fi suma semnalului sinusoidal s cu
zgomotul z.
Pentru definirea timpului t vom utiliza o comand nou:
linspace(a,b,n)
care mparte n n intervale egale intervalul [a,b]. n analiza i prelucrarea
semnalelor este util ca n s fie putere a lui 2. Nu este cazul aici, dar vom
pune totui n=512=2
9
.
Este evident c pentru primul i al doilea element al semnalului
filtrat nu putem aplica formula de mediere. De aceea primul element
filtrat se ia chiar x(1), iar al doilea (x(2)+x(1)).

6. Problema va utiliza bucle for mbricate. Pentru teste vom utiliza if.
Vom nota lmin i cmin indici cutai pentru elementul minim, respectiv
lmax i cmax indicii elementului maxim.
10

7. S notm cu T
f
temperatura din frigider. Dac la momentul t
i

temperatura berii este T
i
atunci temperatura T
i+1
de la momentul t
i+1
este
dat de:
( )
1 1
( )
i i i i f i
T T K t t T T
+ +
= +
unde, pentru simplificare, K este o coeficientul de conducie al cldurii
comun pentru ansamblul bere-sticl. Pentru simplificarea formulei vom
considera unitatea de msur a timpului minutul i msurtorile se vor
face din minut n minut. Deci t
i+1
t
i
= 1. Vom presupune c pentru
constanta K este valabil K=0.05. Notaii:
k=0.05 constanta de condiie;
tbf=14 temperatura berii final;
tb temperatura berii calculat n minutul t;
tbn - temperatura berii calculat n minutul t+1;
t minutul curent, in final rspunsul dorit.



Soluii

1a) 10; b) 50; c) 750; d) 70.7107;

2.
>> x=[1 2 3];
>> if l==1&c==1
y='scalar';
elseif l==1|c==1
y='vector';
else
y='matrice';
end
>> y
y =
vector

3.
>> lungime=4.25;
>> unitate='ft';
>> switch unitate
11
case 'in'
lungime_metrii=lungime*0.0254;
case 'ft'
lungime_metrii=lungime*0.3048;
case 'm'
lungime_metrii=lungime;
case 'mm'
lungime_metrii=lungime/1000;
otherwise
lungime_metrii=NaN;
end
>> lungime_metrii
lungime_metrii =
1.2954

4.
>> v=[1 0 5 7 3 4 5 5 8]
v =

1 0 5 7 3 4 5 5 8
>> vx=[0 v 0]
vx =
0 1 0 5 7 3 4 5 5 8 0
>> for ind=2:length(vx)-1
w(ind-1)=(vx(ind-1)+vx(ind+1))/2;
end
>> w
w =
0 3.0000 3.5000 4.0000 5.5000 4.0000 4.5000 6.5000 2.5000

5.
>> t=linspace(0,10,512);
>> s=sin(2*pi/5+t);
>> z=0.1*randn(size(t));
>> x=s+z;
>> y=zeros(size(t));
>> y(1)=x(1);
>> y(2)=(x(2)+x(1))/2;
>> for k=3:length(t)
y(k)=(x(k)+x(k-1)+x(k-2))/3;
end
12
>> subplot(2,1,1);
>> plot(t,x)
>> xlabel('timp [s]')
>> ylabel('amplitudine semnal')
>> title('Semnal sinusoidal cu zgomot')
>> subplot(2,1,2)
>> plot(t,y)
>> xlabel('timp [s]')
>> ylabel('amplitudine semnal')
>> title('Semnal filtrat')



Se observ faptul c semnalul filtrat a eliminat n mare msur zgomotul.

6.
>> a=[1 2 3;0 -2 3;-2 -1 0];
>> [r,c]=size(a);
>> lmin=1;lmax=1;cmin=1;cmax=1;
>> elemin=a(1,1);
>> elemax=a(1,1);
>> for i=1:r
13
for j=1:c
if a(i,j) > elemax
elemax=a(i,j);
lmax=i;
cmax=j;
end
if a(i,j) < elemin
elemin=a(i,j);
lmin=i;
cmin=j;
end
end
end
>> [elemax lmax cmax]
ans =
3 1 3
>> [elemin lmin cmin]
ans =
-2 2 2
Elementul maxim este 3 i se afl pe linia 1 coloana 3, iar elementul
minim este -2 i se afl pe linia 2 coloana 2. Se remarc faptul c, dei
exist mai multe elemente maxime s-au minime, este reinut primul
ntlnit.

7.
>> k=0.05;
>> tbf=14;
>> tb=30;
>> t=1;
>> tf=10;
>> while tb > tbf
tbn=tb+k*(tf-tb);
tb=tbn;
t=t+1;
end
>> t
t =
33
Deci dup 33 de minute putem scoate berea din frigider la temperatura de
14
o
C. Cam dureaz i dac afar e 30
o
C o s ni se par o venicie !!