====== Programozási tételek ====== A programozási tételek egyszerű alap algoritmusok, azaz típusfeladatok minta megoldásai, melyek bizonyítottan jók és hatékonyak, így a "tétel" elnevezés jogos rájuk nézve. ===== Sorozathoz érték rendelése ===== Az alábbi tételekben minden esetben egy //A// tömb elemeiből indulunk ki, eredményül pedig egy értéket kapunk. ==== Eldöntés tétel ==== Adott egy //N// elemű //A// tömb. valamint egy //T()// tulajdonság (logikai függvény). Döntsük el, hogy van-e az //A// tömbnek //T// tulajdonságú eleme. === Állapot tér=== N in bbN, A = bbR^{N}, T: bbR right delim{lbrace}{igaz, hamis}{rbrace} azaz //N// természetes szám az //A// tömb elemszáma, a tömb tehát //N// darab valós számot tartalmaz, a //T// tulajdonság pedig a valós számokhoz rendel igaz, vagy hamis értéket. === Előfeltétel === nincs === Utófeltétel === Ki: (exists i in bbN, 1<=i<=N: T(A(i))) azaz a visszatérési érték akkor lesz igaz, ha találtunk az //A// tömbben //T// tulajdonságú elemet, pontosabban akkor, ha van olyan érvényes (1 és //N// közé eső) //i// index, melyre igaz, hogy az //A// tömb //i//-edik eleme //T// tulajdonságú. === Algoritmus === i := 1 Ciklus amig (i <= N) és nem T(A(i)) i := i + 1 Ciklus vége Ki: (i <= N) **Magyarázat:** Az elemek vizsgálatát az első elemtől kezdjük (i := 1), és lépegetünk sorba az elemeken (i := i + 1), amíg el nem érjük a tömb végét (i <= N), vagy nem találunk T tulajdonságú elemet (nem T(A(i))). A visszatérési érték akkor lesz igaz, ha nem értük el tömb végét (i <= N). === Feladatok === * Ismerjük egy hét napjainak napi átlaghőmérsékleteit. Igaz-e, hogy folyamatosan emelkedett a hőmérséklet? * Állapítsuk meg egy szövegről, hogy eszperente szöveg-e (eszperente szöveg az, amelyben csak e és é magánhangzók szerepelnek) * Adott szövegről döntsük el, hogy több mondatból áll-e! (Mondathatár: mondatvégi írásjel, szóköz, majd nagybetű) * Egy repülőgéprő Európából Amerikába repülve rendszeres időközönként mérték a tengerszint feletti magasságot (0 tengert, pozitív érték szárazföldet jelöl). Döntsük el, hogy az út során haladt-e el sziget felett a repülőgép! ==== Kiválasztás tétel ==== Adott egy //N// elemű //A// tömb. valamint egy //T()// tulajdonság (logikai függvény). Tudjuk, hogy a tömbnek van //T()// tulajdonságú eleme. Adjunk meg egy //T()// tulajdonságú elemet, vagy annak indexét! === Állapot tér=== N in bbN, A = bbR^{N}, T: bbR right delim{lbrace}{igaz, hamis}{rbrace} azaz //N// természetes szám az //A// tömb elemszáma, a tömb tehát //N// darab elemet tartalmaz, a //T// tulajdonság pedig az elemekhez rendel igaz, vagy hamis értéket. === Előfeltétel === exists i in bbN, 1<=i<=N: T(A(i)) Az //A// tömbnek van //T()// tulajdonságú eleme. === Utófeltétel === Ki: i, A(i) (i in bbN, 1<=i<=N: T(A(i))) azaz a visszatérési érték az //i// index, vagy a tömb //i//-edik eleme, melyre //A(i)// T() tulajdonságú. === Algoritmus === i := 1 Ciklus amig nem T(A(i)) i := i + 1 Ciklus vége Ki: i, A(i) === Feladatok === * Adjuk meg egy beolvasott 1-nél nagyobb pozitív egyész szám legkisebb 1-től különböző pozitív osztóját! * Adjuk meg egy beolvasott 1-nél nagyobb pozitív egyész szám legnagyobb önmagától különböző pozitív osztóját! * Határozzuk meg két szám legnagyobb közös osztóját! * Határozzuk meg az N természetes számhoz legközelebbi négyzetszámot (N>1)! * Határozzuk meg hány nap múlva lesz a legközelebbi vasárnap! ==== Keresés tétel ==== Adott egy //N// elemű //A// tömb. valamint egy //T()// tulajdonság (logikai függvény). Döntsük el, hogy van-e az //A// tömbnek //T// tulajdonságú eleme, ha van adjuk meg az elemet, vagy az elem tömbbeli indexét! === Állapot tér=== N in bbN, A = bbR^{N}, T: bbR right delim{lbrace}{igaz, hamis}{rbrace} azaz //N// természetes szám az //A// tömb elemszáma, a tömb tehát //N// darab valós számot tartalmaz, a //T// tulajdonság pedig a valós számokhoz rendel igaz, vagy hamis értéket. === Előfeltétel === nincs === Utófeltétel === Ki: (exists i in bbN, 1<=i<=N: T(A(i))) esetén delim{lbrace}{i; A(i)}{rbrace}, különben hamis azaz a visszatérési érték akkor lesz hamis, ha nem találtunk az //A// tömbben //T// tulajdonságú elemet, egyéb esetben a //T// tulajdonságú elem indexég és az elemet magát adjuk vissza. === Algoritmus === i := 1 Ciklus amig (i <= N) és nem T(A(i)) i := i + 1 Ciklus vége Ha (i <= N) akkor Ki: i, A(i) különben Ki: hamis Elágazás vége **Magyarázat:** Az elemek vizsgálatát az első elemtől kezdjük (i := 1), és lépegetünk sorba az elemeken (i := i + 1), amíg el nem érjük a tömb végét (i <= N), vagy nem találunk T tulajdonságú elemet (nem T(A(i))). Ha nem értük el tömb végét (i <= N), akkor találtunk //T// tulajdonságú elemet, így ezt, illetve ennek indexét adjuk vissza, egyéb esetben //hamis// logikai értékkel tér vissza. === Feladatok === ==== Megszámolás tétel ==== Adott egy //N// elemű //A// tömb. valamint egy //T()// tulajdonság (logikai függvény). Számoljuk meg, hogy hány //T// tulajdonságú eleme van az //A// tömbnek. === Állapot tér=== N in bbN, A = bbR^{N}, T: bbR right delim{lbrace}{igaz, hamis}{rbrace}, Db in bbN azaz //N// természetes szám az //A// tömb elemszáma, a tömb tehát //N// darab valós számot tartalmaz, a //T// tulajdonság pedig a valós számokhoz rendel igaz, vagy hamis értéket. === Előfeltétel === nincs === Utófeltétel === Db = |delim{lbrace}{i in bbN | T(A(i))}{rbrace}| azaz a //Db// változó az //A// tömb //T// tulajdonságú elemeinek számával egyenlő === Algoritmus === Db := 0 Ciklus i := 1-től N-ig Ha T(A(i)) akkor Db := Db + 1 Ciklus vége Ki: Db ==== Összegzés (sorozatszámítás) tétel ==== Adott egy //N// elemű, számokat tartalmazó //A// tömb. Határozzuk meg az //A// tömb elemeinek összegét! === Állapottér === N in bbN, A = bbR^{N} === Előfeltétel === nincs === Utófeltétel === S = sum{i=1}{N}{A(i)} === Algoritmus === S := 0 Ciklus i := 1-től N-ig S := S + A(i) Ciklus vége Ki: S **Magyarázat:** //S//-ben tároljuk az eddig sorra vett elemek összegét, //i// mutatja, hogy hányadik elemnél tartunk a feldolgozás közben. Első lépésként - mivel még egy elemet sem vizsgáltunk meg - az //S// kezdőértékét 0-ra állítjuk. Ezután végig megyünk az összes elemen (ezért számlálásos ciklust használunk) és //S// értékét minden lépésben az //A// tömb soron következő elemével növeljük. ---- Az algoritmus gondolatmenete minden olyan esetben alkalmazható, ahol a sorozathoz rendelt érték megadható az eggyel rövidebb sorozat és az utolsó tag segítségével (rekurzív módon): f(a_1,a_2,...,a_n) = f(a_1,a_2,...a_{n-1}) circ a_n Ilyen a szumma függvény az összeadás művelettel párban, a produktum függvény a szorzás művelettel, de ilyen a számok átlaga, mértani közepe, szövegek egymásután fűzése és még sok egyéb függvény is. === Feladatok === * Olvassunk be egy //n// pozitív egész számot, majd számítsuk ki az //n!// értéket! * Egy napon minden órában megmértük a hőmérsékletet. Számítsuk ki ezen adatok alapján a napi átlaghőmérsékletet! * Adott szavakat fűzzünk össze közéjük szóközöket helyezve! ==== Maximumkiválasztás ==== Adott egy //N// elemű //A// tömb. Válasszuk ki a tömb legnagyobb elemét. === Algoritmus === MaxIndex := 1 Ciklus i := 2-től N-ig Ha A(i) > A(MaxIndex) akkor MaxIndex := i Ciklus vége Ki: MaxIndex, A(MaxIndex) ==== Logaritmikus keresés ==== Adott egy //N// elemű, __rendezett__ //A// sorozat. Keressük meg benne az //X// értéket! === Algoritmus === E := 1 V := N Ciklus K := int((E+V) / 2) Ha A(K) > X akkor V := K - 1 Ha A(K) < X akkor E := K + 1 Amíg A(K) <> X és E <= N Ha E > N akkor Ki: nincs különben Ki: K ===== Sorozathoz sorozat rendelése ===== ==== Rendezés ==== Adott egy //N// elemű //A// tömb. Rendezzük a tömb elemeit emelkedő sorrendbe! === Minimumkiválasztásos rendezés === Ciklus i := 1-től N-1-ig // minimumkiválasztás minIndex := i Ciklus j := i+1-től N-ig Ha A(minIndex) > A(j) akkor minIndex := j; Elágazás vége Ciklus vége // csere Segéd := A(i) A(i) := A(minIndex) A(minIndex) := Segéd Ciklus vége ==== Kiválogatás ==== Adott egy //N// elemű //A// tömb és egy //T// tulajdonság. Válogassuk ki egy //B// tömbbe az //A// vektor //T// tulajdonságú elemeit. === Algoritmus === Db := 0 Ciklus i := 1-től N-ig Ha T(A(i) akkor Db := Db + 1 B(Db) := A(i) Elágazás vége Ciklus vége ==== Szétválogatás - két tömbbe ==== Adott egy //N// elemű //A// tömb és egy //T// tulajdonság. Válogassuk ki az //A// vektor //T// tulajdonságú elemeit egy //B//, nem //T// tulajdonságú elemeit egy //C// tömbbe. === Algoritmus === Db := 0 Ciklus i := 1-től N-ig Ha T(A(i) akkor Db := Db + 1 B(Db) := A(i) különben C(i-Db) := A(i) Elágazás vége Ciklus vége ===== Példák ===== * [[informatika:programozas:pascal:tetelek|Pascal megvalósítás]] * [[informatika:programozas:dotnet:c-sharp:tetelek|C# megvalósítás]]