Skip to content
Snippets Groups Projects
Nostede lokker.ipynb 14.5 KiB
Newer Older
olerid's avatar
olerid committed
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "<nav class=\"navbar navbar-default\">\n",
    "  <div class=\"container-fluid\">\n",
    "    <div class=\"navbar-header\">\n",
    "      <a class=\"navbar-brand\" href=\"_Oving3.ipynb\">Øving 3</a>\n",
    "    </div>\n",
    "    <ul class=\"nav navbar-nav\">\n",
    "      <li ><a href=\"Intro%20til%20lokker.ipynb\">Intro til løkker</a></li>\n",
    "    <li ><a href=\"Mer%20om%20lokker.ipynb\">Mer om løkker</a></li>\n",
    "    <li class=\"active\"><a href=\"Nostede%20lokker.ipynb\">Intro til nøstede løkker</a></li>\n",
    "    <li><a href=\"Kodeforstaelse.ipynb\">Kodeforståelse</a></li>\n",
    "    <li ><a href=\"Gjett%20tallet.ipynb\">Gjett tallet</a></li>\n",
    "        <li ><a href=\"Tekstbasert%20spill%202.ipynb\">Tekstbasert spill 2</a></li>\n",
    "    <li ><a href=\"Geometrisk%20rekke.ipynb\">Geometrisk rekke</a></li>\n",
    "    <li ><a href=\"Fibonacci.ipynb\">Fibonacci</a></li>\n",
    "    <li><a href=\"Alternerende%20sum.ipynb\">Alternerende sum</a></li>\n",
    "    <li ><a href=\"Hangman.ipynb\">Hangman</a></li>\n",
    "    <li ><a href=\"Derivasjon.ipynb\">Derivasjon</a></li>\n",
    "    <li ><a href=\"Doble%20lokker.ipynb\">Doble løkker</a></li>\n",
    "    </ul>\n",
    "  </div>\n",
    "</nav>\n",
    "\n",
    "# Intro til nøstede løkker\n",
    "\n",
    "**Læringsmål:**\n",
    "\n",
    "* Nøstede løkker\n",
    "\n",
    "I denne oppgaven skal du lære hvordan vi kan benytte oss av en løkke inne i en annen løkke. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "### Intro til nøstede løkker\n",
    "Nøstede løkker vil si løkker som er inni andre løkker. Et eksempel på en nøstet løkke er en dobbel løkke, som vil si at det er en løkke inni en annen løkke. Doble løkker brukes mye i programmering, typisk når man skal løse problemer som på en eller annen måte er todimensjonale, f.eks. knyttet til matriser eller todimensjonale tabeller med tall. Todimensjonal her kan bety rent visuelt (f.eks. at man skal tegne noe på en skjerm og må oppdatere fargen i hvert punkt i et rutenett av piksler), men behøver ikke å ha noen visuell betydning. Det kan være snakk om dimensjoner av informasjon på en mer abstrakt måte. F.eks. kan de to dimensjonene være tall og verdier i kortstokken, vi kan da generere en hel kortstokk ved en dobbel løkke som følger:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-07-02T13:13:16.212772Z",
     "start_time": "2019-07-02T13:13:16.199788Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K \n",
      "♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K \n",
      "♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K \n",
      "♦A ♦2 ♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K \n",
      "\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def format_card_deck():\n",
    "    \n",
    "    farger = ['♠', '♣', '♥', '♦']\n",
    "    verdier = ['A', '2', '3', '4', '5', '6', '7', '8',\n",
    "                  '9', '10', 'J', 'Q', 'K']\n",
    "    outer_string = \"\"\n",
    "    \n",
    "    for farge in farger:  # Traverse the farger-array\n",
    "        inner_string = \"\"\n",
    "        for verdi in verdier: # Traverse the verdier-array\n",
    "            inner_string += farge + verdi + \" \" # Add the current farge and verdi, in addition to spacing\n",
    "        outer_string += inner_string + \"\\n\" # add all the values of one farge to the result, and start at a new line\n",
    "           \n",
    "    return outer_string\n",
    "\n",
    "print(format_card_deck())\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "hidden": true,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Den innerste løkka går 13 runder hver gang den kjører fordi det er 13 elementer i sekvensen som gis til for-løkka (verdier). Den legger til hver av kortene i en farge til en indre streng. Denne strengen legges til en ytre streng når den indre forløkken er ferdig. Dermed får vi alle kortene av en sort hver gang den indre forløkken er ferdig å kjøre. Merk \"\\n\" i den ytre strengen. Dette gjør at vi skifter linje mellom hver gang den fullførte indre strengen legges til den  ytre strengen. Den ytre løkka går 4 ganger, en for hver farge i kortstokken"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "**Eksempel på nøstet løkke med print**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n"
     ]
    }
   ],
   "source": [
    "for x in range(5):\n",
    "    for y in range(3):\n",
    "        print(\"Jeg elsker ITGK! \", end=\" \")\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Under følger en funksjon og bygging av tekststreng som gir samme output som løkkene over:**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
      "Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
      "Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
      "Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
      "Jeg elsker ITGK! Jeg elsker ITGK! Jeg elsker ITGK! \n",
      "\n"
     ]
    }
   ],
   "source": [
    "def nested_loop_example():\n",
    "    \n",
    "    result_string = \"\"\n",
    "    \n",
    "    for x in range(5):\n",
    "        inner_string = \"\"\n",
    "        \n",
    "        for y in range(3):\n",
    "            inner_string += \"Jeg elsker ITGK! \"\n",
    "        \n",
    "        result_string += inner_string + \"\\n\"\n",
    "    return result_string\n",
    "\n",
    "print(nested_loop_example())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Denne utskriften trenger man strengt tatt ikke dobbel løkke for å få til; selve utskriften gir riktig nok et todimensjonalt inntrykk, men siden den underliggende informasjonen ikke er todimensjonal men derimot konstant (samme utskrift \"Jeg elsker ITGK!\" i alle tilfeller), er det også greit mulig å klare dette med enkel løkke, eller helt uten løkker, som følger:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-07-02T13:15:07.223226Z",
     "start_time": "2019-07-02T13:15:07.215744Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!\n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!\n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!\n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!\n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!\n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!  \n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Løsning med enkel løkke:\n",
    "for x in range(5):\n",
    "    print(\"Jeg elsker ITGK!  Jeg elsker ITGK!  Jeg elsker ITGK!\")\n",
    "\n",
    "# Løsning uten løkker; \"\\n\" er tegnet for linjeskift (newline på engelsk)\n",
    "print(((\"Jeg elsker ITGK!  \" * 3) + \"\\n\") * 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Koden over vil skrive ut “Jeg elsker ITGK!” tre ganger ved siden av hverandre fem ganger nedover. Dette skjer på to ulike måter, derav 10 linjer i outputen. \n",
    "\n",
    "Hvis vi nå endrer litt på kravene til programmet, så det skal handle om flere studenter enn \"Jeg\" og flere emner enn \"ITGK\", vil vi ha et genuint todimensjonalt problem (én dimensjon er studenter, en annen emner) hvor dobbel løkke vil være klart enkleste løsning. **Din oppgave: kopier funksjonen nested_loop_example(), endre programmet så det gir utskrift som vist nedenfor**. Fra forrige oppgave skal altså Jeg byttes ut med Stud &lt;nummer>, og ITGK skal byttes ut med Emne &lt;nummer>. Brukeren skal angi ønsket antall for både studenter og emner, 4 og 3 er bare eksempler.\n",
    "\n",
    "```\n",
    "print(nested_loop_example())\n",
    "Hvor mange studenter? 4\n",
    "Hvor mange emner? 3\n",
    "Stud 1 elsker Emne 1 ; Stud 1 elsker Emne 2 ; Stud 1 elsker Emne 3 ;\n",
    "Stud 2 elsker Emne 1 ; Stud 2 elsker Emne 2 ; Stud 2 elsker Emne 3 ;\n",
    "Stud 3 elsker Emne 1 ; Stud 3 elsker Emne 2 ; Stud 3 elsker Emne 3 ;\n",
    "Stud 4 elsker Emne 1 ; Stud 4 elsker Emne 2 ; Stud 4 elsker Emne 3 ;\n",
    "```\n",
    "\n",
    "**EKSTRA UTFORDRING** (ikke nødvendig for å få godkjent (a)): For å gjøre programmet litt mindre tørt og abstrakt, kan du prøve å endre så det skriver fornavn på personer i stedet for \"Stud x\", og navn på faktiske emner i stedet for Emne y - jfr eksempel med kortstokk i teksten \"Intro til nøstede løkker\" øverst i denne oppgaven. For å gjøre det mindre forutsigbart, kan du dessuten bruke funksjonen random() for å generere tilfeldige tall for hver runde av løkka, og ha en if-setning for å velge verb basert på verdien av dette. F.eks. \"elsker\" bare hvis tallet ble > 0.9, og gradvis litt mer beskjedne verb til lavere tallverdien var."
   ]
  },
  {
magnusch's avatar
magnusch committed
   "cell_type": "markdown",
olerid's avatar
olerid committed
   "metadata": {},
   "source": [
magnusch's avatar
magnusch committed
    "***Skriv koden din her:***"
olerid's avatar
olerid committed
   ]
  },
