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);
❑
digitalWrite(13, LOW); // set the LED off
❑
delay(1000);
❑
}
// wait for a second // 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;
❑
Int ido = 1000; // ido nevű változó
❑
digitalWrite(lab, HIGH);
❑
delay(ido);
❑
digitalWrite(lab, LOW);
❑
delay(ido);
❑
}
// lab nevű változó
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;
❑
digitalWrite(led_bal, HIGH);
❑
const int jobb = 3;
❑
delay ( 200 );
❑
const int led_bal = 10;
❑
digitalWrite(led_bal, LOW);
❑
const int led_jobb = 13;
❑
delay ( 200 );
❑
void setup() {
❑
❑
pinMode(led1, OUTPUT);
❑
pinMode(led2, OUTPUT);
❑
pinMode(jobb, INPUT);
❑
pinMode(bal, INPUT);
❑
}
❑
void loop(){
❑
❑
while ( digitalRead ( bal ) == LOW ) {
❑
} // 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++){
// set
// wait
❑
digitalWrite(10, LOW);
❑
delay(600);
❑
}
❑
for (i=1; i<=3; i++){
❑
digitalWrite(10, HIGH);
❑
delay(200);
❑
digitalWrite(10, LOW);
❑
delay(200);
❑
}
❑
digitalWrite(10, HIGH);
❑
deleay(1000);
❑
delay(600);
❑
}
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