Algoritmusok
Algoritmus fogalma Mi az algoritmus? Egy adott probléma megoldásának leírása elemi lépések sorozatával HF: Al Khwarizmi
Követelmények Véges: nem állhat végtelen sok lépésből Teljes: teljes megoldást ad a problémára Determinisztikus: ugyanolyan bemenő adatokkal ugyanazt az eredményt adja Egyértelmű: minden lépés után pontosan tudjuk, hol kell folytatni
Megadás módjai Szóban Folyamatábrával Struktogram-mal Mondatszerű leírással Sz.g. program (ez is algoritmus)
Folyamatábra vs. struktogram
Szekvenciális algoritmusok Egyszerű leírás, nincs elágazás, feltétel, stb. Pl.: Összeszerelési útmutató, kiürítési terv, stb. HF.: írjanak példát szekvenciális algoritmusokra! (csak példát, az algoritmust nem muszáj)
Vezérlési szerkezetek Szekvencia (sor) Szelekció (elágazás) Iteráció (ciklus) Böhm Jacopini sejtés (Mills tétel): Ezzel a 3 vezérlési szerkezettel minden strukturált program felírható (Ez a strukturált programozás alaptétele)
Teafőzés Vegyünk egy ibrik vizet Melegítsük Forró a víz? ha nem: vissza 2-ik pont Tegyünk egy csészébe teafiltert Öntsük rá a forró vizet Ízesítsük, és várjunk 5 percet Feladat: átkelés az úttesten
Változó használata Írjunk 10 egymást követő term. számok a képernyőre: Lehet szekvenciálisan: 10x írunk ki számot Lehet ciklussal: x legyen 0 írjuk ki x-et növeljük x-et 1-el Ha x<=9 vissza 2 stop
Feladat HF: MF208/19;26 Írjunk algoritmust: Bekér két számot, és kiírja, h melyik nagyobb Készítsük el az alg. folyamatábráját is!
Arduino Mikrokontroller, egy programozható chip Az Arduino nyílt bárki gyárthat Emulátorok: http://blog.oscarliang.net/arduino-simulator-free-virtu al-circuit-hardware/ http://simulator-for-arduino-free-version.updatestar.c om/hu
Egyszerű arduino algoritmus Led blinking: void loop() { digitalwrite(13, HIGH); // set the LED on delay(1000); // wait for a second digitalwrite(13, LOW); // set the LED off delay(1000); } // wait for a second
Változók Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai): Név Érték Típus Memóriacím A változó értéke (esetleg más attribútuma is) a program futása alatt változhat.
Változók Változó neve: ált.ban betűvel (angol abc) kezdődik, és betűvel vagy számmal, egyéb jelekkel folytatódhat. Pl.: X1, abc12, 3D -nem jó Értékadás: Értékadás bal oldalán a változó címét veszi figyelembe a program, jobb oldalon szereplő változó az értékét képviseli X=2; 2=X; X=Z; X = X + 1; változó címe = érték
Egyszerű arduino algoritmus Led blinking változókkal void loop() { Int lab = 13; // lab nevű változó Int ido = 1000; // ido nevű változó digitalwrite(lab, HIGH); delay(ido); digitalwrite(lab, LOW); delay(ido); }
Ciklusok Előírt lépésszámú ciklus: A ciklus kezdetekor meghatározható, hogy hányszor fut le a ciklus magja Pl.: számok 1-től 120-ig Feltételes ciklus Egy feltételtől függően áll meg Pl.: addig, amíg Entert nem ütnek
WHILE ciklus While (feltétel) { ciklusmag } A ciklus addig ismétlődik, amíg a feltétel igaz
Feladat: index algoritmus 2 ledet villogtatunk attól függően, hogy melyik lábon érkezik LOW jel Az áramkör fordított logikát használ: a lábakon állandóan HIGH jel érkezik, a lábat földelni (LOW) kell, ha zárni akarjuk a kört, vagy használjuk a következő kapcsolást:
Index algoritmus const int bal = 2; const int jobb = 3; const int led_bal = 10; const int led_jobb = 13; void setup() { pinmode(led1, OUTPUT); pinmode(led2, OUTPUT); pinmode(jobb, INPUT); pinmode(bal, INPUT); } void loop(){ while ( digitalread ( bal ) == LOW ) { digitalwrite(led_bal, HIGH); delay ( 200 ); digitalwrite(led_bal, LOW); delay ( 200 ); } // itt végződik a ciklus while ( digitalread ( jobb ) == LOW ) { digitalwrite(led_jobb, HIGH); delay ( 200 ); digitalwrite(led_jobb, LOW); delay ( 200 ); } // itt végződik a ciklus }
Ciklus részei Ciklusfej: ez határozza meg a feltételeket, kezdőértéket, stb. (a kerek zárójelek közötti rész) Ciklusmag: ez a programrészlet ismétlődik (a kapcsos zárójelek közötti rész) Ciklusváltozó: csak előírt lépésszámú ciklusnál van, ebben számoljuk a lépéseket minden ismétlődésnél változik
FOR ciklus (előírt lépésszámú) For (i=1; i<=10; i=i+1) { ciklusmag } i ciklusváltozó i=1 kezdőérték i<=10 amíg i kisebb v egyenlő, mint 10 i=i+1 lépésköz, i értékét egyesével növeljük
Rövid műveletek X = X + 1 X++ X += 1 X += Y Trükkös: Y = X++; Y = ++X;
Feladat: SOS jelzés void loop() { for (i=1; i<=3; i++){ digitalwrite(10, HIGH); // set the LED on delay(200); // wait digitalwrite(10, LOW); the LED off delay(200); } for (i=1; i<=3; i++){ // wait digitalwrite(10, HIGH); delay(600); // set digitalwrite(10, LOW); delay(600); } for (i=1; i<=3; i++){ digitalwrite(10, HIGH); delay(200); digitalwrite(10, LOW); delay(200); } deleay(1000); }
SOS áramkör
Feladat: Írjanak programot, ami a Morse abc alapján kicsipogja a saját nevüket! Készítsünk kő-papír-olló játékot: Véletlen számot generálunk 1-3-ig 1 csipogás: kő 2 csipogás: papír 3 csipogás: olló random(n) véletlen szám n-ig (nîn)
Dobókocka Hogyan változtassuk meg a kő-papír-olló programot (algoritmust), hogy elektronikus dobókocka legyen? Oldjuk meg, hogy a kockadobás gombnyomásra történjen!
Reflexidő Írjunk programot, ami megméri reakcióidőnket! Várunk 3-6 mp-ig véletlenszerűen Felkapcsolunk egy LED-et Számolunk addig, amíg a nyomógombot meg nem nyomják Eloltjuk a LED-et Kiírjuk az eredményt a képernyőre Megjegyzés: számolás helyett pontosabb eredményt kapunk, ha a millis(); függvényt használjuk.
Reakció idő mérő void loop() { delay( random (3000,6001) ); digitalwrite(10, HIGH); // set the LED on kezd = millis(); while ( digitalread ( nyomogomb ) == HIGH ) { // vár 3000-6000 msec } //amíg meg nem nyoják a gombot, nem csinálunk semmit Serial.print ( (millis()-kezd)/1000 ) //a mostani időből kivonjuk a kezdés idejét, és kiírjuk az eredményt }
Feladat -megszámlálás Készítsünk programot, ami minden 10-ik gombnyomásnál csipog egyet! A nyomógomb az 1-es, a hangszóró a 11-es lábon található.
Megszámlálás Void loop { szamlalo = 0; while ( szamlalo < 10 ){ if ( digitalread ( nyomogomb ) == HIGH ) { szamlalo++; } } //cillus vége //ide akkor jutunk, ha... tone(10,1000); delay(200); notone (10,1000) }//program vége
Megszámlálás tétele Megszámoljuk, hogy egy n elemű adathalmazban hány darab adott tulajdonságú elem létezik Algoritmus megszámlálás Darab = 0 Ciklus i=1-től n-ig Ha tulajdonság ( elem( i ) ) == igaz darab = darab +1 Ciklus vége Ki: darab Algoritmus vége
Összefoglalás