{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Software Entwicklung \n",
    "\n",
    "## Kapitel 2: Kontrollfluss\n",
    "\n",
    "### 2.7 Algorithmus\n",
    "\n",
    "Ein Algorithmus ist\n",
    "\n",
    "- eine *endliche Folge* von Regeln (*Finitheit*),\n",
    "- nach denen sich nach *endlich vielen* (*Terminiertheit*),\n",
    "- *eindeutig festgelegten* Schritten (*Determiniertheit*)\n",
    "- die Lösung einer *Klasse von Problemen* ergibt (*Allgemeingültigkeit*)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Für die Darstellung eines Algorithmus können Visualisierungen verwendet werden. Nachfolgend \n",
    "ist der Euklid'sche Algorithmus zur Berechnung des größten gemeinsamen Teilers (ggT) zweier Zahlen\n",
    "als UML Aktivitätsdiagramm dargestellt: \n",
    "\n",
    "![Aktivitätsdiagramm GGT](../img/ggtuml.png \"GGT-Berechnung als Aktivitätsdiagramm\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Der gleiche Algorithmus kann aber auch in Form eines Struktogramms visualisiert werden:\n",
    "\n",
    "![Aktivitätsdiagramm GGT](../img/ggtstruct.png \"GGT-Berechnung als Aktivitätsdiagramm\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Sehr gebräuchlich ist mittlerweile die Verwendung von Pseudocode. Es gibt viele Varianten für Pseudocode. Meist einigt man sich innerhalb einer Organisation auf eine einheitliche Syntax. Zudem gibt es in der Literatur viele Syntax-Vorschläge.\n",
    "\n",
    "    Eingabe a, b\n",
    "    Falls a=0\n",
    "        Ausgabe a\n",
    "     Sonst\n",
    "        Solange b != 0\n",
    "            Falls a > b\n",
    "                a := a - b\n",
    "            Sonst\n",
    "                b := b - a\n",
    "        Ausgabe a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Die Lösungsidee für ein Problem wird also unabhängig von einer Programmiersprache in\n",
    "Form eines Algorithmus entwickelt. Die anschließende Formulierung eines Algorithmus in einer \n",
    "Programmiersprache ist dann eine relativ einfache Übertragungsaufgabe."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "a = int(input(\"a eingeben:\"))\n",
    "b = int(input(\"b eingeben:\"))\n",
    "\n",
    "if a==0:\n",
    "    print(b)\n",
    "else:\n",
    "    while b>0:\n",
    "        if a>b:\n",
    "            a=a-b\n",
    "        else:\n",
    "            b=b-a\n",
    "    print(a)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 2.8 Berechenbarkeit\n",
    "\n",
    "In der *theoretischen Informatik* wurden verschiedene \n",
    "Modelle für die Beschreibung von Rechenmaschinen entwickelt. Es wurde bewiesen,\n",
    "dass viele Modelle gleichwertig zur \n",
    "sog. __[Turing-Maschine](https://de.wikipedia.org/wiki/Turingmaschine)__ sind, \n",
    "d.h. mit diesen Modellen die gleichen Berechnungen ausgeführt werden können bzw. es keine \n",
    "Berechnungsvorschrift gibt, die nur mit einem Modell, nicht aber mit dem anderen ausführbar ist.\n",
    "\n",
    "Zudem geht man davon aus, dass alle relevanten Algorithmen zur Klasse der von Turing-Maschinen berechenbaren \n",
    "Algorithmen gehören (__[Churchsche These](https://de.wikipedia.org/wiki/Church-Turing-These)__).\n",
    "\n",
    "Mit den Bausteinen *Sequenz*, *Bedingte Anweisung* und *Schleife* sowie *Variablenzuweisung* liefert Python ein Modell, \n",
    "von dem bewiesen wurde, dass es äquivalent zur Turing-Maschine ist. Oder anders ausgedrückt: alle weiteren \n",
    "Sprachelemente dienen lediglich der besseren Verständlichkeit und leichteren Wartbarkeit von Python-Code,\n",
    "erweitern aber nicht die Möglichkeiten der Berechenbarkeit.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\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
}
