Számkitaláló
Készíts egy számkitaláló programot! A program kitalál véletlenszerűen egy pozitív egész számot (1 és 1000 között), a felhasználó pedig addig tippel, amíg meg nem találja a keresett számot. A program minden tipp után megmondja, hogy a felhasználó tippje kisebb vagy nagyobb a keresett értéknél. Ha eltalálta, akkor pedig azt. Ilyenkor egyúttal be is fejeződik a program futása.
Vajon mi a nyerő stratégia a gép „ellen”? Hogyan lehet legkevesebb tippből kitalálni a számot, amire a gép gondolt?
Számkitaláló fordítva
A felhasználó gondol egy számra 1 és 100 között, a gép pedig megpróbálja kitalálni. Például: „kisebb a szám, mint 25?”, erre a felhasználó „i”gen vagy „n”em választ ad. Mi a nyerő stratégia a gép részéről, hogy tudja a legkevesebb kérdésből kitalálni? Valósítsa meg a programot!
Gondolkodtató: ha a gép a nyerő stratégiát alkalmazza, meg tudja-e mondani, ha a felhasználó következetlen választ ad, csalni próbál? Miért?
Nincsenek egyformák
Készíts programot, amely N (maximum 100) darab véletlen számot állít elő, amelyek között nincsenek egyformák!
Lottószámok
Az előadás lottószámos programja úgy generált öt különböző számot az 1…90 intervallumból, hogy a már meglévőket egy tömbbe tette, és abban a tömbben ellenőrizte minden új véletlenszámra, hogy egyedi-e.
Írj programot, amely eltérő logikával generál öt különböző számot! Egy 90 elemű tömbbe írd bele a számokat 1-től 90-ig, és utána tömbindexet generálj véletlenszerűen! Miután egy számot már kisorsoltál, vedd ki a tömbből!
Ötvenhét
Készíts programot, mely egy, a felhasználó által megadott 1 és 99 közötti természetes számot képes kiírni betűvel! Pl.:
5: ot 44: negyvennegy 16: tizenhat
Ezerkilencázhetvenöt
A feladat ugyanaz, mint fent, csak a tartomány legyen 1 és 999999 között. 2000-ig minden számot egybeírunk, 2000 fölött az ezres és ezer alatti rész közé kötőjelet kell tenni. Példák:
625: hatszazhuszonot 1975: ezerkilencszazhetvenot 8000: nyolcezer 23870: huszonharomezer-nyolcszazhetven
Előjelek
Készíts függvényt, amelyik megadja két számról, hogy egyezik-e az előjelük!
Szökőév
Készíts függvényt, amelyik adott évszámról eldönti, hogy az szökőév-e. (Szökőév minden negyedik, nem szökőév minden századik, mégis az minden 400-adik. A 2000. évben ezért volt szökőév.)
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ámolja ezt az első n
taggal!
A faktoriális nagy szám lehet. Tárold azt double
típusú változóban!
Armstrong-számok
Írj függvényt, amely megmondja egy számról, hogy hány számjegyű!
Írj függvényt, amely hatványozást végez egész számokon!
Készíts programot, mely Armstrong-számokat keres, és a találatkat megjeleníti a képernyőn! N-jegyű Armstrong számoknak nevezzük azokat a számokat, melyek számjegyei N-dik hatványainak összege éppen a számot adja. Például: egy négyjegyű Armstrong-szám a 1634, mivel: 1634=14+64+34+44. Használd az előbb megírt függvényeket!
A kapitány
A kapitány abban az évben született, amely 2016-hoz alulról a legközelebbi olyan szám, melynek osztói száma 8, és van benne 7-es számjegy. Hány éves a kapitány? Határozzuk meg algoritmikus módszerrel egy teljes C programban az évszámot! Írjuk ki ezt is, és azt is, hogy most hány éves!
Használjunk top-down tervezést! Ha jól csináljuk, a main()
kb. 5 soros, és azt mondja:
Az év változóban legyen 2016, és amíg nem igaz a vizsgált számra, hogy az osztóinak száma 8, és van benne 7-es
számjegy, addig csökkentjük az év változó értékét.
(1978 a megoldás.)
Sakktábla
Írj függvényeket, amelyek paraméterei két koordinátapár, amelyek egy mezőre hivatkoznak a
sakktáblán! (Ez lehet négy karakter is, pl. d6
és e8
.) Az egyes
függvények mondják meg a logikai típusú visszatérési értékükben, hogy az adott mezőpár helyes
lépés-e egy királynak, bástyának, futónak, huszárnak vagy vezérnek!
Írj programot, amely megkérdezi egy kiinduló mezőnek a koordinátáit a felhasználótól, és aztán kilistázza az egyes figurák által elérhető mezőket!
A függvények segítségével „sormintamentessé” tehető a program. Hasonlítsd össze az így kapott programot a régebbi gyakorlófeladat anyagában található megoldással. Miben segítenek még a függvények?
Minimum, maximum, határ
Írj olyan függvényeket, amelyek:
- Visszaadja két egész szám közül a nagyobbikat:
max(a, b)
. - Visszaadja két egész szám közül a kisebbiket:
min(a, b)
.
Teszteld ezeket a függvényeket! Utána írj olyan függvényt is a fentiek használatával, amely:
- Két oldalról korlátoz egy értéket:
korlatoz(szam, min, max)
adja vissza a számot, hamin
ésmax
közé esik, amúgy pedigmin
-t vagymax
-ot attól függően, hogy merre haladta meg a tartományt.
Bitbabrálás
Adott az alábbi függvény prototípus:
unsigned bitset(unsigned eredeti, unsigned bit);
- Valósítsd meg a függvényt, amely az
eredeti
paraméterben kapott számbit
sorszámú bitjét 1-re állítja, és visszatér az így kapott számmal! A többi bit maradjon változatlanul! A legkisebb helyiértékű bit száma 0. - Készíts
bitreset
függvényt is, melynek paraméterezése megegyezik abitset
-ével, és a megadott sorszámú bitet 0-ra állítja! - Végül pedig
bitnegal
függvényt, amely a megadott sorszámú bitet negálja.
Legyen unsigned c=51
! Végezd el a következő műveleteket, és írd ki egymás alá az
egyes lépések eredményét! Figyeld meg, hogyan változnak a bitek!
c = bitset(c, 5);
c = bitreset(c, 7);
c = bitnegal(c, 3);
Elmozdulás egy adott ponttól
Készíts függvényt, mely egy pont x és y koordinátáival tér vissza. A függvény paraméterként kapja egy pont x és y koordinátáját (egy pontot), valamint egy szöget és egy távolságértéket. Számítsd ki a visszatérési értékként szereplő pont x és y koordinátáit, hogy az a megadott ponttól meghatározott szögben és távolságban legyen.
Elforgatás egy pont körül
Készíts függvényt, amely egy x és y koordinátával rendelkező pontot elforgat egy másik adott pont körül, adott szöggel! A függvény visszatérési értéke az elforgatott pont legyen. (A forgatáshoz való képletet megtalálod a függvénytáblában is.)
Kártyapakli I.
Kártyás játékot írunk. Definiálj egy olyan C-s típust, amely tárolhatja egy kártya adatait (szín: pikk, treff, … és szám: A, 2, 3, … J, Q, K). Tölts fel egy tömböt egy pakli kártyáival. Utána keverd meg a tömböt. A keverő algoritmus ne cserélje feleslegesen sokszor a tömb elemeit! Végül írd ki, milyen sorrendben szerepelnek a kártyák a megkevert pakliban.
Kártyapakli II.
Definiálj egy olyan C-s típust, amely tárolhatja egy kártya adatait (szín: pikk, treff, … és szám: A, 2, 3, … J, Q, K)!
Írj függvényt, amely megmondja egy pakli kártyáról (kártyák tömbjéről), hogy:
- Hiányos-e a pakli,
- Van-e benne dupla lap (kétszer ugyanaz)!
Rudak hossza
Egy gyárban fémrudakat gyártanak. A megmunkálás pontatlansága miatt azonban ezek hossza kicsit eltérő: pl. egy 1 méteresnek szánt rúd 999 mm és 1001 mm között bármekkorára sikerülhet. Ha két ilyen rudat egymás mögé teszünk, akkor az összegzett hosszuk valahol 1998 és 2002 mm között lesz.
- Definiálj típust, amely egy rúd minimális és maximális hosszát tárolja!
- Írj egy függvényt, amely paraméterként kapja két rúd adatait, és visszatérési értéke egy rúd, amely ezek összege (egymás mögé tett rudak hossztartománya).
- Írj függvényt, amely visszaadja egy paraméterként kapott rúd átlagos hosszát!
- Egészítsd ki ezt teljes programmá, amelyben létrehozol egy 999-1001 mm-es, és egy 498-502 mm-es rudat. Számolja ki a program a függvényekkel, hogy mekkora ezek összege minimálisan, maximálisan és átlagosan!
Vektorok
Egy programban kétdimenziós vektorok adatait kell tárolni. Ilyenek lehetnek a sebességek: vx vízszintes irányú, vy függőleges irányú sebességek adják a v sebességvektort.
- Definiálj típust, amely egy sebességvektort tárol!
- Írj függvényt, amely paraméterként egy sebességvektort kap, és visszatérési értéke a vektor hossza (Pitagorasz-tétel)!
- Írj függvényt, amely paraméterként két sebességvektort kap, és visszatérési értéke az összeg vektor (komponensenként)!
- Egészítsd ki mindezt főprogrammá, amelyben egy (1 m/s, 2 m/s) és egy (-0,5 m/s, 3 m/s) sebességvektort összegzel, és utána kiszámolod, az eredő vektornak mekkora a hossza! Írd ki az összes kiszámolt adatot!
Dátumok, öröknaptár
Írjunk programot, amely egy struktúrában dátumot tárol: év, hónap, nap. Kezeljék ezeket függvények:
datum_kiir(d)
: kiírja a dátumot év.hónap.nap formában.datum_ev_napja(d)
: megmondja, az év hányadik napja. Vegye figyelembe a szökőéveket! (Ehhez csak elő kell szedni a 4. gyakorlat feladatát – tekinthetjük azt akár kidolgozottnak is.)datum_kivon(d1, d2)
: megmondja, hány nap telt el d2-től d1-ig, ahol d1 a kisebbítendő, d2 a kivonandó.milyen_nap(d)
: megmondja, milyen napra esik az adott dátum. 1=hétfő, 7=vasárnap. 1900. január 1. hétfőre esett.
Átfedő körök
Egy geometriai programban körök adatait kell tárolni: középpont (x, y koordináta) és sugár. Ezek valós számok.
- Definiálj típust, amelyben egy kör adatai eltárolhatóak!
- Írj függvényt, amely paraméterként kap két kört, és megmondja, hogy azok átfedik-e egymást! (Ez akkor van, ha a középpontjaik Pitagorasz-tétellel számolható távolsága kisebb, mint a sugaraik összege.)
- Írj függvényt, amely beolvassa a billentyűzetről a középpontot és a sugarat, és visszatérési értéke egy ilyen tulajdonságú kör.
- Egészítsd ki ezt teljes programmá, amelyben beolvasod két kör adatait, és megmondod, hogy azok átfedik-e egymást!
3D vektorok
Az előadáson bemutatott törtes példa alapján írj egy programot, amelyik háromdimenziós vektor típust képes kezelni! Tudjon vektorokat kiírni, összeadni, kivonni; számítsa ki két vektor skaláris szorzatát! A program kerete az alábbi legyen:
#include <stdio.h>
/* ... a megírt programrészek ... */
int main(void) {
Vektor a = {3, 2, 1}, b = {4, 6, 8}, c;
c = osszead(a, b);
kiir(c); printf("\n");
c = kivon(a, b);
kiir(c); printf("\n");
printf("Skalárszorzat: %g\n", skalarszorzat(a, b));
return 0;
}
Bankautomata II.
Idézd föl az órai bankautomatás feladatot! A feladatkiírás azt kérte, hogy írj egy programot, amely egy adott pénzösszeget a megadott névértékű bankjegyekre és érmékre bont le. Pl. 4200 Ft = 2×2000 Ft + 1×200 Ft.
Ez a feladat annak a folytatása. Most az automata rekeszei végesek. Tárold el azt is, hogy melyik bankjegyből és érméből épp mennyi van! Írj programot mohó algoritmussal, amelyik úgy ad pénzt, hogy ezt figyelembe veszi!