You are on page 1of 4

C O N T R O L U L F L U X U L U I

1. INTRODUCERE
Structurile de control (utilizate in programarea structurata) acceptate in OCTAVE, permit
utilizatorului folosirea limbajului matricial de nivel inalt, in concordanta cu teorema de
structura (Boehm si Jacopini). Teorema de structura precizeaza ca orice algoritm de tip
flux (avand un singur punct de inceput - intrare - si un singur punct de terminare a
executiei - iesire -) se poate reprezenta ca o combinatie a trei structuri de control:
a) SECVENTA (succesiune de doua sau mai multe operatii); b) DECIZIA (alegerea unei
operatii intr-o alternativa); c) CICLUL CU TEST INITIAL (repetarea unei operatii atata
timp cat o anumita conditie este indeplinita).
2. STRUCTURI PENTRU CONTROLUL FLUXULUI
INSTRUCTIUNEA if
Instructiunea if (structura de decizie) poate fi folosita sub una din formele : (exemplu in
problema 1 din Tema de laborator)










INSTRUCTIUNEA switch (exemplu in problema 2 din Tema de laborator)








INSTRUCTIUNEA while





Exemplu: Sa se calculeze primele 100 de numere Fibonacci:
>>fib = ones (1, 100);i = 3; while (i <= 100)
fib (i) = fib (i-1) + fib (i-2); i++;
endwhile

Introducere in informatica. GNU-Octave. Laborator 4.
Copyright 2010, INFORMATICA, Sanda-Carmen Georgescu & Tudor Petrovici

>>if (condition)
then-body
endif
>>

>>if (condition)
then-body
else
else-body
endif
>>

>>if (condition)
then-body
elseif (condition)
elseif-body
else
else-body
endif
>>

>> switch expression
case label
command_list
case label
command_list
...
otherwise
command_list
endswitch
>>

>> while (condition)
body
endwhile
>>

INSTRUCTIUNEA do-until




Exemplu: Sa se calculeze primele 100 de numere Fibonacci:
>>fib = ones (1, 100);i = 2; do i++; fib (i) = fib (i-1) + fib (i-2);
until(i==100)
INSTRUCTIUNEA for (avantajele vectorizarii Octave, fac ca in
multe cazuri, sa se evite folosirea acestei instructiuni vezi
problema din Tema de laborator)




Exemplu: Sa se calculeze primele 100 de numere Fibonacci:
>>fib = ones (1, 100);for i=1:100
fib (i) = fib (i-1) + fib (i-2); endfor
ALTE INSTRUCTIUNI : break, continue, try, unwind_protect
INSTRUCTIUNEA pentru continuarea unei linii de comanda : . . . (trei puncte)
sau \ (backslesh)

