2. hét: logikai kifejezések, sorozatok, listák, sztringek

Czirkos Zoltán, Frey Balázs · 2024.09.22.

Gyakorlófeladatok az előadás anyagához kapcsolódóan.

1. Boole-algebra

Szendvicsek

Egy büfében az alábbi szabályokat használják a jó szendvicsek készítéséhez:

  1. Egy szendvicsben legyen legalább egy fajta hús,
  2. Egy szendvicsben legyen marha vagy sonka, de együtt ne,
  3. Ha a szendvicsben van pulykahús, akkor legyen benne sajt is.

Írj logikai kifejezést, amely a jó szendvicseknél értékelődik ki igaz értékre, amúgy pedig hamisra! A változók: sajt, ha van benne sajt, pulyka, ha van benne pulyka, marha és sonka.

Megoldás

Az egyes szabályok megfelelői:

  1. marha or sonka or pulyka,
  2. (marha and not sonka) or (not marha and sonka), ami egyébként marha ⊕ sonka XOR kapcsolatnak felel meg,
  3. not pulyka or sajt, mert ha nincs benne pulyka, akkor mindegy, van-e sajt, viszont ha van benne pulyka (tehát not pulyka hamis), akkor muszáj lennie benne sajtnak.

A végleges szabály:
(marha or sonka or pulyka) and ((marha and not sonka) or (not marha and sonka)) and (not pulyka or sajt)

Almás pite

Egy almás pite receptben az alábbi útmutatásokat találjuk:

  1. Ne használjunk egyszerre szegfűborsot és szerecsendiót,
  2. akkor és csak akkor használjunk szerecsendiót, ha a pitébe tettünk fahéjat.

Írj fel egy logikai kifejezést a szegfubors, szerecsendio és fahej változókkal, amely akkor értékelődik ki igazra, ha a recept utasításait a készítő betartotta!

Töltsd ki egy igazságtáblát is, amely külön mutatja, hogy az első, illetve a második útmutatás teljesül-e egy adott fűszerkombinációra! Ellenőrizd a tábla alapján a kifejezéseid!

Megoldás

Az egyes szabályok:

  1. not (szegfubors and szerecsendio), ez épp akkor lesz hamis, ha mindkét változó igaz (ha egyszerre használnánk őket),
  2. (szerecsendio and fahej) or (not szerecsendio and not fahej), mert az is jó, ha mindkettő van, és az is, ha egyik sem: „akkor és csak akkor”.

A végleges szabály:
not (szegfubors and szerecsendio) and ((szerecsendio and fahej) || (not szerecsendio and !fahej))

Pizzák

Alex, Beth és Chris szeretnének egy óriáspizzát rendelni, méghozzá olyat, amelyből mind a hárman szívesen esznek. Ezeket a kijelentéseket tehetjük:

  • Alex az olívabogyós pizzát csak akkor eszi meg, ha pepperoni is van rajta,
  • Beth viszont a pepperonis pizzát csak sonka nélkül eszi meg,
  • Chris pedig csak olyan pizzát hajlandó enni, amin pontosan kétféle feltét van.

Használd a következő változókat: p IGAZ értékű, ha a pizzán van pepperoni, s akkor IGAZ, ha van rajta sonka és o akkor IGAZ, ha van rajta olívabogyó! Írj egy logikai kifejezést, amely akkor és csak akkor igaz, ha a pizza mindhármuk számára megfelelő! Rajzold fel az igazságtáblát, amely külön mutatja mindhármuk preferenciáit, és egy oszlopban azt is, hogy az adott pizza megfelelő-e! Meg tudnak egyezni? Lehet egyszerűsíteni a felírt képletet?

Megoldás

Alex:

(not o and not p) or (o and p)

Beth:

p and not s

Chris:

(p and s and not o) or (p and not s and o) or (not p and s and o)

Kombinálva:

((not o and not p) or (o and p)) and (p and not s) and
((p and s and not o) or (p and not s and o) or (not p and s and o))

Egyszerűsítve (az igazságtábla alapján is ellenőrizhető): p and not s and o.

psoAlexBethChrismindenki
0001000
0010000
0101000
0110010
1000100
1011111
1100010
1111000

Büfé

Egy büfé négy törzsvásárlója az alábbi fajta szendvicseket szereti:

  • Az 1. vásárló olyan szendvicset szeret, amiben bacon magában van.
  • A 2. vásárló szerint a paradicsomos szendvics csak akkor jó, ha van benne salátalevél is.
  • A 3. vásárló nem szereti, ha bacon és salátalevél is van egyszerre a szendvicsben.
  • A 4. vásárló csak az olyan szendvicset (v)eszi meg, amiben se paradicsom, se salátalevél nincsen.

