diff --git a/lectures/chap2/lab/funksjoner_og_kalkulasjoner.ipynb b/lectures/chap2/lab/funksjoner_og_kalkulasjoner.ipynb index c967ac04257bc5630b3684d85d3178f4d7c8aaaa..f2958d927597709f234a215d99e8ca0262125751 100644 --- a/lectures/chap2/lab/funksjoner_og_kalkulasjoner.ipynb +++ b/lectures/chap2/lab/funksjoner_og_kalkulasjoner.ipynb @@ -14,7 +14,6 @@ "**Læringsmål**:\n", "\n", "* Aritmetikk\n", - "* Matematiske utrykk i Python\n", "* Funksjoner\n", "\n", "\n", @@ -119,12 +118,6 @@ "\n", "La $d$ være $a * b + c$\n", "\n", - "La $e$ være $\\frac{-b + 4}{a - 4}$\n", - "\n", - "La $f$ være $5^{a * b + 2}$\n", - "\n", - "La $g$ være $[(a + b) * c - d]$\n", - "\n", "**_Skriv koden din i kodeblokken under_**" ] }, @@ -152,9 +145,6 @@ "3\n", "13\n", "19\n", - "-0.5\n", - "390625\n", - "46\n", "```" ] }, @@ -170,10 +160,7 @@ "print(a)\n", "print(b)\n", "print(c)\n", - "print(d)\n", - "print(e)\n", - "print(f)\n", - "print(g)" + "print(d)" ] }, { @@ -224,32 +211,6 @@ " return 2 * x + 3 # Returnerer parameteren x ganget med 2 og plusset med 3" ] }, - { - "cell_type": "markdown", - "metadata": { - "hidden": true - }, - "source": [ - "Når en funksjon står for seg selv, som funksjonen over, får vi ingen output når vi kjører koden. Funksjonen er kun _definert_, akkurat som når man oppretter seg en variabel. På samme måte som man ikke kan bruke variabler før de er definert, kan man ikke bruke funksjoner før de er definert:\n", - "\n", - "```py\n", - "# Her kan man ikke bruke a eller min_funksjon\n", - "\n", - "a = 1.3 # Assosierer navnet a med et flyttallsobjekt i minnet\n", - "\n", - "# Her kan man bruke a, men ikke min_funksjon\n", - "\n", - "def min_funksjon(): # Assosierer navnet min_funksjon med et funksjonsobjekt i minnet\n", - "\n", - "# Her kan man bruke begge\n", - "```\n", - "\n", - "\n", - "Prøv å kjøre kodeblokken over og se at du ikke får noe output.\n", - "\n", - "Når en funksjon er defniert, kan vi _kalle_ på den. Dette kan man gjøre ved å skrive funksjonsnavnet, etterfulgt av parenteser og eventuelle _argumenter_ i parentesene. Kodeblokken under kaller på funksjonen `f(x)`, med argumentet $2$. Prøv å kjøre den!" - ] - }, { "cell_type": "code", "execution_count": null, @@ -280,14 +241,6 @@ "\n", "$f(x) = 2x + 1$\n", "\n", - "$g(x) = \\frac{-4x + 2}{5x + 3}$\n", - "\n", - "$h(x) = x^2 + 2x + 1$\n", - "\n", - "$i(x) = \\sqrt(x)$\n", - "\n", - "$j(x) = \\sin{x} + \\cos{x}$\n", - "\n", "**_Skriv koden din i kodeblokken under_**" ] }, @@ -321,10 +274,6 @@ "\n", "```python\n", "21\n", - "-0.6428571428571429\n", - "16\n", - "2.0\n", - "-0.6752620891999122\n", "```" ] }, @@ -336,192 +285,7 @@ }, "outputs": [], "source": [ - "print(f(10))\n", - "print(g(5))\n", - "print(h(3))\n", - "print(i(4))\n", - "print(j(5))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "heading_collapsed": true, - "run_control": { - "frozen": true - }, - "solution": "hidden" - }, - "source": [ - "### Tutorial - Matteoperasjoner del 2: Heltallsdivisjon og Modulo:\n", - "\n", - "Les gjerne denne før du begynner på neste oppgave" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "I tillegg til vanlig divisjon / har Python også heltallsdivisjon som skrives // og modulo som skrives med operatoren %.\n", - "\n", - "Heltallsdivisjon og modulo minner om måten du lærte divisjon på barneskolen før du hadde lært desimaltall, altså med hele tall og rest.\n", - "\n", - "Tabellen under illustrerer hvordan disse operatorene virker:\n", - "\n", - "**Utrykk i Python**|**Resultat**|**Forklaring**\n", - "---|---|---\n", - "17 / 5\t|3.4\t|Vanlig divisjon\n", - "17 // 5|\t3\t|Heltallsdivisjon, gir hvor mange hele ganger nevneren 5 går opp i telleren 17\n", - "17 % 5\t|2|\tModulo, gir resten av 17 // 5, dvs. de 2 som blir til over\n", - "7.75 / 2.5\t|3.1|\tVanlig divisjon\n", - "7.75 // 2.5\t|3.0|\tHeltallsdivisjon, gir hvor mange hele ganger nevneren 2.5 går opp i 7.75.<br> Her blir svaret et flyttall (3.0) heller enn heltallet 3, fordi teller og nevner er flyttall.\n", - "7.75 % 2.5\t|0.25|\tModulo, Resten av 7.75//2.5 er 0.25 fordi 2.5 * 3.0 er 7.5\n", - "\n", - "Heltallsdivisjon og modulo har en rekke nyttige bruksområder i programmering.\n", - "\n", - "Ett eksempel er regning med enheter som aggregeres på andre måter enn det typiske 10, 100, 1000, slik som 60 sekund per minutt, 60 minutt per time, 24 timer per døgn, 7 døgn per uke.\n", - "\n", - "Koden under viser hvordan // og % kan brukes til slike beregninger. Prøv å kjør den." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "hidden": true - }, - "outputs": [], - "source": [ - "def antall_hele_uker(dager):\n", - " return dager // 7\n", - "\n", - "def antall_uker_dager(dager):\n", - " uker = dager // 7\n", - " dager = dager % 7\n", - " return uker, dager\n", - "\n", - "print(antall_hele_uker(10))\n", - "print(antall_uker_dager(15))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2019-07-01T09:01:23.971652Z", - "start_time": "2019-07-01T09:01:23.962336Z" - }, - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "Det fins også mange andre nyttige anvendelser av // og %, som vil vise seg etter hvert som vi kommer til mer avanserte problemer." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "heading_collapsed": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "### c) Bruk av heltallsdivisjon og modulo" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "hidden": true - }, - "source": [ - "Lag tre funksjoner `antall_minutt_sekund(sek)`, `antall_dogn_timer(timer)` og `antall_timer_minutt_sekund(sek)`, som gjør om sekunder til hele minutter, timer til hele døgn og sekunder til timer og resterende minutter.\n", - "\n", - "**_Skriv koden din i kodeblokken under_**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "hidden": true - }, - "outputs": [], - "source": [ - "# Skriv koden din her" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "hidden": true - }, - "source": [ - "Kjør kodeblokken under for å se at koden din fugerer som forventet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "hidden": true, - "scrolled": true - }, - "outputs": [], - "source": [ - "print(antall_minutt_sekund(120))\n", - "print(antall_dogn_timer(75))\n", - "print(antall_timer_minutt_sekund(19832))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "**Riktig utskrift hvis du har fått det til, skal bli**\n", - "```\n", - "2\n", - "3\n", - "(5, 30) #siden 19832 sekunder tilsvarer 5 timer, 30 min, 32 sek.\n", - "```" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### d) Konvertering av minutter\n", - "Skriv et program som finner ut hvor mange måneder, dager, timer og minutter er i et gitt antall minutter (f.eks. hvor mange måneder, dager, timer og minutter er 1252300 minutter?)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Skriv koden din her" + "print(f(10))" ] } ], diff --git a/lectures/chap2/lab/logiske_operatorer_uttrykk.ipynb b/lectures/chap2/lab/logiske_operatorer_uttrykk.ipynb index eb28ab2432458db4297ac7b5fe1dfe5eba83980c..ec15effe94d8b3084fac81519e61ebebc2ebf875 100644 --- a/lectures/chap2/lab/logiske_operatorer_uttrykk.ipynb +++ b/lectures/chap2/lab/logiske_operatorer_uttrykk.ipynb @@ -414,168 +414,6 @@ "source": [ "Husk parenteser!" ] - }, - { - "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": [ - "Du skal i denne oppgaven fullføre funksjonen gitt nedenfor slik at den fungerer korrekt. Det er blitt laget 10 pannekaker, noe som er mer enn datamaskinen klarer å spise, og den ønsker å dele noen av dem med deg. Men om du er grådig og spør om å få flere enn 10, vil du få beskjed om at det ikke er mulig. Om du derimot ønsker å gi datamaskinen pannekaker (skriver inn et negativt tall som argument til funksjonen), vil du også få beskjed om at det ikke er mulig. ***Endre på koden under***" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg\")\n", - " \n", - "def antall_pannekaker(n):\n", - " if ...: #Kode mangler her\n", - " return \"Beklager, men det er nok ikke mulig\"\n", - " else:\n", - " r = 10-p\n", - " return f\"Da blir det {p} på deg og {r} på meg :D\"" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "**Eksempel på kjøring**\n", - "\n", - "```\n", - "Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg\n", - "antall_pannekaker(4)\n", - "Da blir det 4 på deg og 6 på meg :D\n", - "```\n", - " \n", - "```\n", - "Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg ^u^\n", - "antall_pannekaker(100)\n", - "Beklager, men det er nok ikke mulig\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "## d)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "I denne deloppgaven skal pannekakefunksjonen utvides. Det skal nå også ta inn et argument om personen liker pannekaker og lagre det i en boolsk variabel, som vist i koden under (merk: `'J'` betyr at personen liker pannekaker, og `'N'` betyr at personen ikke liker pannekaker:\n", - "```python\n", - "print(\"Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg\")\n", - "\n", - "def antall_pannekaker(n, liker):\n", - " if liker == 'J':\n", - " liker_pannekaker = True\n", - " else:\n", - " liker_pannekaker = False\n", - " ...\n", - "```\n", - "\n", - "Pannekakeprogrammet elsker pannekaker og er lite forståelsesfull ovenfor de som ikke gjør det. Derfor, om `liker_pannekaker` er `False`, skal det også svare \"...ikke mulig\" selv om brukeren ber om et antall pannekaker innenfor lovlig intervall <0,10>.\n", - "\n", - "Din jobb er å samle alle disse betingelsene i et logisk uttrykk og skrive dette logiske uttrykk inn i koden nedenfor (der ... står), slik at programmet får rett oppførsel. ***Endre på koden under***" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg ^u^\n" - ] - } - ], - "source": [ - "print(\"Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg ^u^\")\n", - "def antall_pannekaker(n, liker):\n", - " if liker == 'J':\n", - " liker_pannekaker = True\n", - " else:\n", - " liker_pannekaker = False\n", - " \n", - " if ...: #Kode mangler her\n", - " return \"Beklager, men det er nok ikke mulig\"\n", - " else:\n", - " r = 10-p\n", - " return f\"Da blir det {p} på deg og {r} på meg :D\"" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "**Eksempel på kjøring**\n", - "```\n", - "Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg\n", - "antall_pannekaker(5, 'J')\n", - "Da blir det 5 på deg og 5 på meg :D\n", - "```\n", - "\n", - "```\n", - "Hei! Jeg har 10 pannekaker jeg ønsker å dele med deg ^u^\n", - "antall_pannekaker(7, 'N')\n", - "Beklager, men det er nok ikke mulig\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/lectures/chap2/lab/ulike_typer_if_setninger.ipynb b/lectures/chap2/lab/ulike_typer_if_setninger.ipynb index ceb9aa3ab46f3021e5781d3ce2a3b1eb3e8b9156..e595a3ae8f429f3fd04e9eb90f3efcefd7567823 100644 --- a/lectures/chap2/lab/ulike_typer_if_setninger.ipynb +++ b/lectures/chap2/lab/ulike_typer_if_setninger.ipynb @@ -324,1020 +324,6 @@ ">>>\n", "```" ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "## b)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2019-07-01T10:03:17.573938Z", - "start_time": "2019-07-01T10:03:17.564290Z" - }, - "deletable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "Ta utgangspunkt i følgende funksjon, som tar inn antall epler og antall barn som argumenter, og deretter regner ut hvor mange epler det blir på hvert barn." - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": { - "ExecuteTime": { - "end_time": "2019-07-01T10:06:41.706832Z", - "start_time": "2019-07-01T10:06:37.363889Z" - } - }, - "outputs": [], - "source": [ - "def antall_epler_per_barn(epler, barn):\n", - " # Antall epler til hvert barn\n", - " antall_per = epler // barn\n", - " # Antall epler det er igjen etter at barna har fått sine epler\n", - " antall_rest = epler % barn\n", - " \n", - " return antall_per, antall_rest\n", - "\n", - "antall_per, antall_rest = antall_epler_per_barn(14,3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Når en funksjon i Python returnerer mer enn én ting, kan det enten returneres som en liste ved å plassere \"square brackets\" rundt og skille elementene ved komma, eller som en tuppel ved å skille elementene ved komma. Dersom du ønsker å hente ut spesifikke deler av den returnerte dataen, må du enten hente den ut ved å indeksere outputen, eller ved å deklarere variablene på tilsvarende måte som verdiene ble returnert. Vedlagt kode viser de to måtene." - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Da blir det 2 epler til hvert barn\n", - "og 2 epler til overs til deg selv.\n", - "Takk for i dag!\n" - ] - } - ], - "source": [ - "tuppel = antall_epler_per_barn(12,5)\n", - "antall_per = tuppel[0]\n", - "antall_rest = tuppel[1]\n", - "\n", - "print(\"Da blir det\", antall_per, \"epler til hvert barn\")\n", - "print(\"og\", antall_rest, \"epler til overs til deg selv.\")\n", - "print(\"Takk for i dag!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Vi kan hente ut de returnerte variablene direkte ved å gjøre som i eksempelet nedenfor." - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Da blir det 2 epler til hvert barn\n", - "og 2 epler til overs til deg selv.\n", - "Takk for i dag!\n" - ] - } - ], - "source": [ - "antall_per, antall_rest = antall_epler_per_barn(12,5)\n", - "\n", - "print(\"Da blir det\", antall_per, \"epler til hvert barn\")\n", - "print(\"og\", antall_rest, \"epler til overs til deg selv.\")\n", - "print(\"Takk for i dag!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "Under vises to kjøreeksempler med tilsvarende scripts som i de to cellene ovenfor:\n", - "\n", - "**Kjøring 1:**\n", - "```\n", - "antall_per, antall_rest = antall_epler_per_barn(14, 3)\n", - "\n", - "Da blir det 4 epler til hvert barn \n", - "og 2 epler til overs til deg selv. \n", - "Takk for i dag!\n", - "```\n", - "\n", - "**Kjøring 2:**\n", - "```\n", - "antall_per, antall_rest = antall_epler_per_barn(3, 0)\n", - "Traceback (most recent call last): \n", - " ... \n", - "ZeroDivisionError: integer division or modulo by zero \n", - "```\n", - "\n", - "\n", - "Det første, hvor brukeren gir tallene 14 og 3 som argumenter, funker fint. Hvis brukeren derimot svarer 0 barn, vil funksjonen gi feilmelding (`ZeroDivisionError`) fordi det er umulig å dele på null. Negativt antall barn vil \"funke\", men ikke gi mening.\n", - "\n", - "___Endre koden slik at de to print-setningene som forteller hvor mange epler det blir til barna og deg selv KUN utføres hvis barn > 0. \"Takk for i dag!\" skal derimot printes uansett.___\n", - "\n", - " Kjøring med barn > 0 skal gi samme resultat som eksemplet øverst. Eksemplet under viser kjøring hvis det skrives 0 for barn:\n", - " \n", - "```\n", - "antall_per, antall_rest = antall_epler_per_barn(3, 0) \n", - "Takk for i dag!\n", - "```\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "heading_collapsed": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "## Generelt om if-else-setninger\n", - "Dette er ikke en del av oppgaven, men kan være lurt å lese før du går videre. **Trykk på pilen til venstre for å lese**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "I eksemplene knyttet til (a) og (b) skulle vi gjøre noe ekstra hvis en betingelse var sann, ellers la være. I andre tilfeller kan vi ønske å gjøre en handling hvis betingelsen er sann, og en alternativ handling hvis den er usann.\n", - "\n", - "Det kan vi oppnå med en **if-else**-setning. Eksemplet nedenfor bygger videre på tilsvarende eksempel for if-setninger." - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": { - "ExecuteTime": { - "start_time": "2019-07-01T10:30:04.105Z" - }, - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Regn i mm: 0.0\n", - "Jeg burde bruke paraply i dag: Nei\n", - "Ha en fin tur til universitetet!\n" - ] - } - ], - "source": [ - "def paraply_if_else(regn):\n", - " print(f\"Regn i mm: {regn}\")\n", - " \n", - " if regn > 0.2:\n", - " anbefaling = \"Ja\"\n", - " else:\n", - " anbefaling = \"Nei\"\n", - " hilsen = \"Ha en fin tur til universitetet!\"\n", - " return anbefaling, hilsen\n", - "\n", - "anbefaling, hilsen = paraply_if_else(0.0)\n", - "\n", - "print(f\"Jeg burde bruke paraply i dag: {anbefaling}\")\n", - "print(hilsen)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "I dette eksemplet vil følgende skje hvis vi svarer mer enn 0.2 mm nedbør slik at betingelsen blir sann:\n", - "\n", - "**Eksempel på kjøring med over 0.3 mm nedbør:**\n", - "```\n", - "paraply_if_else(0.3)\n", - "\n", - "Output:\n", - "Jeg burde bruke paraply i dag: Ja\n", - "Ha en fin tur til universitetet!\n", - "```\n", - "\n", - "Svares det derimot et lavere tall, slik at betingelsen blir usann, skjer følgende:\n", - "\n", - "**Eksempel på kjøring med under 0.0 mm nedbør:** \n", - "```\n", - "paraply_if_else(0.0)\n", - "\n", - "Output:\n", - "Jeg burde bruke paraply i dag: Nei\n", - "Ha en fin tur til universitetet!\n", - "```\n", - "\n", - "Altså:\n", - "- Anbefalingen settes til \"Ja\" under `if`-uttrykket bare hvis betingelsen er sann.\n", - "- Setningen som står på innrykk under `else` blir utført bare hvis betingelsen er usann (kunne også hatt flere setninger på innrykk etter `else`).\n", - "- Den siste hilsenen, som ikke har innrykk (Ha en fin tur...), blir returnert uansett." - ] - }, - { - "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": [ - "I denne deloppgaven skal det lages et program som sjekker om en person kan stemme, altså om personen er 18 år eller eldre. Man må da spørre brukeren om alder og lagre svaret i en variabel, for deretter å sjekke om brukerens alder er 18 eller mer.\n", - "\n", - "**Eksempel på kjøring**\n", - "\n", - "```\n", - "kan_stemme(19)\n", - "\n", - "Output:\n", - "Du kan stemme:)\n", - "```\n", - " \n", - "```\n", - "kan_stemme(18)\n", - "\n", - "Output:\n", - "Du kan stemme:)\n", - "```\n", - " \n", - "```\n", - "kan_stemme(2)\n", - "\n", - "Output:\n", - "Du kan ikke stemme ennå\n", - "```\n", - "\n", - "***Skriv din kode her:***" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "heading_collapsed": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "#### Fremgangsmåte\n", - "Trykk på pilen til venstre for å lese" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "1. Lag en funksjon som heter `kan_stemme` som tar inn en alder (tall) som argument\n", - "2. Sjekk, vha. if, om personens alder er større eller lik 18 (`alder >= 18`). Om dette er tilfelle skal strengen `\"Du kan stemme:)\"` returneres fra funksjonen\n", - "3. Lag en `else`-blokk som returnerer strenger `\"Du kan ikke stemme ennå\"`\n", - "\n", - "(Det er flere mulige løsninger på denne oppgaven.)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "heading_collapsed": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "## Generelt om if-elif-else-setninger\n", - "Les gjerne denne før du går videre. **Trykk på pilen til venstre for å lese**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "I eksemplene vi har sett hittil, har det vært kun to mulige utfall på betingelsene - kaken har stått >= 50 minutt, eller ikke; antall barn er > 0, eller ikke; alder er over 18, eller ikke. I mange praktiske situasjoner kan det være tre eller flere mulige utfall.\n", - "\n", - "F.eks. hvis det var meldt mer enn 3 mm nedbør er kanskje ikke paraply tilstrekkelig, vi ville heller anbefale støvler og regntøy. Vårt tidligere eksempel kunne da utvides som følger:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Regn i mm: 4\n", - "Dagens anbefaling: Støvler og regntøy\n", - "Ha en fin tur til universitetet!\n" - ] - } - ], - "source": [ - "# EKSEMPEL 1\n", - "\n", - "def paraply_if_elif_else(regn):\n", - " print(f\"Regn i mm: {regn}\")\n", - " \n", - " if regn > 3.0:\n", - " anbefaling = \"Støvler og regntøy\"\n", - " elif regn > 0.2:\n", - " anbefaling = \"Paraply\"\n", - " else:\n", - " anbefaling = \"T-skjorte med NTNU-logo\"\n", - " hilsen = \"Ha en fin tur til universitetet!\"\n", - " \n", - " return anbefaling, hilsen\n", - "\n", - "anbefaling, hilsen = paraply_if_elif_else(4)\n", - "print(f\"Dagens anbefaling: {anbefaling}\")\n", - "print(hilsen)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "Under vises tre kjøringer av denne koden:\n", - "\n", - "```\n", - "paraply_if_elif_else(4.2)\n", - "\n", - "Output:\n", - "Regn i mm: 4.2\n", - "Dagens anbefaling: Støvler og regntøy\n", - "Ha en fin tur til universitetet!\n", - ">>>\n", - "```\n", - "\n", - "```\n", - "paraply_if_elif_else(0.3)\n", - "\n", - "Output:\n", - "Regn i mm: 0.3\n", - "Dagens anbefaling: Paraply\n", - "Ha en fin tur til universitetet!\n", - ">>>\n", - "```\n", - "\n", - "```\n", - "paraply_if_elif_else(0.0)\n", - "\n", - "Output:\n", - "Regn i mm: 0.0\n", - "Dagens anbefaling: T-skjorte med NTNU-logo\n", - "Ha en fin tur til universitetet!\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "Hvis betingelsen `regn > 3.0` er sann, settes anbefalingen til støvler og regntøy, deretter går programmet til første kodelinje etter hele if-elif-else-setningen, og setter hilsenen til (\"Ha en fin tur...\")\n", - "\n", - "Hvis betingelsen `regn > 3.0` er usann, settes **ikke** anbefalingen til støvler, programmet sjekker i stedet betingelsen på `elif`. Hvis denne er sann, settes anbefalingen til paraply, og dersom `elif`-påstanden også er usann, settes anbefalingen til T-skjorte med NTNU-logo som tidligere.\n", - "\n", - "Det er mulig å klare seg uten if-elif-else-setninger og i stedet bare putte if-else-setninger inni hverandre for å oppnå det samme. Eksemplet ovenfor kunne alternativt skrives:" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "hidden": true - }, - "outputs": [], - "source": [ - "# EKSEMPEL 2\n", - "def paraply_nested_if(regn):\n", - " if regn > 3.0:\n", - " anbefaling = \"Støvler og regntøy\"\n", - " else:\n", - " if regn > 0.2:\n", - " anbefaling = \"Paraply\"\n", - " else:\n", - " anbefaling = \"T-skjorte med NTNU-logo\"\n", - " hilsen = \"Ha en fin tur til universitetet!\"\n", - " return anbefaling, hilsen\n", - "\n", - "anbefaling, hilsen = paraply_nested_if(0.3)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "Særlig i tilfeller hvor det dreier seg om tre eller flere alternative utfall basert på verdien av den **samme variabelen** (f.eks. `regn` her) vil de fleste oppfatte **if-elif-else**-setninger som både lettere å skrive og lettere å forstå, enn flere nøstede if-else-setninger.\n", - "\n", - "Ett typisk eksempel er antall oppnådde poeng på en eksamen, som kan transformeres til en bokstavkarakter A-F etter gitte grenser. Det er da 6 mulige utfall, dette gir mye innrykk og blir vanskelig å lese med nøstede if-setninger:" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": { - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Du fikk C\n" - ] - } - ], - "source": [ - "# EKSEMPEL 3\n", - "def hvilken_karakter(score): \n", - " if score >= 89:\n", - " return \"A\"\n", - " else:\n", - " if score >= 77:\n", - " return \"B\"\n", - " else:\n", - " if score >= 65:\n", - " return \"C\"\n", - " else:\n", - " if score >= 53:\n", - " return \"D\"\n", - " else:\n", - " if score >= 41:\n", - " return \"E\"\n", - " else:\n", - " return \"F\"\n", - "\n", - "karakter = hvilken_karakter(75)\n", - "print(f\"Du fikk {karakter}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "if-elif-else-setning vil være klart å foretrekke i en slik situasjon; det er mye lettere å se at koden her tar en beslutning med 6 alternativer basert på verdien av en enkelt variabel:" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": { - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Du fikk C\n" - ] - } - ], - "source": [ - "# EKSEMPEL 4\n", - "def hvilken_karakter(score): \n", - " if score >= 89:\n", - " return \"A\"\n", - " elif score >= 77:\n", - " return \"B\"\n", - " elif score >= 65:\n", - " return \"C\"\n", - " elif score >= 53:\n", - " return \"D\"\n", - " elif score >= 41:\n", - " return \"E\"\n", - " else:\n", - " return \"F\"\n", - "\n", - "karakter = hvilken_karakter(75)\n", - "print(f\"Du fikk {karakter}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "Ved bruk av if-elif-else er det avgjørende at betingelsene kommer i riktig rekkefølge. Anta at vi hadde gjort karaktereksemplet motsatt:" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": { - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Du fikk F\n" - ] - } - ], - "source": [ - "# EKSEMPEL 5\n", - "# HER HAR VI MED VILJE HAR GJORT FEIL\n", - "def hvilken_karakter(score): \n", - " if score >= 0:\n", - " return \"F\"\n", - " elif score >= 41:\n", - " return \"E\"\n", - " elif score >= 53:\n", - " return \"D\"\n", - " elif score >= 65:\n", - " return \"C\"\n", - " elif score >= 77:\n", - " return \"B\"\n", - " elif score >= 89:\n", - " return \"A\"\n", - " \n", - "karakter = hvilken_karakter(75)\n", - "print(f\"Du fikk {karakter}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "Her vil øverste betingelse vil være sann for alle eksamensbesvarelser - og alle ender opp med karakteren F.\n", - "\n", - "Det er også viktig når det er snakk om alternativt ekskluderende utfall av samme beslutning at vi bruker **if-elif-else**-setning; **IKKE en serie med frittstående if-setninger**.\n", - "\n", - "Eksempel 6 under ser nesten ut som Eksempel 4, bare at vi kun skriver `if` der vi før skrev `elif`. Merk også at funksjonen her bruker en variabel `karakter` for å holde på karakteren, heller enn å returnere den - dette er gjort for å fremheve feilen som oppstår." - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": { - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Karakter etter første if: A\n", - "Karakter etter andre if: B\n", - "Karakter etter tredje if: C\n", - "Karakter etter fjerde if: D\n", - "Karakter etter femte if: E\n", - "Du fikk F\n" - ] - } - ], - "source": [ - "# EKSEMPEL 6\n", - "# HER HAR VI MED VILJE HAR GJORT FEIL\n", - "def hvilken_karakter(score):\n", - " karakter = \"\"\n", - " if score >= 89:\n", - " karakter = \"A\"\n", - " print(f\"Karakter etter første if: {karakter}\")\n", - " if score >= 77:\n", - " karakter = \"B\"\n", - " print(f\"Karakter etter andre if: {karakter}\")\n", - " if score >= 65:\n", - " karakter = \"C\"\n", - " print(f\"Karakter etter tredje if: {karakter}\")\n", - " if score >= 53:\n", - " karakter = \"D\"\n", - " print(f\"Karakter etter fjerde if: {karakter}\")\n", - " if score >= 41:\n", - " karakter = \"E\"\n", - " print(f\"Karakter etter femte if: {karakter}\")\n", - " else:\n", - " karakter = \"F\"\n", - " return karakter\n", - "\n", - "hvilken_karakter(92)\n", - "print(f\"Du fikk {karakter}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "En student som har fått 92 poeng vil her komme riktig ut av den første if-setningen, og karakter settes til A. Men 92 > 77 er også sant, så karakter omgjøres deretter til B. Så til C, så til D, så til E.\n", - "\n", - "De eneste tilfellene som dette programmet vil takle korrekt blir dermed studenter som skal ha E eller F.\n", - "\n", - "Feilen her er at vi bruker nye frittstående if-setninger (dvs. som ikke er relatert til hverandre), mens vi egentlig har å gjøre med gjensidig ekskluderende alternativer som skulle vært løst med if-elif-else.\n", - "\n", - "Hvor er det eventuelt riktig å bruke frittstående if-setninger? Jo, hvis det er snakk om flere uavhengige beslutninger. I eksempel 7 under er det to uavhengige beslutninger, den ene om man skal ta paraply eller ikke, den andre om brodder eller ikke. Hver beslutning tas uavhengig av den andre, da blir det riktig med to frittstående if-setninger.\n", - "\n", - "Hadde vi i stedet brukt if-elif her, ville programmet ikke ha virket som det skulle, da det kun ville ha vært i stand til å anbefale brodder i oppholdsvær (mens det jo kan være minst like glatt om det regner)." - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": { - "ExecuteTime": { - "start_time": "2019-07-01T11:00:12.045Z" - }, - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Regn i mm: 0.3\n", - "Hvor glatt er det på en skala fra 1 til 10: 9\n", - "Da anbefaler jeg paraply. \n", - "Da anbefaler jeg sko med brodder eller pigger.\n" - ] - } - ], - "source": [ - "# EKSEMPEL 7\n", - "def paraply_og_brodder(regn, glatt):\n", - " print(f\"Regn i mm: {regn}\")\n", - " print(f\"Hvor glatt er det på en skala fra 1 til 10: {glatt}\")\n", - " anbefaling = \"\"\n", - " if regn > 0.2:\n", - " anbefaling += \"Da anbefaler jeg paraply. \\n\"\n", - " if glatt > 8:\n", - " anbefaling += \"Da anbefaler jeg sko med brodder eller pigger.\"\n", - " return anbefaling\n", - "\n", - "anbefaling = paraply_og_brodder(0.3, 9)\n", - "print(anbefaling)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "I andre tilfeller kan en beslutning være avhengig av en annen, f.eks. kun være aktuell ved et visst utfall av en foregående if-setning. Som i eksempel 8 under:" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": { - "hidden": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Regn i mm: 0.3\n", - "Vind i sekundmeter: 9\n", - "Anbefaler regntøy, for mye vind for paraply.\n" - ] - } - ], - "source": [ - "# EKSEMPEL 8\n", - "def paraply_i_vind(regn, vind):\n", - " print(f\"Regn i mm: {regn}\")\n", - " print(f\"Vind i sekundmeter: {vind}\")\n", - " if regn > 0.2:\n", - " if vind < 7.0:\n", - " return \"Da anbefaler jeg paraply.\"\n", - " else:\n", - " return \"Anbefaler regntøy, for mye vind for paraply.\"\n", - "\n", - "anbefaling = paraply_i_vind(0.3, 9)\n", - "print(anbefaling)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "Her ville if `regn > 0.2:` .....`elif vind < 7.0` ha blitt feil.\n", - "\n", - "Programmet ville da ha gjort vurderinger av vinden kun hvis det ikke regnet, og dermed ha vært ute av stand til å fraråde paraply hvis det regner og samtidig blåser kraftig.\n", - "\n", - "**Oppsummert:**\n", - "\n", - "- flere helt uavhengige beslutninger: bruk frittstående if-setninger\n", - "- beslutning med gjensidig utelukkende handlingsalternativer: bruk if-else (2 alternativer) eller if-elif-else (3 eller flere alternativer)\n", - "- beslutninger relatert på annen måte, f.eks. at en betingelse (som `vind < 7.0` ovenfor) kun er aktuell gitt et visst utfall av en annen betingelse: kan løses ved å nøste flere if-setninger inni hverandre\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "## d)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "Lag en utvidet versjon av programmet fra (c) som sier om personen kan stemme eller ikke, med følgende regler:\n", - "\n", - "- `alder >= 18`: Kan stemme både ved lokalvalg og Stortingsvalg\n", - "- `alder >= 16`: Kan stemme ved lokalvalg, men ikke ved Stortingsvalg\n", - "- ellers (`alder < 16`): Kan ikke stemme.\n", - "\n", - "Eksempel på kjøring:\n", - "\n", - "```\n", - "kan_stemme(19)\n", - "\n", - "Output:\n", - "Du kan stemme både ved lokalvalg og Stortingsvalg\n", - ">>>>\n", - "```\n", - "\n", - "```\n", - "kan_stemme(17)\n", - "\n", - "Output:\n", - "Du kan stemme ved lokalvalg, men ikke ved Stortingsvalg\n", - ">>>>\n", - "```\n", - "\n", - "```\n", - "kan_stemme(12)\n", - "\n", - "Output:\n", - "Du kan ikke stemme ennå\n", - "```\n", - "\n", - "___Skriv din kode her:___" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "## e)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "Du skal lage en funskjon som sjekker hvilken billettpris en person skal betale ut ifra alderen til personen og returnerer prisen som et tall.\n", - "\n", - "Oversikt over alder og tilhørende billettpriser:\n", - "\n", - "Aldersgruppe | Billettpris\n", - "--- | ---\n", - "Under 3 år | Gratis\n", - "3-11 år | 30 kr\n", - "12-25 år | 50 kr\n", - "26-66 år | 80 kr\n", - "67 år og over | 40 kr" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "run_control": { - "frozen": true - } - }, - "source": [ - "___Skriv din kode her:___" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "editable": false, - "heading_collapsed": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "#### Fremgangsmåte\n", - "Trykk på pilen til venstre" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": false, - "hidden": true, - "run_control": { - "frozen": true - } - }, - "source": [ - "1. Først må det lages en funksjon som tar inn alderen til brukeren som argument.\n", - "2. Videre skal man sjekke hvilken billett personen skal ha, og dette gjøres med en if-elif-else-setning:\n", - "\n", - "```\n", - "if alder < 3:\n", - " ...\n", - "elif alder < 12:\n", - " ...\n", - "elif ...:\n", - " ...\n", - "elif ...:\n", - " ...\n", - "else:\n", - " ...\n", - "```" - ] } ], "metadata": { diff --git a/lectures/chap2/notes/slides/lecture-2.md b/lectures/chap2/notes/slides/lecture-2.md deleted file mode 100644 index 5cbea9509be39bf0b9833c6a5125f3862a91dba4..0000000000000000000000000000000000000000 --- a/lectures/chap2/notes/slides/lecture-2.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -marp: true -size: 4:3 -paginate: true ---- -<!-- https://marpit.marp.app/directives --> - -# Leksjon 2 - -**Læringsutbytte** - -* Kunne skrive enkle matematiske uttrykk i Python -* Lære å definere funksjoner i Python -* Kunne sette opp logiske uttrykk -* Lære å bruke if-setningen i Python. - ---- -# Funksjoner og kalkulasjoner - -**Aritmetikk** - -**Presedens mellom operatorer fungerer som i matematikken.** - -* Multiplikasjon og divisjon har høyere presedens enn addisjon og subtraksjon. -* 3 + 2 * 5 blir 13, fordi * gjøres før +. -* 5 - 1 / 2 blir 4.5, fordi / gjøres før -. -* Potens har høyere presedens enn multiplikasjon og divisjon: - 5 * 2 ** 3 blir 40, fordi ** gjøres før *. ---- -* Parenteser kan brukes for å få en annen rekkefølge på regneoperasjonene: - * (3 + 2) * 5 blir 25, fordi + gjøres før *. - * (5 - 1) / 2 blir 2, fordi - gjøres før /. - * (5 * 2) ** 3 blir 343, fordi * nå gjøres før **. -* Hvis du skal "oversette" et matematisk uttrykk med parenteser til Python, bruk parenteser på samme sted også i Python-koden. - ---- - -## Funksjoner - -Eksempel på den matematiske funksjonen $f(x) = 2x + 3$ i Python: - -```python -def f(x): # Definerer funksjonen - return 2 * x + 3 # Returnerer parameteren x ganget med 2 og plusset med 3 - - -# Kall/bruk funksjonen -print(f(1)) -print(f(2)) - -y = f(3) -print(y) -``` ---- -# Moduler og pakker - -* En modul i Python er en python-fil -* En modul inneholder python-code, som regel funksjoner. -* Eksempel på en modul er 'math' -* Vi kan bruke moduler i våre programmer: -```python -import math - -print(math.pi) # printer ut verdien av variabelen pi som ligger i modulen math -print(math.pow(4,2)) # printer 4*4 = 16 -``` -```python -import math as m - -print(m.pi) # printer ut verdien av variabelen pi som ligger i modulen math -print(m.pow(4,2)) # printer 4*4 = 16 -``` - ---- - -```python -from math import pi, pow - -print(pi) # printer ut verdien av variabelen pi som ligger i modulen math -print(pow(4,2)) # printer 4*4 = 16 -``` ---- -# Pakker - -* Pakker består av flere moduler -* Vi kan importere hele eller deler av en pakke -* De fleste pakkene må installeres i miljøet før de kan tas i bruk. -* På Jupyter har vi allerede installert det meste av det som trengs i dette kurset. -* For å installere en pakke, start terminal vindu og skriv: - -```python -pip install <<pakkenavn>> -``` - -Eksempel: -```python -pip install matplotlib -``` ---- - -# Eksempler på bruk av pakker - -```python -import matplotlib.pyplot as plt -import random as rnd - -dager = range(7) -regn_mm = [rnd.randint(0,10) for i in dager] - -plt.plot(dager,regn_mm) -``` - ---- -## Logiske operatorer - -* `==` (betyr "er lik", merk at her er to likhetstegn nødvendig for å skille fra tilordningsoperatoren) -* `!=` (betyr "ulik", altså det motsatte av ==) -* `>` , `<` , `>=` , `<=` (som betyr henholdsvis større, mindre, større eller lik, og mindre eller lik) - -```python -a = 10 -b = 15 - -er_lik = a == b -print (er_lik) - -er_storre = a > b -print (er_storre) - -er_ulik = a != b -print (er_ulik) -``` - ---- -# if-setninger - -* Bruker til å finne ut resultatet av logiske uttrukk blir - -```python -a = 10 -b = 15 - -if a == b: - print ('a er lik b') - -if a > b - print ('a er større enn b') - -if a != b: - print ('a er ulik b') -``` \ No newline at end of file diff --git a/lectures/chap2/notes/slides/lecture-2.pdf b/lectures/chap2/notes/slides/lecture-2.pdf deleted file mode 100644 index 64494fb169669bfe562f7cb896b904401f9b65d9..0000000000000000000000000000000000000000 Binary files a/lectures/chap2/notes/slides/lecture-2.pdf and /dev/null differ