Sunteți pe pagina 1din 7

Programare si limbaje II

Anul I, AR+ITT

Laborator 8. 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.
8.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 1. Fiierul L8script1.m
% 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
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.
Script 2. Fiierul L8script2.m
% 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

1|Page

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II

Laborator 8. Instruciuni de control al ciclurilor

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!

8.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:
1. S se determine primul numr ntreg n pentru care n! este un numr cu 50 de cifre. Se va folosi funcia
factorial().
Script 3. Fiierul L8script3.m
% 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

2|Page

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II

Laborator 8. Instruciuni de control al ciclurilor

2. Se citesc un ir de numere din 13 cifre, reprezentnd coduri numerice personale. S se determine, pentru
fiecare CNP citit: sexul, data naterii (anul n format aaaa, luna, ziua) i judeul naterii. Structura CNP este de
urmtoarea form (http://ro.wikipedia.org/wiki/Cod_numeric_personal, accesat la 08/04/2012):
S | AA | LL | ZZ | JJ | NNN | C,
unde:
S reprezint sexul i secolul n care s-a nscut persoana care posed acel CNP. Persoanelor de sex masculin le sunt
atribuite numerele impare iar persoanelor de sex feminin numerele pare.
Prima cifr a CNP-ului este: (sex brbtesc / sex femeiesc)
1 / 2 - nscui ntre 1 ianuarie 1900 i 31 decembrie 1999
3 / 4 - nscui ntre 1 ianuarie 1800 i 31 decembrie 1899
5 / 6 - nscui ntre 1 ianuarie 2000 i 31 decembrie 2099
7 / 8 - pentru personale strine rezidente n Romnia.
n plus 9 - pentru persoanele strine.
AA este un numr format din 2 cifre i reprezint ultimele 2 cifre din anul naterii. O persoan nscut n anul
1970 va avea la AA 70. (SAA = 170). Daca o persoana va avea prima cifra una din valorile 7,8 (rezideni) sau 9,
atunci se va considera secolul 20. ex SAA =771 anul naterii va fi 1971
LL este un numr format din 2 cifre i reprezint luna naterii persoanei.
ianuarie februarie martie aprilie
01

02

03

04

mai

iunie

05

06

iulie august septembrie octombrie noiembrie decembrie


07

08

09

10

11

12

ZZ reprezint ziua naterii n format de 2 cifre. Pentru zilele de la 1 la 9 se adaug 0 naintea datei. Spre
exemplificare, o persoan nscut n prima zi a lunii va avea codul 01.
JJ este un numr format din dou cifre i este reprezentat de codul judeului sau sectorului n care s-a nscut
persoana ori n care avea domiciliul sau reedina n momentul acordrii C.N.P. De exemplu, pentru Buzu acest
numr este 10. Pentru Bucureti, codul este un numr din intervalul 41 i 46 i reprezint sectorul n care s-a
nscut acea persoan. Codurile judeelor sunt n ordinea alfabetic a acestora, cu unele excepii.
Cod
01
02
03
04
05
06
07
08
09
10
11
12

Jude
Alba
Arad
Arge
Bacu
Bihor
Bistria-Nsud
Botoani
Braov
Brila
Buzu
Cara-Severin
Cluj

Cod
13
14
15
16
17
18
19
20
21
22
23
24

Jude
Constana
Covasna
Dmbovia
Dolj
Galai
Gorj
Harghita
Hunedoara
Ialomia
Iai
Ilfov
Maramure

Cod
25
26
27
28
29
30
31
32
33
34
35
36

Jude
Mehedini
Mure
Neam
Olt
Prahova
Satu Mare
Slaj
Sibiu
Suceava
Teleorman
Timi
Tulcea

Cod
37
38
39
40
41
42
43
44
45
46
51
52

Jude
Vaslui
Vlcea
Vrancea
Bucureti
Bucureti S.1
Bucureti S.2
Bucureti S.3
Bucureti S.4
Bucureti S.5
Bucureti S.6
Clrai
Giurgiu

NNN este un numr format din 3 cifre din intervalul 001 - 999. Numerele din acest interval se mpart pe judee,
birourilor de eviden a populaiei, astfel nct un anumit numr din acel interval s fie alocat unei singure
persoane ntr-o anumit zi.
C este cifr de control (un cod autodetector) aflat n relaie cu toate celelalte 12 cifre ale CNP-ului. Cifra de
control este calculat dup cum urmeaz: fiecare cifr din CNP este nmulit cu cifra de pe aceeai poziie din
numrul 279146358279; rezultatele sunt nsumate, iar rezultatul final este mprit cu rest la 11. Dac restul este
10, atunci cifra de control este 1, altfel cifra de control este egal cu restul.
Script 4. Fiierul L8script4.m
% Script extragere campuri din CNP
%% initializare
clear all
n = 1;

3|Page

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II

Laborator 8. Instruciuni de control al ciclurilor

obs='';
raspuns = 'D';
cnp = 0;
%% citire date
while strcmpi(raspuns, 'D')
while cnp <= 10^12 % similar 1e12
cnp = input(['Introduceti codul numeric personal al persoanei ',...
num2str(n), ': ']);
end
cnp=num2str(cnp);
s = cnp(1);
switch s
case '1'
sex = 'masculin';
secol = 20;
case '2'
sex = 'feminin';
secol = 20;
case '3'
sex = 'masculin';
secol = 19;
case '4'
sex = 'feminin';
secol = 19;
case '5'
sex = 'masculin';
secol = 21;
case '6'
sex = 'feminin';
secol = 21;
case '7'
sex = 'masculin';
secol = 20;
obs = 'Persoana straina rezidenta in Romania';
case '8'
sex = 'feminin';
secol = 20;
obs = 'Persoana straina rezidenta in Romania';
case '9'
sex = 'necunoscut';
secol = 20;
obs = 'Persoana straina';
end
aa = cnp(2:3);
if secol == 20
an = str2num(['19',aa]);
elseif secol == 21
an = str2num(['20',aa]);
else
an = str2num(['18',aa]);
end
jj = str2num(cnp(8:9));
if jj == 12
jud = 'Cluj';
elseif jj >= 40 && jj <= 46
jud = 'Bucuresti';
else
jud = 'Judet necunoscut';
end
%% creare structura
pers(n).cnp = cnp;
pers(n).s = sex;
pers(n).an = an;
pers(n).luna = str2num(cnp(4:5));
pers(n).zi = str2num(cnp(6:7));
pers(n).jud = jud;
pers(n).obs = obs;
raspuns = input('Continuati ? (D/N): ','s');

4|Page

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II

Laborator 8. Instruciuni de control al ciclurilor

n = n+1;
end
%% afisare
for index = 1:n-1
disp(['Persoana ',num2str(index)]);
disp(pers(index));
end

n urma rulrii, rezult:


Introduceti codul numeric
Continuati ? (D/N): d
Introduceti codul numeric
Continuati ? (D/N): d
Introduceti codul numeric
Continuati ? (D/N): d
Introduceti codul numeric
Continuati ? (D/N): n
Persoana 1
cnp: '1751011120025'
s: 'masculin'
an: 1975
luna: 10
zi: 11
jud: 'Cluj'
obs: ''

personal al persoanei 1: 1751011120025


personal al persoanei 2: 2451121411125
personal al persoanei 3: 3021201220012
personal al persoanei 4: 9411212001200

Persoana 2
cnp: '2451121411125'
s: 'feminin'
an: 1945
luna: 11
zi: 21
jud: 'Bucuresti'
obs: ''
Persoana 3
cnp: '3021201220012'
s: 'masculin'
an: 1802
luna: 12
zi: 1
jud: 'Judet necunoscut'
obs: ''
Persoana 4
cnp: '9011212001200'
s: 'necunoscut'
an: 1941
luna: 12
zi: 12
jud: 'Judet necunoscut'
obs: 'Persoana straina'

8.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.

5|Page

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II

Laborator 8. Instruciuni de control al ciclurilor

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.
Script 5. Fiierul L8script5.m
% 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@#$.

8.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. Dup fiecare caracter introdus se va tasta <Enter>. La sfrit se va afia irul citit.
Script 6. Fiierul L8script6.m
% 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

6|Page

Conf.dr.ing. Ovidiu-Aurelian Detean Programare si limbaje II

Laborator 8. Instruciuni de control al ciclurilor

n = n + 1;
end
disp(['Sirul introdus este: ''',char(str),''' si are ',num2str(n-1),' caractere.'])

n urma rulrii, rezult:


Introduceti sirul de caractere.
Tastati enter dupa fiecare caracter introdus:
1
2
3
.
:
a
b
c
X
Y
Z
Sirul introdus este: '123:abcXYZ' si are 10 caractere.

8.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 ncheia modul keyboard.
8.6 Exerciii individuale
1. S se reprezinte schemele logice aferente fiierelor script 1-6.
2. Se citesc de la tastatur valorile a, b i h, reprezentnd capetele unui interval [a, b], respectiv pasul de
parcurgere. S se reprezinte tabelar valorile vectorului x (a x b) i ale funciei f(x), dat prin urmtoarea
expresie:

f ( x) =

x+7
, daca x 4
x3
2x + 3
, daca 4 < x 10
x 8
x + 1,

daca x > 10

3. 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:

2 x + 1, daca x < 5
x 5,
daca 5 x < 4

g ( x) = x + 1
x( x 3) , daca 4 x < 8

daca x 8
x + 6,
4. S se reprezinte schemele logice aferente exerciiilor individuale 2-4.

7|Page

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