Programozási alapismeretek 10. előadás
Tartalom Kiválogatás + összegzés Kiválogatás + maximumkiválasztás Maximumkiválasztás + kiválogatás Eldöntés + megszámolás Eldöntés + eldöntés Sorozatszámítás mátrixra Eldöntés mátrixra Tesztek előállítása 2/49
Kiválogatás + összegzés Feladat: Adott tulajdonságú elemek összege feltételes összegzés. Specifikáció: Bemenet: Egész, XTömb[1..:Egész] Kimenet: SEgész Előfeltétel: 0 Utófeltétel: S= i1 T(X[i]) X[i] 3/49
Kiválogatás + összegzés Specifikáció a : Utófeltétel a : és S= Specifikáció b : Utófeltétel b : és S= Db i1 Db i1 X[Y[i]] Y[i] Db,Y Db,Y Kiválogat T Kiválogat i T X i1 Xi 1 i i Xi 4/49
Kiválogatás + összegzés 1. megoldási ötlet a : Válogassuk ki az adott tulajdonságúakat, majd utána adjuk össze őket! Db:=0 i=1.. T(X[i]) I Db:=Db+1 Y[Db]:=i S:=0 i=1..db S:=S+X[Y[i]] Változó i:egész 5/49
Kiválogatás + összegzés 1. megoldási ötlet b : Válogassuk ki az adott tulajdonságúakat, majd utána adjuk össze őket! Db:=0 i=1.. T(X[i]) I Db:=Db+1 Y[Db]:=X[i] S:=0 i=1..db S:=S+Y[i] Változó i:egész 6/49
Kiválogatás + összegzés 2. megoldási ötlet: Kiválogatás helyett azonnal adjuk össze a megfelelő elemeket! nincs elem-/indexfeljegyzés (Y-ban) + nincs számlálás (Db-ben) S:=0 i=1.. I T(X[i]) S:=S+X[i] Változ i:eg 7/49
Kiválogatás + maximumkiválasztás Feladat: Adott tulajdonságú elemek maximuma feltételes maximumkeresés. Specifikáció: Bemenet: :Egész, X:Tömb[1..:Valami] Kimenet: MaxI:Egész, Van:Logikai Előfeltétel: 0 Utófeltétel: Van=i (1 i ): T(X[i]) és Van( 1 MaxI és T(X[MaxI]) és i(1 i ): T(X[i])X[MaxI] X[i] ) 8/49
Kiválogatás + maximumkiválasztás Specifikáció 2 : Utófeltétel 2 : Van, MaxI MaxInd i T X 1 i Xi 9/49
Kiválogatás + maximumkiválasztás A megoldás felé: Specifikáció : Utófeltétel : és Db,Y Van=Db>0 és Van( 1 MaxI és T(X[MaxI]) és Db Kiválogat Kiolvasható az algoritmikus ötlet: Válogassuk ki az adott tulajdonságúakat, majd keressünk maximumot, ha van értelme! MaxI MaxInd i1 i T X 1 i X Y i i 10/49
Kiválogatás + maximumkiválasztás 1. megoldás algoritmusa: Válogassuk ki az adott tulajdonságúakat, majd! Db:=0 i=1.. T(X[i]) I Db:=Db+1 Y[Db]:=i Van:=Db>0 Változó i:egész 11/49
Kiválogatás + maximumkiválasztás 1. megoldása algoritmusa:, majd keressünk maximumot, ha van értelme! Van MaxI:=Y[1] i=2..db X[Y[i]]>X[MaxI] I MaxI:=Y[i] I 12/49
Kiválogatás + maximumkiválasztás 2. megoldási ötlet (és algoritmusa): Induljunk ki a specifikációban észrevett tételekből: a kiválogatás helyett keressük meg az első T-tulajdonságút, i:=1 i és T(X[i]) i:=i+1 Van:=i Változó i:egész 13/49
Kiválogatás + maximumkiválasztás 2. megoldási ötlet (és algoritmusa): majd válasszuk ki az ilyenek maximumát! Van MaxI:=i i=i+1.. I T(X[i]) és X[i]>X[MaxI] MaxI:=i I 14/49
Kiválogatás + maximumkiválasztás 3. megoldási ötlet (és algoritmusa): Kiválogatás, ill. keresés helyett azonnal válasszuk ki a maximumot! Kell egy fiktív 0. elem a maximumkiválasztáshoz, ami kisebb minden normál elemnél. X[0]:=- MaxI:=0 i=1.. I T(X[i]) és X[i]>X[MaxI] MaxI:=i Van:=MaxI>0 Változó i:egész 15/49
Maximumkiválasztás + kiválogatás Feladat: Összes maximális elem kiválogatása. Specifikáció: Bemenet: Egész,X Tömb[1..:Valami] Kimenet: DbEgész, MaxITömb[1..Db:Egész] Előfeltétel: >0 Utófeltétel: Db = i1 1 X[i] Max és Max=X[MaxI[1]] és i(1 i Db): j(1 j ): X[MaxI[i]] X[j] és MaxI(1,2,,) 16/49
Maximumkiválasztás + kiválogatás Feladat: Összes maximális elem kiválogatása. Specifikáció: Bemenet: Egész, XTömb[1..:Valami] Kimenet: DbEgész, MaxITömb[1..Db:Egész] Előfeltétel: >0 Utófeltétel: Max= MaxÉrt X[i] Db, MaxI i=1 Kiválogat X i1 i Max és i 17/49
Maximumkiválasztás + kiválogatás 1. megoldási ötlet: Határozzuk meg a maximumot, majd válogassuk ki a vele egyenlőeket! Max:=X[1] i=2.. X[i]>Max I Max:=X[i] Változó Max:Valami i:egész 18/49
Maximumkiválasztás + kiválogatás 1. megoldási ötlet: Határozzuk meg a maximumot, majd válogassuk ki a vele egyenlőeket! Db:=0 I Db:=Db+1 MaxI[Db]:=i i=1.. X[i]=Max 19/49
Maximumkiválasztás + kiválogatás 2. megoldási ötlet: A pillanatnyi maximálissal egyenlőeket azonnal válogassuk ki! Db:=1 MaxI[1]:=1 Max:=X[1] i=2.. I X[i]>Max X[i]=Max I Db:=1 Db:=Db+1 MaxI[1]:=i MaxI[Db]:=i Max:=X[i] Változó Max:Valami i:egész 20/49
Eldöntés + megszámolás Feladat: Van-e egy sorozatban legalább K darab adott tulajdonságú elem? Specifikáció: Bemenet:,KEgész, XTömb[1..:Valami] Kimenet: VanLogikai Előfeltétel: 0 [és K>0] Utófeltétel: db= 1 i1 T(X[i]) és Van=db K 21/49
Eldöntés + megszámolás 1. megoldási ötlet: Számoljuk meg, hogy hány adott tulajdonságú van, majd nézzük meg, hogy ez legalább K-e! (Azaz valójában nincs: eldöntés tétel!) db:=0 i=1.. T(X[i]) I db:=db+1 Van:=db K Változó i:egész 22/49
Eldöntés + megszámolás 2. megoldási ötlet: Ha már találtunk K darab adott tulajdonságút, akkor ne nézzük tovább! db:=0 i:=1 i és db<k T(X[i]) I db:=db+1 i:=i+1 Van:=db=K Változó i:egész 23/49
Keresés + megszámolás Feladat: Melyik egy sorozatban a K. adott tulajdonságú elem (ha van egyáltalán)? Specifikáció: Bemenet:,KEgész, XTömb[1..:Valami] Kimenet: VanLogikai, KIEgész Előfeltétel: 0 és K>0 Utófeltétel: Van=i(1i): Van 1KI és KI j1 T(X[j]) 1 i j1 T(X[j]) 1 =K és =K és T(X[KI]) 24/49
Keresés + megszámolás 1. megoldási ötlet: Az előbbi ötlet: számoljuk meg, hogy hány adott tulajdonságú van, majd nézzük meg, hogy ez legalább K-e kevés, még hátra van a K. újbóli megkeresése A működőnek látszó ötlet: a megszámolás helyett kiválogatás kell és a keresésre nincs szükség de ez is túl hosszadalmas! 25/49
Keresés + megszámolás 2. megoldási ötlet: Ha már találtunk K darab adott tulajdonságút, akkor ne nézzük tovább: keresés a K.-ig. db:=0 i:=1 i és db<k T(X[i]) I db:=db+1 i:=i+1 Van:=db=K Változó i:egész 26/49
Keresés + megszámolás 2. megoldási ötlet: Ha megtaláltunk a K.-kat, akkor jegyezzük föl az indexét! I Van KI:=i-1 27/49
Eldöntés + eldöntés Feladat: Van-e két sorozatnak közös eleme? Specifikáció: Bemenet:,MEgész, XTömb[1..:Valami], YTömb[1..M:Valami] Kimenet: VanLogikai Előfeltétel: 0 és M0 Utófeltétel: Van=i(1 i ), j(1 j M): X[i]=Y[j] Utófeltétel : Van i1 M j1 X i Yj 28/49
Eldöntés + eldöntés 1. megoldási ötlet: Határozzuk meg a két sorozat közös elemeit (metszet), s ha ennek elemszáma legalább 1, akkor van közös elem! Specifikáció: Az utófeltétel igazítása : a metszet részeredménye volt: DbEgész a módosított utófeltétel: metszet utófeltétele és Van=Db>0. Megjegyzés: A metszet = kiválogatás + eldöntés 29/49
Eldöntés + eldöntés 2. megoldási ötlet: Ha már találtunk 1 darab közös elemet, akkor ne nézzük tovább! i:=0 Van:=Hamis i< és nem Van i:=i+1 j:=1 j M és X[i] Y[j] j:=j+1 Van:=j M Változó i,j:egész 31/49
Összegzés mátrixra Feladat: Egy mátrix elemeinek összege. Specifikáció: Bemenet:,MEgész, XTömb[1..,1..M:Egész] Kimenet: SEgész Előfeltétel:,M0 Utófeltétel: S= X[i, j] i1 M j1 32/49
Összegzés mátrixra Algoritmus: A megoldás lényegében csak abban különbözik az alapváltozattól, hogy a mátrix miatt két egymásba ágyazott ciklusra van szükség. S:=0 i=1.. j=1..m S:=S+X[i,j] Változó i,j:egész 33/49
Eldöntés mátrixra Feladat: Van-e egy mátrixban adott tulajdonságú elem? Specifikáció: Bemenet:,MEgész, XTömb[1..,1..M:Valami] Kimenet: VanLogikai Előfeltétel:,M0 Utófeltétel: Van=i(1 i ), j(1 j M): T(X[i,j]) 34/49
Eldöntés mátrixra Algoritmus: Az alapváltozathoz képest itt meg kell fogalmazni a mátrix elemein való nem feltétlenül végighaladást, soronként, balról jobbra! i:=1 j:=1 I i és nem T(X[i,j]) j<m j:=j+1 Van:= i j:=1 i:=i+1 Változó i,j:egész 35/49
Eldöntés mátrixra Algoritmus: Az alapváltozathoz képest itt meg kell fogalmazni a mátrix elemein való nem feltétlenül végighaladást, soronként, balról jobbra! i:=1 j:=1 I i és nem T(X[i,j]) j<m j:=j+1 Van:= i j:=1 i:=i+1 Változó i,j:egész 36/49
Eldöntés mátrixra Algoritmus: Az alapváltozathoz képest itt meg kell fogalmazni a mátrix elemein való nem feltétlenül végighaladást, soronként, balról jobbra! i:=1 j:=1 I i és nem T(X[i,j]) j<m j:=j+1 Van:= i j:=1 i:=i+1 Változó i,j:egész 37/49
Eldöntés mátrixra Algoritmus: Az alapváltozathoz képest itt meg kell fogalmazni a mátrix elemein való nem feltétlenül végighaladást, soronként, balról jobbra! i:=1 j:=1 I i és nem T(X[i,j]) j<m j:=j+1 Van:= i j:=1 i:=i+1 Változó i,j:egész 38/49
11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 Tesztek előállítása Feladat (teszteléshez): Egy repülőgéppel Európából Amerikába repültünk. Az út során X kilométerenként mértük a felszín tengerszint feletti magasságát (0). 0 magasságot ott mértünk, ahol tenger van, >0-t pedig ott, ahol szárazföld. Adjuk meg a szigeteket! 120 100 80 60 40 20 0 1 3 5 7 9 39/49
Tesztek előállítása Specifikáció Bemenet: Egész, MagTömb[1..:Egész] Kimenet: DbEgész, K,VTömb[1..Db:Egész] Kis teszteket készíthetünk a tesztelési elveknek megfelelően, például: =3, Mag=(1,0,1) nincs sziget =5, Mag=(1,0,1,0,1) egy sziget =7, Mag=(1,0,1,0,1,0,1) több sziget =7, Mag=(1,0,1,1,1,0,1) hosszabb sziget Hogyan készítünk nagy teszteket? 40/49
Szabályos tesztek Készíthetünk szabályos teszteket egyszerű ciklusokkal. Például így: :=1000 i=1..10 Mag[i]:=11 i i=11..900 Mag[i]:=0 i=901.. Mag[i]:=i 900 Változó i:egész Európa tenger Amerika 41/49
Véletlen tesztek (alapok véletlenszámok) A véletlenszámokat a számítógép egy algoritmussal állítja elő egy kezdőszámból kiindulva. x 0 f(x 0 )=x 1 f(x 1 )=x 2 A véletlenszerűséghez megfelelő függvény és jó kezdőszám szükséges. Kezdőszám: (pl.) a belső órából vett érték. Függvény (az ún. lineáris kongruencia módszernél): f(x) = (A*x+B) Mod M, ahol A, B és M a függvény belső konstansai. 42/49
Véletlen tesztek (alapok C++) C++: rand() véletlen egész számot ad 0 és egy maximális érték (RAD_MAX) között. srand(szám) kezdőértéket állít be. Véletlen(a..b){a,,b} v=rand() % (b-a+1)+a Véletlen(){1,,} v=rand() % +1 véletlenszám[0,1)valós A generátor használata kockadobásra: v=rand()/(rad_max+1.0) #include <time.h> srand(time(ull)); i=rand() % 6 +1; 43/49
Véletlen tesztek Véletlen tesztekhez használjunk véletlenszámokat! Például így: :=1000 M:=Véletlen(10) i=1..m Mag[i]:=Véletlen(5..10) i=m+1..900 véletlenszám<0.5 I Mag[i]:=0 Mag[i]:=1 i=901.. Mag[i]:=Véletlen(3..8) Változó i:egész Európa tenger és szigetek Amerika 44/49
Specifikációs komment: Az előbbi algoritmus általánosítása! Kód: Véletlen tesztek (Példa C++) Fájlkezeléshez 45/49
Függvényprototípusok Kód: Véletlen tesztek (Példa C++) Főprogram 46/49
A lényegi eljárás Kód: Véletlen tesztek (Példa C++) 47/49
Alprogramok implementációja Kód: Véletlen tesztek (Példa C++) Kód jegyzetként 48/49
Véletlen tesztek (Példa C++) Az eredményfájl és elemzése: Adatfájl jegyzetként 49/49
Programozási alapismeretek 10. előadás vége