Uke 4 — bool / if ================= Introduksjon ------------ Denne uken skal vi jobbe med booleans og if-statements i Python. Les den første delen av `kapittel 2 i Automate the Boring Stuff `_ frem til "*while* Loop Statements". Eksempler --------- Vi skal demonstrere hvordan du kan sammenligne (``<, >, ==, >=, <=``) uttrykk på ulike måter, og hvordan slike sammenligninger kan brukes i if-setninger. Eksempel 1 .......... Her vil du se noen eksempler på sammenligninger av tall og strenger. Strenger sammenlignes i alfabetisk rekkefølge. Last ned filen her: :download:`eksempel_1.py`, og kjør koden. Du kan prøve å skrive om rad 10 og 11 med f-strings. Prøv å sammenligninge noen andre uttrykk. .. literalinclude:: eksempel_1.py Eksempel 2 .......... Her er noen eksempler på de boolske operatorene ``and``, ``or`` og ``not``. * ``X and Y`` evaluerer til ``True`` om både ``X`` og ``Y`` evaluerer til ``True``. * ``X or Y`` evaluerer til ``True`` om enten ``X`` eller ``Y`` evaluerer til ``True``. * ``not X`` evaluerer til ``True`` om ``X`` evaluerer til ``False``. Last ned filen her: :download:`eksempel_2.py`. Skjønner du hva som skjer i de siste 8 radene? Hva blir ``test_4`` og hva tror du ``test_5`` blir? Kjør koden. Var det riktig? .. literalinclude:: eksempel_2.py Eksempel 3 .......... Her er noen eksempler på if-setninger. Om uttrykket ved ``if`` evaluerer til ``True`` kjøres kodeblokken under. Last ned filen her: :download:`eksempel_3.py`, og kjør koden. Hvorfor printes ingenting i den siste if-setningen? Kan du endre koden slik at noe blir skrevet ut fra den? .. literalinclude:: eksempel_3.py Eksempel 4 .......... Her er noen eksempler på if-else-setninger. Om uttrykket ved ``if`` ikke evalueres til ``True`` kjøres koden under ``else`` i stedet. Last ned filen her: :download:`eksempel_4.py`, og kjør koden. Hva returneres av funksjonene ``is_smaller()``, ``is_odd()`` og ``is_even()`` (et heltall, en float, en streng, etc.)? De siste 5 radene er eksempler på hvordan man kan bruke if-else som uttrykk i Python. Uttrykket ``A if X else B`` evalueres til ``A`` om ``X`` evalueres til ``True``, ellers evalueres det til ``B``. .. literalinclude:: eksempel_4.py Eksempel 5 .......... Her er noen eksempler på if-elif-else-setninger. Om uttrykket ved ``if`` ikke evalueres til ``True`` går Python videre til ``elif`` og sjekker om det uttrykket evalueres til ``True``, og kjører isåfall kodeblokken under. Forskjellen mellom to ``if`` etter hverandre og ``if`` så ``elif`` er at om uttrykket ved ``if`` evalueres til ``True`` sjekkes ikke det i ``elif``'en. Om man har to ``if`` etter hverandre sjekkes alltid begge uttrykkene. Last ned filen her: :download:`eksempel_5.py`, og kjør koden. Hvorfor blir det ulike resultater fra 'chain 4' med elif og 'chain 4' med bare if? I Python kan man bruke ``in`` for å sjekke om en bokstav eller en streng er en del av en annen streng. .. literalinclude:: eksempel_5.py Eksempel 6 .......... Her er noen eksempler på kode som ikke er riktig. Prøv å finne feilene uten å kjøre koden først. Last ned filen her: :download:`errors_1.py`. Finn feilen og endre så at koden går å 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:: errors_1.py Oppgaver -------- .. note:: Denne uken skal du levere koden på git. De siste ukene fikk du en ``git.app.uib.no``-konto (:doc:`../00-techsetup/README`), og vi begynte å bruke git (:doc:`../03-gitsetup/README`). Sjekk https://git.app.uib.no/ii/inf100/20h/assignments nå. Der finnes din kopi av ``inf100-uke04``, som inneholder fire ``oppgave_....py`` filer. Du skal clone prosjektet, editere filene, og pushe resultatet tilbake til serveren, slik som vi har gjort med ``test``-prosjektet tidligere. Oppgave 1 ......... I denne oppgaven skal vi fortsette på eksempelet med polynom fra forrige uke. I filen ``oppgave_1.py``, skriv kode hvor du definerer en funksjon ``poly_string(a,b,c)`` som tar tre **positive heltall eller 0** som argument, og returnerer strengen med andregradspolynomet (``ax^2 + bx + c``). Det første tallet er andregradskoeffisienten (``a``), det andre tallet er førstegradskoeffisienten (``b``) og det tredje tallet er konstanten (``c``). For eksempel, om funksjonen får tallene 3, 7 og 10, skal den returnere strengen ``"3x^2 + 7x + 10"``. * Om noen av tallene er ``0`` skal tilsvarende uttrykk ikke være med i strengen. * Om noen av de første to tallene er ``1``, f.eks ``1x^2``, skal ``1`` ikke skrives ut, bare ``x^2``. * Om alle tre tall er ``0`` skal strengen være ``"0"``. * Det skal være et mellomrom før og etter hvert plusstegn, men det skal ikke være mellomrom mellom koeffisientene og potensene av x. Se eksempelkjøringene. Når ditt program kjøres skal brukeren spørres om tre tall. Etterpå skal det tilsvarende andregradspolynomet skrives ut på skjermen. Du må bruke funksjonen du laget. Eksempelkjøring:: Angi koeffisient foran x^2: 3 Angi koeffisient foran x: 7 Angi konstantterm: 10 Ditt polynom er 3x^2 + 7x + 10. Eksempelkjøring:: Angi koeffisient foran x^2: 0 Angi koeffisient foran x: 16 Angi konstantterm: 0 Ditt polynom er 16x. Eksempelkjøring:: Angi koeffisient foran x^2: 1 Angi koeffisient foran x: 1 Angi konstantterm: 1 Ditt polynom er x^2 + x + 1. Eksempelkjøring:: Angi koeffisient foran x^2: 0 Angi koeffisient foran x: 0 Angi konstantterm: 0 Ditt polynom er 0. Oppgave 2 ......... Vi skal nå forbedre funksjonen fra oppgave 1. I filen ``oppgave_2.py`` skriv kode som gjør det **samme som i oppgave 1**, men nå skal funksjonen din **også kunne håndtere negative tall**. * Om en koeffisient er negativ skal den skrives med minustegn i stedet for et plusstegn før uttrykket: ``5x - 3``, ikke ``5x + -3``. * Et minustegn mellom to uttrykk skal ha et mellomrom før og etter. * Hvis uttrykket **begynner** med et negativt tall, skal du ikke ha mellomrom der: ``-5x^2``, ikke ``- 5x^2``. * Om den første eller andre koeffisienten er ``-1`` skall bare minustegnet, ikke ``1``, skrives ut. Se eksempelkjøringene. Eksempelkjøring:: Angi koeffisient foran x^2: -26 Angi koeffisient foran x: -5 Angi konstantterm: -9 Ditt polynom er -26x^2 - 5x - 9. Eksempelkjøring:: Angi koeffisient foran x^2: -1 Angi koeffisient foran x: -1 Angi konstantterm: -1 Ditt polynom er -x^2 - x - 1. Eksempelkjøring:: Angi koeffisient foran x^2: -13 Angi koeffisient foran x: 8 Angi konstantterm: 0 Ditt polynom er -13x^2 + 8x. Eksempelkjøring:: Angi koeffisient foran x^2: 20 Angi koeffisient foran x: -5 Angi konstantterm: 44 Ditt polynom er 20x^2 - 5x + 44. Oppgave 3 ......... I denne oppgaven skal brukeren bestemme hva programmet gjør. Våre øyne oppfatter lys med en bølgelengde fra 380 til 740 nanometer, eller med en frekvens fra 405 til 790 terahertz. Dette spektrumet kan deles opp ut fra fargene vi ser i henhold til følgende tabell: ======= ============= ============ Farge Bølgelengde Frekvens ======= ============= ============ fiolett 380--450 nm 680--790 THz blå 450--485 nm 620--680 THz cyan 485--500 nm 600--620 THz grønn 500--565 nm 530--600 THz gul 565--590 nm 510--530 THz oransje 590--625 nm 480--510 THz rød 625--740 nm 405--480 THz ======= ============= ============ I filen ``oppgave_3.py``, skriv et program som spør brukeren om en enhet, enten nanometer (``'nm'``) eller terahertz (``'THz'``), og en verdi (et tall). Programmet skal så skrive ut hvilken farge lyset med den enheten og den verdien har. For eksempel, om brukeren angir ``THz`` ``487`` skal programmet ditt skrive ut at lyset med den frekvensen er oransje. Om brukeren angir ``nm`` ``392`` skal programmet skrive ut at lyset med den bølgelengden er fiolett. Du kan anta at brukeren alltid angir gyldige verdier. Oppgave 4 ......... I denne oppgaven skal vi beregne om et gitt år er et skuddår eller ikke. 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 ``oppgave_4.py``, skriv kode som spør brukeren om et årstall, for å så skrive ut på skjermen om dette er et skuddår eller ikke. Du kan bruke Pythons modulooperator ``%`` til å beregne om et tall er deleligt med et annet tall. Du kan finne mer informasjon om denne operatorn i `Pythons dokumentasjon `_. Litt ekstra... -------------- Hva skriver ut dette programmet? Hvordan fungerer det? :: def chain(n): if n == 0: print('Done') else: print('X' * n) chain(n-1) chain(5)