3. TEMA DE LABORATOR
1) Se se rezolve sistemul liniar: A*X=B , daca A este matricea cu A(i,j)= 2 daca i=j
si A(i,j)=1 in rest, iar B are componentele B(i)=i^(i-1) ( i,j=110).
HELP: >>n=10;for i=1:n <CR> for j=1:n <CR> if i==j <CR> A(i,j)=2;<CR>
else <CR> A(i,j)=1;<CR> endif <CR> endfor <CR> endfor
>>for i=1:n <CR> B(i)=i^(i-1);<CR> endfor
>>X=inv(A)*B'
Help: CR=Enter
2) In calculul matricial se foloseste norma-p (daca p=1, norma se defineste ca fiind suma
valorilor absolute ale elementelor matricii/vectorului; daca p=inf, norma se defineste ca
fiind cea mai mare valoare dintre valorile absolute ale elementelor matricii/vectorului; in
celelalte cazuri ea se defineste ca fiind radacina patrata din suma patratelor elementelor
matricii/vectorului.









3) Sa se genereze un vector de pas h=0.2 in intervalul [0, 20]
>>h=0.2 ;t=0 ;T=20 ;
>> while t<T
t = t+h;
end
4) Sa se scrie un script Octave care sa calculeze suma primilor 1000 de termeni pentru
seria armonica Riemann si seria armonica alternata (folosind ciclul for si prin
>> do
body
until (condition)
>>

>> for var = expression
body
endfor
>>
>>

>> switch pnorm
case 1;sum(abs(v))
case inf; max(abs(v))
otherwise
sqrt(v'*v)
end
>>

vectorizare). Sa se evalueze in ambele cazuri timpul de calcul si sa se afiseze rezultatele in
format long. Pentru seria armonica alternata sa se compare rezultatul cu valoarea exacta a
sumei seriei, ln(2)









































5) Sa se rezolve sistemul H*X=U, daca H este o matrice HILBERT : H(i,j)= 1/(i+j-
1), iar U(i)=1/(i+j) (i,j=14)
HELP: n=4; for i=1:n <CR> for j=1:n<CR> H(i,j)=1/(i+j-1); <CR>
endfor<CR> endfor . . .
6) Sa se rezolve sistemul tridiagonal A*X=B, daca A(i,j)=2 cand i=j, A(i,j)=-1 cand
|i-j|=1 si A(i,j)=0 in rest, iar B(i)=i^i ( i,j=14)
HELP: >>n=4; for i=1:n, for j=1:n<CR> if i==j<CR> A(i,j)=2;<CR> elseif
abs(i-j)==1<CR> A(i,j)=-1<CR> else A(i,j)=0; <CR> endif<CR>
endfor<CR> endfor . . .
7) Sa se scrie un program care utilizeaza o bucla while, care calculeaza suma
elementelor vectorului X=[5 2 9 10 1 9 1] pana cand intalneste un numar mai
mare ca 8.
HELP: >>X=[5 2 9 10 1 9 1];
s=0;k=1; <CR> while (X(k)<=8) & (k<= length(X)) <CR> s=s+X(k) <CR>
k=k+1<CR> endwhile
clear all; echo on
% Suma primilor 1000 de termeni ai seriei armonice Riemann folosind
ciclul
% for
tic()
h = 0;
for i=1:1000
h = h + 1/i;
endfor
toc()
## Suma primilor 1000 de termeni ai seriei armonice Riemann
## folosind vectorizarea
tic();V = [1:1000];
h1 = sum(1 ./ V); toc()
## Suma primilor 1000 de termeni ai seriei armonice alternate
## folosind ciclul for
h2 = 0;
for i=1:1000
h2 = h2 + sum((-1)^(i+1) / i;
endfor
## Suma primilor 1000 de termeni ai seriei armonice alternate
## folosind vectorizarea
tic();V =[1:1000];
V = [1:100]';
S = (-ones(100,1)) .^ rem(V+1, 2);
h3 = sum(S ./ V);toc()
pause
% Rezultate in format long
format long
h, h1, h2, h3
eroare=log(2)-h3 % se evaluiaza eroarea sumei partiale de 1000 de
termeni fata de valoarea exacta a sumei seriei armonice alternate



8) Sa se defineasca functia: f(x)=2*x+3, daca x apartine intervalului [-10,2] si
f(x)=2*x^2-1 daca x apartine intervalului (2,20] pentru toate valorile intregi pentru
care este definita si sa se reprezinte grafic.
HELP: >>x=-10:20; for k=1:length(x) <CR> if x<=2 <CR> f= 2*x(k)+3
;<CR> else f=2*x.^2-1<CR> end <CR> end<CR> plot(x,f)
9) Sa se calculeze combinari de 100 luate cate 5 ( folosind instructiunea for sau facilitatile
de factorizare ale Octave, folosind prod)
10) Se dau seriile numerice de termen general u_n=1/n^p (p=2, 3, 4) (serii de tip
Riemann) . Se cere ( pentru fiecare din cele 3 serii): a) sa se calculeze si sa se introduca
intr-un vector primele 20 de sume partiale; b) sa se calculeze suma seriilor cu o
aproximatie de 0.0001 folosind sirul sumelor partiale si sa se compare rezultatele obtinute
cu valorile lor exacte c) sa se calculeze eroarea relativa daca pentru calculul sumei se
foloseste suma partiala a primilor 200 de termeni ; ( eroarea realtiva=(valoarea exacta
valoarea aproximativa) / valoarea exacta )
HELP1: Pentru b) se poate folosi instructiunea while
Spre exemplu pentru seria Riemann cu p=2 >> sveche=0;k=1;iter=0.0001;
diferenta=1; <CR> while abs(diferenta)>iter <CR> snoua=sveche+1/(k^2)
<CR> k=k+1 <CR> diferenta=sveche-snoua <CR> sveche=snoua <CR> endwhile
Pentru a) >>n=1:20; sir=1./n.^2; s=cumsum(sir)
HELP2: Valorile exacte pentru suma seriilor Riemann: p=2, s=pi^2/6; p=3,
s=pi^2/25.79; p=4, s=pi^2/90
11) Se da produsul infinit p=cos(pi/4)*cos(pi/8)**cos(pi/2^(n+1)), n=1,2
Se cere : a) sa se calculeze si sa se introduca intr-un vector primele 20 de produse
partiale; b) sa se calculeze produsul cu o aproximatie de 0.1 folosind sirul produselor
partiale si sa se compare rezultatul obtinut cu valorea lui exacta c) sa se calculeze eroarea
relativa daca pentru calculul produsului se foloseste produsul partial a primilor 200 de
termeni ; ( eroarea realtiva=(valoarea exacta valoarea aproximativa) / valoarea exacta )
HELP1: Pentru b) se poate folosi instructiunea while
Exemplu : >> pvechi=cos(pi/4);k=2;iter=0.1; diferenta=1 <CR> while
abs(diferenta)>iter <CR> pnou=pvechi*cos(pi/2^(k+1)) <CR> k=k+1
<CR> diferenta=pvechi-pnou <CR> pvechi=pnou <CR> endwhile
Pentru a) >>n=1:20; sir=cos(pi./2.^(n+1); s=cumprod(sir)
HELP2: Valorea exacta a produsului: p=2/pi

You might also like