{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Cvičení č. 6 rozšířené o poznámky ze cvičení a řešení některých příkladů (ZS 2026/27)\n",
    "### V minulém díle jste viděli..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Příkaz `if`\n",
    "\n",
    "Příkaz `if` umožňuje vytvořit blok příkazů, které se provedou, pouze pokud je splněna určitá podmínka.\n",
    "Příkaz `if` můžeme rozšířit o další větve – libovolný počet příkazů `elif` umožňuje ověřovat dodatečné podmínky a poslední větev `else` se provede, pokud není splněna žádná z předchozích podmínek:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "číslo se rovná 0\n"
     ]
    }
   ],
   "source": [
    "a = 0\n",
    "if a > 0:\n",
    "    print(\"číslo je kladné\")\n",
    "    print(\"číslo se rovná\", a)\n",
    "elif a == 0:\n",
    "    print(\"číslo se rovná 0\")\n",
    "else:\n",
    "    print(\"číslo není kladné\")\n",
    "    print(\"číslo se rovná\", a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Příkaz `while`\n",
    "\n",
    "Příkaz `while` umožňuje opakovat skupinu příkazů, dokud je splněna vstupní podmínka:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n",
      "10\n"
     ]
    }
   ],
   "source": [
    "n = 0\n",
    "while n <= 10:\n",
    "    print(n)\n",
    "    n += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Příkaz `for`\n",
    "\n",
    "Příkaz `for` umožňuje opakovat skupinu příkazů pro předem známou sadu hodnot:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n",
      "10\n"
     ]
    }
   ],
   "source": [
    "for n in range(11):\n",
    "    print(n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Podrobnosti k používání podmínek a cyklů"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Podmíněný výraz\n",
    "\n",
    "Pokud v programu potřebujeme spočítat nějakou hodnotu, která závisí na vyhodnocení nějaké podmínky, můžeme použít buď podmíněný příkaz:\n",
    "```python\n",
    "if nějaká_podmínka:\n",
    "    hodnota = výraz1\n",
    "else:\n",
    "    hodnota = výraz2\n",
    "```\n",
    "nebo můžeme použít _podmíněný výraz_, což je ternární operace ve tvaru:\n",
    "```python\n",
    "hodnota = výraz1 if nějaká_podmínka else výraz2\n",
    "```\n",
    "\n",
    "Podmíněný výraz lze samozřejmě použít všude tam, kde je očekáván nějaký výraz.\n",
    "Může být tedy součástí komplikovanějších aritmetických výrazů a dokonce můžete psát vnořené podmíněné výrazy, čímž se ale značně zhoršuje přehlednost kódu."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n"
     ]
    }
   ],
   "source": [
    "# už umíme:\n",
    "x = -10\n",
    "if x < 0:\n",
    "    abs_hodnota = -x\n",
    "else:\n",
    "    abs_hodnota = x\n",
    "    \n",
    "print(abs_hodnota)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n"
     ]
    }
   ],
   "source": [
    "# to samé, ale pomocí podmíněného výrazu:\n",
    "x = -10\n",
    "abs_hodnota = -x if x < 0 else x\n",
    "    \n",
    "print(abs_hodnota)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nejsi plnolety\n"
     ]
    }
   ],
   "source": [
    "# už umíme:\n",
    "vek = 20\n",
    "if vek >= 18:\n",
    "    print(\"jsi plnolety\")\n",
    "else:\n",
    "    print(\"nejsi plnolety\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nejsi plnolety\n"
     ]
    }
   ],
   "source": [
    "# to samé, ale pomocí podmíněného výrazu:\n",
    "vek = 15\n",
    "print(\"jsi plnolety\") if vek >= 18 else print(\"nejsi plnolety\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Příkazy `break` a `continue`\n",
    "\n",
    "Příkazy `break` a `continue` slouží pro podrobnější kontrolu provádění cyklů.\n",
    "Zatímco příkaz `break` ukončí provádění celého cyklu, příkaz `continue` způsobí přerušení pouze aktuální iterace a přejde na vyhodnocování vstupní podmínky.\n",
    "Oba příkazy lze použít uvnitř cyklu `while` i uvnitř cyklu `for`.\n",
    "\n",
    "__Příklad:__ následující program vypisuje čísla větší než 100, která nejsou sudá a skončí, jakmile se vypíše první číslo dělitelné 7:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101\n",
      "103\n",
      "105\n"
     ]
    }
   ],
   "source": [
    "n = 100\n",
    "while True:\n",
    "    # pokud je číslo sudé, přejdeme na další iteraci\n",
    "    if n % 2 == 0:\n",
    "        n += 1\n",
    "        continue\n",
    "\n",
    "    # vypíšeme číslo\n",
    "    print(n)\n",
    "\n",
    "    # pokud jsme vypsali číslo dělitelné 7, ukončíme cyklus\n",
    "    if n % 7 == 0:\n",
    "        break\n",
    "\n",
    "    n += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div style=\"border-left: 5px solid green; padding-left: 1em\">\n",
    "<p><strong>Tip:</strong>\n",
    "Kliknutím na tlačítko <strong>pytutor</strong> v rozhraní JupyterLab se zobrazí grafická interpretace toho, co se v programu děje.</p>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Příklady"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Kvadratická rovnice\n",
    "\n",
    "Napište program pro vyřešení kvadratické rovnice $ax^2 + bx + c = 0$, kde čísla $a,b,c$ jsou reálné parametry.\n",
    "Pozor na případy $a = 0$, $b = 0$, a $c = 0$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dva realne koreny\n",
      "koreny: 3.0 2.0\n"
     ]
    }
   ],
   "source": [
    "# vstupní data - zadá uživatel\n",
    "a = 1\n",
    "b = -5\n",
    "c = 6\n",
    "\n",
    "# řešení úlohy - musí fungovat pro libovolné vstupní hodnoty\n",
    "if a == 0:\n",
    "    print(\"Je to linearni rovnice\")\n",
    "    x = -c / b\n",
    "    print(\"koren:\", x)\n",
    "else:\n",
    "    d = b ** 2 - 4 * a * c\n",
    "    if d > 0:\n",
    "        print(\"dva realne koreny\")\n",
    "        x1 = (- b + d ** 0.5) / (2 * a)\n",
    "        x2 = (- b - d ** 0.5) / (2 * a)\n",
    "        print(\"koreny:\", x1, x2)\n",
    "    elif d < 0:\n",
    "        print(\"dva komplexni koreny\")\n",
    "        x1 = (- b + d ** 0.5) / (2 * a)\n",
    "        x2 = (- b - d ** 0.5) / (2 * a)\n",
    "        print(\"koreny:\", x1, x2)\n",
    "    else:\n",
    "        print(\"jeden dvojnasobny koren\")\n",
    "        x = -b / (2 * a)\n",
    "        print(\"koren:\", x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. BMI podruhé\n",
    "\n",
    "Napište program, který spočítá BMI uživatele a vypíše, zda má nadváhu, podváhu nebo normální váhu (normální váze odpovídá BMI mezi 18.5 a 25).\n",
    "Dále program napíše uživateli, jaké je jeho rozmezí optimální hmotnosti."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Jaká je tvoje hmotnost (v kg): 80\n",
      "Jaká je tvoje výška (v cm): 180\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tvé bmi je 24.691358024691358\n",
      "Tvoje váha je optimální.\n"
     ]
    }
   ],
   "source": [
    "m = float(input(\"Jaká je tvoje hmotnost (v kg):\"))\n",
    "v = float(input(\"Jaká je tvoje výška (v cm):\"))\n",
    "v /= 100\n",
    "bmi = m / (v ** 2)\n",
    "print(\"Tvé bmi je\", bmi)\n",
    "\n",
    "if (bmi < 18.5):\n",
    "    print (\"Máš podváhu.\")\n",
    "elif (bmi > 25):\n",
    "    print(\"Máš nadváhu.\")\n",
    "else:\n",
    "    print(\"Tvoje váha je optimální.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Ověření prvočíselnosti\n",
    "\n",
    "Napište program, který ověří, jestli je vstupní celé číslo $n$ prvočíslo nebo ne."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "zadej cislo 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 je prvocislo\n"
     ]
    }
   ],
   "source": [
    "n = int(input(\"zadej cislo\"))\n",
    "je_prvocislo = True\n",
    "if n <= 1:\n",
    "    je_prvocislo = False\n",
    "else:\n",
    "    for d in range(2, n):\n",
    "        if n % d == 0:\n",
    "            je_prvocislo = False\n",
    "            break\n",
    "            \n",
    "if je_prvocislo:\n",
    "    print(n, \"je prvocislo\")\n",
    "else:\n",
    "    print(n, \"neni prvocislo\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "zadej cislo 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 je prvocislo\n"
     ]
    }
   ],
   "source": [
    "n = int(input(\"zadej cislo\"))\n",
    "je_prvocislo = True\n",
    "if n <= 1:\n",
    "    je_prvocislo = False\n",
    "else:\n",
    "    for d in range(2, int(n ** 0.5)+1):\n",
    "        if n % d == 0:\n",
    "            je_prvocislo = False\n",
    "            break\n",
    "            \n",
    "if je_prvocislo:\n",
    "    print(n, \"je prvočíslo.\")\n",
    "else:\n",
    "    print(n, \"není prvočíslo.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Ciferný součet\n",
    "\n",
    "Napište program, který sečte jednotlivé cifry zadaného celého kladného celého čísla."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Collatzova posloupnost\n",
    "\n",
    "Napište program, který vypíše [Collatzovu posloupnost](https://cs.wikipedia.org/wiki/Collatz%C5%AFv_probl%C3%A9m) (do dosažení hodnoty 1) pro dané počáteční přirozené číslo $n$.\n",
    "\n",
    "Collatzova posloupnost: vezmeme celé kladné číslo $n$. Pokud je $n$ sudé, vydělíme ho dvěma, pokud je $n$ liché, vynásobíme ho třemi a přičteme jedničku, postup opakujeme.\n",
    "\n",
    "Hypotéza je, že posloupnost pro každé přirozené $n$ nakonec dojde k číslu 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6. Prvočíselný rozklad\n",
    "\n",
    "Napište program, který vypíše prvočíselný rozklad přirozeného čísla $n$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7. Největší společný dělitel (NSD)\n",
    "\n",
    "Napište program, který najde největšího společného dělitele dvou čísel zadaných uživatelem pomocí [Euklidova algoritmu](https://cs.wikipedia.org/wiki/Eukleid%C5%AFv_algoritmus)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "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.14.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