magnusch's avatar
magnusch committed
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
olerid's avatar
olerid committed
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Lag en funksjon som returnerer en tekststreng med alle klokkeslett i løpet av et døgn på en fin måte. Du trenger kun å tenke på timer og minutter. Klokkeslettene skal gå fra 0:0 til 23:59 som vist nedenfor.\n",
    "\n",
    "Eksempel på kjøring av kode:\n",
    "\n",
    "```python\n",
    "print(klokkeslett())\n",
    "\n",
    "0:0\n",
    "0:1\n",
    "0:2\n",
    ".\n",
    ".       # Alle klokkeslett i mellom her skal skrives ut\n",
    ".\n",
    "23:58\n",
magnusch's avatar
magnusch committed
    "23:59\n",
    "```\n",
olerid's avatar
olerid committed
    "\n",
    "***Skriv koden din her:***"
   ]
  },
  {
   "cell_type": "code",
magnusch's avatar
magnusch committed
   "execution_count": null,
olerid's avatar
olerid committed
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-07-02T13:21:25.863928Z",
     "start_time": "2019-07-02T13:21:25.855403Z"
    }
   },
magnusch's avatar
magnusch committed
   "outputs": [],
   "source": []
olerid's avatar
olerid committed
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "editable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "## c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "Bruk doble løkker til å lage en funksjon som returnerer alle tallene i den lille gangetabellen, dvs. lag to for-løkker opp til 11 og multipliser variabelen x fra den ene løkken med variabelen y fra den andre løkken og bygg det på en indre streng i den innerste løkken. Du trenger ikke å tenke på formatet til utskriften.\n",
    "\n",
    "Eksempel på kjøring:\n",
    "\n",
    "```python\n",
    "print(gangetabellen())\n",
    "1\n",
    "2\n",
    "3\n",
    "4\n",
    "5\n",
    ".\n",
    ".\n",
    ".\n",
    "60\n",
    "70\n",
    "80\n",
    "90\n",
    "100\n",
    "```\n",
    "***Skriv koden din her:***"
   ]
  },
  {
   "cell_type": "code",
magnusch's avatar
magnusch committed
   "execution_count": null,
olerid's avatar
olerid committed
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-07-02T13:22:00.046861Z",
     "start_time": "2019-07-02T13:22:00.042947Z"
    }
   },
magnusch's avatar
magnusch committed
   "outputs": [],
   "source": []
olerid's avatar
olerid committed
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": false,
    "run_control": {
     "frozen": true
    }
   },
   "source": [
    "**Bonus**: Forsøk å legg inn \"\\n\" etter den innerste løkken i c) har kjørt (dvs. på samme innrykk som innerste for, men nedenfor linjen hvor inner_string blir utvidet med tall. Legg også til et mellomrom etter str(i*j)'  ' på slutten av print-funksjonen som printer ut tallene. Ser du nå at det ligner mer på en gangetabell?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Edit Metadata",
  "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",
magnusch's avatar
magnusch committed
   "version": "3.8.10"
olerid's avatar
olerid committed
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}