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

oktatas/informatika/programozas/tetelek.txt · Utolsó módosítás: 2019/06/04 14:21 szerkesztette: barnkopf
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0