Írj fel mind a négy vásárlóhoz egy-egy logikai kifejezést, amelyek akkor és csak akkor igazak, ha egy adott típusú szendvics megfelelő nekik!

Megoldás

A preferenciák logikai kifejezéssel:

  • 1. vásárló: bacon and not salata and not paradicsom, mert nem elég csak azt mondani, hogy legyen benne bacon, azt is kell mondani, hogy a másik két összetevő nincs.
  • 2. vásárló: not paradicsom or salata, mert ha van paradicsom, a kifejezés első fele hamis lesz, ilyenkor a második fele: salata muszáj igaz legyen, hogy az egész igaz tudjon lenni; ha pedig nincs paradicsom, az első fele mindenképp igaz, tehát lehet benne salata, de az se baj, ha nincs.
  • 3. vásárló: not (bacon and salata), mert ha mindkettő van, a belső részkifejezés igaz lesz, és pont azt nem szereti, tehát tagadjuk.
  • 4. vásárló: not paradicsom and not salata, mert egyik sem teljesülhet.

Wason feladatai

6 3

1. feladat. Tegyük fel, hogy vannak kártyáink, amelyeknek egyik oldalán egy alakzat van, másikon pedig egy szám. Adott egy szabály:

Ha egy kártyának négyzet van az egyik oldalán, páratlan szám kell legyen a másik oldalán.

Ezek állítólag érvényesek az oldalt látható kártyákra. Melyeket kell megfordítani ahhoz, hogy ellenőrizzük a szabályt? Ha a negyzet változó és a paros változó igaz/hamis értékeket tárolnak, amelyek azt mutatják, egy adott kártyán négyzet, illetve páros szám van-e, akkor mi az a logikai kifejezés, amely igazra értékelődik ki, ha egy kártya megfelel a szabálynak?

2. feladat. Egy országban legalább 18 évesnek kell lennie valakinek ahhoz, hogy sört ihasson. Egy rendőr az alábbiakat tudja egy bár négy különböző vendégéről:

  • Sört iszik.
  • Kólát iszik.
  • 25 éves.
  • 16 éves.

Melyikükről kell több információt szereznie, hogy tudja, betartja-e a törvényt?

Megoldás

1. feladat. Meg kell fordítani a négyzetest, mert ha nem páratlan számot találunk a másik oldalán, akkor az megsérti a szabályt. Meg kell fordítani a hatost is, mert ha négyzet van a másik oldalán, a páros számával sérti a szabályt. A logikai kifejezés pedig not negyzet or paros.

2. feladat. A sört ivóról és a 16 évesről.

  • A sört ivóról tudnia kell, elmúlt-e 18.
  • Aki kólát iszik, bárhány éves lehet, nem szegi meg a tilalmat.
  • Aki 25 éves, bármit ihat.
  • Aki 16 éves, nem ihat sört – róla tudnia kell, mit iszik.

A két feladat matematikailag tökéletesen egyforma. Egyformák lettek a megoldásaid is?

2. Logikai kifejezések a programokban

Osztható-e

Készíts programot, mely a felhasználótól bekért két számról megállapítja, hogy oszthatók-e egymással!

Háromszög

Készíts programot, amely a felhasználó által megadott a, b és c háromszög oldalhosszúságok ismeretében a.) eldönti, hogy létezik-e a háromszög, b.) meghatározza, hogy ha létezik a háromszög, az derékszögű, hegyesszögű vagy tompaszögű. (A Pitagorasz-tétel alapján ez eldönthető.)

Kisebb, nagyobb, egyenlő

Készíts programot, mely három változó (a,b,c) értékét a felhasználótól megkérdezi, majd a számok közötti relációt kiírja a képernyőre. Természetesen előfordulhat egyenlőség is. Lehetséges példák eredményre: "b<c<a", "c<a=b", "a=b=c", stb.

Dolgozat pontszáma

 0…23 → 1
24…32 → 2
33…41 → 3
42…50 → 4
51…60 → 5

Írj programot, amely megkérdezi, hány pontot kapott valaki egy dolgozatra. Utána pedig kiírja az érdemjegyet (elégtelen, elégséges, közepes, jó, jeles) szavakkal a képernyőre! A pontozási táblázat oldalt látható.

Euler feladata

Egy gazda sertést, kecskét és juhot vásárolt, összesen 100 állatot, pontosan 600 aranyért. A sertés darabja 21 arany, a kecskéé 8 arany, a juhoké 3 arany. Hány darabot vett mindegyik állatból? Oldd meg nyers erővel (azaz a lehetséges esetek végigpróbálásával) a feladatot!

Oszthatóság

Készíts programot, mely meghatározza és kiírja az összes hárommal és öttel egyaránt osztható, 1000-nél kisebb természetes számot.

Fizzbuzz 1.

Írj programot, amely a fizz-buzz játékot játssza! Ez a számokat növekvő sorrendben írja ki; de minden 3-mal osztható helyére azt, hogy „fizz”, az 5-tel oszthatók helyére pedig azt, hogy „buzz”. Ha mindkét feltétel teljesül, akkor a kiírandó szöveg „fizzbuzz”.

Hogy lehetne megírni ezt a programot röviden, ha a 7-eseknél „banana”, és 11-eseknél „bumm” van a fentihez hasonló módon?

Fizzbuzz 2.

Az előző program kapcsán vizsgálni kellett egy szám 3-mal és 5-tel való oszthatóságát. Egy szám lehet 3-mal osztható (vagy nem), lehet 5-tel osztható (vagy nem). Ez két, egymástól független tulajdonság. Mondhatjuk így is: ha egy szám 3-mal osztható, akkor azon belül még lehet 5-tel is osztható, vagy nem. Ha pedig 3-mal nem osztható, akkor azon belül is lehet még 5-tel osztható, vagy nem.

Írj egy olyan Fizzbuzz programot, amelynek felépítése ezt a logikát követi!

Az ötjegyű számok osztója

Készíts programot, mely meghatározza az összes olyan legfeljebb ötjegyű természetes számot, amelynek első két jegyéből alkotott szám osztója az eredeti számnak!

Legnagyobb közös osztó

300│2
150│2
 75│3
 25│5
  5│5
  1│

Emlékezz vissza a gyakorlat feladatára, a prímtényezős felbontásra. Egy adott osztóval addig osztunk, amíg csak lehet; utána a következő osztót próbáljuk. Mindezt pedig addig folytatjuk, amíg 1-ig el nem érünk, mert az már nem osztható semmivel.

Tervezz programot két pozitív egész legnagyobb közös osztójának (LNKO) meghatározására! Gondold végig, hogyan lehet a sima prímtényezős felbontásból kiindulni. (Egy tényező akkor szerepel a közös osztó felbontásában, ha mindkettő számnak tényezője.) A tervezéshez pszeudokódot, folyamatábrát vagy struktogramot használj! Valósítsd meg a programot!

Legkisebb közös többszörös

Írd át úgy a fenti programot, hogy a legkisebb közös többszörösét (LKKT) számolja ki a két megadott számnak! Gondold meg: mikor tényezője a közös többszörösnek egy prímszám?

Törtek összege

Készíts programot, amely kiszámolja a/b+c/d (két tört összegét), majd az eredményt törzsalakú törté alakítja (amely már nem egyszerűsíthető tovább)!

Láda

+---+
|\  |
| \ |
|  \|
+---+

Írj programot, amely +, |, -, és \ karakterekből egy ládát rajzol! Figyelj a visszaper karakter kirajzolására: azt "\\" formában kell megadni. Hogyan lehetne ezt megírni két egymásba ágyazott ciklussal és sok elágazással?

Lépés a sakktáblán I.

Használd a sakktáblán a szokásos jelölést; 1…8 a sorok, a…h az oszlopok jele. Adott két mező, pl. b7 és d6; kérd ezeket a felhasználótól! Mondd meg ezután, ez a lépés szabályos-e egy király, vezér, futó, bástya vagy huszár számára! (Tegyük fel, hogy nem áll más figura az útjukban.)

Lépés a sakktáblán II.

A feladat mint az előző, de most csak egy mezőt ad a felhasználó (pl. d6). Listázd ki a programból, melyekre tud lépni szabályosan arról egy király, egy vezér stb.

3. Programozási tételek

Négyzetszám

Készíts programot, amely egy pozitív egész számról négyzetgyökvonás nélkül eldönti, hogy négyzetszám-e!

Osztók száma

Írj programot, ami kiírja egy pozitív, egész szám osztóinak a számát!

Osztók összege

Adjuk meg egy felhasználótól kért szám osztóinak összegét! (Pl. 6-hoz: 1+2+3+6 = 12.) Melyik programozási tételeket kell ehhez kombinálni? Nevezd meg őket! Írd meg a programot úgy is, hogy az osztók összegébe a számot önmagát nem számítod bele! Hol kell ehhez módosítani a programot?

Tökéletes szám az, amelynél az utóbbi összeg megegyezik magával a számmal (vagyis az osztóinak összege, 1-et beleértve, de a számot magát nem). A 6 a legkisebb tökéletes szám, mert 1+2+3=6. A következők 28 és 496. Írjuk ki, hogy a kapott szám tökéletes-e!

Megoldás

Az osztók összegzéséről egyből eszünkbe juthat az összegzés tétele: ciklus a számokon, akkumulátor változóban összegzés. Az összeghez azonban nem mindegyik számot kell hozzáadni, hanem csak az osztókat, vagyis válogatunk közülük. A kiválogatás tétele hasonlít a számláláshoz: ha egy feltétel teljesül, akkor csinálunk valamit a számmal:

CIKLUS AMÍG van még szám, ADDIG
    szám = következő elem
    HA feltétel(szám), AKKOR
       KIÍR: szám
    FELTÉTEL VÉGE
CIKLUS VÉGE

Intervallum prímszámai

Készíts programot, mely a felhasználó által megadott [n,m] zárt intervallumban növekvő sorrendben kiírja az összes prímszámot!

Végezz ellenőrzést, hogy a megadott két szám helyes-e: egyik szám sem lehet kisebb 2-nél. Ha a felhasználó m-re kisebb számot ad meg, mint n-re, akkor a két számot automatikusan cserélje meg!

Nem prímek

Írj programot, amely kér a felhasználótól egy pozitív egész számot, és utána kiírja az összes, ennél a számnál kisebb olyan pozitív egész számot, amely nem prím!

Sorozat

Készíts programot, mely bekér egy számot (k), majd kiszámítja az alábbi összeget:

y=1×2 + 2×3 + 3×4 + ... + k×(k+1)

Adott számnál kisebb tökéletes számok

Írj programot, amely kér a felhasználótól egy pozitív egész számot, és kiírja az összes, a megadott értéknél kisebb tökéletes számot! Tökéletes az a szám, amely megegyezik osztóinak összegével, pl.: 28=1+2+4+7+14.

e: a természetes logaritmus alapszáma I.

Az e=2,7182818… matematikai konstans előállítható az alábbi képlettel:

    1    1    1    1    1
e = ── + ── + ── + ── + ── + …
    0!   1!   2!   3!   4!

Írj programot, amely kiszámítja ezt az első 20 taggal!

Megoldás

Tipp: ha ciklusban ciklust alkalmaztál, próbáld meg egyszerűsíteni a megoldásodat. Elég egyetlen egy ciklus!

e: a természetes logaritmus alapszáma II.

Írj programot, mely kiszámítja az a(n)=(1+1/n)^n sorozat k-adik elemét. A k változó értékét kérdezd a felhasználótól! (A hatványozáshoz most ne használd a pow() függvényt.)

A π kiszámítása

John Wallis, angol matematikus az alábbi képletet adta a π kiszámítására:

π   2·2   4·4   6·6   8·8
─ = ─── · ─── · ─── · ─── · …
2   1·3   3·5   5·7   7·9

Ismerd fel a szabályosságot a sorozatban! Írj programot, amelyik kiszámítja a szorzatot az első n tényező figyelembevételével! Próbáld ki a programot úgy, hogy a szorzat első 10, 100, 1000 tényezőjét veszed figyelembe!

A Leibniz-féle sor

Leibniz a lenti összegképletet vezette le a π becslésére. Minél több tag szerepel az összegben, annál pontosabb az eredmény. Feladat: írj egy programot úgy, hogy ennek alapján számolja ki a π közelítő értékét!

π       1   1   1
─ = 1 - ─ + ─ - ─ + …
4       3   5   7

A feladat több buktatót is tartalmaz. Ha nem helyes a program által kiírt eredmény, használj nyomkövetést, figyeld a változók értékét!

Tipp: figyeld meg, hogy az összeadás és a kivonás váltakoznak. Érdemes kettesével, páronként haladni az összegzésben, mert akkor a páros/páratlan vizsgálat kimaradhat a programból.

Párosak, páratlanok

Készíts programot, mely bekér N darab természetes számot (először N-et kérje be). Az adatok beírása után a program írja ki a beírt páros és páratlan számok darabszámát, és a páratlan számok összegét!

Pontosan három osztó

Írj programot, amely kiírja a képernyőre az első öt olyan számot, amelynek pontosan három osztója van!

Prímszámok

Kérj a felhasználótól egy n számot. Írd ki az összes olyan (i;j) párt, amelyre 1<i<j≤n, és igaz az, hogy i+j prím. Pl. n=6 esetén 2+3=5, 3+4=7 stb.

Osztható mind a tízzel

Melyik a legkisebb olyan szám, amelynek osztója az 1…10 számok mindegyike? (2520.) Határozd ezt meg programból! Melyik programozási tételt kell ehhez használni?

3 és 5 többszörösei

A 3 és 5 számok 10-nél kisebb többszörösei 3, 5, 6 és 9. Ezek összege 23. Mennyi az 1000 alatti ilyen számok összege? Ehhez melyik tétel szükséges?

Egy kör belső pontjai

Adott a síkon középpontjának (x,y) koordinátáival és sugarával egy kör. Készíts programot, mely megadja a körbe eső egész koordinátájú pontok számát!

Páratlan számok

Egy program bekér a felhasználótól két pozitív egész számot, és kiírja a két szám közötti összes páratlan számot. A program akkor is helyesen működik, ha a felhasználó előbb a felső, aztán az alsó határt adja meg (és fordítva is).

Megoldás

Pszeudokód:

Első és második szám bekérése
Ha első > második
    alsó = második, felső = első
Egyébként
    alsó = első, felső = második
A ciklusváltozó legyen alsó
Amíg a ciklusváltozó kisebb vagy egyenlő a felsővel
    Ha a ciklusváltozó páratlan
       Írd ki a ciklusváltozót
    Növeld a ciklusváltozót eggyel

Annyi csillag, ahány…

Egy program bekér a felhasználótól két pozitív egész számot, és kiszámítja a két szám közötti összes 5-tel osztható páros szám összegét, majd ennyi * karaktert ír a képernyőre. A program akkor is helyesen működik, ha a felhasználó előbb a felső, aztán az alsó határt adja meg (és fordítva is).

Megoldás

Pszeudokód:

Első és második szám bekérése
Ha első > második
    alsó = második, felső = első
Egyébként
    alsó = első, felső = második
Összeg = 0, ciklusváltozó = alsó
Amíg ciklusváltozó kisebb, mint felső
    Ha ciklusváltozó osztható 10-zel
        Összeget növeld ciklusváltozóval
    növeld ciklusváltozót eggyel
Ciklusváltozó = 0
Amíg ciklusváltozó < összeg
    írj ki egy csillagot
    ciklusváltozót növeld eggyel

Hárommal oszthatók, de öttel nem

Egy program bekér a felhasználótól két pozitív egész számot, és megszámolja, hogy a két szám között hány 3-mal osztható, de 5-tel nem osztható szám áll, végül kiírja a darabszámot. A program akkor is helyesen működik, ha a felhasználó előbb a felső, aztán az alsó határt adja meg (és fordítva is).

Megoldás

Pszeudokód:

Első és második szám bekérése
Ha első > második
    alsó = második, felső = első
Egyébként
    alsó = első, felső = második
Darabszám = 0, ciklusváltozó = alsó
Amíg ciklusváltozó kisebb, mint felső
    Ha alsó osztható hárommal, de nem osztható öttel
        Darabszám növelése eggyel
    Alsó növelése eggyel

Az összeg a maximum nélkül

Egy program megkérdezi a felhasználótól, hogy hány darab szám összegét kívánja kiszámolni, majd bekér ennyi darab egész számot. Utána kiírja a számok összegét úgy, hogy az összegben ne legyen benne a felhasználó által megadott legnagyobb szám. (Az összeg így éppen a maximummal kevesebb.) Pl. ha a felhasználó 4 számot ad: -1, 10, 5, 7, akkor a kiírt összeg 11 lesz, mert -1+5+7=11.

Megoldás

Pszeudokód:

Darabszám bekérése
Összeg = 0
Ciklusváltozó = 0
Amíg ciklusváltozó kisebb, mint a darabszám
    Kérd be a következő számot
    Ha a ciklusváltozó 0, a maximum legyen egyenlő a számmal
    Egyébkén
        Ha a szám nagyobb a maximumnál
            A maximum legyen egyenlő a számmal
    Az összeghez add hozzá a számot
Írd ki az összeg és a maximum különbségét

Adott számnál kisebb legnagyobb prím

Írj programot, amely bekér a felhasználótól egy egész számot, és kiírja a számnál kisebb számok közül a legnagyobb prímet, ha van ilyen!

Megoldás

A talált prímeket felesleges eltárolni – egy lista használata hiba lenne. Visszafelé kell haladni a kereséssel, és az első találat éppen a keresett prím.

Osztók összege vajon prím-e?

Írj programot, amely bekér a felhasználótól egy pozitív egész számot. A program számítsa ki a szám osztóinak összegét, és írja ki, hogy ez prím-e! Pl. be: 9 ki: Összeg: 13, prím (1+3+9).

Megoldás

A megtalált osztókat felesleges eltárolni, csak az összegre vagyunk kíváncsiak. Ezért listát használni felesleges lenne.

4. Sorozatok kezelése listák nélkül

Számok összege és szorzata

Írj programot, amely a felhasználótól számokat kér, egészen addig, amíg 0-t nem kap! Írja ki ezeknek a számoknak az a) összegét, b) szorzatát.

A feladatot meg lehet oldani úgy – és ez a szép megoldás –, hogy a beolvasott szám nulla, avagy nem nulla voltát csak egyetlen egy helyen kell ellenőrizni. Ha nem ilyen lett a programod, próbáld meg átalakítani ilyenné!

Legkisebb, legnagyobb I.

Készíts programot, mely bekér a felhasználótól egy természetes számot (n). Ezután a felhasználótól n darab egész szám megadását kéri, majd kiírja a képernyőre az n megadott szám közül a legkisebbet és a legnagyobbat, továbbá a számok átlagát.

Tipp

Vegyük észre, hogy ehhez nem kell lista! Továbbá azt is észre kell venni, hogy az első számot némileg speciálisnak kell tekinteni. Fel kell tételezni, hogy az is marad a legkisebb; majd később legfeljebb találunk még kisebbet. De a min = 100000000-szerű megoldás elvi hibás!

Legkisebb, legnagyobb II.

Készíts programot, amely bekér egész számokat mindaddig, amíg nem ad meg 0-t a felhasználó. A program határozza meg és írja ki a beadott egész számok közül a legkisebbet és a legnagyobbat, továbbá a számok átlagát! (A 0-t ne számítsd bele a beadott számokba, ez csak a bevitel végét jelzi. Vigyázz, ez nem ugyanaz a feladat, mint az előző!)

Repülés

Egy repülőgéppel repülünk, és 100 m-ként megmérjük a felszín tengerszint feletti magasságát méterben. Készíts programot, mely a billentyűzetről beérkező adatok eltárolása nélkül megállapítja, hogy

  1. jártunk-e a tenger felett?
  2. átrepültünk-e sziget felett? Ha igen, hány sziget felett?

Az első és utolsó mérést szárazföldön végeztük. (Az adatbeolvasás végét a -1 adat bevitele jelezze!)

A beírtak közül legnagyobb prím

Írj programot, amely egész számokat kér be a felhasználótól mindaddig, amíg a felhasználó pozitív számokat ad meg! Ezt követően írja ki a beolvasott számok közül a legnagyobb prímet (a beolvasott számok között lehet a legnagyobb prímnél nagyobb összetett szám is, tehát nem elég a maximumot vizsgálni, a prímséget is kell)!

Megoldás

Hiba lenne itt a beírt számokat eltárolni. A szélsőérték kereséséhez felesleges – mindig csak a legutóbbi (legnagyobb) értékre kell emlékeznie a programnak!

5. Karakterek, sztringek

Hány betű?

Hozz létre egy sztringet! Írj ciklust, amelyik megszámolja az 'l' betűket a sztringben!

Karakter típusa

Készíts programot, mely beolvas egy karaktert, és megállapítja róla, hogy az nagybetű, kisbetű, szám vagy egyéb karakter!

Kisbetűk

Készíts programot, amely megkapja egy sztringet, és megadja a szövegben található kisbetűk számát.

Hány szóköz?

Készíts programot, mely bekér egy mondatot, majd
a.) megszámolja és kiírja, hogy a mondatban hány szóköz található.
b.) kiírja a mondatot szóközök nélkül.

Karakterek cseréje

Készíts programot, mely egy sztringet és további két karaktert (mit és mire) kap. A függvény keresse meg a sztringben a "mit" változóban megadott karaktereket, és cserélje azokat a "mire" változóban megadottakra. Állítsd elő az eredményt egy új változóban, és írd ki azt!

Névelő

Készíts programot, mely adott sztringben megszámolja, hányszor fordul elő az „a” névelő. A névelő lehet mondat elején, de végén nem, viszont vessző állhat előtte is és utána is, egyébként szóköz karakterek határolják.

Squeeze

Írj olyan "squeeze" programot, amely egy sztringből az összes olyan karaktert törli, amelyik szerepel egy második sztringben! Például "megadott sztring", "gt" esetén: "meado szrin" az eredmény.

Pontosan egyszer

Írj programot, amely beolvas egy szöveg, és megállapítja, hogy vannak-e benne olyan karakterek, amelyek pontosan egyszer fordulnak elő. A program írja ki ezeket a karaktereket, ha pedig nincsenek a karakterláncban egyedi karakterek, akkor közölje a felhasználóval!

Legalább kettő

Írj függvényt, amely kap egy sztringet, és visszaadja az első olyan karakter indexét, amelyből legalább kettő található a sztringben! Ha nincs ilyen karakter, jelezze azt –1-gyel!

Karakterek törlése

Írj függvényt, amely átvesz paraméterként egy módosítandó sztringet és még egy karaktert. Alakítsa át úgy a sztringet úgy (új sztringet létrehozva), hogy a megadott karaktert törölje a sztring elejéről és a végéről is! Mindkét oldalon lehet több is, vagy akár semennyi. A belsejében viszont tudjuk, hogy nincsen.

Példa bemenet: „xxxHello hallo elektor kalandorxxxx” és az „x” karakter
Példa kimenet: „Hello hallo elektor kalandor”

Második szó, utolsó szó

Írj programot, amely szringgel dolgozik! A sztring szöveget tartalmaz, melynek szavait szóközök választják el egymástól (minden szó, ami nem szóköz). A program adja meg a sztring második szavának indexét (hányadik karakternél kezdődik), és az utolsó szónak az indexét! A kapott sztringről biztosan tudjuk, hogy legalább két szóból áll.

Caesar-féle kódolás, tetszőleges kulccsal

Ez egy laborfeladat folytatása.

A kódolás lényege ugyanaz, mint az előbb. Csak a lépés itt megadható: minden betű helyett ábécében egy tőle meghatározott távolságra lévő betűvel kell helyettesíteni. Így például, ha az eltolás „c”, az angol ábécében az a-t a c-vel, a b-t az d-vel stb. kell helyettesíteni.

Írj egy programot, amelyiknek megadható a kódolandó karakter, és a szintén a felhasználótól bekért szövegek kódolva kiírja. Csak a kisbetűket kódolja, más karaktereket hagyjon változatlanul. Figyelj arra is, hogy a programkódban ne legyenek mágikus értékek (pl. 26, mint az abc betűinek száma).

Megoldás

A kódoló:

kulcs = input("Melyik karakterrel kódoljunk? (a-z) ")
while len(kulcs) != 1 or ord(kulcs) < ord('a') or ord(kulcs) > ord('z'):
    kulcs = input("Melyik karakterrel kódoljunk? (a-z) ")

delta = ord(kulcs) - ord('a')
print(delta)

szoveg = input("Írd be a kódolandó szöveget: ")
kodolt = ""

for i in szoveg:
    if ord(i) < ord('a') or ord(i) > ord('z'):
        kodolt += i
        continue
    
    eltolas = ord(i)+delta
    while eltolas > ord('z'):
        eltolas = eltolas - (ord('z') - ord('a') + 1)
    
    kodolt += chr(eltolas)

print(kodolt)

A dekódoló ugyanez, csak kivonni kell, és a másik irányba történhet „túlcsordulás”:

kulcs = input("Melyik karakterrel dekódoljunk? (a-z) ")
while len(kulcs) != 1 or ord(kulcs) < ord('a') or ord(kulcs) > ord('z'):
    kulcs = input("Melyik karakterrel kódoljunk? (a-z) ")

delta = ord(kulcs) - ord('a')
print(delta)

szoveg = input("Írd be a kódolandó szöveget: ")
kodolt = ""

for i in szoveg:
    if ord(i) < ord('a') or ord(i) > ord('z'):
        kodolt += i
        continue
    
    eltolas = ord(i)-delta
    while eltolas < ord('a'):
        eltolas = eltolas + (ord('z') - ord('a') + 1)
    
    kodolt += chr(eltolas)

print(kodolt)

Karaktertábla

Az előadásanyagban szerepel egy táblázat az ASCII karakterkódokkal. A feladat egy olyan programot írni, amely kirajzolja azt, fejlécekkel együtt. (Miért csak 32-től 127-ig kell menni?)

Tabulátorok

Írj olyan programot, amely egy sztringben talált tab karakterek mindegyikét annyi ponttal helyettesíti, amennyi a következő tabulátor pozícióig hátravan! A tabulátor pozíciók legyenek 8 karakterenként. Például, bemenet (ahol a \t-vel jelzett helyeken a felhasználó a tabulátor billentyűt nyomja meg):

\t\tHello,
világ\t!

Kimenet:

1234567|1234567|1234567
................Hello,
világ...!

6. Listák: keresések, egymás melletti elemek vizsgálata

Szigmon

Készíts egy olyan programot, amely létrehoz és a programba beépített kezdeti értékekkel feltölt számokat tartalmazó listát! Írja ki, hogy a lista elemei szigorúan monoton növekvőek, csökkenőek, vagy egyik sem!

Teszteld a programot, hogy mind a három eredményt előállítsd vele! Próbáld ki úgy is, hogy a csökkenő vagy növekvő monotonitást a lista első kettő vagy utolsó kettő elemével rontod el, hogy lásd, a számsor széleit is helyesen kezeled-e!

Tipp

Melyik programozási tételt kell alkalmazni ennek megoldásához? Másképp feltéve a kérdést, mit kell találni a listában ahhoz, hogy tudjuk, nem szigmon növekvő?

Az utolsó öt szám… átlaga

Írj programot, amely a felhasználótól számokat kér be. A bevitel addig tartson, amíg a felhasználó 0-t nem ad meg. Amikor ez megtörtént, a program írja ki az utoljára bevitt öt szám átlagát! (Tegyük fel, hogy volt legalább ennyi.)

Tipp

Hány elemet kell ehhez eltárolni?

A folyó

Egy folyó sodrásirányára merőlegesen 2 méterenként megmértük a meder mélységét, és egy listában sorfolytonosan eltároltuk. Így az alábbi 18 számot kaptuk:

0.1, 1, 1.5, 1.7, 2, 2.3, 2.8, 4.5, 9.8, 12, 14.1, 13, 11.9, 8.7, 6.1, 3.5, 1, 0.5

Készíts programot, mely meghatározza, hogy hol a legmeredekebb a mederfal, és hány a százalékos meredeksége! (A százalékos lejtés azt mutatja, hogy egységnyi táv alatt mennyit változott a magasság: 10 m távon 5 m különbség 50%-os lejtőt jelent.)

Tipp

Melyik programozási tétel kell itt? A meredekségnek mijét kell meghatározni? Vigyázz, a lejtő és az emelkedő ugyanaz, ha másik irányból nézzük, és vigyázz, ne indexeld túl a listát!

Kisebbek vagy nagyobbak?

Adott egy számokból álló lista, valamilyen értékekkel feltöltve. Készíts programot, mely a felhasználótól bekért p egész számról meghatározza, hogy a listában p-nél nagyobb, vagy p-nél kisebb számokból van-e több!

Elemek száma I.

Adott egy rendezetlen lista. Készíts programot, mellyel a felhasználó kiválaszthatja a lista egy elemét és meghatározza a nála kisebb és nagyobb elemek számát!

Elemek száma II.

Adott egy rendezett lista. Készíts programot, melyben a felhasználó adhat egy számot, és a program meghatározza, hány annál kisebb és nagyobb eleme van a listának.

Miben lehet nagyon másképp gondolkodni, mint az előző feladatban?

Éppen a szorzata

Adott egy egész számokat tartalmazó lista. Készíts programot, mely a felhasználótól bekér egy egész számot (z), majd eldönti, hogy van-e két olyan elem a listában, amelyek szorzata éppen z!

Melyik szerepel előbb?

Adott egy egész értékekkel feltöltött lista. Készíts programot, mely a felhasználótól kért két számról eldönti, hogy a két szám szerepel-e a listában, és ha igen, akkor melyik szerepel előbb.

Páronként

Készíts programot, mely egy 50 elemű listát véletlen egész számokkal tölt fel 0 és 200 között. Keress a listában két olyan elemet, melyekre teljesül, hogy a nagyobbik elem a kisebbik duplája! Keresd meg az összes ilyen párost!

Átlaghoz legközelebb

Írj programot, amely egy egészekből álló listában megkeresi azt az számot, amely az összes szám átlagához a legközelebb van!

Egyforma elemek

Írj programot, amely egy adott (előre feltöltött vagy billentyűzetről beolvasott) listát vizsgálva kiírja azon elempárok indexeit, amelyek egyformák! Vajon hány összehasonlítás kell ehhez, ha n a lista elemszáma?

Megoldás

Nem kell n2, csak n(n-1)/2 összehasonlítás, mivel minden párt elég csak egyszer megvizsgálni (ha a=b, akkor b=a is igaz).

Mind különböző

Írj programot, amely egy adott (előre feltöltött vagy billentyűzetről beolvasott) listáról megmondja, hogy minden eleme különböző-e!

Tipp

Mit kell találni a listában ahhoz, hogy tudjuk, nem minden elem különböző?

Jó megoldás lehet az is, ha rendezzük a listát, mert akkor az egyforma elemek egymás mellé kerülnek. De vajon mi ennek a hátránya?

Emeletes ház (Dinesman feladata)

Baker, Cooper, Fletcher, Miller és Smith egy ötemeletes ház különböző emeletein laknak. Baker nem a legfölső emeleten lakik, Cooper pedig nem az alsó szinten. Fletcher lakhelye sem a legalsó szinten van, de nem is a legfölsőn. Miller magasabban lakik, mint Cooper. Smith nem Fletcherrel szomszédos emeleten lakik, ahogy Cooper és Fletcher sem emelet-szomszédok.

A kérdés: melyik emelet kié?

Tipp

Az, hogy különböző emeleteken laknak, csak egy feltétel a sok közül. Próbáld végig programban az összes lehetőséget! A „különböző emeletek” feltétel ellenőrzését úgy is megoldhatod, hogy beteszed az öt változót egy listába, és megnézed, mind különbözőek-e az elemei. Lásd a Mind különböző című feladatot.

Lista három legkisebb eleme

Készíts programot, amely egy tömb 3 legkisebb elemét határozza meg!

Átszállások

Buszjáratok megállóinak neveit tároljuk listákban. A programod feladata, hogy beolvassa a buszjáratok adatait, és megmondja két adott járatról, hogy át lehet-e szállni egyikről a másikra, vagy nem; és ha igen, hol.

Írj programot, amely a szabványos bemenetről beolvassa két járat megállóit, üres sorig, majd megvizsgálja, hogy van-e közös megállója, és ha van, kiírja azt.