Szendvicsek
Egy büfében az alábbi szabályokat használják a jó szendvicsek készítéséhez:
- Egy szendvicsben legyen legalább egy fajta hús,
- Egy szendvicsben legyen marha vagy sonka, de együtt ne,
- 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:
marha or sonka or pulyka
,(marha and not sonka) or (not marha and sonka)
, ami egyébkéntmarha ⊕ sonka
XOR kapcsolatnak felel meg,not pulyka or sajt
, mert ha nincs bennepulyka
, akkor mindegy, van-e sajt, viszont ha van bennepulyka
(tehátnot 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:
- Ne használjunk egyszerre szegfűborsot és szerecsendiót,
- 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:
not (szegfubors and szerecsendio)
, ez épp akkor lesz hamis, ha mindkét változó igaz (ha egyszerre használnánk őket),(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
.
p | s | o | Alex | Beth | Chris | mindenki |
---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 | 0 |
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 bennebacon
, azt is kell mondani, hogy a másik két összetevő nincs. - 2. vásárló:
not paradicsom or salata
, mert ha vanparadicsom
, 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 nincsparadicsom
, az első fele mindenképp igaz, tehát lehet bennesalata
, 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
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?
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.
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.
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
- jártunk-e a tenger felett?
- á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!
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...!
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.