Sunteți pe pagina 1din 10

1 | P a g e

Programare si limbaje II
Anul I, AR+ITT

1 Recapitulare

Curs 4

1.1 Comenzi

edit
open
type
echo

1.2 Funcii

realmin()
input()
sscanf()
display()
disp()
sprintf()


1.3 Caractere speciale

%
%%

Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor

5.1 Instruciuni de control condiional

Instruciunile de control condiional permit selectarea blocului de instruciuni care urmeaz s fie executat, n
momentul rulrii, n funcie de o anumit condiie (instruciunea if cu clauzele ei, else i endif) sau prin selectarea
dintr-o mulime de opiuni posibile (instruciunea switch cu clauzele case i otherwise).

5.1.1 Instruciunea if-end

Instruciunea if este folosit pentru luarea unei decizii, de obicei ntr-un fiier script, n conjuncie cu o expresie cu
rol de condiie. Corespunde structurii decizionale din programarea structurat.

Sintax:
if expresie
instruciuni
end

Descriere:
n momentul execuiei instruciunii if ,se evalueaz expresie i dac rezultatul are valoarea logic 1 (true) sau o
valoare diferit de zero, se execut una sau mai multe instruciuni.
expresie poate consta n variabile, constante, expresii mai mici unite prin operatori logici sau relaionali sau
chiar apeluri de funcii logice sau cu rezultat numeric.

Exemple de expresii:
a>0
(a==b) && (b==c)
(a<=x) && (x<=b)
isprime(a)
isscalar(a)

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
2 | P a g e
n cazul n care expresia de tip condiie nu este evaluat la un scalar (adic este un tablou), toate elementele
tabloului respectiv trebuie s ndeplineasc acea condiie, pentru ca expresia s fie adevrat.

Exemplul 1: s se calculeze media la verificare la Programare pe semestrul II, tiind c nota final are urmtoarele
componente: nota la proba scris, cu o pondere de 50%, nota la proba de laborator, cu o pondere de 25%, nota la
dosarul cu probleme, cu o pondere de 25% si eventualul bonus la nota final. Ca i condiii, toate cele trei
componente ale notei trebuie s fie mai mari sau egale cu 5 i toate eventualele absene s fie recuperate.
Exemplul se va verifica pe mai multe seturi de valori de intrare.

Script 1. Fiierul L7script1.m
nota_scris = 5;
nota_lab = 5.5;
nota_dosar = 10;
absente_lab = 0;
bonus = 1.5;
if (nota_scris >= 5) && (nota_lab >= 5) && (nota_dosar >= 5) && (absente_lab == 0)
disp('Media de promovare: ');
media = 0.5 * nota_scris + 0.25 * nota_lab + 0.25 * nota_dosar + bonus;
disp(media);
end

Instruciunile if pot fi imbricate (suprapuse sau incluse unele n altele), n acest caz fiecare if trebuie mperecheat
cu o instruciune end.

5.1.2 Instruciunea if-else-end

Instruciunea if-else furnizeaz o alternativ, n cazul n care expresie nu este adevrat.
Sintax:
if expresie
instruciuni1
else instruciuni2
end

Descriere:
n momentul execuiei instruciunii if-else, se evalueaz expresie i dac rezultatul are valoarea logic 1 (true)
sau o valoare diferit de zero, se execut una sau mai multe comenzi notate prin instruciuni1, iar n caz
contrar, dac rezultatul are valoarea logic 0 (false), se execut instruciunile instruciuni2.

Exemplul 2: Se reiau cerinele de la exemplul 1, cu specificarea c n cazul n care studentul nu ntrunete
condiiile de promovare, se va afia mesajul: Student nepromovat!. Se va calcula i afia att media rezultat
dup aplicarea formulei, ct i nota final, rotunjit la cel mai apropiat ntreg. Fiierul script creat se va denumi
promovati_if_else.m.

