CATEGORII DOCUMENTE |
Mediul de programare SCILAB
Prezentare, instalare, lansare in executie, ferestre si meniuri
SCILAB este un produs dedicat calculului numeric si reprezentarii grafice in domeniul ingineriei, elaborat de Institutul National de Cercetare in Informatica si in Automatica - INRIA Franta. SCILAB are trasaturi comune cu produsul comercial MATLAB.
Versiunea 4.1.1 a mediului SCILAB (13,6 MB) este disponibila gratuit pe site-ul https://www.scilab.org si se instaleaza printr-o procedura automata, implicit in partitia activa, directorul X:Program Filesscilab-4.1.1binWScilex.exe.
Lansarea in executie se poate face cu ajutorul pictogramei de pe Desktop, prin butonul Start → Programs → Scilab-4.1.1 → scilab-4.1.1 sau din calea X:Program Filesscilab-4.1.1bin - fisierul WScilex.exe.
Fereastra de comenzi (figura 8.1), deschisa la pornirea mediului, contine elementele:
bara de nume;
bara de meniuri;
bara de unelte;
fereastra propriu-zisa cu prompt-ul SCILAB -->
Principalele meniuri cu comenzile lor sunt prezentate in figura 8.2.
Meniurile cu comenzile uzuale si rolul lor sunt urmatoarele:
Meniul File:
New Scilab deschide o sesiune de comenzi noua;
Exec permite lansarea in executie a unui subprogram creat si salvat anterior;
Open permite accesul la un (sub)program printr-o fereastra SciPad (figura 8.3);
Save... ajuta la salvarea unui program cu eventuala stabilire a numelui si destinatiei;
Change Directory permite schimarea directorului curent pe durata unei sesiuni;
Exit determina inchiderea unei sesiuni de lucru si terminarea programului SCILAB.
Meniul Edit:
Select All pentru selectarea continutului ferestrei;
Copy si Paste pentru copierea zonelor selectate in si din fereastra;
Empty Clipboard sterge continutul memoriei tampon;
History permite accesul la comenzi pentru manipularea comenzilor introduse anterior in dreptul prompt-ului SCILAB;
LaunchPad
Meniul Preferences contine comenzi pentru modificarea aspectului si a modului de lucru ale mediului SCILAB.
Meniul Cotrol are comenzi pentru executia si oprirea programului curent.
Meniul Editor este, de fapt, o comanda care permite accesul la o noua fereastra SciPad.
Meniul Help ofera utilizatorului posibilitatea documentarii asupra mediului SCILAB.
Ferastra SciPad permite incarcarea, editarea si salvarea unui (sub)program, care poate fi lansat in executie din fereastra de comenzi (Exec). Desigur, aceste operatii se pot face si in ferestra de comenzi, dar in conditii nu tocmai comode.
Obiectele mediului SCILAB
Elementele mediului de programare SCILAB sunt constantele, literalele, polinoamele si functiile rationale, functiile matematice uzuale, functii SCILAB generale, matricele si listele.
Constantele
Constantele disponibile in mediul SCILAB sunt prezentate in tabelul 8.1.
Constantele SCILAB
Tabelul 8.1
Contanta |
Notatia SCILAB |
Tipul |
%pi |
real |
|
e |
%e |
real |
%inf | ||
i |
%i |
complex |
true |
%t |
boolean |
false |
%f |
boolean |
Literalele
Literalele folosite in SCILAB sunt:
Literale numerice reale
Numarul real 17,173 se poate scrie:
17.173 = 17173e-3 = 0.17173e+2
(simbolul exponentului poate fi e sau E).
Literale numerice complexe
Numarul complex 7 - 3i se scrie:
7 - 3*%i
Literale nenumerice
Sunt siruri de caractere cuprinse intre apostrofuri sau ghilimele:
'i' sau ''i''
'sir' sau ''sir''
Polinoame si functii rationale
Un polinom poate fi definit cu ajutorul functiei poly:
[p=]poly(a, 'x'[,'semafor']
a = numar real, vector sau matrice;
x = simbol nedeterminata;
semafor = poate fi coeff sau roots (a doua este valoarea implicita).
Daca a este un numar real, se poate defini nedeterminata:
-->x=poly(0,'x')
x = x sau
-->x=poly(-3,'x')
x = x+3
apoi se poate introduce pe linia de comanda:
-->p=x^3-6*x^2+11*x-6
care, in functie de nedeterminata (x sau x+3) defineste polinomul:
p=
-6+11*x-6x^2+x^3 respectiv
p=
2*x+3x^2+x^3
Daca a este un vector, elementele acestuia sunt considerate ca fiind fie coeficientii, fie radacinile polinomului, dupa cum semaforul are valoarea coeff sau roots.
De exemplu, declaratiile:
-->a=[-6 11 -6 1];
-->p=poly(a,'x','coeff')
definesc polinomul:
p=
-6+11*x-6x^2+x^3
iar declaratiile:
-->a=[1 2 3];
-->p=poly(a,'x')
definesc acelasi polinom.
Daca a este o matrice patrata, polinomul generat este valoarea determinantului det(x*eye()-a). Functia eye() este matricea unitate. De exemplu, declaratiile:
-->a=[1 2 -1;2 1 2;-1 1 2];
-->p=poly(a,'x')
generaza polinomul:
p=
15-2*x-4x^2+x^3
acelasi polinom poate fi generat cu declaratiile:
-->a=[1 2 -1;2 1 2;-1 1 2];
-->x=poly(0,'x');
-->p=det(x*eye()-a)
Daca p si q sunt doua polinoame in nedeterminata x, atunci p/q defineste o functie rationala. De exemplu:
-->v1=[1 2 3];v2=[1 2 -1];p=poly(v1,'x');q=poly(v2,'x');
-->r=p/q
r =
-3 + x
1 + x
-->N=r('num')
N=
-3 + x
-->n=r('den')
n=
1 + x
Functii matematice uzuale
Functiile matematice frecvent folosite sunt prezentate in tabelul 8.2.
Functiile matematice uzuale
Tabelul 8.2
Functia |
Semnificatia |
Functia |
Semnificatia |
abs(x) |
|x| |
exp(x) |
ex |
log(x) |
ln(x) |
log10(x) |
lg(x) |
sin(x) |
sin(x) |
asin(x) |
arcsin(x) |
sinh(x) |
sh(x) |
asinh(x) |
arcsh(x) |
cos(x) |
cos(x) |
acos(x) |
arccos(x) |
cosh(x) |
ch(x) |
acosh(x) |
arcch(x) |
tan(x) |
tg(x) |
atan(x) |
arctg(x) |
tanh(x) |
th(x) |
atanh(x) |
arcth(x) |
cotg(x) |
ctg(x) |
coth(x) |
cth(x) |
Functii SCILAB generale
Functiile SCILAB frecvent folosite sunt prezentate in tabelul 8.3.
Functiile SCILAB uzuale
Tabelul 8.3
Functia |
Semnificatia |
exit (quit) |
parasirea sesiunii de lucru. |
help functie |
afiseaza informatii despre functia precizata |
who |
listeaza numele variabilelor curente |
whos |
listeaza numele variabilelor curente, dimensiunile si tipurile lor |
clc |
sterge continutul ferestrei de comenzi |
clear |
sterge toate variabilele si functiile declarate in sesiunea in curs |
clear a,b |
sterge variabilele a si b |
size(arg) |
returneaza dimensiunea unei matrice specificata ca argument |
length(arg) |
returneaza lungimea matricei (vectorului) specificata ca argument |
matrix(v,m,n) |
remodeleaza matricea v, parcurgand-o pe coloane, intr-o matrice de mxn (liniixcoloane) |
Matrici
In mediul SCILAB se pot folosi matrici care in matematica sunt notate astfel:
Matricile A si B sunt de forma (mxn) - matrici propriu-zise, C si D sunt de forma (mx ) si, respectiv, ( xn) - vectori, iar matricea E este de forma ( x ) - scalar.
Notatia SCILAB pentru o matrice este de forma a(i,j), iar referirea la un element al matricei se face prin notatia x=a(2,2), ceea ce inseamna x=4.
Atentie! SCILAB este case sensitive (variabila a este diferita de variabila A).
Definirea matricilor simple
Se poate face prin:
a) Introducerea explicita a listei elementelor intr-unul din formatele:
a=[1 2;3 4] sau a=[1,2;3,4];
separatorul dintre elementele unei linii este spatiul sau virgula (,)
separatorul dintre linii este simbolul punct si virgula (;)
ex:
>x=[1,2,3,4]
x=
1 2 3 4
-->y=[1;2;3;4]
y=
1
b) Generarea prin instructiuni si functii
ex:
-->clear;
-->k=3;b(k)=5 //instructiune de atribuire
b =
0.
0.
5.
-->t=1:2:7 //progresie aritmetica: prim-termen:pas:ultim-termen
t =
1. 3. 5. 7.
-->r=rand(2,3)*17 //functie de randomizare
r =
3.5925227 0.0037593 11.311479
5.6155606 10.68266
Matrici speciale
zeros(m,n) defineste matricea nula de m linii si n coloane;
ones(m,n) defineste o matrice de m linii si n coloane avand toate elementele egale cu 1;
eye(m,n) defineste matricea unitate de m linii si n coloane.
Elementele matricilor
O matrice poate contine constante, variabile, siruri de caractere, polinoame sau functii rationale. De exemplu:
-->x=poly(0,'x');
-->y=2*x-5;
-->a=[%pi 2^3 sin(%pi/6);y sqrt(16) -5;x abs(a(2,3)) %e]
a =
3.1415927 8 0.5
- 5 + 2x 4 - 5
x 5 2.7182818
-->b=['matrice' 'de' 'doua';'linii' 'trei' 'coloane']
b =
!matrice de doua !
!
!linii trei coloane !
Selectarea unui element al unei matrice se face prin precizarea liniei si a coloanei. In exemplul de mai sus, elementul a(3,2) = abs(a(2,3)) = 5.
Operatori matriceali
Operatorii matriceali sunt prezentati in tabelul 8.4.
Operatori matriceali
Tabelul 8.4
Simbolul |
Semnificatia |
adunare de matrici |
|
scadere de matrici |
|
inmultire de matrici |
|
inmultire pe componente |
|
ridicare la putere prin produs de matrici |
|
ridicare la putere a componentelor |
|
a b = a-1 . b |
|
a . b = (bi,j / ai,j)i,j |
|
b / a = b . a-1 |
|
b . / a = (bi,j / ai,j)i,j |
|
transpunere matrice (inversarea liniilor cu coloanele) |
Extinderea unei matrice patrate
Adaugarea liniei v ca prima sau ultima linie a matricei patrate a:
-->v=[0 0 0];a=[1 2 3;4 5 6;7 8 9];
-->va=[v;a]
va =
0. 0. 0.
1. 2. 3.
4. 5. 6.
7. 8. 9.
-->av=[a;v]
av =
1. 2. 3.
4. 5. 6.
7. 8. 9.
0. 0. 0.
Adaugarea vectorului v ca prima sau ultima coloana a matricei patrate a:
-->vap=[v;a']'
vap =
0. 1. 2. 3.
0. 4. 5. 6.
0. 7. 8. 9.
-->apv=[a';v]'
apv =
1. 2. 3. 0.
4. 5. 6. 0.
7. 8. 9. 0.
Extinderea unei matrice oarecare
Adaugarea vectorului v(n) ca prima sau ultima linie a matricei a(m,n):
-->a=[1 2 3;4 5 6];
-->v=[0 0 0];
-->va=[v;a]
va =
0. 0. 0.
1. 2. 3.
4. 5. 6.
-->av=[a;v]
av =
1. 2. 3.
4. 5. 6.
0. 0. 0.
Adaugarea vectorului v(m) ca prima sau ultima coloana a matricei a(m,n):
-->a=[1 2 3;4 5 6];
-->v=[0;0]
v =
0.
0.
-->va=[v a]
va =
0. 1. 2. 3.
0. 4. 5. 6.
-->av=[a v]
av =
1. 2. 3. 0.
4. 5. 6. 0.
Adaugarea unui element si completarea cu zero a elementelor nedefinite:
-->a=[-1.3 sqrt(3) (2*3)/5]
a =
- 1.3 1.7320508 1.2
-->a(5)=abs(a(1));
-->a
a =
- 1.3 1.7320508 1.2 0. 1.3
sau:
-->b=[1 2;3 4]
b =
1. 2.
3. 4.
-->b(2,4)=6;
-->b
b =
1. 2. 0. 0.
3. 4. 0. 6.
Construirea unei matrice din matrici mici folosite ca elemente:
-->a1=[1 2;3 4];
-->a2=[5 6;7 8];
-->a=[a1;a2]
a =
1. 2.
3. 4.
5. 6.
7. 8.
-->b=[a1 a2]
b =
1. 2. 5. 6.
3. 4. 7. 8.
sau
-->a1=[1 2 3;4 0 0];
-->a2=[5 6;7 8];
-->a=[a1;a2]
!--error 6
inconsistent row/column dimensions
-->a=[a1 a2]
a =
1. 2. 3. 5. 6.
4. 0. 0. 7. 8.
Se observa ca matricile a si a au acelasi numar de linii, dar numar de coloane diferit. De aceea, incercarea de a le combina pe coloane (a=[a1;a2]) se termina cu eroare.
Extragerea unei submatrice dintr-o matrice
Extragerea unei zone compacte
Definirea zonei cuprinsa intre liniile li : lf si coloanele ci : cf se face prin expresia de forma a(li:lf,ci:cf). Pentru extragerea tuturor liniilor sau tuturor coloanelor se folosesc expresiile de forma a(:,ci:cf), respectiv a(li:lf,:). Exemplu:
-->a=[0 0 0 0;0 1 2 3;0 4 5 6;0 7 8 9]
a =
0. 0. 0. 0.
0. 1. 2. 3.
0. 4. 5. 6.
0. 7. 8. 9.
-->b=a(2:3,2:4)
b =
1. 2. 3.
4. 5. 6.
-->c=a(:,1:3)
c =
0. 0. 0.
0. 1. 2.
0. 4. 5.
0. 7. 8.
-->d=a(2:4,:)
d =
0. 1. 2. 3.
0. 4. 5. 6.
0. 7. 8. 9.
Extragerea unei zone necompacte
Precizarea zonei a(l,c) se face prin definirea a doi vectori care contin liniile (l) si, respectiv, coloanele (c) matricei a, care vor fi extrase. Exemplu:
-->a=[0 0 0 0;0 1 2 3;0 4 5 6;0 7 8 9]
a =
0. 0. 0. 0.
0. 1. 2. 3.
0. 4. 5. 6.
0. 7. 8. 9.
-->l=[1 2 4];
-->c=[2 3];
-->b=a(l,c)
b =
0. 0.
1. 2.
7. 8.
Extragerea ultimei linii sau a ultimei coloane
Pentru extragerea ultimei linii sau ultimei coloane din matricea a se folosesc expresii de forma a($,:), respectiv, a(:,$).
Liste
O lista se defineste printr-o expresie de forma:
list(e1, e2, ., en)
in care ei sunt obiecte SCILAB. Exemplu:
-->l=list(17,%pi,'scilab',[1 2;3 4])
l =
l(1)
17.
l(2)
3.1415927
l(3)
scilab
l(4)
1. 2.
3. 4.
Elemente de programare in SCILAB
Generalitati
In ce priveste editarea programelor, mediul SCILAB ofera doua posibilitati:
Introducerea programului, linie cu linie, in fereastra de comenzi in dreptul prompt-ului. Fiecare instructiune este executata si rezultatul este afisat imediat ce s-a terminat introducerea ei, moment marcat de apasarea tastei Enter. Rezultatul executiei nu este afisat daca, inainte de Enter, se tasteaza punct si virgula (;).
Deschiderea unei ferestre de editare SciPad permite introducerea programului fara o executie imediata si cu indentarea liniilor, pentru usurarea urmaririi structurii acestuia. Dupa finalizare programul poate fi lansat in executie cu ajutorul comenzii Load into Scilab din meniul Execute (Ctrl+l).
Comentariul trebuie precedat de doua simboluri slash (//) consecutive si poate sa apara in continuarea unei instructiuni sau sa ocupe singur o linie a programului.
Instructiunea de atribuire
variabila = expresie
Instructiuni conditionale
Operatori logici si operatori relationali
Pentru exprimarea conditiilor care insotesc instructiunile conditionale se folosesc operatorii logici si operatorii relationali, prezentati in tabelul 8.5
Operatori logici si operatori relationali
Tabelul 8.5
Operatori logici |
Operatori relationali |
||
Simbolul |
Semnificatia |
Simbolul |
Semnificatia |
& |
si | ||
sau | |||
nu |
< = | ||
< |
< |
||
> = | |||
> |
> |
Instructiunea if
if conditie- then
instructiuni-
[ elseif conditie- then
instructiuni-
elseif conditie-n [then
instructiuni-n
else
instructiuni-n+
end
Cuvantul cheie then poate fi inlocuit cu Enter sau virgula (,). Daca este folosit, then trebuie sa apara pe aceasi linie cu if sau elseif. Cuvantul cheie elseif poate fi despartit in doua cuvinte - else si if - cu conditia ca al doilea sa fie scris pe linia urmatoare. Exemple:
// Instructiunea IF - var.1
a=0;
b=rand()
if b<=.5
a=1
end;
if b>.5
a=2
end;
// Instructiunea IF - var.2
a=0;
if b<=.5
a=1
else
a=2
end;
// Instructiunea IF - cu ELSEIF
if b<.2
a=1
elseif b<.4
a=2
elseif b<.6
a=3
elseif b<.8
a=4
else
a=5
end;
b =
0.2113249
a =
1.
a =
1.
a =
2.
In programul precedent functia rand() genereaza aleator un numar subunitar strict pozitiv.
Instructiunile select case
select expresie
case expresie- then
instructiuni-
[ case expresie- then
instructiuni-
case expresie-n [then
instructiuni-n
else
instructiuni-n+
end
Cuvantul cheie then poate fi inlocuit cu Enter sau virgula (,). Daca este folosit, then trebuie sa apara pe aceasi linie cu case. Exemplu:
/ Instructiunile SELECT CASE
clear;clc
n=round(10*rand(1,1))
select n
case 0 then
disp(0,'n=')
case 1 then
disp(1,'n=')
case 2 then
disp(2,'n=')
case 3 then
disp(3,'n=')
case 4 then
disp(4,'n=')
case 5 then
disp(5,'n=')
case 6 then
disp(6,'n=')
case 7 then
disp(7,'n=')
case 8 then
disp(8,'n=')
else
disp(9,'n=')
end
n =
9.
n=
9.
In programul precedent expresia round(10*rand(1,1)) genereaza aleatoriu a un numar intreg cuprins in intervalul [1,9]. Cuvantul cheie else putea fi inlocuit cu expresia case 9.
Instructiuni de ciclare
Instructiunea for
for variabila=expresie [do
instructiune, instructiune,
end
In mod obisnuit expresie este de forma n :pas:n sau n :n , unde n ,n sunt variabile sau constante care definesc valorile initiala, respectiv, finala pentru variabila, iar pas reprezinta valoarea cu care este incrementata variabila la fiecare reluare a ciclului. Daca lipseste din expresie, pas are valoarea implicita 1.
Cuvantul cheie do poate fi inlocuit cu Enter sau virgula (,). Daca este folosit, do trebuie sa apara pe aceasi linie cu for. Virgula este obligatorie pentru separarea instructiunilor scrise pe aceeasi linie (vezi Ex.3). Exemple:
// Instructiunea FOR
clear;clc
n=3;
// Ex.1
for i = 1:n do
for j = 1:n do
a(i,j) = 1/(i+j-1);
end;
end
disp(a,'Ex.1: a=')
// Ex.2
for j = 2:n-1,
a(j,j) = j;
end;
disp(a,'Ex.2: a=')
// Ex.3
disp('Ex.3: v=')
for v=a, write(6,v), end
// Ex.4
disp('Ex.4')
for l=list(1,2,'example') do
l,
end
Ex.1: a=
1. 0.5 0.3333333
0.5 0.3333333 0.25
0.3333333 0.25 0.2
Ex.2: a=
1. 0.5 0.3333333
0.5 2. 0.25
0.3333333 0.25 0.2
Ex.3: v=
1.0000000000D+00
5.0000000000D-01
3.3333333333D-01
5.0000000000D-01
2.0000000000D+00
2.5000000000D-01
3.3333333333D-01
2.5000000000D-01
2.0000000000D-01
Ex.4
l =
1.
l =
2.
l =
example
Instructiunea while
while conditie=expresie [do / then / (,)
instructiune, instructiune,
else instructiune, instructiune,
end
Cuvantul cheie do poate fi inlocuit cu then, virgula (,) sau Enter. Daca este folosit, do sau then trebuie sa apara pe aceasi linie cu while. Virgula este obligatorie pentru separarea instructiunilor scrise pe aceeasi linie. Exemple:
// Instructiunea WHILE
clear;clc
i=0;
j=0;
while i<=5
j=j+1;
n=round(10*rand());
if n<=5
i=i+1;
end
end
disp(i)
disp('din')
disp(j)
din
9.
numere n<=5
Instructiunea break realizeaza un salt neconditionat la prima instructiune, aflata dupa instructiunea end, care incheie instructiunea de ciclare.
Functii (subprograme) in SCILAB
Functii definite in linia de comanda
deff ('[y , yn]=f(x , xm)',['y =expresie ', , 'yn=expresien
O functie definita in linia de comanda poate fi salvata prin comanda:
save('calefisier.bin',f)
Exemple:
// Functia DEFF
clear;clc
// Ex.1
disp('Ex.1')
deff('[y]=f(x)','y=2*x^2-7*x+5');
x=[1:1:9];
disp(x,'x=')
disp('f:');
f
// Ex.2
disp('Ex.2')
deff('[z]=g(u,v)','z=u+v')
deff('[z]=h(u,v)',['a=3*u+1'; 'z=4*a+u'])
u=[1 2 3 4];
v=[1 1 1 1];
disp(u,'u=',v,'v=')
disp('g:')
g
disp('h:')
h
Ex.1
x=
1. 2. 3. 4. 5. 6. 7. 8. 9.
f:
ans =
0. - 1. 2. 9. 20. 35. 54. 77. 104.
Ex.2
v=
1. 1. 1. 1.
u=
1. 2. 3. 4.
g:
ans =
2. 3. 4. 5.
h:
ans =
17. 30. 43. 56.
Functii definite in exterior
In fereastra SciPad se creaza subprogramul:
function [y , yn]=f(x , xm
instructiuni Scilab
care se salveaza obligatoriu cu numele fisier.sci si poate fi utilizata dupa incarcarea ei prin:
getf('calefisier.sci', 'c')
in care parametrul 'c' semnifica faptul ca Scilab foloseste in executie o forma compilata a subprogramului. Daca se utilizeaza 'n', atunci codul subprogramului este interpretat.
Functiile definite in exterior pot fi organizate in biblioteci. Astfel, functiile Scilab, aflate intr-un catalog localizat prin cale, pot fi reunite intr-o biblioteca prin comanda:
genlib('numeBiblioteca', 'cale')
Resursele bibliotecii pot fi utilizate dupa reincarcarea ei prin:
numeBiblioteca=lib('cale')
Grafica in SCILAB
Scilab dispune de foarte multe functii grafice, din care prezentam plot2d si fplot2d.
Functia plot2d
plot2d([x,] y)
unde x si y sunt doua matrici de acelasi tip de m linii si n coloane.
Functia construieste in fereastra grafica graficele a n curbe, care trec prin punctele:
(xi,j,yi,j)1≤i≤m j
Daca x lipseste, el este presupus un vector :n, unde n este numarul de puncte pe curba dat de parametrul y.
Exemple:
// Functia PLOT2D
clear;clc
x=[0:0.1:2*%pi]';
// Ex.1 plotare simpla
plot2d(sin(x));
// Ex. 2 plotare simpla
clf()
plot2d(x,sin(x));
// Ex. 3 plotare multipla
clf()
plot2d(x,[sin(x) sin(2*x) sin(3*x)]);
// Ex. 4 plotare multipla cu 3 culori (rosu-5, albastru-2, verde-3), cu legenda (L1,L2,L3), cu 3 marcaje principale si 10 secundare pe x si pe y si cu frame - stanga-jos (0,-2) si dreapta-sus (2
clf()
plot2d(x,[sin(x) sin(2*x) sin(3*x)],[5,2,3],leg='L1@L2@L3',..
nax=[10,3,10,3],rect=[0,-2,2*%pi,2]);
Functia fplot2d
fplot2d(x, f) unde
x este un sir de numere reale;
f este o functie Scilab
iar rezultatul este graficul functiei f construit pe baza valorilor ei in punctele lui x.
Exemple:
// Functia FPLOT2D
clear;clc
x=[0:0.1:2*%pi]';
deff('[y]=f(x)','y=sin(x)+cos(x)')
x=[0:0.1:10]*%pi/10;
fplot2d(x,f)
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2384
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved