{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# IN1000 - Seminartime uke 4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Stikkord for timen\n",
    "\n",
    "* While-løkker\n",
    "* for-løkker med teller\n",
    "* for-løkker på lister. \n",
    "* Prosedyrer med parametre. \n",
    "* Funksjoner. \n",
    "\n",
    "Spørsmål?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# While-løkke\n",
    "\n",
    "En løkke inneholder en kodeblokk som man ønsker at skal gjentas en rekke ganger. For eksempel, ønsker man å skrive ut alle tall fra 0 til 5.q\n",
    "\tKan løses ved å skrive print(1), print(2), osv… \n",
    "    \n",
    "MEN; hva hvis man vil skrive ut alle tall fra 0 til X, hvor X er ukjent og/eller kan forandre seg. Da kan det være fint med en løkke:\n",
    "Syntaks:\n",
    "```python3\n",
    "while <uttrykk er sant> :\n",
    "\t<gjør dette>\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "x = 5  # kan også endre slik at x er input fra bruker\n",
    "i = 0   # i er telleren vår, veldig vanlig å bruke variabelnavnet i for teller i løkker. \n",
    "\n",
    "while i < x :     \t# kan leses som “så lenge i er mindre enn 5”\n",
    " print(i)           # skriver ut telleren vår\n",
    " i = i + 1\t# deretter øker vi variabelen i med 1\n",
    "          #  kan alternativt skrives som i += 1\n",
    " # så gjentas løkken"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "Kjør denne gjerne i [pythontutor](http://www.pythontutor.com/visualize.html#code=x%20%3D%205%20%20%23%20kan%20ogs%C3%A5%20endre%20slik%20at%20x%20er%20input%20fra%20bruker%0Ai%20%3D%200%20%20%20%23%20i%20er%20telleren%20v%C3%A5r,%20veldig%20vanlig%20%C3%A5%20bruke%20variabelnavnet%20i%20for%20teller%20i%20l%C3%B8kker.%20%0A%0Awhile%20i%20%3C%20x%20%3A%20%20%20%20%20%20%20%20%20%23%20kan%20leses%20som%20%E2%80%9Cs%C3%A5%20lenge%20i%20er%20mindre%20enn%205%E2%80%9D%0A%20print%28i%29%20%20%20%20%20%20%20%20%20%20%20%23%20skriver%20ut%20telleren%20v%C3%A5r%0A%20i%20%3D%20i%20%2B%201%20%20%20%20%23%20deretter%20%C3%B8ker%20vi%20variabelen%20i%20med%201%0A%20%20%20%20%20%20%20%20%20%20%23%20%20kan%20alternativt%20skrives%20som%20i%20%2B%3D%201%0A%20%23%20s%C3%A5%20gjentas%20l%C3%B8kken&cumulative=false&heapPrimitives=nevernest&mode=edit&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) \t"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "* Det boolske uttrykket i en while-løkke må være modifiserbart, dvs. at det blir evaluert til false på et eller anenet tidpunkt, ellers så vil vi havne i en evig løkke.\n",
    "* Nyttig bruk for while-løkke er for eksempel en kommandoløkke, der man ikke avslutter før brukeren taster inn en spesifikk kommando."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Oppgave 1\n",
    "\n",
    "Hva blir skrevet ut?\n",
    "```python\n",
    "x = 3\n",
    "\n",
    "while x < 10:\n",
    " x += 1\n",
    "\n",
    "print(x)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# bruk også pythontutor\n",
    "x = 3\n",
    "\n",
    "while x < 10:\n",
    " x += 1\n",
    "\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "Etter dere har gjort oppgaven kan den kjøres i [pythontutor](http://www.pythontutor.com/visualize.html#code=x%20%3D%203%0A%0Awhile%20x%20%3C%2010%3A%0A%20x%20%2B%3D%201%0A%0Aprint%28x%29&cumulative=false&heapPrimitives=nevernest&mode=edit&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Oppgave 3\n",
    "\n",
    "Hva tror du skrives ut på skjermen av programmet under? Diskuter med gruppen.\n",
    "\n",
    "```python\n",
    "tekst = [\"hadet\", \"på\", \"badet\", \"din\", \"gamle\", \"sjokolade\"]\n",
    "indeks = 0\n",
    " \n",
    "while indeks < len(tekst):\n",
    "   print(tekst[indeks])\n",
    "   indeks += 2\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "tekst = [\"hadet\", \"på\", \"badet\", \"din\", \"gamle\", \"sjokolade\"]\n",
    "indeks = 0\n",
    " \n",
    "while indeks < len(tekst):\n",
    "   print(tekst[indeks])\n",
    "   indeks += 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# For-løkker\n",
    "\n",
    "```python\n",
    "for i in range(tall)   \t\t\t # hvor hver i fra 0 til tall. \n",
    "for i in range(start, slutt)\t\t# i vil ha startverdi start og slutte på slutt. \n",
    "for i in range (start, slutt, oekning) # i vil ha startverdi start, slutte på slutt og øke med oekning.\n",
    "\t\n",
    "     \n",
    "Variablen i trenger ikke å være definert på forhånd.\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# for i in range(tall) \n",
    "\n",
    "# Feks. for i in range(4)\t# vil gå fra 0 til 4 (NB! Ikke til og med), fao 0 tom. 3.\n",
    "for i in range(4):\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# for i in range(start, slutt)\n",
    "# i vil starte som 2 og gå til 5/tom. 4.\n",
    "for i in range(2, 5): \n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# for i in range (start, slutt, oekning)\n",
    "# i vil starte som 2, øke med 3 for hver runde helt frem til i er større enn 15 (eller lik 15), da slutter den.\n",
    "\n",
    "# Dvs: 2, 5, 8, 12, 15 > løkken kjøres ikke mer. \n",
    "for i in range(2, 15, 3):\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Så hva er forskjellen på for og while? Når bruker man hva?\n",
    "\n",
    "* **For** brukes gjerne når man vet hvor mange ganger noe skjer.\n",
    "* **While** kan gjerne brukes når man ikke vet hvor mange ganger noe skal skje, men feks. Hvis man vil lagre et ukjent antall verdier en bruker taster helt til brukeren taster 0, da er det fordelaktig å bruke while. \n",
    "\n",
    "* Ofte kan man likevel velge hva man ønsker\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Oppgave 4\n",
    "Skriv et program med en prosedyre printHei, prosedyren skal skrive ut teksten “Hei” til skjermen. \n",
    "\n",
    "Definer en variabel a med en verdi 5 og lag en while-løkke, løkken skal kalle prosedyren printHei. \n",
    "\n",
    "Bruk variabelen a slik at løkken er ferdig etter du har kalt print_hei 5 ganger.\n",
    "\n",
    "Skriv prosedyren printHei. Deretter løs oppgaven både ved hjelp av while-løkke og for-løkke."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# For-løkker for lister / for-each\n",
    "\n",
    "Syntaks:\n",
    "```python\n",
    "for <element> in <liste> :\t\t# for hvert element i listen “liste”…\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "div = [\"kamera\", \"lommebok\", \"pass\", \"mobillader\"]\n",
    "for ting in div : \n",
    "\t print(\"Pakket med: \", ting)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "* For mengder/set gjelder akkurat det samme, men her kan rekkefølgen på ting variere (i lister vil de alltid komme i den rekkefølgen de står i/basert på index). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Prosedyrer med parametre\n",
    "\n",
    "Forrige uke:\n",
    "```python\n",
    "def metode_navn (): \n",
    "\t\t<ting skjer>\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Forskjeller på funksjon, prosedyre og metode\n",
    "\n",
    "### Funksjon \n",
    "En funksjon som defineres med  *def*, som ikke er del av en klasse (ordet self brukes ikke). Funksjoner har alltid en returverdi.\n",
    "Eks:    \n",
    "```python\n",
    "def sum(a, b):\n",
    "    c = a + b        \n",
    "    return c\n",
    "```\n",
    "På engelsk kalles dette function.\n",
    "\n",
    "### Prosedyre \n",
    "Tilsvarende funksjon, men uten returverdi. Bruker aldri ordet self, og er ikke del av en klasse.\n",
    "Eks:\n",
    "```python\n",
    "    def superprint(ord):\n",
    "        print(“ordet er”, ord)\n",
    "```\n",
    "På engelsk kalles dette procedure.\n",
    "\n",
    "\n",
    "### Metode\n",
    "Tilsvarende funksjon, men som del av en klasse. Har alltid self som første parameter. Kan, men må ikke, ha en returverdi.\n",
    "Eks:\n",
    "```python\n",
    "    def areal(self):\n",
    "        firkant_areal = self.lengde * self.bredde\n",
    "        return firkant_areal\n",
    "```\n",
    "På engelsk kalles dette method.\n",
    "\n",
    "\n",
    "### NB!\n",
    "\n",
    "Frem til vi lærer mer om objekter er det kun funksjoner og prosedyrer vi fokuserer på.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sende med parametere\n",
    "\n",
    "* Til prosedyrer/funksjoner kan man også sende med parametre, som er en type variabler. Variablene man sender med “blir” de som er med som argument i prosedyren.\n",
    "\n",
    "Syntaks:\n",
    "\n",
    "```python\n",
    "def prosedyre_navn(parameter1, parameter2, …)  # kan ha så mange parametere man vil\n",
    "\t<gjøre ting>\n",
    "```\n",
    "F.eks.\n",
    "```python\n",
    "def summer(a, b):\n",
    "\tprint(\"sum: \", a + b)\n",
    "```\n",
    "\n",
    "Inni prosedyren “summer” vil a her ha verdien 5 og b ha verdien 6. \n",
    "Man kan også sende med variabler når man kaller på en prosedyre:\n",
    "Feks.\n",
    "```python\n",
    "z = 7\n",
    "y = 3.5\n",
    "summer(z, y)\n",
    "```\n",
    "\n",
    "Her vil a få verdien 7 og b får verdien 3.5. \n",
    "\n",
    "**NB! Når prosedyren summer er ferdig så vil ikke a og b “beholde” verdiene sine.\n",
    "Repetere igjen; Fordel med prosedyrer -> kan gjenbruke kode! Kan kalle på en prosedyre flere ganger**\n",
    "\n",
    "Tegn opp disse kallene, forklar hvordan a og b får sine “verdier”.\n",
    "\n",
    "Parametrene som sendes med kan være hvilke som helst verdier.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# Feks.\n",
    "def summer(a, b):\n",
    "\tprint(\"sum: \", a + b)\n",
    "\n",
    "# Inni prosedyren “summer” vil a her ha verdien 5 og b ha verdien 6. \n",
    "# Man kan også sende med variabler når man kaller på en prosedyre:\n",
    "# Feks.\n",
    "\n",
    "z = 7\n",
    "y = 3.5\n",
    "summer(z, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Oppgave 8\n",
    "\n",
    "Skriv en prosedyre “storst_av_to” som tar imot to tall som parametre og skriver ut verdien til det største tallet."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Funksjoner igjen\n",
    "\n",
    "* Når vi skriver ```return ``` så \"avsluttes\" funksjonen, videre linjer i funksjonen kjøres da ikke.\n",
    "\n",
    "```python\n",
    "def summer(a,b):\n",
    "    return a+b\n",
    "\n",
    "z = 7\n",
    "y = 3.5\n",
    "tot = summer(z,y)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Oppgave 10\n",
    "(Du skal nå endre på oppgave 8):\n",
    "\n",
    "Skriv en funksjon **storst_av_to** som tar imot to tall som parametre og returnerer det største tallet. Deretter skrives tallet ut etter funksjonskallet. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "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.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