Script 2. Fiierul L7script2.m
% Script calcul nota examen, exemplificare if-else
nume = input('Numele: ', 's');
prenume = input('Prenumele: ', 's');
nota_scris = input('Nota la proba scrisa: ');
nota_lab = input('Nota la laborator: ');
nota_dosar = input('Nota pe dosarul cu probleme: ');
absente_lab = input('Numar absente: ');
bonus = input('Puncte bonus: ');
if (nota_scris >= 5) && (nota_lab >= 5) && (nota_dosar >= 5) && (absente_lab == 0)
media = 0.5 * nota_scris + 0.25 * nota_lab + 0.25 * nota_dosar + bonus;
disp(['Media: ', num2str(media)]);
disp(['Nota de promovare: ', num2str(round(media))]);
else
disp('Student nepromovat!');
end

Mai jos sunt redate dou exemple de posibile cazuri de rulare ale script-ului.

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
3 | P a g e
Cazul 1:
Numele: Ionescu
Prenumele: Filimon
Nota la proba scrisa: 9.5
Nota la laborator: 8
Nota pe dosarul cu probleme: 6
Numar absente: 0
Puncte bonus: 0.5
Media: 8.75
Nota de promovare: 9
Cazul 2:
Numele: Fodor
Prenumele: Elisabeta
Nota la proba scrisa: 6.5
Nota la laborator: 3
Nota pe dosarul cu probleme: 7
Numar absente: 2
Puncte bonus: 0
Student nepromovat!

Dezavantaje: n script-ul de mai sus, trebuie introduse la nceput toate datele, pentru ca MATLAB s ia o decizie
(studentul este promovat, caz n care i se calculeaz media i nota final, sau studentul este nepromovat). De
asemenea, dac punctajul obinut este mai mare de 10, datorit notelor mari i a prezenei bonusului, nota de
promovare nu se limiteaz la 10.

Exemplul 3: Se reiau cerinele de la exemplul 1, cu specificarea c n cazul n care studentul nu ntrunete
condiiile de promovare, se va afia mesajul: Student nepromovat! i se va meniona motivul nepromovrii. Se
vor analiza toate cazurile de nepromovare, iar n situaia n care un criteriu de promovare nu este ndeplinit (una
din note este sub 5 sau numrul de absene este mai mare dect zero), se va renuna la introducerea
urmtoarelor date. n cazul n care, datorit cumulrii bonusului, media devine mai mare dect 10, nota final se
va limita la 10.

Script 3. Fiierul L7script3.m
% Script calcul nota examen, exemplificare if-else, v.2
nume = input('Numele: ', 's');
prenume = input('Prenumele: ', 's');
nota_scris = input('Nota la proba scrisa: ');
if nota_scris < 5
disp('Student nepromovat! Motiv: nota la proba scrisa mai mica de 5.');
else
nota_lab = input('Nota la laborator: ');
if nota_lab < 5
disp('Student nepromovat! Motiv: nota la laborator mai mica de 5.');
else
nota_dosar = input('Nota pe dosarul cu probleme: ');
if nota_dosar < 5
disp('Student nepromovat! Motiv: nota la dosar mai mica de 5.');
else
absente_lab = input('Numar absente: ');
if absente_lab > 0
disp('Student nepromovat! Motiv: absente nerecuperate.');
else
bonus = input('Puncte bonus: ');
media = 0.5 * nota_scris + 0.25 * nota_lab + 0.25 * ...
nota_dosar + bonus;
disp(['Media: ', num2str(media)]);
if media > 10
media = 10;
end
disp(['Nota de promovare: ', num2str(round(media))]);
end
end
end
end

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
4 | P a g e
La rularea script-ului pot fi obinute urmtoarele rezultate:

Cazul 1:
Numele: Socol
Prenumele: Vivi
Nota la proba scrisa: 10
Nota la laborator: 9.5
Nota pe dosarul cu probleme: 9.75
Numar absente: 0
Puncte bonus: 2
Media: 11.8125
Nota de promovare: 10
Cazul 2:
Numele: Curcan
Prenumele: Vasile
Nota la proba scrisa: 3
Student nepromovat! Motiv: nota la proba scrisa mai mica de 5.
Cazul 3:
Numele: Scorobete
Prenumele: Alexandru
Nota la proba scrisa: 10
Nota la laborator: 10
Nota pe dosarul cu probleme: 10
Numar absente: 3
Student nepromovat! Motiv: absente nerecuperate.

