{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Alapvető vezérlési utasítások a programozásban

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# If\n", "\n", "\n", "\n", "Ha azt szeretnénk, hogy valami akkor történjen, ha megfelel vagy épp nem felel meg valamilyen feltételnek (valami egyenlő-e valamivel, nagyobb-e, ...) akkor feltétel vizsgálatot kell végezni és az eredmény szerinti feladatot elvégezni.\n", "\n", "Például, ha gyököt akarunk vonni egy beadott számból szükséges lehet ilyen vizsgálat. Ugyanis ha pozitív a szám semmi gond, ha viszont negatív, akkor ezt kezelni kell, mondjuk szorozzuk meg -1-el. \n", "\n", "Ez a kérdés magyarul hogy is szól: Ha a szám nagyobb (vagy egyenlő) mint 0 akkor vonjunk gyököt, ha pedig nem akkor szorozzuk meg mínusz eggyel és utána vonjunk gyököt belőle. Lehet érzeni a mondatban, mit mikor kell elvégezni." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ennek a műveleteknek az elvégzésére több paranccsal is alkalmas, de a leggyakoribb az `if-else` parancs. Ez lényegében egy elágazás, ami azt teszik, hogy ha igaz az állítás, akkor megcsinál valamit, ha meg hamis, akkor mást.\n", "\n", "Szerkezete:\n", "\n", "```python\n", "if (feltétel vizsgálat):\n", " utasítás1\n", "else:\n", " utasítás2\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Megjegyzés: Nem kötelező mindkét ágban utasítást adni, ilyenkor csakis a feltétel teljesülésekor hajtódik végre utasítás. \n", "\n", ">Tehát a következő parancs is értelmes:\n", "\n", ">```python\n", "if \"élet értelme\" == 42:\n", " print(\"Naná\") # És itt nem adunk meg else ágat\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Példák" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "var1 = 100\n", "if var1:\n", " print(\"A változónak van értéke\")\n", " print(var1)\n", "else:\n", " print(\"A változónak nincs értéke\")\n", " print(var1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "var1 = \"cica\"\n", "if var1:\n", " print(\"A változónak van értéke\")\n", " print(var1)\n", "else:\n", " print(\"A változónak nincs értéke\")\n", " print(var1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "var1 = \"\"\n", "if var1:\n", " print(\"A változónak van értéke\")\n", " print(var1)\n", "else:\n", " print(\"A változónak nincs értéke\")\n", " print(var1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Adjunk magyarázatot a kovetkezőre:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "var1 = 0\n", "if var1:\n", " print(\"A változónak van értéke\")\n", " print(var1)\n", "else:\n", " print(\"A változónak nincs értéke\")\n", " print(var1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Többszörös elágazások (`if-elif-else`)\n", "\n", "Az elágazások egymásba fűzhetőek két módon. Vagy egy már nyitott elágazásban helyezünk el újabb elágazást, vagy többszörös feltételvizsgálatot végzünk az elágazásunkon. Lássuk most az első esetet:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "szam=int(input(\"Kérem adjon meg egy egész számot:\"))\n", "\n", "if szam > 0:\n", " if szam%2 == 0:\n", " print(\"A megadott szám páros pozitív\")\n", " else: \n", " print(\"A megadott szám páratlan pozitív\")\n", "else: \n", " if szam%2 == 0:\n", " print(\"A megadott szám páros negatív\")\n", " else: \n", " print(\"A megadott szám páratlan negatív\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ha nem egymásba akarunk teljesen eltérő feltételeket vizsgálni, hanem összefüggően, több feltételt külön-külön vizsgálni (több elágazásunk van), akkor használjuk az `if-elif-else` szerkezetet:\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "szam=float(input(\"Kérem adjon meg egy számot:\"))\n", "\n", "if szam == 0:\n", " print(\"nulla\")\n", "elif szam > 0:\n", " print(\"pozitív\")\n", "else:\n", " print(\"negatív\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Megjegyzés: Törekedjünk a lehető legkevesebb új elágazás használatára. Mivel a sok elágazás átláthatatlanná teszi a program működését. Azaz szerencsésebb az `if-elif-else` használata, mint sok önálló `if-else`.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Oldjuk meg együtt\n", "\n", "Írjunk egy if tömböt amely a nap és az óra valtozók megadott értékei alapján eldönti, hogy épp az adott időben a diák mit csinál. Az if tömb válasza az alábbiak szerint osztandó ki:\n", "- A fiúk is és a lányok is hétköznap délelőtt tanulnak.\n", "- 12-től fociznak.\n", "- Hétvégén mindenki kirándul.\n", "- Mindennap mindenki 8-kor megy aludni, és reggel 8 kor kel." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Megoldás helye" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# For\n", "\n", "A számítógépek legfontosabb tulajdonságai közt szerepel az, hogy nagyon gyorsak és \"fáradhatatlanok\". Olyan feladatok megoldásában a leghatékonyabbak, amikor a feladatot kevés munkával meg lehet fogalmazni (\"az alkotó pihen\") de végrehajtása nagyon sok ismétlést, iterációt igényel (\"a gép forog\"). Az iteráció (angol: iterate) azt jelenti, hogy például egy lista elemein egyesével végigmegy a program, és műveleteket végez el rajtuk. \n", "\n", "\n", "\n", "A Python-ban, az egyik erre használható utasítás a **for** parancs (magyarul kb. a ...-ra, azaz pl. a hét minden napjára, a lista minden elemére):\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "days_of_the_week = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for day in days_of_the_week:\n", " print(day)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ez a kódrészlet a **days_of_the_week** listán megy végig és a meglátogatott elemet hozzárendeli a **day** változóhoz, amit *ciklusváltozónak* is neveznek. Ezek után mindent végrehajt amit a beljebb tabulált (angolul: *indented*) parancsblokkban írtunk (most csak egy **print** utasítás), amihez felhasználhatja a ciklusváltozót is. Miután vége a beljebb tabulált régiónak, kilép a ciklusból.\n", "\n", "Szinte minden programnyelv használ hasonló ciklusokat. A C, C++, Java nyelvekben kapcsos zárójeleket {} használnak a ciklusok elkülönítésére, kb. így: \n", "\n", "`for (i=1..10) {print i}` \n", "\n", "A FORTRAN nyelvben az *END* szócska kiírása jelzi a ciklus végét. A pythonban a kettőspont (\":\"), majd szóközökkel beljebb írt sorok szolgálnak erre. Ha más programokból másolunk át részleteket figyeljünk arra hogy a behúzás helyett nem TAB-ot használ. (A TAB néhol megengedett de kerülendő. A modern [python kódolási stílusirányzat](http://django.arek.uni-obuda.hu/python3-doc/html/tutorial/controlflow.html#intermezzo-kodolasi-stilus) minden behúzást 4 szóköznek javasol.) \n", "\n", "Annak semmi jelentősége nincs, hogy a példában a **day** nevet adtunk az iterációban szereplő *ciklusváltozó*nak. A program semmit se tud az emberi időszámításról, például, hogy a hétben napok vannak és nem kiscicák:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for macska in days_of_the_week:\n", " print(macska)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A ciklus utasításblokkja állhat több utasításból is:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A **range()** parancs remekül használható ha a **for** ciklusban adott számú műveletet szeretnénk elvégezni:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i in range(20):\n", " print(\"The square of \",i,\" is \",i*i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Akkor válik mindez még érdekesebbé, ha az eddig tanult iterációt és feltétel vizsgálatot kombináljuk:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)\n", " if day == \"Sunday\":\n", " print (\" Sleep in\")\n", " elif day == \"Saturday\":\n", " print (\" Do chores\")\n", " else:\n", " print (\" Go to work\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Figyeljük meg a fenti példában hogy ágyazódik egymás alá a **for** és az **if**! " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Egy példa program: Fibbonacci sorozat\n", "\n", "A [Fibonacci](http://en.wikipedia.org/wiki/Fibonacci_number) sorozat első két eleme 0 és 1, majd a következő elemet mindig az előző kettő összegéből számoljuk ki: 0,1,1,2,3,5,8,13,21,34,55,89,...\n", "\n", "Ha nagyobb **n** értékekre is ki akarjuk számolni a sorozatot, ez kiváló feladat lehet egy fáradhatatlan és gyors számítógépnek!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "n=int(input(\"Adjon meg egy egész számot:\")) #Bekér a program egy számot (ennyi tagú lesz a sorozat)\n", "\n", "if n<0: # Megvizsgáljuk, hogy nem-e negatív számot adott-e meg a felhasználó\n", " print(\"Negatív számot adott meg, megszorzom -1-gyel.\\n\")\n", " n=n*(-1)\n", "\n", "sequence = [0,1] # A két kezdőérték\n", "for i in range(2,n): # számok 2-től n-ig, Figyelni kell hogy n ne legyen kisebb mint 2!!\n", " sequence.append(sequence[i-1]+sequence[i-2]) # Így számoljuk a következő tagot\n", "print (sequence)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nézzük végig lépésről lépésre! Először **n** értékét, azaz a kiszámolandó sorozat hosszát állítjuk be 10-re. A sorozatot majdan tároló listát **sequence**-nek neveztük el, és *inicializáltuk* az első két értékkel. A \"kézi munka\" után következhet a gép automatikus munkája, az iteráció.\n", "\n", "Az iterációt 2-vel kezdjük (ez ugye a 0-s indexelés miatt a 3. elem lesz, hisz az első kettőt már mi megadtuk) és **n**-ig, a megadott lista méretig számolunk. \n", "\n", "A ciklus törzsében az addig kiszámolt lista végére hozzátűzzük (**append**) az előző két tag összegét. A ciklus vége után kiíratjuk az eredményt." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dat=[];\n", "for i in range(10):\n", " dat.append(i**2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dat" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" }, "latex_envs": { "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 0 }, "nav_menu": {}, "toc": { "navigate_menu": true, "number_sections": false, "sideBar": true, "threshold": 6, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 0 }