{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Software Entwicklung \n",
    "\n",
    "## Kapitel 2: Kontrollfluss\n",
    "\n",
    "Unter dem *Kontrollfluss* eines Programms versteht man die Reihenfolge der Abarbeitung der\n",
    "Programmbefehle."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 2.1 Sequenz \n",
    "Die einfachste Form eines Kontrollflusses ist die lineare sequenzielle Ausführung der Befehle\n",
    "in der Reihenfolge, wie sie auch im Programmcode stehen. Dies ist das \"normale\"\n",
    "Verhalten eines Python-Programms. Ein Zeilenumbruch schließt die Anweisung ab.\n",
    "\n",
    "![Sequenz](../img/Sequenz.png \"Sequenz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "print(\"Anweisung 1\")\n",
    "print(\"Anweisung 2\")\n",
    "print(\"Anweisung 3\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 2.2 Bedingte Anweisung \n",
    "Gelegentlich ist es notwendig, die Abarbeitungsreihenfolge zu variieren. Im einfachsten\n",
    "Fall sind eine oder mehrere Anweisungen nur auszuführen, wenn eine *Bedingung* erfüllt ist.\n",
    "\n",
    "![Bedingte Anweisung](../img/Bedingung.png \"Bedingte Anweisung\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Eine bedingte Anweisung wird in Python mit dem Schlüsselwort <code>if</code> eingeleitet. Danach folgt ein\n",
    "Ausdruck, der zu einem booleschen Wert evaluiert. Das kann z.B. ein Vergleich sein\n",
    "oder auch eine Variable mit einem Boolean-Wert."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 2\n",
    "c = (a < b)\n",
    "print(\"Anweisung\", c)\n",
    "if c:\n",
    "    print(\"Optionale Anweisung\")\n",
    "    print(\"Optionale Anweisung\")\n",
    "print(\"Anweisung\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Die optionale Anweisung folgt nach einem Doppelpunkt. Soll mehr als eine Anweisung optional ausgeführt werden,\n",
    "so müssen diese eingrückt ab der nachfolgenden Zeile aufgeführt werden. Leerzeichen haben in Python also eine\n",
    "Bedeutung!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 2\n",
    "print(\"Anweisung 1\")\n",
    "if a <= b:\n",
    "    print(\"Anweisung 2\")\n",
    "    if a == b:\n",
    "        print(\"Anweisung 3\")\n",
    "    print(\"Anweisung 4\")\n",
    "print(\"Anweisung 5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 2.3 Verzweigung \n",
    "\n",
    "Soll nicht nur bei der Erfüllung eine Bedingung optionaler Code ausgeführt werden, sondern auch bei der \n",
    "Nichterfüllung, so spricht man von einer *Verzweigung*.\n",
    "\n",
    "![Verzweigung](../img/Verzweigung.png \"Verzweigung\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Die Alternative, die ausgeführt wird, wenn die Bedingung nicht zutrifft, wird mit dem Schlüsselwort \n",
    "<code>else</code> ergänzt. Auch hier folgt ein Doppelpunkt und die auszuführenden Anweisungen\n",
    "werden eingerückt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 5\n",
    "print(\"Anweisung\")\n",
    "if a < b:\n",
    "    print(\"Optionale Anweisung 1\")\n",
    "else:\n",
    "    print(\"Optionale Anweisung 2\")\n",
    "print(\"Anweisung\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 2.4 Mehrfachverzweigung \n",
    "\n",
    "Existieren mehr als zwei Alternativen, spricht man von einer *Mehrfachverzweigung*.\n",
    "\n",
    "![Mehrfachverzweigung](../img/Mehrfach.png \"Mehrfachverzweigung\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Sollen mehrere Bedingungen überprüft werden, so können diese mit einer oder mehreren <code>elif</code>-Blöcken \n",
    "ergänzt werden. Ein evtl. vorhandener <code>else</code>-Block wird ausgeführt, wenn keine der Alternativen \n",
    "zum Zug gekommen ist."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "a = 5\n",
    "b = 2\n",
    "print(\"Anweisung\")\n",
    "if a < b:\n",
    "    print(\"Optionale Anweisung 1\")\n",
    "elif a > b:\n",
    "    print(\"Optionale Anweisung 2\")\n",
    "else:\n",
    "    print(\"Optionale Anweisung 3\")    \n",
    "print(\"Anweisung\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 2.5 If-Ausdruck\n",
    "\n",
    "Bei einem *If-Ausdruck* ist das Ergebnis von einer Bedingung abhängig. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 2\n",
    "\n",
    "min = a if a < b else b\n",
    "print(min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Die Anweisung unmittelbar vor dem <code>if</code> wird nur ausgeführt, wenn die Bedingung erfüllt ist. Die Anweisung \n",
    "nach dem <code>else</code> wird ausgeführt, falls die Bedingung nicht erfüllt ist. Der <code>else</code>-Zweig\n",
    "ist bei diesem Konstrukt verpflichtend. Insgesamt entspricht das Ergebnis des Ausdrucks dem Wert der ausgeführten Operation.\n",
    " "
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.9"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "metadata": {
     "collapsed": false
    },
    "source": []
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
