ifin811/ea1 C Programozás: Algoritmusok
Vázlat Problémák megoldása Algoritmusok Változók és értékeik Programvezérlés
A probléma megoldásának folyamata Pontos meghatározás Algoritmus Program Futtatás -> megoldás Tervezés Implementáció Fordítás Analizálás Probléma
Algoritmus és program Algoritmus: a feladat végrehajtásához szükséges utasítások sorozata Probléma C Program
Algoritmusok - példák (Étel) recept IKEA bútor összeszerelési útmutató Játékszabályok Video magnó használati utasítás Hogyan juthatsz el a házibulira Szabásminta Autó javítási kézikönyv manual Fizika : egyenletek Természeti törvények -> modellek
Az algoritmus összetevői Változók és értékeik Műveletek Utasítások sorozata Részfeladatok, szubrutinok Elágazások Ismétlések Dokumentáció
Változók és értékeik Mennyiségek, mérési eredmények, a probléma kiinduló paraméterei Lehetnek számok, betűk, összetett objektumok Gyakran van mértékegységük: Recept: hozzávalók
Ananászos lepénykék Előmelegítem a sütőt 230° C-ra. Gyenge lángon a vajat és belekeverem a mézet. A kiolvadt tésztát leheletvékonyra nyújtom, és 12 db körlapot vágok ki. Átteszem őket a sütőlappal kibélelt tepsibe. A lecsepegtetett ananászkarikákat ráteszem a tésztakarikákra. Egyenletesen megkenem őket a mézes vajjal. 15 percre betolom őket a forró sütőbe. Még forrón megszórom őket a fahéjas-szerecsendiós porcukorral. 3 deka vaj 1 ek. méz 1 doboz ananászkonzerv ½ csomag mirelit leveles tészta Kevés liszt a deszkára és kiszúráshoz 2 ek. porcukor ½ tk. őrölt fahéj 2 csipetnyi frissen reszelt szerecsendió Forrás: Stahl Judit: Gyorsan valami finomat, Park Kiadó, 2003
Ananászos lepénykék Előmelegítem a sütőt 230° C-ra. Gyenge lángon a vajat és belekeverem a mézet. A kiolvadt tésztát leheletvékonyra nyújtom, és 12 db körlapot vágok ki. Átteszem őket a sütőlappal kibélelt tepsibe. A lecsepegtetett ananászkarikákat ráteszem a tésztakarikákra. Egyenletesen megkenem őket a mézes vajjal. 15 percre betolom őket a forró sütőbe. Még forrón megszórom őket a fahéjas-szerecsendiós porcukorral. 3 deka vaj 1 ek. méz 1 doboz ananászkonzerv ½ csomag mirelit leveles tészta Kevés liszt a deszkára és kiszúráshoz 2 ek. porcukor ½ tk. őrölt fahéj 2 csipetnyi frissen reszelt szerecsendió Forrás: Stahl Judit: Gyorsan valami finomat, Park Kiadó, 2003
Változók Értékek – tárolására szolgálnak Példa: Ez az üveg tartalmazhat 10 gumicukorkát 50 gramm cukrot 3 szelet sütit stb. Érték Változó
A változók korlátai A változók csak bizonyos típusú értékeket tudnak tartalmazni
Az algoritmusok részei Változók és értékeik Utasítások, műveletek (primitív) Utsasítások sorozata Részfeladatok, szubrutinok (utasításokból állnak) Elágazások (különböző utasítások felé) Ismétlések (részfeladat) Dokumentáció (független az utasításoktól)
Utasítások Vedd le a cipőd Számolj 10 -ig Vágjuk fel a hagymát 1 sima, 1 fordított Húzuk meg szorosan a csavart Az utasítások egyértelműek, egyszerűek és végrehajthatóak Utasítások, hogy műveleteket hajtsunk végre értékeken és változókon.
Utasítások alkalmazása Legtöbb műveletet csak bizonyos típusú változókon és értékeken lehet elvégezni Példa: Aprítsuk fel
Az algoritmusok részei Változók és értékeik Utasítások, műveletek (primitív) Utsasítások sorozata Részfeladatok, szubrutinok (utasításokból állnak) Elágazások (különböző utasítások felé) Ismétlések (részfeladat) Dokumentáció (független az utasításoktól)
Utasítások sorozata 1. Nyisd ki a hűtőt 2. Tedd be az elefántot 3. Csukd be a hűtő ajtaját 1. Nyisd ki a hűtőt 2. Vedd ki az elefántot 3. Tedd be a zsiráfot 4. Csukd be a hűtő ajtaját
Az algoritmusok részei Változók és értékeik Utasítások, műveletek (primitív) Utsasítások sorozata Részfeladatok, szubrutinok (utasításokból állnak) Elágazások (különböző utasítások felé) Ismétlések (részfeladat) Dokumentáció (független az utasításoktól)
Szubrutin Egy elnevezett részsorozata az utasításoknak Így: Egyszerűen (nevével) lehet rá hivatkozni ...nem pedig külön-külön minden utasításra Különböző paraméterekkel hívható
Szubrutin: példa { 1. a kulcsot keresd meg 2. központi zárat nyisd ki szubrutin Vezess_az_ELTÉre { 1. a kulcsot keresd meg 2. központi zárat nyisd ki 3. ajtót nyisd ki 4. szállj be 5. csukd be az ajtót 6. tedd be a kulcsot 7. indítsd el az autót 8. tolass ki a parkolóból 9. menj el az utca végéig 10. fordulj jobbra 11. menj el az utca végéig 12. fordulj balra ... stb. stb. stb… ...stb.stb.stb... 52. találj parkolót 53. parkolj be 54. állítsd le a motort 55. vedd ki a kulcsot 56. nyisd ki az ajtót 57. szállj ki 58. csukd be az ajtót 59. zárd be a kocsit }
Szubrutin hívása szubrutin Hétfő szubrutin 39_hét { { Kelj_fel Hétfő Mosakodj_meg Egyél_reggelit Vezess_az_ELTÉre Ülj_be_C_programozásra ...stb...stb...stb... Vezess_haza } szubrutin 39_hét { Hétfő Kedd Szerda Csütörtök ...stb...stb...stb... }
Szubrutin A “szubrutin” helyett használható: Részfeladat Modul szubrutin Hétfő { Kelj_fel Mosakodj_meg Egyél_reggelit Vezess_az_ELTÉre Ülj_be_C_programozásra ...stb...stb...stb... Vezess_haza } A “szubrutin” helyett használható: Részfeladat Modul Procedure Függvény
Szubrutin Kapcsos zárójelek jelzik a szubrutin elejét és végét. szubrutin Hétfő { Kelj_fel Mosakodj_meg Egyél_reggelit Vezess_az_ELTÉre Ülj_be_C_programozásra ...stb...stb...stb... Vezess_haza } Kapcsos zárójelek jelzik a szubrutin elejét és végét.
Szubrutin hívása Speciális utasítás “szubrutin hívás” szubrutin Hétfő { Kelj_fel Mosakodj_meg Egyél_reggelit Vezess_az_ELTÉre Ülj_be_C_programozásra ...stb...stb...stb... Vezess_haza } Speciális utasítás “szubrutin hívás”
Szubrutin A szubrutinnak lehetnek paraméterei szubrutin ügyfélszolgálat ( nevem ,napszak ) { mondd(“Jó napszakot”); mondd(“nevem vagyok”); mondd(“Miben segíthetek?”); } ügyfélszolgálat ( “Szebeni Anna”, “Reggel” ); ügyfélszolgálat (“Szebeni Anna”, “Nap” ); ügyfélszolgálat ( “Kriza Péter”, “Este” );
Az algoritmusok részei Változók és értékeik Utasítások, műveletek (primitív) Utsasítások sorozata Részfeladatok, szubrutinok (utasításokból állnak) Elágazások (különböző utasítások felé) Ismétlések (részfeladat) Dokumentáció (független az utasításoktól)
Elágazások Olyan utasítás amelyik eldönti, hogy a következő lehetséges két sorozatból melyiket hajtsuk végre A döntés egy igaz/hamis állításon múlik Példák: Autójavítás Reciprok
Elágazások: autójavítás ha (önindító megy) akkor { EllenőrizBenzin EllenőrizGyertya EllenőrizKarburátor } egyébként EllenőrizAkkumulátor EllenőrizGyujtófej
Elágazások: autójavítás ha (önindító megy) akkor { EllenőrizBenzin EllenőrizGyertya EllenőrizKarburátor } egyébként EllenőrizAkkumulátor EllenőrizGyujtófej igaz vagy hamis állítás
Elágazások: autójavítás ha (önindító megy) akkor { EllenőrizBenzin EllenőrizGyertya EllenőrizKarburátor } egyébként EllenőrizAkkumulátor EllenőrizGyujtófej Végrehajtódik, ha a feltétel igaz.
Elágazások: autójavítás ha (önindító megy) akkor { EllenőrizBenzin EllenőrizGyertya EllenőrizKarburátor } egyébként EllenőrizAkkumulátor EllenőrizGyujtófej Végrehajtódik, ha a feltétel hamis.
Elágazások: reciprok Feladat. Adjuk meg egy szám reciprokát. Példák: A 2 reciproka: 1/2 A -3/4 reciproka: 1/(-3/4) = -4/3 A 0 reciproka: “értelmetlen” Feladat. Adjuk meg egy szám reciprokát.
Elágazások: reciprok Feladat. Adjuk meg egy szám reciprokát. Algoritmus: beolvas Szám; if (Szám nem egyenlő 0) then { kiír 1/Szám; } else kiír „végtelen”; Feladat. Adjuk meg egy szám reciprokát.
Elágazások: reciprok Algoritmus: beolvas Szám; if (Szám nem egyenlő 0) then { kiír 1/Szám; } else kiír „végtelen”; A Szám egy változó amely értéke attól függ, hogy mit adnak be a program futásakor.
Elágazások: reciprok Algoritmus: Az elágazás függ Szám értékétől beolvas Szám; if (Szám nem egyenlő 0) then { kiír 1/Szám; } else kiír „végtelen”; Az elágazás függ Szám értékétől
Elágazások: reciprok Algoritmus: beolvas Szám; if (Szám nem egyenlő 0) then { kiír 1/Szám; } else kiír „végtelen”; Egy adott konkrét Szám esetén csak az egyik ág hajtódik végre
Elágazások: reciprok Algoritmus: beolvas Szám; if (Szám nem egyenlő 0) then { kiír 1/Szám; } else kiír „végtelen”; Végrehajtódik, ha Szám nem egyenlő 0-val
Elágazások: reciprok Algoritmus: Végrehajtódik, ha Szám egyenlő 0-val beolvas Szám; if (Szám nem egyenlő 0) then { kiír 1/Szám; } else kiír „végtelen”; Végrehajtódik, ha Szám egyenlő 0-val
Elágazások: feladat Algoritmus 1: Algoritmus 2: Ugyanazt a kimentet adja a két alábbi algoritmus? Algoritmus 1: Algoritmus 2: input Num; if (Num != 0) then { output 1/Num; } else output „végtelen”; input Num; if (Num != 0) then { output 1/Num; } output „végtelen” ;
Elágazások: összetett feltétel Mi van ha több feltételt kell kielégítteni? ha ( ma csütörtök van és 12:00 ) akkor { gyerünk az 160-as terembe } egyébként gyerünk moziba megoldás 1
Elágazások: összetett feltétel ha ( ma csütörtök van ) akkor { ha ( 12:00 ) gyerünk a 160-as terembe } egyébként …stb... “egymásba ágyazott” feltételek megoldás 2
Elágazások: legalább egyfeltétel Több feltétel közül elég ha egy teljesül ha ( éhes vagyok vagy elmúlt 11:00 óra vagy a padszomszédom szemet vetett az uzsonnámra ) akkor { Most megeszem az uzsonnát }
Az algoritmusok részei Változók és értékeik Utasítások, műveletek (primitív) Utsasítások sorozata Részfeladatok, szubrutinok (utasításokból állnak) Elágazások (különböző utasítások felé) Ismétlések (részfeladat) Dokumentáció (független az utasításoktól)
Ismétlések Ismételj egy utasítást... ...addig amíg egy feltétel fennáll Más néven iteráció vagy ciklus Példa: Randira hívás
Ismétlések szubrutin RandiraHívás ( név, időpont , hely ) { Felhív(név); Mond("Helló", név, „hogy vagy?"); Mond(„Eljössz velem", időpont, hely, "?"); VálasztHallgat( ); start könyörgések_száma nullától; amíg (a válasz "Nem" és könyörgések_száma < 100) { Mond(„Na, lécci!"); könyörgések_száma növelése 1-el; VálasztHallgat ( ); } }
Ismétlések A feltételt vizsgáljuk meg először szubrutin RandiraHívás ( név, időpont , hely ) { Felhív(név); Mond("Helló", név, „hogy vagy?"); Mond(„Eljössz velem", időpont, hely, "?"); VálasztHallgat( ); start könyörgések_száma nullától; amíg (a válasz "Nem" és könyörgések_száma < 100) { Mond(„Na, lécci!"); könyörgések_száma növelése 1-el; VálasztHallgat ( ); } } A feltételt vizsgáljuk meg először
Ismétlések Lehet, hogy nem is hajtódik végre szubrutin RandiraHívás ( név, időpont , hely ) { Felhív(név); Mond("Helló", név, „hogy vagy?"); Mond(„Eljössz velem", időpont, hely, "?"); VálasztHallgat( ); start könyörgések_száma nullától; amíg (a válasz "Nem" és könyörgések_száma < 100) { Mond(„Na, lécci!"); könyörgések_száma növelése 1-el; VálasztHallgat ( ); } } Lehet, hogy nem is hajtódik végre
Ismétlések A változók kezdteti értékét helyesen kell beállítani szubrutin RandiraHívás ( név, időpont , hely ) { Felhív(név); Mond("Helló", név, „hogy vagy?"); Mond(„Eljössz velem", időpont, hely, "?"); VálasztHallgat( ); start könyörgések_száma nullától; amíg (a válasz "Nem" és könyörgések_száma < 100) { Mond(„Na, lécci!"); könyörgések_száma növelése 1-el; VálasztHallgat ( ); } }
Ismétlések A feltételben használt változót frissíteni kell szubrutin RandiraHívás ( név, időpont , hely ) { Felhív(név); Mond("Helló", név, „hogy vagy?"); Mond(„Eljössz velem", időpont, hely, "?"); VálasztHallgat( ); start könyörgések_száma nullától; amíg (a válasz "Nem" és könyörgések_száma < 100) { Mond(„Na, lécci!"); könyörgések_száma növelése 1-el; VálasztHallgat ( ); } } A feltételben használt változót frissíteni kell
Ismétlések Végtelen ciklus Mi történik, ha nem frissítjük az értéket? szubrutin RandiraHívás ( név, időpont , hely ) { Felhív(név); Mond("Helló", név, „hogy vagy?"); Mond(„Eljössz velem", időpont, hely, "?"); VálasztHallgat( ); start könyörgések_száma nullától; amíg (a válasz "Nem" és könyörgések_száma < 100) { Mond(„Na, lécci!"); VálasztHallgat ( ); } } Végtelen ciklus
Az algoritmusok részei Változók és értékeik Utasítások, műveletek (primitív) Utsasítások sorozata Részfeladatok, szubrutinok (utasításokból állnak) Elágazások (különböző utasítások felé) Ismétlések (részfeladat) Dokumentáció (független az utasításoktól)
Dokumentáció Mi célt szolgál az algoritmus Hogyan csinálja meg Milyen paramétereket vár és ad vissza Milyen részei vannak, mi azok feladata
Fölülről lefelé tervezés Írjuk le a feladatot Osszuk fel 3-7 részre Minden részfeladatot osszunk 3-7 részre Addig osszuk tovább, amíg a részfeladat utasításai egyszerre jól átláthatóak, pl. elemi utasítások