5.1.3 Instruciunea if-elseif-end

Uneori n cazul utilizrii instruciunii if, este necesar impunerea unei condiii suplimentare. Acest lucru poate fi
realizat cu ajutorul cuvntului cheie elseif.

Sintax:
if expresie1
instructiuni1
elseif expresie2
instructiuni2
end

Descriere:
n momentul execuiei instruciunii if-elseif, se evalueaz expresie1 i dac rezultatul are valoarea logic 1
(true) sau o valoare diferit de zero, se execut una sau mai multe comenzi notate prin instruciuni1. n caz
contrar, dac rezultatul are valoarea logic 0 (false), se evalueaz expresie2 i dac rezultatul are valoarea
true sau diferit de zero, se execut comenzile instruciuni2.
Exemplul 4: Se reiau cerinele de la exemplul 1, cu specificarea c n cazul n care studentul nu ntrunete
condiiile de promovare, se va afia mesajul: Student nepromovat! i se va meniona motivul nepromovrii. n
cazul n care, datorit cumulrii bonusului, media devine mai mare dect 10, aceasta se va limita la 10. Se va folosi
forma instruciunii condiionale if-elseif-end.

Script 4. Fiierul L7script4.m
% Script calcul nota examen, exemplificare elseif
nume = input('Numele: ', 's');
prenume = input('Prenumele: ', 's');
nota_scris = input('Nota la proba scrisa: ');
nota_lab = input('Nota la laborator: ');
nota_dosar = input('Nota pe dosarul cu probleme: ');
absente_lab = input('Numar absente: ');
bonus = input('Puncte bonus: ');
if nota_scris < 5
disp('Student nepromovat! Motiv: nota la proba scrisa mai mica de 5.');
elseif nota_lab < 5
disp('Student nepromovat! Motiv: nota la laborator mai mica de 5.');
elseif nota_dosar < 5
disp('Student nepromovat! Motiv: nota la dosar mai mica de 5.');
elseif absente_lab > 0
Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
5 | P a g e
disp('Student nepromovat! Motiv: absente nerecuperate.');
else
disp('Nota de promovare: ');
media = 0.5 * nota_scris + 0.25 * nota_lab + 0.25 * nota_dosar + bonus;
if media > 10
media = 10;
end
disp(media);
end


5.1.4 Instruciunea de selecie multipl switch-case-otherwise-end

Instruciunea de selecie multipl switch execut un bloc de instruciuni prin selecia dintr-o mulime de
alternative, denumite cazuri (case) n funcie de valoarea unei expresii, denumite selector.

Sintax:
switch expr_selector
case expr_case
instruciune, ..., instruciune
case {expr_case 1, expr_case 2, expr_case 3, ...}
instruciune, ..., instruciune
otherwise
instruciune, ..., instruciune
end

Descriere:
Instruciunea switch-case-otherwise-end reprezint un mod de execuie condiionat a codului. Fiecare
alternativ (case) conine: instruciunea case, una sau mai multe expresii i una sau mai multe instruciuni. Se vor
executa instruciunile de pe ramura case unde expresia selector coincide cu cel puin una din expresiile case
specificate. Dac nici una din expresiile case nu coincide cu expresia selector, se vor executa instruciunile
specificate dup clauza otherwise.

Observaie:
Spre deosebire de limbajul C, MATLAB execut doar prima ramur case care se potrivete cu valoarea expresiei
selector. Din aceast cauz, instruciunea break nu este necesar aici.

Exemplul 5: Se citete de la tastatur o cifr ntre 1 i 7, reprezentnd o zi din sptmn. S se afieze numele
zilei, n funcie de cifra citit de la tastatur.

