Villkoret växer

När ett villkor inte räcker

Hittills har varje beslut i din kod hängt på en enda jämförelse: är poängen minst 90, är svaret lika med "ja". Men verkliga regler är sällan så enkla. Du släpps in på matchen om du har biljett och har fyllt arton. Du får rabatt om du är student eller pensionär. Och ibland är det som avgör inte ett värde du redan har, utan något som måste räknas ut först: är platsnumret jämnt eller udda?

Den här delen handlar om villkoret självt. Grenarna är desamma som i Konsten att välja, det är frågan i if-raden som växer.

and och or, kombinerade villkor

and och or låter dig kombinera flera villkor i ett enda uttryck: and kräver att båda sidor är sanna, or nöjer sig med minst en.

Editor

Redo.

Kör koden, du släpps in. Ändra sedan har_biljett till False, varför nekas du trots att du fyllt 18? Byt nu ut and mot or och kör igen, varför släpps du plötsligt in utan biljett? Prova till sist ålder = 16 med or kvar: vilket av de två villkoren är det som räddar dig?

Kombinationer av and och or i samma villkor är möjliga, men då blir utvärderingsordningen avgörande: and utvärderas före or, precis som multiplikation utvärderas före addition i matematik. Villkoret inloggad and är_admin or har_betalat läser Python alltså som (inloggad and är_admin) or har_betalat, och den som bara har betalat släpps in utan att vara inloggad. Skriv parenteserna själv så säger villkoret det du menade: if inloggad and (är_admin or har_betalat):.

Rest efter division, operatorn %

Ett villkor behöver inte vara en jämförelse rakt av. Ibland är det en uträkning som avgör, och den vanligaste av dem är frågan om ett tal är jämnt eller udda.

Python räknar ut resten efter en division med operatorn %, som uttalas Modulus (%) En aritmetisk operator som returnerar resten efter heltalsdivision. 7 % 2 blir 1, och 17 % 5 blir 2 för att 17 = 3×5 + 2. Används dels för att avgöra om ett tal är jämnt delbart, dels för att hålla tal inom ett bestämt intervall, som klockor, alfabetpositioner och cykliska system. Se: Villkoret växer :

Editor

Redo.

Läs av svaren. Tvåan går en hel gång i sjuan och lämnar 1 över. I åttan går den jämnt upp och lämnar 0. Fyran går tre hela gånger i femton och lämnar 3. Det är resten % svarar med, aldrig hur många hela gånger det gick.

Och där har du villkoret: ett tal är jämnt när tal % 2 blir 0, och udda annars.

Operatorn kan mer än så. Den är också det som får en räkning att börja om från början i stället för att bara växa, och den sidan av % behöver du när du bygger Caesar-chiffret i Position och modulus.

Uppgift: Vinstlotten

Skapa filen vinstlott.py. Ett lotteri har en regel som ingen utomstående begriper, och din uppgift är att koda den korrekt.

Regeln lyder: du vinner om du är medlem och lottnumret antingen är jämnt eller slutar på 7.

  1. Fråga efter lottnumret och gör om svaret till ett heltal. Fråga sedan om personen är medlem och spara svaret som ett booleskt värde, till exempel genom att jämföra inmatningen med "ja".

  2. Skriv regeln som ett enda villkor med and, or och parenteser. Att numret slutar på 7 tar du reda på med % 10.

  3. Skriv ut Vinst! eller Nitlott. beroende på utfallet.

  4. Testa med tabellen nedan innan du är nöjd.

MedlemLottnummerSka skriva ut
ja24Vinst!
ja17Vinst!
ja33Nitlott.
nej17Nitlott.

Den sista raden är den som avgör om parenteserna sitter rätt.

  1. Gå till Source Control-panelen i VS Code, stagea filen, skriv ett meningsfullt commit-meddelande och pusha.

Vad händer om

Ta bort parenteserna ur ditt villkor och kör de fyra testfallen igen. Vilken rad byter svar, och vad säger det om vad Python gjorde med villkoret när du inte talade om vad du menade?

Motivera & reflektera

Motivera hur du översatte regeln till kod. Var i villkoret sitter and och var sitter or, och hur vet du att en icke-medlem aldrig kan vinna?

Nästa nivå

Triangelfabriken. Tristian klassificerar trianglar för hand hela dagarna och vill bli av med jobbet. Skriv programmet som ersätter honom.

Programmet läser in tre vinklar som heltal, och du får lita på att de tillsammans blir 180 grader. Sedan svarar det med en av tre saker:

  • Rätvinklig om någon vinkel är exakt 90 grader.
  • Trubbig om någon vinkel är större än 90 grader.
  • Spetsig om alla tre vinklarna är mindre än 90 grader.

Testa med:

VinklarSka skriva ut
100, 40, 40Trubbig
90, 60, 30Rätvinklig
60, 60, 60Spetsig

Hela knepet sitter i två ord i reglerna ovan: någon och alla. Det ena blir ett or, det andra ett and. Läs reglerna en gång till innan du skriver villkoren, så slipper du gissa.

Uppgiften är en omskrivning av en övning från Programmeringsolympiaden.