Uke 3 — bool / if
=================
Introduksjon
------------
Denne uken skal vi jobbe med booleans og if-statements i Python. Først skal vi også se
på f-strings, som gir en enkel måte å lage strenger som bruker verdier i
variabler.
Les den første delen av `kapittel 2 i Automate the Boring Stuff
`_ frem til "*while* Loop
Statements".
Eksempler
---------
Eksempel: f-strings
...................
Vi bruker f-strings ved å putte et "f" foran strengen vi vil lage. Når vi har
"f" foran strengen kan vi putte variabler eller andre uttrykk innen "{}". Så blir
verdien konvertert til en streng og puttet inn hvor parentesene er. La oss se på
noen eksempler.
Last ned filen her: :download:`eksempel_f_strings.py
`, og kjør koden.
.. literalinclude:: eks/eksempel_f_strings.py
Eksempel: Sammenligninger
.........................
Vi skal demonstrere hvordan du kan sammenligne (``<, >, ==, >=, <=``) uttrykk
på ulike måter, og hvordan slike sammenligninger kan brukes i if-setninger.
Her er noen eksempler på sammenligninger av tall og strenger. Strenger
sammenlignes i alfabetisk rekkefølge.
Last ned filen her: :download:`eksempel_sammenlign.py
`, og kjør koden. Du kan prøve å skrive om rad 12 og
13 med f-strings (uthevet nedenfor). Prøv å sammenligninge noen andre uttrykk.
.. literalinclude:: eks/eksempel_sammenlign.py
:emphasize-lines: 12,13
Eksempel: in
............
Vi kan bruke ordet ``in`` til å sjekke om en ting er med i en annen ting.
Resultatet blir en boolsk verdi.
Last ned filen her: :download:`eksempel_in.py `, og kjør
koden.
.. literalinclude:: eks/eksempel_in.py
Eksempel: Boolske Operatorer
............................
Her er noen eksempler på de boolske operatorene ``and``, ``or`` og ``not``. Hvis
du er usikker og trenger å oppdatere minnet ditt på boolske uttrykk, les igjen
seksjonen **Boolean Values** i `kapittel 2 av teksten.
`_
* ``X and Y`` har verdien ``True`` om både ``X`` og ``Y`` har verdien ``True``.
* ``X or Y`` har verdien ``True`` om enten ``X`` eller ``Y`` har verdien ``True``.
* ``not X`` har verdien ``True`` om ``X`` har verdien ``False``.
Last ned filen her: :download:`eksempel_boolske.py `.
Skjønner du hva som skjer i de siste 8 linjene? Hva blir ``test_4`` og hva tror
du ``test_5`` blir? Kjør koden. Var det riktig?
.. literalinclude:: eks/eksempel_boolske.py
Eksempel: If-setninger
......................
Her er noen eksempler på if-setninger. Om uttrykket etter ``if`` har verdien
``True`` kjøres kodeblokkene under.
La oss først prøve med et enkelt eksempel. Last ned filen her:
:download:`eksempel_if_bool.py `, og kjør koden. Hva
blir printet?
.. literalinclude:: eks/eksempel_if_bool.py
Det kan være litt vanskelig å forstå hva koden gjør. Du kan tegne bildet av
koden for å hjelpe deg selv til å forstå. Se bildet for eksempelet på
kontrollflyten for denne if-setning ``a < b`` :
.. code-block:: python
# denne koden gir samme informasjon som bildet nedenfor
if a < b:
print("Smaller!")
.. image:: ./img/uke04_if.png
:width: 300
:alt: control flow for if statement evaluating ``a < b``
La oss øve litt mer på dette. Last ned filen her: :download:`eksempel_if_numbers.py
`, og kjør koden. Prøve å tegne et bilde av
kontrollflyten for ``a > b`` i koden.
.. literalinclude:: eks/eksempel_if_numbers.py
Til slutt er det noen if-setninger som **ikke** er så gode. Last ned filen her: :download:`eksempel_bad-ifs.py `, og kjør koden. Hva er galt med dem? Hvordan kan du skrive dem bedre?
.. literalinclude:: eks/eksempel_bad-ifs.py
La oss prøve et annet eksempel. Last ned filen her:
:download:`eksempel_if_names.py `, og kjør koden.
Hvorfor skrives ut ingenting i den siste if-setningen?
.. literalinclude:: eks/eksempel_if_names.py
La oss prøve et siste eksempel på if-setninger. Last ned filen her:
:download:`eksempel_if_nested.py `, og kjør koden.
Hvorfor skrives ut ingenting i den siste if-setningen (linjer uthevet nedenfor)? Kan du endre koden slik at noe blir skrevet ut i den?
.. literalinclude:: eks/eksempel_if_nested.py
:emphasize-lines: 9,10
.. _uke_03_oppgave_1:
Oppgave 1
.........
I filen ``uke_03_oppg_1.py`` skal du lage et program som leser inn 3 ord og
skriver ut det lengste ordet. Om flere ord har den lengste lengden skal programmet **skrive ut alle** ord.
Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøring:
.. code-block:: html
Skriv et ord: eple
Skriv et annet ord: gulrot
Skrive et siste ord: ananas
gulrot
ananas
Eksempel: If-else-setninger
...........................
Her er noen eksempler på if-else-setninger. Om uttrykket ved ``if`` ikke
har verdien ``True`` kjøres koden under ``else`` i stedet.
Se bildet for et eksempel på kontrollflyten for if-else-setning ``a < b`` i denne koden:
.. code-block:: python
if a < b:
print("Smaller!")
else:
print("Bigger!")
.. image:: ./img/uke04_if_else.png
:width: 300
:alt: control flow for if-else statement evaluating ``a < b``
Hvis vi bytte inne tall for senteningen, får vi den:
.. code-block:: python
# samme if-sentning som a < b, men med tall:
if 30 < 50:
print("30 is smaller than 50")
else:
print("30 is not smaller than 50")
Det finnes en annen måte å bruke if-else: vi kan bruke ``A if X else B`` som et uttrykk.
Uttrykket har verdien ``A`` om ``X`` har verdien ``True``, ellers har det verdien ``B``:
.. code-block:: python
x = "apple" if (5 < 6) else "banana"
print(x) # hva skrives ut her?
x = "apple" if (9 < 6) else "banana"
print(x) # hva skrives ut her?
Eksempel: Modulo-operatoren
...........................
Vi kan bruke **modulo-operatoren** ``%`` for å vurdere om et tall er oddetall eller partall. Du kan lese mer om ``%`` i `Python-dokumentasjonen `_.
Last ned filen her: :download:`eksempel_modulo.py `,
og kjør koden. Hva skjer?
.. literalinclude:: eks/eksempel_modulo.py
.. _uke_03_oppgave_2:
Oppgave 2
.........
Regelen for å beregne om et år er et skuddår eller ikke er som følger:
* Vanligvis er et år som er **deleligt med 4** et **skuddår** (for eksempel 1996 var et skuddår).
* Men år som også er **delelige med 100** (for eksempel 1900) er **ikke skuddår**.
* Unntatt år som er **delelige med 400** (for eksempel 2000). Disse **er skuddår**.
I filen ``uke_03_oppg_3.py``, skriv et program som spør brukeren om et årstall
og skriver ut om det er et skuddår eller ikke.
Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøringer:
.. code-block:: html
Angi år: 1996
Dette er et skuddår.
.. code-block:: html
Angi år: 1900
Dette er ikke et skuddår.
Eksempel: Turtle
................
Forrige uke møte vi Python-turtle. Denne uken bruke vi turtle-modulen for å demonstrere boolsk logikk med programflyt. Last ned filen :download:`eksempel_turtle-if.py `,
og kjør koden. Hva er rekkefølgen av kommandoer du må gi for å tegne en firkantet form?
.. literalinclude:: eks/eksempel_turtle-if.py
.. _uke_03_oppgave_3:
Oppgave 3
.........
Vanligvis sier mann at et menneskeår tilsvarer 7 hundeår. Dette tar
ikke hensyn til at hunder blir voksne når de er ca 2 år. Derfor kan det være bedre å
regne begge de første 2 menneskeårene som 10.5 hundeår hvert, og etter det regne hvert
menneskeår som 4 hundeår.
I filen ``uke_03_oppg_3.py`` skal du skrive et program som spør brukeren om
antall menneskeår og siden skriver ut hvor mange hundeår det tilsvarer.
Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøringer:
.. code-block:: html
Angi menneskeår: 2
Dette tilsvarer 21.0 hundeår.
.. code-block:: html
Angi menneskeår: 11
Dette tilsvarer 57.0 hundeår.
Eksempel: If-elif-else-setninger
................................
Her er noen eksempler på if-elif-else-setninger. Om uttrykket ved ``if`` ikke
har verdien ``True`` går Python videre til ``elif`` og sjekker om det
uttrykket har verdien ``True``, og kjører isåfall kodeblokken under.
Forskjellen mellom to ``if`` etter hverandre og ``if`` så ``elif`` er at om
uttrykket ved ``if`` har verdien ``True`` sjekkes ikke det i ``elif``'en. Om
man har to ``if`` etter hverandre sjekkes alltid begge uttrykkene.
Se bildet for et eksempel på kontrollflyten for en enkel if-elif-else-setning:
.. code-block:: python
# denne koden gjør det samme som bildet:
if a < b:
print("Smaller!")
elif a > b:
print("Bigger!")
elif a == b:
print("Same!")
.. image:: ./img/uke04_if_elif_else.png
:width: 400
:alt: control flow for if-elif-else statement evaluating ``a`` og ``b``
Last ned filen her: :download:`eksempel_if_elif.py `,
og kjør koden. Hvorfor blir det ulike resultater fra 'Flow 4' med ``elif`` og
'Flow 4' med bare ``if``?
.. literalinclude:: eks/eksempel_if_elif.py
Her er et annet eksempel av ``if-elif`` som er litt morsommere.
Tenk deg at du spiller The Witcher og du har nettopp kommet til byen.
Du møtt en fyr på puben, og må bestemme deg hva du skal gjør neste:
.. code-block:: python
pub_guy = "angry"
if pub_guy == "happy":
print("Let's have a pint!")
elif pub_guy == "demon":
print("Slay him")
else:
print("Grunt and walk away")
Kan du tegne et diagram for denne programflyten?
.. _uke_03_oppgave_4:
Oppgave 4
.........
Her skal vi gjøre nesten samme sak som i oppgave 1 igjen, men med en liten
forskjell. I filen ``uke_03_oppg_4.py`` skal du lage et program som leser inn
3 ord og skriver ut det lengste ordet. Om flere ord har den lengste lengden
skal programmet **bare skrive ut det første** ord.
Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøring:
.. code-block:: html
Skriv et ord: eple
Skriv et annet ord: banan
Skrive et siste ord: ananas
ananas
Oppgave 5
.........
Du finner :ref:`uke_03_oppgave_5` til slutten av siden.
Eksempel: Finn feilene
.......................
Her er noen eksempler på kode som ikke er riktig. Prøv å finn feilene uten å
kjøre koden først.
Last ned filen her: :download:`errors_1.py `. Finn feilen og
endre slik at koden går ann å kjøre.
Hva hvis en som besøker museumet er både en senior og en student? Endre koden
slik at denne personen betaler riktig pris (en person som tilhører to kategorier
betaler kun den billigste prisen).
.. literalinclude:: eks/errors_1.py
:linenos:
Oppgaver
--------
Oppgave 1
.........
Du finner :ref:`uke_03_oppgave_1` nedenfor Eksempel: If-sentninger.
Oppgave 2
.........
Du finner :ref:`uke_03_oppgave_2` nedenfor Eksempel: Modulo-operatoren.
Oppgave 3
.........
Du finner :ref:`uke_03_oppgave_3` nedenfor Eksempel: Turtle.
Oppgave 4
.........
Du finner :ref:`uke_03_oppgave_4` nedenfor Eksempel: If-elif-else sentninger.
.. _uke_03_oppgave_5:
Oppgave 5
.........
*Denne oppgaven kommer fra: Stephenson, Ben. "If Statement Exercises."
The Python Workbook. Springer, Cham, 2014. 15-27.*
Følgende tabell viser en oktav med tonene, som begynner med midten C, sammen med deres frekvenser:
===== ===== =============
Note Oktav Frekvens (Hz)
===== ===== =============
C 4 261.63
D 4 293.66
E 4 329.63
F 4 349.23
G 4 392.00
A 4 440.00
B 4 493.88
===== ===== =============
I denne oppgaven skal du skrive et program som tar som input først
en tone og dens oktav fra brukeren. Programmet skal skrive ut frekvensen til
tonen på den oktaven.
Når programmet ditt fungerer riktig for noter i tabellen bør du legge til støtte
for alle notatene fra C0 til C8. **IKKE** gjør det med veldig mange if-elif
sentninger. Prøv i stedet å bruke forholdet mellom noter i forskjellige oktaver:
frekvensen til en hvilken som helst tone i oktav *n* er halvparten av frekvensen
til den tilsvarende tonen i oktav *n* + 1
Ved å bruke dette forholdet kan du finne alle de andre notatene **uten** å legge
til flere saker i if-sentninger dine.
I filen ``uke_03_oppg_5.py``, skriv kode som gjør følgende, **i oppgitt rekkefølge**:
1. Spør brukeren om en tone og en oktav. Lagre hvert resultat i en ny variabel.
2. Beregne frekvensen til tonen (anta 4. oktav) ved å bruke dataene i tabellen ovenfor.
3. Del deretter frekvensen med 2\ :sup:`4-x`, hvor `x` er oktavtallet angitt av
brukeren for å få riktig frekvensen.
4. Skriv ut
.. note::
Husk at eksponenter skrives i Python som ``**``.
Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøringer.
.. code-block:: html
Enter note: C
Enter octave: 4
C4 is 261.63 Hz.
.. code-block:: html
Enter note: C
Enter octave: 0
C0 is 16.351875 Hz.
.. code-block:: html
Enter note: C
Enter octave: 8
C8 is 4186.08 Hz.