Script 5. Fiierul L7script5.m
% zile din saptamana
zi = input('Introduceti ziua: ');
switch zi
case 1
mesaj = 'luni';
case 2
mesaj = 'marti';
case 3
mesaj = 'miercuri';
case 4
mesaj = 'joi';
case 5
mesaj = 'vineri';
case 6
mesaj = 'sambata';
case 7
mesaj = 'duminica';
otherwise
mesaj = 'zi invalida!';
end
disp('Ziua este:');
disp(mesaj);

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
6 | P a g e
Exerciiu propus:

1. Se citesc de la tastatur valorile a, b, i h, reprezentnd capetele unui interval [a, b], respectiv pasul de
parcurgere. S se reprezinte graficul funciei g(x), dat prin urmtoarea expresie:

+
<

+
<
< +
=
8 , 6
8 4 ,
) 3 (
1
4
5 , 5
5 , 1 2
) (
x daca x
x daca
x x
x
x daca x
x daca x
x g .
Rezolvare:

a = input('a = ');
b = input('b = ');
h = input('h = ');
x = a:h:b;
y1 = 2*x(x<-5)+1;
y2 = x((-5<=x)&(x<4))-5;
x3 = x((4<=x)&(x<8));
y3 = (x3+1)./(x3.*(x3-3));
y4 = x(x>=8)+6;
y = [y1 y2 y3 y4];
[x' y']
plot(x,y)

Rezultate:

a = -7
b = 10
h = 0.1
ans =
-7.0000 -13.0000
-6.9000 -12.8000
-6.8000 -12.6000
-6.7000 -12.4000
-6.6000 -12.2000
...
9.6000 15.6000
9.7000 15.7000
9.8000 15.8000
9.9000 15.9000
10.0000 16.0000

Rezultatele intermediare au fost omise n mod intenionat, din economie de spaiu.

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
7 | P a g e

Fig. 5.1 Graficul funciei g(x)


5.2 Instruciuni de control al ciclurilor

Cu ajutorul instruciunilor de control al ciclurilor se poate executa n mod repetat un bloc de comenzi, revenind la
nceputul blocului, n funcie de o anumit condiie. Pentru a executa blocul de comenzi de un numr specificat de
ori, se folosete instruciunea for. Pentru a executa repetitiv anumite instruciuni ct timp o condiie continu s
fie adevrat sau fals, se folosete comanda while. Instruciunile continue i break ofer un control suplimentar
asupra ciclurilor. Instruciunea return permite ncheierea execuiei programului.

5.2.1 Instruciunea for-end

Instruciunea for este folosit pentru executarea unui grup de instruciuni de un numr predeterminat de ori.
Corespunde structurii iterative din programarea structurat.

Sintax:
for index = start:increment:sfrit
instruciuni
end

Descriere:
n momentul execuiei instruciunii for, valoarea index parcurge intervalul [start, sfrit], cu pasul de
parcurgere stabilit prin increment. Pentru fiecare valoare a lui index, se execut n mod repetat una sau mai
multe instruciuni.
Incrementul implicit este 1. n acest caz el nu mai trebuie specificat. Incrementul poate lua i valori negative, caz
n care valoarea index descrete.

Exemple:

1. S se construiasc irul x, coninnd primele n puteri ale lui 2. Valoarea n se va citi de la tastatur.

% Script pentru calculul puterilor lui 2
n = input('Introduceti numarul de elemente: ');
x = [];
x(1)=1;
for m = 2:n
x(m) = 2 * x(m - 1);
end
Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
8 | P a g e
display(x)

Pentru n = 10, se obin urmtoarele rezultate:

Introduceti numarul de elemente: 10
x =
1 2 4 8 16 32 64 128 256 512

2. Se citete de la tastatur o matrice ptrat A. Se cere s se determine suma elementelor de deasupra
diagonalei secundare.

% suma elementelor de deasupra diagonalei secundare
%% initializare
A = [];
suma = 0;
%% citire matrice
disp('Introduceti matricea A:')
A = input('');
%% verificari
[row col] = size(A);
if row~=col
disp('Matricea nu este patrata!')
return
end
%% calcul suma
for m = 1:row-1
for n=1:row-m
suma = suma + A(m, n);
end
end
%% afisare
disp(['Suma este: ', num2str(suma)])

Cazul 1
Introduceti matricea A:
[1 2 3 4;
5 6 7 8;
9 0 -1 -2;
-3 -4 -5 -6]
Suma este: 26

Cazul 2
Introduceti matricea A:
[1 2 3;
4 5 6]
Matricea nu este patrata!

5.2.2 Instruciunea while-end

Instruciunea while corespunde structurii repetitive condiionate anterior, din programarea structurat.

Sintax:
while expresie
instruciuni
end

Descriere:
Instruciunea while este folosit pentru executarea unui grup de instruciuni n mod repetat, ct timp expresia de
control este adevrat.
Dac expresie este evaluat la o matrice (nu este un scalar), atunci toate elementele acesteia trebuie s aib
valoarea logic adevrat, pentru ca execuia s continue.

Exemple:
Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
9 | P a g e

1. S se determine primul numr ntreg n pentru care n! este un numr cu 50 de cifre. Se va folosi funcia
factorial().

% primul numar intreg n pentru care n! este un numar cu 50 de cifre
n = 1;
while factorial(n) < 1e49 % 10^49 are 50 de cifre
n = n + 1;
end
disp(['Numarul este: ', num2str(n)])
disp(['n! = ', num2str(factorial(n))])

n urma rulrii, rezult:

Numarul este: 41
n! = 33452526613163803000000000000000000000000000000000

5.2.3 Instruciunea break

Instruciunea break ntrerupe execuia unui ciclu for sau while.

Sintax:
break

Descriere:
Instruciunile care apar dup instruciunea break, din corpul unui ciclu for sau while, vor fi ignorate. Urmtoarea
instruciune care se execut este cea care urmeaz dup instruciunea end, de nchidere a ciclului.

Exemple:

1. S se citeasc de la tastatur un ir de maxim 30 de caractere care s nu conin caracterul punct (.). Citirea se
va ncheia dac se introduce caracterul punct.

% citire sir max 30 caractere, fara punct
str = [];
disp('Introduceti sirul de caractere.')
disp('Tastati enter dupa fiecare caracter introdus:')
n = 1;
while n <= 30
str(n) = input('','s');
if str(n) == '.'
break
end
n = n + 1;
end
disp(['Sirul introdus este: ', char(str)])

n urma rulrii, rezult:

Introduceti sirul de caractere:
a
e
r
t
y
u
1
@
#
$
.
Sirul introdus este: aertyu1@#$.

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II Curs 5. Instruciuni de control condiional. Instruciuni de control al ciclurilor
10 | P a g e
5.2.4 Instruciunea continue

Instruciunea continue transfer controlul urmtoarei iteraii a unui ciclu for sau while.

Sintax:
continue

Descriere:
Instruciunile care rmn n corpul unui ciclu, dup instruciunea continue, vor fi ignorate. Execuia se reia de la
nceputul ciclului unde a fost ntlnit instruciunea continue.

Exemple:

1. S se citeasc de la tastatur un ir de 10 de caractere. n cazul n care se citete caracterul punct (.), acesta se
va ignora.

% citire sir 10 caractere, fara punct
str = [];
disp('Introduceti sirul de caractere.')
disp('Tastati enter dupa fiecare caracter introdus:')
n = 1;
while n <= 10
str(n) = input('','s');
if str(n) == '.'
continue
end
n = n + 1;
end
disp(['Sirul introdus este: ', char(str), ' de ',num2str(n-1), ' caractere.'])

n urma rulrii, rezult:

Introduceti sirul de caractere.
Tastati enter dupa fiecare caracter introdus:
1
2
w
s
.
f
g
.
;
g
f
d
Sirul introdus este: 12wsfg;gfd de 10 caractere.

5.2.5 Instruciunea return

Sintax:
return

Descriere:
Instruciunea return, de control al terminrii programului, permite ieirea din program din orice punct al su,
nainte de punctul normal de terminare.
return mai este folosit i pentru a incheia modul keyboard.

S-ar putea să vă placă și