Programozás alapjai 6. gyakorlat Futásidő, rekurzió, feladatmegoldás
Háziellenőrzés Egészítsd ki úgy a simplemaths.c programot, hogy megfelelően működjön. A program feladata az inputon soronként megadott egyszerű matematikai műveletek elvégzése lenne. A függvények megvalósítása a main() függvény után következzen. A program az alábbi műveleteket ismerné (ahol E nemnegatív decimális egész, V pedig valós számokat jelöl: fact E : kiszámolja E faktoriálisát sqr V : kiszámolja V négyzetét cube V : kiszámolja V köbét add V1, V2 : kiszámolja a V1 + V2 összeget sub V1, V2 : kiszámolja a V1 - V2 különbséget mul V1, V2 : kiszámolja a V1 * V2 szorzatot per V1, V2 : kiszámolja a V1 / V2 hányadost div E1, E2 : kiszámolja az E1 / E2 egészosztás hányadosát mod E1, E2 : kiszámolja az E1 / E2 egészosztás maradékát exit : kilép a programból
Futásidő mérése Linux alatt A time parancs segítségével mérhető egy program futásideje /usr/bin/time program A -f %U kapcsolóval csak a felhasználó által ténylegesen felhasznált időt fogja kijelezni (ez kell nekünk) /usr/bin/time -f %U program A minél pontosabb mérés érdekében érdemes parancssorról adni neki az inputot echo 1000000000 /usr/bin/time -f %U program
Feladat - f0115 Írj programot, mely bekér egy n pozitív egész számot, és megadja az első n természetes szám összegét! Készíts kétféle algoritmust két külön függvényben, és mindkettővel számoltasd ki az eredményt: Az első egy mechanikus, ciklust használó algoritmus legyen. A másik matematikailag átgondolt, minél egyszerűbb algoritmus legyen. Hasonlítsd össze a két megoldás futásidejét! Ehhez használj long long int típusú értékeket (különben int használatával túlcsordulás nélkül még a hosszabb futásidejű algoritmus is túl gyorsan lefutna), és milliárdos (a mai processzorok GHz-es órajelével összevethető) nagyságrendű inputot.
Rekurzió Vannak olyan feladatok, melyek önmagukban elég bonyolultak, de ha jobban megvizsgáljuk, akkor a megoldásuk lebontható hasonló részfeladatokra Pl? Ezt C-ben a rekurzív függvényhívással valósíthatjuk meg Rekurzió: mikor a függvény önmagát hívja meg, csak más paraméterrel FONTOS! Legyen olyan esete a hívásnak, ami nem eredményez újabb hívást (tehát amikor elértünk a legegyszerűbb alakhoz)
Feladat - f0126 Számítsd ki n! értékét a 0! = 1, n! = n * (n-1)! képlet segítségével, nem rekurzív módon ciklussal és rekurzív módon is! Hasonlítsd össze a futási idejüket!
Véletlen szám generálás C-ben (pszeudo)véletlen számokat a rand() függvénnyel lehet Generál egy egész számot 0 és RAND_MAX között Az srand() függvénnyel be lehet állítani a seedet Pszeudorandom szám: azonos seed esetén ugyan azokat a számokat generálja Ha az időt adjuk meg seednek, akkor mindig új sorozatot kapunk srand(time(null)); A time() függvény a time.h headerben van
Feladat - f0165 Határozd meg egy NxM-es véletlen értékű elemekkel feltöltött egész mátrix transzponáltját. N és M bemenetként jönnek, mindkettő max. 128 lehet A kimenet csv formátumú, eredeti és a transzponált mátrix között egy üres sor van egy ; jellel
Önálló feladat - f0167 Határozd meg egy NxM-es véletlen értékű elemekkel feltöltött egész mátrix minden egyes sorának és oszlopának minimumát és maximumát is. N és M bemenetként jönnek, mindkettő max. 128 lehet A kimenet csv formátumú, táblázatos alakban kb. Így nézzen ki ;;"Min.";1;2;3 ;;"Max.";7;8;9 "Min.";"Max." 1;3;;1;2;3 4;6;;6;5;4 7;9;;7;8;9
Feladat - f0189 Írj egy programot, ami a bemeneti szöveget kiírja a kimenetre, de közben törli belőle a számjegy karaktereket, és a végén kiírja, hogy mennyi számjegyet törölt.
Feladat - f0200 Írj egy programot, ami kiszámolja, majd irányszöggel és nagysággal megadja a hasonlóképpen megadott fizikai erők sorozatának eredőjét a kétdimenziós térben. Az erők sorozatának végét egy 0 nagyságú erő jelzi.
Tennivalók Házik a pubban Két hét múlva a mai anyagból lesz a (nagyobb) mini ZH Ciklusokkal, tömbökkel kapcsolatos algoritmikus feladatok Kb. mint amiket most vettünk