Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Matlab lényeges vonásai, adattípusok.
hgguiniyyn 1/1/2019 Matlab lényeges vonásai, adattípusok. uyhjnnmbyg
2
A Matlabról A MATLAB (MATrix LABoratory = mátrix laboratórium) egy interaktív, tudományos és műszaki számítások elvégzésére kifejlesztett, mátrixalapú, magas színtű programozási nyelv. A gyártó cég a The Math Works Inc a programdokumentáció mindegyikén így definiálja a programot: A MATLAB néhány jellemzője: több mint 600 matematikai, tudományos és mérnöki függvényt tartalmaz, matematikai analízisre, numerikus módszerekre és algoritmusok fejlesztésére a MATLAB programozási nyelvén könnyű különböző elemzéseket, modellezéseket és szimulációkat létrehozni és megjeleníteni, de akár önálló alkalmazásokat is meg lehet benne megvalósítani beépített ábrázoló rutinjaival egyszerűvé teszi a 2D és 3D ábrák létrehozását és szerkesztését vektorok, mátrixok, többdimenziós tömbök, objektumok és felhasználó által létrehozható adatstruktúrák segítik az adatfeldolgozást be- és kimeneti fájlszűrői segítségével képes írni és olvasni az elterjedtebb fájlformátumokat, köztük az ASCII-t és az EXCEL-t is. más alkalmazásokkal C, C++, Fortran, Java, ActiveX, vagy DDE felületen keresztül képes kapcsolatot létrehozni programozói felülete hatékony szerkesztési és hibakeresési felületet nyújt I. előadás
3
I. előadás
4
Változók neve lefoglalt szavak
A változók neveit betűkből vagy számjegyekből állíthatjuk össze, amelyből az első jel betű kell, hogy legyen. Különbség van a nagy és kisbetűk között. Bizonyos betűkombinációkat tanácsos kihagyni. Az alábbi kulcsszavakhoz nem tudunk értéket hozzárendelni break, case, else, elseif, end, for, if, otherwise, switch, while Matlab utasításokban gyakran előforduló szavak clear, help, helpdesk, helpwin, lookfor, ver, who, load stb. Standard változók amelynek a Matlab ad értéket ans - név nélküli eredmény neve clock - pillanatnyi időt adja meg cputime - Matlab indítása óta eltelt idő i, j - komplex számok képzetes egysége Inf – végtelen, nullával való osztás eredménye NaN - not a number, nem szám, mint 0/0 pi - az egység kör területe realmax - 2,2251e-308 a legnagyobb lebegőpontos szám értéke realmin - 1,7977e+308 legkisebb pozitív lebegőpontos szám értéke tic - 0-ra állítja a kezdőértéket a toc számára toc - a legutolsó tic utasítás óta eltelt időt adja meg másodpercekben clear – minden változót töröl, a lefoglalt változók numerikus értékét visszaállítja I. előadás
5
Numerikus változók A változók deklarálása érték adással történik. A Matlab a megadott érték alapján dönti el, hogy milyen típusú adatot tárolunk majd benne. változó = kifejezés Példa. >> a=11 a = 11 Létrejön az a változó, mint egy 1x1-es mátrix, értéke 11. Számok használata Pl – e– e23 2+3i i I. előadás
6
Műveletek Aritmetikai operátorok: + (összeadás), - (kivonás), * (szorzás), / (osztás), ^ (hatványozás), \ (inverz osztás). Pl. Számítsuk ki egy gömb térfogatát R=2; Terfogat=(4/3)*pi*R^3 Példa inverz osztásra >>d=2\1 d= A kifejezések kiértékeléséhez a Matlab bevezeti a precedencia szabályt. >>a/b^2 Ez azt jelenti, hogy az egyes műveletek rangsorolva vannak, és a kiszámítás csökkenő rang szerint történik: azaz először a legmagasabb percedenciájú műveletek, majd az eggyel alacsonyabb rangú, es így tovább hajtódnak végre. Az operátorok precedencia sorrendje: 1. ^ 2. +, - (előjel) 3. *, .*, /, ./, \ 4. +, - (összeadás, kivonás) 5. : (colon) Azonos precedenciájú műveleteket balról jobbra haladva végezzük. Sok esetben szükség van a precedencia- vagy a balról-jobbra sorrend megváltoztatására, akkor ezt a kerek zárójelek segítségével érhetjük el. >> (a+b+c)/3 I. előadás
7
Karakterláncok tárolása
A karakterlánc típusú változó deklarálása érték-adással történik, aposztrófok közé téve a szöveget. >>s= 'almafa' A karakter tényleges tárolása, a Matlab az ASCII kódjukat tárolja, kísérő információval. Az utóbbi utal arra, hogy itt nem egy közönséges egész számról van szó, hanem karakterről. I. előadás
8
Az utasításokra adott válasz között látszólag nincs különbség.
A változóban akkor is egy numerikus adat van tárolva, ha karakterlánc változó. >> x=20, s='20' x = 20 s = Az utasításokra adott válasz között látszólag nincs különbség. >> x=x+2, s=s+2 22 A 2-es számot numerikus adatként adja a karaktereket tartalmazó vektorhoz, azaz a ott tárolt ASCII kódokhoz. Ilyenkor az eredmény numerikus adat lesz. Tehát fontos tudni egy változóról, hogy milyen tulajdonságú. I. előadás
9
Függvények karakterláncokkal
length(sz) Karakterlánc hosszát adja meg double(sz) Karakterek Ascii kódjait téríti vissza char(kod) Ascii kódokhoz hozzárendelt karaktereket jeleníti meg deblank(sz) a karakterlánc végén található szóközeket levágja ischar(sz) 1 ha argumentuma string 0 különben isletter(sz) karakterenként vizsgálja a karakterláncot és egy vektor megfelelő indexű elemét 1-re vagy 0-ra állítja, attól függően, hogy a szóban forgó karakter betű-e vagy sem isspace(sz) karakterenként vizsgálja a karakterláncot és egy vektor megfelelő indexű elemét 1-re vagy 0-ra állítja, attól függően, hogy a szóban forgó karakter szóköz-e vagy sem int2str(x) egész számot szöveggé alakít num2str(x) valós számot 4 tizedes pontossággal szöveggé alakít mat2str(x) valós számot szöveggé alakít str2num(sz) szöveget számmá alakít I. előadás
10
Függvények karakterláncokkal
strcat(sz1,sz2) vízszintesen kapcsolja össze argumentumait, összekapcsolandó karakterláncok végén található szóközeket elhagyja. strvcat(sz1,sz2) függőlegesen kapcsolja össze az argumentumait strcmp(sz1,sz2) összehasonlítja a paraméterként beírt karakterláncokat 1 ad vissza ha a kettő tökéletesen megegyezik strncmp(sz1,sz2,n) csak az első n karaktert hasonlítja össze findstr(sz1,sz2) a két karakterlánc közül a rövidebbet keresi a másikban, valahányszor megtalálja, a kezdőpozíciót kiírja a kimenő sorvektorba strrep(sz1,sz2,sz3) az első paraméterében megkeresi a másodikként megadott karakterláncot, és valahányszor megtalálja, kicseréli a harmadik paraméterre strtok(sz1,sz2) az első paraméterét kettévágja ott, ahol a második paraméterét először megtalálta upper(sz) nagybetűkké alakít lower(sz) kisbetűkké alakít I. előadás
11
Vektorok, mátrixok Vektorok megadása:
A Matlab számára az alapvető vektortípus a sorvektor. Szögletes zárójelek között felsoroljuk az elemeket egymástól szóközzel vagy vesszővel elválasztva. x=[ ] vagy vele ekvivalens formában x=[5, 1, 2, 4] x = x = Oszlopvektor esetében az elválasztó karakter a pontosvessző: y=[1;5;3;2] y = 1 5 3 2 De még megadhatjuk a sorvektor transzponáltjaként: y=[ ]’ vagy y=[1,5,3,2]’ Mátrix megadása: a sor elemeit szóközzel vagy vesszővel kell elválasztani, a sorok végét pontosvessző jelöli. A=[ ; ; ] A = II. előadás
12
kezdőérték : lépésköz : végsőérték >> V=1:3:20
Vektorok megadása Egyenközű vektorokat a : operátor illetve a linspace függvénnyel segítségével adhatjuk meg. kezdőérték : lépésköz : végsőérték >> V=1:3:20 V = >> V=10:-4:-10 V = >> V=1:0.2:2 V = ha a lépésköz 1, akkor el lehet hagyni >> V=-1:3 V = linspace(elsőelem, utolsóelem, elemekszáma) >>V=linspace(0,20,6) V = >> V=linspace(0,1,7) V = Mátrixgenerátorok: zeros(n,m) - nxm elemű mátrix, melynek minden eleme nulla. >> zeros(2,3) ones(n,m) - a mátrix minden eleme 1. >> ones(2) eye(n,m) - az átlóban 1-esek vannak (egységmátrixok megadására). >> eye(2,4) >> eye(3) rand(n,m) – (0, 1) intervallumbeli valós véletlenszerű elemekkel tölti fel az nxm-es mátrixot. Négyzetes mátrixok generálásánál elég csak egy paramétert megadni. >> d=100*rand(3) egy 3x3-as mátrixot (0, 100)-beli valós véletlenszerű értékekkel tölti fel >> fix(d) – a generált mátrix elemeinek egész részét adja meg II. előadás
13
Hivatkozás elemekre A Matlabban az indexek kezdőértéke mindig 1. Ha az index nem egész, a Matlab hibát jelez. Elemekre való hivatkozás: változónév(index), az index adja meg, hogy a keresett elem hányadik helyen található a vektorban. x-> >> x(5) ans= 4 Részvektorok készítése: vektor(indexvektor), az indexvektor megadja, hogy a vektor mely elemeit szeretnénk feldolgozni. x-> >>x([2 5 6]) ans = Ha egy vektor páratlanindexű komponenseire van szükségünk x-> >> x(1:2:7) >>x(1:2:length(x)) ans = Ha egy vektor első 3 elemét szeretnénk feldolgozni x-> >> x(1:3) ans = Ha a középső 3 elemét szeretnénk feldolgozni x-> >> x(3:5) ans = -1 2 6 4 7 3 -1 2 6 4 7 3 -1 2 6 4 7 3 -1 2 6 4 7 3 -1 2 6 4 7 3 II. előadás
14
Hivatkozások a mátrix elemeire, soraira, oszlopaira illetve blokkjaira
Elemekre való hivatkozás: A(i,j) i. sor j. eleme. Mátrix elemekre hivatkozhatunk egyetlen egy indexszel is az oszlopfolytonos tárolásnak köszönhetően. A(n*(j-1)+i) az A(i,j) elemnek felel meg, ahol n a sorok száma A-> >>A(2,3) >>A(8) Hivatkozás egy teljes sorra: A(i,:) i. sor elemeit adja meg Hivatkozás egy teljes oszlopra: A(:,j) j. oszlop elemeit adja meg A-> >> A(2,:) A-> >> A(:,3) Hivatkozás sor részelemeire: A(i,j:k) – az i. sor j. és k. oszlopai közötti elemeket adja meg Hivatkozás oszlop részelemeire: A(i:k,j) – a j. oszlop i. és k. sorai közötti elemeket adja meg A-> >> A(3,2:4) A-> >> A(1:2,2) II. előadás
15
A-> >>A(2:4,2:4) >>A(1:2,4:6)
Hivatkozások a mátrix blokkjaira: A(sorindex_vektor, oszlopindex_vektor) A-> >>A(2:4,2:4) >>A(1:2,4:6) >>A(2:4,[2 5]) >>A(2:5,1:2:5) >>A([2 4],[3 6]) >>[A(2,2) A(3,4) A(4,3)] II. előadás
16
Bővítés Vektorok bővítése: Új elem hozzáadása
Sorvektor esetén: Vektor=[vektor újelem] >> x=[ ] >>x=[x 2] Oszlopvektor esetén: Vektor=[vektor; újelem] >>y=[1; 9; 2] >>y=[y; 7] Vektor(elemekszáma+1)=újelem mivel a Matlab már tudja, hogy x oszlop- vagy sorvektor mind két esetben használható ez a felírás mód. Ha a vektor indexe nagyobb mint az elemek száma, akkor nem megadott elemeket 0-val tölti fel. >>x=[1 3 2] >>x(4)=0 >>y=[2; 1; 4] >>y(4)=3 >>x=[1 3 2] >>x(7)=-1 x = Mátrixok bővítése: Bővítés egy újabb sorral: Matrix=[Matrix; sorvektor] >> A=[1 2;3 5]; >>A=[A; [-1 2]] A = A = Bővítés egy újabb oszloppal: Matrix=[Matrix oszlopvektor] >> A=[1 2;3 5]; >>A=[A [1 7]’] Bővítés egy újabb elemmel: Matrix(sor, oszlop)=újelem >> A=[1 2;3 5]; >>A(3,3)=4 II. előadás
17
Vektor=[Sorvekt1 Sorvekt2] Vektor=[Oszlopvekt1; Oszlopvekt2]
Vektorok összefűzése Csak azonos típusú vektorokat lehet összefűzni (sort sorral, oszlopot oszloppal). Vektor=[Sorvekt1 Sorvekt2] Vektor=[Oszlopvekt1; Oszlopvekt2] Legyenek: >>x1=[2 0 -1] >>x2=[1 3 5] >>y1=[4; 1; 5] >>y2=[6; 2] >> s=[x1 x2] s = >> s=[x1 y1'] s = >> s=[x2 x1 y2'] s= >>s=[x1 2:4] s = >>s=[x2 5:6 y2'] s= >>s=[x1 2:3:10] s= s=[x2 linspace(1,4,3)] s= s=[linspace(2, 9, 4) y2'] s= >>o=[y1; y2] o = 4 1 5 6 2 >>o=[x1';y2] o = 2 -1 >>o=[y2; x2'; y1(2)] o = 6 3 >>o=[y1; 9; 2] 9 >>o=[y2; (3:4)'] 4 >>o=[(1:2:4)'; y2] o = 1 o=[y2; linspace(2,7,3)'] 4.5 7 o=[linspace(1,4,3)'; (1:2)'] 2.5 II. előadás
18
+ + -> || + -> Mátrixok összerakása
Figyelni kell a mátrixok dimenziójára. > A=[rand(2) rand(2,3)] > A=[rand(5,2) [rand(2,4) ;rand(3,4)]] || > A=[rand(2,3); rand(3)] A=[[rand(2); rand(3,2)] [rand(3); rand(2,3)]] II. előadás
19
Műveletek Legyen + - * .* Művelet Matlab jele Jelentés Példa Eredmény
összeadás + cij=aij+bij A+B C = kivonás - cij=aij-bij A-B C = szorzás * A*B C = elemenkénti szorzás .* cij=aij*bij A.*B C = II. előadás
20
\ / ./ ^ .^ Művelet Matlab jele Jelentés Példa Eredmény
baloldali osztás \ A\B=inv(A)*B A\B C = jobboldali osztás / A/B=A*inv(B) A/B C = elemenkénti jobboldali osztás ./ cij=aij/bij A./B C = hatványozás ^ A^2=A*A A^2 C = elemenkénti hatványozás .^ cij=aij*aij cij=aij^bij cij=2^aij A.^2 A.^B 2.^A C = C = C = II. előadás
21
Függvények sum(x) - Összeadja az x vektor elemeit. Ha x mátrix, akkor összeadja oszlopait (eredmény egy vektor). max(x) - Megkeresi az x vektor legnagyobb elemét. Ha x mátrix, az eredmény egy sorvektor: az oszlopok maximum értékei. min(x) - Megkeresi az x vektor legkisebb elemét. Ha x mátrix, az eredmény egy sorvektor: az oszlopok minimum értékei. sort(x) - Növekvő sorrendbe rendezi az x vektor elemeit. Ha x mátrix, akkor a rendezés oszloponként történik. norm(x) - a vektor normáját adja meg fliplr(x) - Sorvektor elemeit fordított sorrendbe adja vissza. flipud(x) - Oszlopvektor elemeit fordított sorrendbe adja vissza. length(x) - vektor hosszát adja meg. diag(x) - a mátrix átlóját adja meg diag(x,k) - a mátrix k. átlóját adja meg reshape(x,n,m) - újra méretezzük a mátrixot, nxm-es alakba. tril(x) - az x mátrix főátló feletti elemeit lenullázza triu(x) – az x mátrix főátló alatti elemeit lenullázza det(x) - a mátrix determinánsát számolja ki inv(x) - a mátrix inverzét adja meg rank(x) - a mátrix rangját adja meg size(x) – a mátrix dimenzióját adja meg II. előadás
22
Matlab programozás Matlabban létrehozhatunk *.m állományokat, ezeknek 2 típusa van: Scriptek – parancssorozat Függvények – saját függvény létrehozása. Scriptek használata File/New/Script parancs hatására megjelenik egy szövegszerkesztő, ahol megírhatjuk a parancssort (utasítássort), lementhetjük (F5) majd parancsablakban a lementett névvel hivatkozva lefuttathatóak a beírt parancsok. A % jel után megjegyzések írhatók, ezeket a megjegyzéseket a Matlab a program végrehajtása során, figyelmen kívül hagyja. I. előadás
23
Adatátvitel képernyőre
Beolvasás Input utasítás x=input(kar) –a kar karakterlánc kiíródik a képernyőre, és a gép várja az x beadását a billentyűzetről. kar1=input(kar,’s’) - a kar karakterlánc kiíródik a képernyőre, és a gép várja az kar1 karaktersorozat beadását a billentyűzetről. Kiiratás Legegyszerűbb módja, ha a változókat felsoroljuk, vagy az utasítás végén lehagyjuk a pontosvesszőt. >>a, b Disp utasítás Disp(a) –az a argumentum kiíródik a képernyője I. előadás
24
Relációk operátorok A reláció legegyszerűbb esetben két valós szám egymáshoz való viszonyára utaló állítás. Egy relációhoz egyértelműen hozzárendelhetjük a két logikai érték valamelyikét: az igaz (true) vagy a hamis (false) értéket. Ezt a Matlab két számmal reprezentálja, 1-gyel, illetve 0-val. A relációkat leggyakrabban feltételes (if) utasításokban vagy iteratív ciklusokban (while) használjuk. A Matlabban érvényes relációk: Kisebb < Kisebb vagy egyenlő <= Nagyobb > Nagyobb vagy egyenlő >= Egyenlő == Nem egyenlő ~= III. előadás
25
If utasítás A Matlab a döntések meghozatalát szolgáló feltételek vizsgálatára és a döntés végrehajtására az if utasítás szolgál. Az utasítás általános alakja: if feltétel utasítás(ok)1 else utasítás(ok)2 end Ha feltételben egy igaz állítás szerepel, akkor az if és else közötti utasítások hajtódnak végre, ha hamis akkor az else és az end közötti utasítások. Példaprogram: Döntsük el egy számról, hogy osztható-e hárommal. a=input('Szam='); if mod(a,3)==0 disp('Oszthato 3-mal') disp('Nem oszthato 3-mal') I H utasítás2 utasítás1 Logikai_feltétel III. előadás
26
Feltételben numerikus változó
Az if utasítás feltételében, nem csak logikai kifejezés szerepelhet. Megadhatunk numerikus adatokat (szám, vektor, mátrix ) is. Egy szám esetében, ha az nulla, akkor az else utáni utasítások hajtódnak végre, különben az else előtti. Vektorok és mátrixok esetében, ha az elemek között található egy 0-os, akkor az else utáni parancsok értékelődnek ki, ha egyetlen egy nullás eleme sincs a vektornak vagy mátrixnak, akkor az if és else közötti utasításokat végzi el a számítógép. Példaprogramok: 1. Olvass be egy számot, és add meg az inverzét (n - 1/n). 2. Olvass be egy karakterlánc- ot, van-e benne szóköz? 3. Generálj egy mátrixot, elemei egész számok legyenek, van-e benne 0-os? n=input('Szam='); if n inverze=1/n else disp('inverze + vagy - vegtelen') end sz=input('Szoveg=','s'); if isspace(sz)-1 disp('Nincs szokoz') disp('Talalhato benne szokoz') A=fix(20*rand(3)) if A disp('Nincs 0-os eleme') disp('Van 0-os eleme') III. előadás
27
Feltételben vektor & operátort használva Vektort használva
Ezen lehetőség segítségével kiküszöbölhetjük az és operátort (&). Egy vektorban fel kell sorolni a feltételeket. Példaprogram: Olvass be három számot, és döntsd el lehetnek-e egy háromszög oldalai. & operátort használva Vektort használva a=input('a='); b=input('b='); c=input('c='); if (a<b+c)&(b<a+c)&(c<a+b) disp('Lehetnek haromszog oldalai') else disp('Nem lehetnek egy haromszog oldalai') end if [a<b+c b<a+c c<a+b] III. előadás
28
Elseif Az egymásba ágyazott if utasításokra kifejlesztették az if utasítás elseif-es változatát. Az utasítás általános alakja: if feltétel1 utasítás(ok)1 elseif feltétel2 utasítás(ok)2 else utasítás(ok)3 end Ha a feltétel1 igaz állítás, akkor az utasítások1 hajtódnak végre, ha hamis, akkor kiértékelődik az elseif feltétele. Ha a feltétel2 igaz akkor az utasítások2 hajtódik végre, ha ez a feltétel is hamis akkor, az else utáni utasítások kerülnek kiértékelésre. H I Logikai feltétel1 feltétel2 Utasítás3 Utasítás1 Utasítás2 III. előadás
29
For utasítás Ha a programon belül bizonyos utasításokat egymás után többször kell elvégeznünk, de tudjuk, előre, hogy pontosan hányszor, akkor a for utasítást kell használjuk. Az utasítás általános alakja: for változó=kifejezés utasítás(ok) end A kifejezés az esetek nagy részében a : operátorral adjuk meg. kifejezés=k_érték:lépés:v_érték Ebben az esetben az utasítások a : operátor által megadott számszor hajtódnak végre. Példaprogram: Egy bekért számig írd ki a számok négyzeteit. n=input('n='); for i=1:n disp(i^2) I H i<=v_érték Utasítás i= k_érték i=i+lépés III. előadás
30
Példaprogramok Ha a kifejezés a : operátor segítségével van megadva.
1. Olvass be egy karaktert, és hogy hányszor szeretnéd kiíratni a képernyőre. 2. Olvass be egy karakterláncot és minden páratlan helyen lévő karakterét írd át ‘z’ betűre. 3. Olvass be egy karakterláncot és hátulról minden harmadik helyen lévő karakterét írasd ki. k=input('Karakter=','s'); n=input('Hanyszor='); for i=1:n sz(i)=k; end disp(sz) sz=input('Szoveg=','s'); for i=1:2:length(sz) sz(i)='z'; for i=length(sz):-3:1 disp(sz(i)) III. előadás
31
Példaprogramok Ha a kifejezésben egy vektor vagy mátrix szerepel. Ha a kifejezésben vektor szerepel, akkor a for ciklus változója felveszi sorra a vektor értékeit. Ha a kifejezésben mátrix szerepel, akkor a for utasítás változó sorra mátrix oszlopvektorait veszi fel. A for parancs belsejében szereplő utasítások annyiszor hajtódnak végre ahány oszlopot tartalmaz a mátrix. Kifejezésben mátrix Kifejezésben vektor 1. Olvass egy mátrixot, majd írasd ki az oszlopait. 2. Olvass be egy karakterláncot és véletlenszerűen írass ki 5 karaktert belőle. A=input('Matrix='); for i=A disp(i) end sz=input('Szoveg=','s'); v=ceil(length(sz)*rand(1,5)) for i=v disp(sz(i)) III. előadás
32
While utasítás Ha a ciklusváltozó intervallumát, előre nem tudjuk mert például a program futása során megszerzett információtól is függ, a ciklusszervezés while utasítással célszerű megoldani. Az utasítás általános alakja: while feltétel utasítás(ok) end Az utasítások között kell szerepeljen, legalább egy olyan utasítás ami megváltoztatja a feltételben szereplő változók értékeiet, különben végtelen ciklus léphet fel. Az utasítás magja addig hajtódik végre amíg a feltétel igaz. Kilépés hamis feltétel esetén. Előfordulhat, hogy a ciklus magja egyetlen egyszer sem hajtódik végre. Példaprogram: Kérjünk be egy hónapnak megfelelő számot. h=0; while (h<1)|(h>12) h=input('Kerem a honapot='); I H Feltétel Utasítás III. előadás
33
Példaprogram Játék. Generáljunk egy számot 0 és 20 között, majd addig kérjük be tippjeinket ameddig eltaláljuk, hogy a számítógép melyik számot generálta. v=fix(rand*20); t=-1; p=0 while t~=v t=input('Mi a tipped?') if t<v disp('Nagyobb') elseif t>v disp('Kisebb') end p=p+1; disp(['Eltalaltad ' num2str(p) ' próbálkozásból']) III. előadás
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.