Programozási alapismeretek 4. előadás
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.2/ A szöveg A szöveg Feladattípus: tömb bemenet, tömb kimenet tömb bemenet, tömb kimenet Feladattípus: szöveg bemenet, szöveg kimenet szöveg bemenet, szöveg kimenet Feladattípus: tömb bemenet, érték kimenet tömb bemenet, érték kimenet Feladattípus: érték bemenet, tömb kimenet érték bemenet, tömb kimenet Példák Példák Tartalom
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.3/ Szöveg A szöveg és a tömb hasonlóak: o egyféle típusú elemekből állnak, o indexelhetők; különbözőek: o a tömb elem- (és index-) típussal paramétere- zendő (típuskonstrukciós eszköz), a szöveg ka- rakter típusú elemekből áll, o algoritmikusan (!) a szöveg 1-től indexelhető, a tömb deklarációtól függően, o a tömb hossza konstans, a szövegé változtat- ható; szövegeken értelmezve van a hossz() függvény és a + művelet, o problémás az elemmódosítás a szöveg típusnál!
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.4/ Szöveg (C++) Fontosabb string-műveletek ( tegyük föl, hogy: string a; ) o …""… //üres szöveg; pl.: a="" o cin >> a;//olvasás szóközig v. sorvégig o getline(cin,a,’\n’); //olvasás ’\n’-ig o getline(cin,a,’x’); //olvasás ’x’ jelig o …a.length()… //a karakterei száma o …a.size()… //=a.length() o …+… //hozzáírás (konkatenáció) o …a[i]… //a szöveg i. jele, 0 i<a.length() o …a.at(i)… //=a[i], objektumos jelöléssel
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.5/ Szöveg (C++) Fontosabb string-műveletek ( string a; ) o …a.find(mit)… //a mit szöveg helye a-ban o …a.substr(tól,ig)… //=a[tól..ig] o a.replace(tól,db,mivel); //tól db jelet //helyettesít mivel o Kapcsolódó char-műveletek ( string a; ) o …isalpha(a[i])… //a[i] ’a’..’z’, // ’A’..’Z’? o …isdigit(a[i])… //a[i] ’0’..’9’? o …isupper(a[i])… //a[i] ’A’..’Z’? o …islower(a[i])… //a[i] ’a’..’z’? o …tolower(a[i])… //a[i]-t kisbetűssé //alakítja o …toupper(a[i])… //a[i]-t nagybetűssé //alakítja
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.6/ Szöveg Feladat: Fordítsuk meg egy szó (szöveg) betűsor- rendjét! Specifikáció: Bemenet: S:Szöveg Kimenet: T:Szöveg Előfeltétel: – hosszhossz hosszhossz Utófeltétel: hossz(T)=hossz(S) és i (1 i hossz(S)): T[i]=S[hossz(S)–i+1] Előre definiált függvény: hossz hossz hossz: Szöveg Egész hossz(s):=s karaktereinek a száma
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.7/ Algoritmus: A szöveg i-edik karaktere nem módosítható, ha még nincs. Szükséges a + művelet! vagy Szöveg T:= "" i=hossz(S)..1; –1-esével T:=T+S[i] T:= "" i=1..hossz(S) T:=S[i]+T
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.8/ Szöveg Feladat: Adjuk meg egy egyszerű angol névhez a monogramját (pl. James Black JB)! Specifikáció: Bemenet: Név:Szöveg Kimenet: Mon:Szöveg Előfeltétel: SzabályosE(Név) Megjegyzés: a név szabályos, ha csak a szó- kezdőbetűk nagyok, de azok biztosan… feltesszük, hogy létezik a „SzabályosE: Szöveg Logikai” függvény.
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.9/ Szöveg Utófeltétel:és i (1 i hossz(Mon)): NagybetűE(Mon[i]) és Mon Név Feltesszük, hogy létezik a 1. „NagybetűE:Karakter Logikai” függvény, 2. „ ” művelet, az ún. részsorozata-e műve- let (x y akkor igaz, ha x legfeljebb y ele- meinek elhagyásával képezhető).
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.10/ Szöveg Algoritmus: Mon:= "" i=1..hossz(Név) NagybetűE(Név[i]) Mon:=Mon+Név[i]─ I N
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.11/ Szöveg Feladat: Adjuk meg egy magyar névhez a monogram- ját (pl. Szabó Éva SzÉ)! Specifikáció: Bemenet: Név:Szöveg Kimenet: Mon:Szöveg Előfeltétel: SzabályosE(Név) Utófeltétel: … hf … Problémák: a monogramban nagybetűk szerepel- nek, valamint a kettős mássalhangzókból a nagybe- tűt követő kisbetűk.
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.12/ Szöveg Megoldási ötlet: Konstans Többes:Tömb[1..8:Szöveg]= (”Cs”,”Dz”,”Gy”,”Ly”,”Ny”, ”Sz”,”Ty”,”Zs”) Közbevető kérdés: ”Dzs” hova való és miként bonyolítja a megoldást? A megoldás vázlata: képezzük a Név kétbetűs részeit, és megnézzük, hogy bent van-e a Többesben, vagy a betűpár első jele nagybetűs-e, ha igen, akkor monogram- hoz írjuk…
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.13/ Szöveg Algoritmus: Hívhatnak-e valakit „Nagy A”-nak? Fölcse- rélhetők-e a feltételek? Optimális? Mon:= "" i=1..hossz(Név)–1 K:=Név[i]+Név[i+1] K Többes Mon:=Mon+KNagybetűE(Név[i]) Mon:=Mon+ Név[i] I N I N
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.14/ Karakterhasonlítás Feladat: Döntsük el, hogy az A vagy a B betű van-e a magyar ábécében előbb! Specifikáció: Bemenet: A,B:Karakter Kimenet: Előbb:Logikai Előfeltétel: BetűE(A) és BetűE(B) Utófeltétel: Előbb=A M B Definíció: x M y akkor és csak akkor, ha ??? Feltételezés: BetűE:Karakter Logikai függvény
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.15/ Karakterhasonlítás Megoldásötlet: Tároljuk a helyes sorrendben a betűket, és amelyi- ket előbb lehet megtalálni, az az előbbi. Definíció: Konstans Betűk:Tömb[1..2*35:Karakter]= (”a”,”A”,”á”,”Á”,”b”,”B”,…,”z”,”Z”) x M y akkor és csak akkor, ha i j : x=Betűk[i] és y=Betűk[j] Egy másik megoldás alapulhat egy szövegen is: Konstans Betűk:Szöveg=”aAáÁbB…zZ”Szöveg Melyik a jobb?
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.16/ Karakterhasonlítás Algoritmus: Kérdés: mi lenne, ha az ef. nem teljesülne? Lehetne-e ”a”=”A”? (i-1) div 2≤(j-1) div 2? i:=1 Betűk[i]≠A i:=i+1 j:=1 Betűk[j]≠B j:=j+1 Előbb:=i≤j
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.17/ Szóhasonlítás Feladat: Döntsük el, hogy az ábécében az A vagy a B szó van-e előbb! Specifikáció: Bemenet: A,B:Szöveg Kimenet: Előbb:Logikai Előfeltétel: SzóE(A) és SzóE(B) Utófeltétel: Előbb=A B Feltételezés: SzóE:Szöveg Logikai függvény
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.18/ Szóhasonlítás Definíció (alfabetikus rendezés): (1) Az a szó van ábécében előbb, amelyik első különböző betűje előbb van; (2) az üres szó minden szónál előbb van. Példák: ”alfa” ”al” ”f…”> M ”alma”≤”alma” ≤ M (1) (2)
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.19/ Algoritmus: A karakterhasonlításra használjuk az elő- ző feladat megoldását (úgy, hogy A helyébe A[i], B helyébe B[i] kerüljön) ! Szóhasonlítás i:=1 i≤hossz(A) és i≤hossz(B) és A[i]=B[i] i:=i+1 Előbb:=(i>hossz(A)) vagy (i≤hossz(B) és A[i] M B[i])
ELTE Szlávi-Zsakó: Programozási alapismeretek 4.20/ Tömb bemenet, tömb kimenet Feladat: Ismerjük az elmúlt N napon délben mért hő- mérsékletet. Add meg, hogy mely napokon volt pozitív vagy 0 (+), illetve negatív (–) a hő- mérséklet! Specifikáció: Bemenet: N:Egész; H:Tömb[1..N:Egész] Kimenet: E:Tömb[1..N:Karakter] Előfeltétel: N 0 Utófeltétel: i(1 i N): ( H[i] 0 E[i]="+" és H[i]<0 E[i]="–" )
ELTE Tömb bemenet, tömb kimenet Algoritmus: Kódoláshoz: A kimeneti tömb (már) akkor deklarál- ható, amikor a bemeneti tömb mérete ismertté válik. (Hiszen a bemeneti tömb- bel azonos elemszámú.)deklarál- ható I N Szlávi-Zsakó: Programozási alapismeretek 4. 21/ i=1..N H[i] 0 E[i]:=”+”E[i]:=”–”
ELTE Tömb bemenet, tömb kimenet Feladat: Ismerjük az elmúlt N napon délben mért hőmérsékletet. Add meg minden 7-napos időszakra az átlaghőmérsékletet! Specifikáció: Bemenet: N:Egész; H:Tömb[1..N:Egész] Kimenet: A:Tömb[1..N–6:Valós] Előfeltétel: N 7 Utófeltétel: i(1 i N–6): Megjegyzés: 7 egymás utáni szám összegéből a következő összeg egyszerűbben is számolható: A[i]:=(7*A[i–1]–H[i–1]+H[i+6])/7 Szlávi-Zsakó: Programozási alapismeretek 4. 22/
ELTE Tömb bemenet, tömb kimenet S:=0 i=1..7 S:=S+H[i] A[1]:=S/7 i=2..N –6 S:=S–H[i–1]+H[i+6] A[i]:=S/7 Algoritmus: Szlávi-Zsakó: Programozási alapismeretek 4. 23/
ELTE Szöveg bemenet, szöveg kimenet Feladat: Írj programot egy szó magas- (=), illetve mély (–) hangrendű szótagjai megadására! Specifikáció: Bemenet: S:Szöveg Kimenet: H:Szöveg Előfeltétel: SzóE(S) Utófeltétel: hossz(X)=hossz(S) és i(1 i hossz(S)): S[i] {"a","á","o","ó","u","ú"} X[i]="–" és S[i] {"e","é","i","í","ö","ő","ü","ű"} X[i]="=" és S[i] Mássalhangzók X[i]=" " és H X és SzóközNélküliE(H) és hossz(H)= Szlávi-Zsakó: Programozási alapismeretek 4. 24/
ELTE Szöveg bemenet, szöveg kimenet H:=”” i=1..hossz(S) S[i] {”a”,”á”,”o”, ”ó”,”u”, ”ú”} S[i] {”e”,”é”, ”i”,”í”,”ö”, ”ő”,”ü”,”ű”} H:=H+” – ”H:=H+”=” Algoritmus: Megspórolható a segéd X szöveg, ha mind- járt átlépjük a szóközzé konvertálandókat, amiket aztán ki kellene hagynunk. Szlávi-Zsakó: Programozási alapismeretek 4. 25/
ELTE Érték bemenet, tömb kimenet Feladat: Adjuk meg a K kezdőelemű, L lépésközű számtani sorozat első N tagját! Specifikáció 1 : Bemenet: K,L,N:Egész Kimenet: S:Tömb[1..N:Egész] Előfeltétel: N 0 Utófeltétel: i (1≤i≤N): S[i]=K+(i – 1)*L Algoritmus 1 : i=1..N S[i]:=K+(i–1)*L Szlávi-Zsakó: Programozási alapismeretek 4. 26/
ELTE Érték bemenet, tömb kimenet Az uf. „egyszerűbben” is megfogalmazható (rekurzív módon). Specifikáció 2 : Bemenet: K,L,N:Egész Kimenet: S:Tömb[1..N:Egész] Előfeltétel: N 0 Utófeltétel: S[1]=K és i (2≤i≤N): S[i]=S[i–1]+L Algoritmus 2 : Szlávi-Zsakó: Programozási alapismeretek 4. 27/ S[1]:=K i=2..N S[i]:=S[i–1]+L
ELTE Tömb bemenet, érték kimenet Feladat: Egy repülőgéppel Európából Amerikába re- pü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 az óceán két partját! Szlávi-Zsakó: Programozási alapismeretek 4. 28/
ELTE Tömb bemenet, érték kimenet Specifikáció: Bemenet: N:Egész, Mag:Tömb[1..N:Egész] Kimenet: E,U:Egész Előfeltétel: Mag[1]>0 és Mag[N]>0 és i(1<i<N): Mag[i] 0 és i(1<i<N): Mag[i]=0 [ N 3] Utófeltétel: Mag[E]=0 és Mag[U]=0 és i(1 i 0 és i(U 0 Szlávi-Zsakó: Programozási alapismeretek 4. 29/
ELTE Tömb bemenet, érték kimenet E:=2 Mag[E]>0 E:=E+1 U:=N–1 Mag[U]>0 U:=U–1 Algoritmus: Ötlet: elölről, illetve hátulról haladva kivá- lasztjuk a megfelelő elemet. Szlávi-Zsakó: Programozási alapismeretek 4. 30/
ELTE További példák Feladat: 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 magas- sá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! Szlávi-Zsakó: Programozási alapismeretek 4. 31/
ELTE További példák Specifikáció: Bemenet: N:Egész, Mag:Tömb[1..N:Egész] Kimenet: Db:Egész, K,V:Tömb[1..Db:Egész] Előfeltétel: Mag[1]>0 és Mag[N]>0 és i(1<i<N): Mag[i] 0 és i(1<i<N): Mag[i]=0 [ N 3] Utófeltétel: Db= és HalmazEHalmazE RendezettERendezettE i (1≤i≤Db): SzigetkezdetE(K[i]) és i (1≤i≤Db): SzigetvégE(V[i]) és HalmazE(K) és HalmazE(V) és RendezettE(K) és RendezettE(V) Előre definiált függvény: HalmazE HalmazE(sorozat):=a sorozatban minden elem csak egyszer van-e? Szlávi-Zsakó: Programozási alapismeretek 4. 32/ RendezettE(sorozat):=a sorozat- ban minden elem nagyobb vagy egyen- lő-e, mint az előző?
ELTE További példák Definíció: SzigetkezdetE:[2..N] Logikai SzigetkezdetE(i):=Mag[i]>0 és Mag[i–1]=0 SzigetvégE:[1..N–1] Logikai SzigetvégE(i):=Mag[i]>0 és Mag[i+1]=0 Kérdés: Mi lesz Európa és Amerika partjával? Megoldás: 2 és N–1 helyett csak az előző feladat szerinti E és U között keresünk szigeteket. Szlávi-Zsakó: Programozási alapismeretek 4. 33/
ELTE További példák Specifikáció: Bemenet: N:Egész, Mag:Tömb[1..N:Egész] Kimenet: Db:Egész, K,V:Tömb[1..Db:Egész] Előfeltétel: Mag[1]>0 és Mag[N]>0 és i(1<i<N): Mag[i] 0 és i(1<i<N): Mag[i]=0 [ N 3] Utófeltétel: Db= és E? és U? ésés E? és U? i (1≤i≤Db): SzigetkezdetE(K[i]) és K[i] E és HalmazE(K) és HalmazE(V) és RendezettE(K) és RendezettE(V) Szlávi-Zsakó: Programozási alapismeretek 4. 34/
ELTE További példák … E, U előállítása … Db:=0 i=E..U SzigetkezdetE(i) Db:=Db+1 K[Db]:=i SzigetvégE(i) V[Db]:=i Algoritmus: Használjuk ki, hogy kezdet és vég csak fel- váltva következhetnek! I N I N Szlávi-Zsakó: Programozási alapismeretek 4. 35/
ELTE További példák Kódoláshoz: Probléma: a számítás során jön ki a kimeneti tömb elem- száma, s közben kellene az elemeit is gyűjteni. Megoldás 1 : Előre definiálunk egy maximális kimeneti tömb- méretet (MaxDb), s ekkorára deklaráljuk a K és a V tömböt). (L. a 3. előadásban.)3. előadás Megoldás 2 : Eltérünk az algoritmustól: először meghatároz- zuk a Db-t, majd összegyűjtjük a K-t, V-t. Szlávi-Zsakó: Programozási alapismeretek 4. 36/
ELTE További példák Feladat: Egy folyón N helyen mérik a vízállást, amit egy referenciamagassághoz képest centiméterben ad- nak meg. Elsőfokú árvízvédelmi készültséget kell elrendelni, ha a magasság meghaladja a 800 centi- métert, másodfokút, ha meghaladja a 900 centi- métert és harmadfokút, ha meghaladja az 10 métert. Folyószakasznak nevezzük a leghosszabb egymás mellett levő egyforma tulajdonságú méré- sekből álló sorozatokat. Árvíznek nevezzük azt a folyószakaszt, ahol minden hely legalább elsőfo- kú készültségű. Adjuk meg, hogy hány folyószakaszon volt árvíz! Szlávi-Zsakó: Programozási alapismeretek 4. 37/
ELTE További példák Specifikáció: Bemenet: N:Egész, F:Tömb[1..N:Egész] Kimenet: Db:Egész Előfeltétel: N 0 Utófeltétel: Db= Szlávi-Zsakó: Programozási alapismeretek 4. 38/
ELTE Algoritmus 1 : Annyi szakaszon volt árvíz, ahány helyen árvíz kezdődött (vagy már az elején is árvíz volt). További példák F[1] 800 Db:=0Db:=1 i=1..N–1 F[i] 800 és F[i+1]>800 Db:=Db+1 IN I N Szlávi-Zsakó: Programozási alapismeretek 4. 39/
ELTE További példák Algoritmus 2 : Annyi szakaszon volt árvíz, ahány helyen árvíz végződött (vagy az utolsó mérésnél is árvíz volt). F[N] 800 Db:=0Db:=1 i=2..N F[i] 800 és F[i-1]>800 Db:=Db+1 NI N I Szlávi-Zsakó: Programozási alapismeretek 4. 40/
ELTE További példák Feladat: Egy folyón N helyen mérik a vízállást, amit egy referenciamagassághoz képest centimé- terben adnak meg. … Adjuk meg az árvizek hosszát! Feltehetjük, hogy az első és az utol- só mérésnél nem volt árvíz.… Szlávi-Zsakó: Programozási alapismeretek 4. 41/
ELTE További példák Specifikáció: Bemenet: N:Egész, F:Tömb[1..N:Egész] Kimenet: Db:Egész, H:Tömb[1..Db:Egész] Előfeltétel: N 1 és F[1] 800 és F[N] 800 Utófeltétel: Db= és i (1≤i≤Db): H[i]=árvízvég[i]–árvízkezdet[i]+1 Definíció: árvízvég:Tömb[1..Db:Egész] … árvízkezdet:Tömb[1..Db:Egész] … Szlávi-Zsakó: Programozási alapismeretek 4. 42/
ELTE További példák Db:=0 i=1..N–1 F[i] 800 és F[i+1]>800 Db:=Db+1 H[Db]:=0 F[i]>800 H[Db]:=H[Db]+1 Algoritmus: Ötlet: a megfelelő számlálót árvízkezdetnél nullázzuk, árvíznél pedig növeljük. I N I N Szlávi-Zsakó: Programozási alapismeretek 4. 43/
ELTE További példák Feladat: Lóversenyre járunk. N napon át naponta fel- jegyeztük, hogy mennyit nyertünk ( 0) vagy vesztettünk (<0). Ha kezdetben X forintunk volt, akkor mely napon kellett először köl- csön kérnünk? Szlávi-Zsakó: Programozási alapismeretek 4. 44/
ELTE További példák Specifikáció: Bemenet: N,X:Egész, P:Tömb[1..N:Egész] Kimenet: Van:Logikai, Nap:Egész Előfeltétel: N 0 és X 0 Utófeltétel: Van= i(1 i N): és Van ( 1 Nap N és és i(1 i<Nap) és ) Szlávi-Zsakó: Programozási alapismeretek 4. 45/
ELTE További példák S:=X i:=1 i N és S+P[i]>0 S:=S+P[i] i:=i+1 Van:= i N Van Nap:=i Algoritmus: I N Szlávi-Zsakó: Programozási alapismeretek 4. 46/
Programozási alapismeretek 4. előadás vége