P1 – Kapitel 3

Aktivitetsdiagram och pseudokod

När programmen blir större och mer komplicerade kan det vara bra att planera programmen innan man skriver dem i kod. Man kan jämföra det med att baka eller laga mat. Det krävs ett recept och receptet består av att du ska utföra vissa steg efter varandra. Detta kallas att koda i sekvens. Det är den typen av program du gjort så här långt. Men tänk dig att du gör en sockerkaka och i receptet står det att du kan välja att ha i kakao eller citron.

Aktivitetsdiagram på sockerkaka
Aktivitetsdiagram på sockerkaka. Diagrammet är gjort med programmet yEd. yED finns för båda Windows och Mac och är gratis.

Med aktivitetsdiagram är det lättare att se hur man ska tänka när man kodar. När man har ett val så kallas det för att koda i selektion. När man gör ett val som om fyllning är kakao, så sätts sant till vänster och falskt till höger. Om detta alltid görs behövs inte texterna om sant och falskt sättas ut.

Programmet om_mig.py som vi gjorde i förra kapitlet kan se ut så här med ett aktivitetsdiagram:

sekvens
Hur programmet om_mig.py kan se ut med ett aktivitetsdiagram

Samma kod kan göras som pseudokod istället:

skriv ut “Hej”
skriv ut “Vad är ditt förnamn”
Mata in förnamn
skriv ut “Vad är ditt efternamn”
Mata in efternamn
skriv ut “‘Hej!  + förnamn + ‘ ‘ + efternamn
skriv ut “Ditt förnamn: ‘+ förnamn + ‘ har ‘ + längden på förnamn + ‘ bokstäver’

Både aktivitetsdiagram och pseudokod ska vara så allmänt skrivna att det går att göra om dem till vilket programmeringsspråk som helst. Det finns inte endast ett korrekt sätt att göra detta på. Målet är att man ska ha med så mycket information att aktivitetsdiagram och pseudokod går att översätta till riktig kod.

if, elif och else

I programmering är det vanligt att koden inte körs i ordning. Ibland vill man att om ett villkor är sant så ska en sak hända annars en annan sak. Då använder man if-sats. Glöm inte sätta (:) efter if, elif och else. I Python har man valt att skriva ihop else if till elif. Tänk också på att göra ett indrag med tabbtangenten, annars fungerar inte programmet.

Du ska skapa programmet selektion.py. I koden används int() för att omvandla inmatningen från en sträng till ett heltal. Om man skulle omvandla till ett decimaltal kunde du använt float() istället. I Pseudokod blir programmet så här

Mata in talA
Mata in talB
Om talA är större än talB, skriv ut “talA är större än talB”
annars om talA är mindre än talB, skriv ut “talA är mindre än talB”
annars, skriv ut “talA är lika med talB”

#Mata in talA
talA = int(input('Mata in ett tal '))

#Mata in talB
talB = int(input('Mata in ett annat tal '))

#om talA är större än talB skriv ut det,
#annars om talA är mindre än talB skriv ut det,
#annars om de är lika skriv ut det

if talA > talB:
    print(talA,'är större än',talB)
elif talA < talB:
    print(talA,'är mindre än ',talB)
else:
    print(talA,'är lika med',talB)

Exempel på utskrift

Mata in ett tal 4
Mata in ett annat tal 7
4 är mindre än 7
Övningar

Övning 3.1

Gör ett program som kontrollerar om ett inmatat värde är positivt, negativt eller noll

 

while

Selektion
Hur programmet selektion.py kan se ut med ett aktivitetsdiagram

Skriv in koden i ett program som du kallar iteration.py. Iteration betyder upprepning.

#Mata in ett tal
tal = int(input('Mata in ett tal '))

#deklarera en variabel
summa = 0

#Så länge värdet i tal inte är lika med 0
# utför det som finns efter kolon(:) och är indraget
while tal != 0:
    #tilldela summan av värdena i variablerna
    #summa och tal variablen summa.
    summa = summa + tal

    tal = int(input('Mata in ett tal '))

print('Summan är',summa)
Exempel på utskrift

Mata in ett tal5
Mata in ett tal6
Mata in ett tal7
Mata in ett tal0
Summan är 18
iteration
Hur programmet iteration.py kan se ut med ett aktivitetsdiagram

break

I exemplet iteration.py avbryts loopen när man matar in en nolla, men det kan vara märkligt att avbtryta programmet när man mata in en nolla. Programmet iteration_break.py är en annan version där break används istället.

#Mata in ett tal
tal = int(input('Mata in ett tal '))
#Deklarera en Sträng val som sätts till 'j'. J som i "ja jag vill fortsätta"
val = 'j'

#deklarera en variabel
summa = 0

#Så länge val är 'j'
# utför det som finns efter kolon(:) och är indraget
while val == 'j':
    #tilldela summan av värdena i variablerna
    #summa och tal variablen summa.
    summa = summa + tal
    val = input('Vill du mata in ett tal till? (j/n) ')
    #Om du matat in 'j' fortsätter loopen
    if val == 'j':
        tal = int(input('Mata in ett tal '))
    #om du matat in något annat tecken avbryts loopen
    else:
        break

print('Summan är',summa)

for

När man inte vet hur många gånger man vill iterera en loop passar det bra att använda while. Men när man i förväg vet att loopen ska köras ett visst antal gånger är det bättre att använda for och range().

När man ska skapa en loop är det vanligt att använda varabelnamnet i. Du kan själv väja annat variabelnamn om det passar bättre. Skapa exemplet for.py. I den första forloopen står det for i in range(5). Det betyder att man deklarerar en variabel med namnet i och range(5) betyder att man startar på noll och går till fyra. 0, 1, 2, 3, 4 blir fem gånger. Så forloopen kommer att skriva ut texten loop nummer: (värdet på i) fem gånger.

Nästa exempel är range(1,6). Det betyder att loopen startar på 1 och går till 5. Så skillnaden mellan första och andra exemplet är att andra exemplet startar och slutar på ett värde högre. I programmering startar numrering oftast på noll istället på ett som du troligen är van vid.

Tredje exemplet med range(2, 10, 2) betyder att man startar på värdet 2 och går till 9 med två steg. I vårt exempel kan dock inte 9 skrivas ut för då hamnar man på 10 och enligt Python får man inte skriva ut 10 eller högre. Så vi kunde lika bra skrivit range(2, 9, 2).

Fjärde exemplet range(10, -11, -4) startar på 10 och minskar med 4 tills man når -10. Pröva att ändra i range för att se hur forloopen fungerar.

print('En forloop med range(5)')
for i in range(5):
    print('loop nummer:  (',i,')')

print('---------------------------')
print('En forloop med range(1,6)')
for varv in range(1,6):
    print('loop nummer:  (',varv,')')
print('---------------------------')
print('En forloop med range(2, 10, 2)')
for j in range(2, 10, 2):
    print('loop nummer:  (',j,')')
print('---------------------------')
print('En forloop med range(10, -11, -4)')
for i in range(10, -11, -4):
    print('loop nummer:  (',i,')')
print('---------------------------')
Utskrift

En forloop med range(5)
loop nummer: (0)
loop nummer: (1)
loop nummer: (2)
loop nummer: (3)
loop nummer: (4)
—————————
En forloop med range(1,6)
loop nummer: (1)
loop nummer: (2)
loop nummer: (3)
loop nummer: (4)
loop nummer: (5)
—————————
En forloop med range(2, 10, 2)
loop nummer: (2)
loop nummer: (4)
loop nummer: (6)
loop nummer: (8)
—————————
En forloop med range(10, -11, -4)
loop nummer: (10)
loop nummer: (6)
loop nummer: (2)
loop nummer: (-2)
loop nummer: (-6)
loop nummer: (-10)
—————————

continue

Istället för att avbryta loopen helt som med break, kan man använda continue istället. I iteration_continue.py används modulus som du läst om i kapitel 2.  Exempelvis 4%2 = 0 eftersom det inte finns någon rest kvar, 3%2 = 1 eftersom resten blir 1.

#for-satsen startar på 1 och går till 10
for i in range(1, 11):
    #om talet i är delbart med 2 skrivs detta ut.
    if i % 2 == 0:
        print(i,'är delbart med två')
        #med continue så avbryts den pågående loopen och man startar om från början av loopen
        #i detta exemplet körs inte print(i,' är ett heltal')
        continue
    print(i,'är ett heltal')

Utskrift

1 är ett heltal
2 är delbart med två
3 är ett heltal
4 är delbart med två
5 är ett heltal
6 är delbart med två
7 är ett heltal
8 är delbart med två
9 är ett heltal
10 är delbart med två

Booleska värden

Heltal (int), decimaltal (float) och Strängar (Strings) kan ha hur många värden som helst. Booleska värden kan bara vara sanna eller falska (true, false). Man skriver exempelvis:

#spam = True
spam = False

if spam == True:
    print("spam är sant")
elif spam == False:
    print("spam är falskt")
Utskrift

spam är falskt

ändra kommentaren så att spam = True. Vad händer med utskriften?

spam = True
#spam = False

if spam == True:
    print("spam är sant")
elif spam == False:
    print("spam är falskt")

Jämförelseoperatorer

OperatorBetydelse
==Lika med
!=Inte lika med
<mindre än
>större än
<=mindre än eller lika med
>=större än eller lika med

Kommer du ihåg att du kan använda Pythons IDLE till att pröva kod utan att skriva hela program. Skriv gärna in dessa exemplen på jämförelser och ändra på värdena och se om de blir True eller False

 

UttryckResultatFörklaring
13 == 13TrueDet är samma värde och båda är heltal
42 == 99FalseDe är olika värden
3 != 5TrueTre är inte lika med fem.
7 != 7FalseSju är inte lika med sju.
'hej' == 'hej'TrueSamma värden
'hej' == 'Hej'FalsePython skiljer mellan stor och liten bokstav. Därför blir det False
'hund' != 'katt'FalseOlika värden
True == TrueTrueSant är lika med sant. Fundera på vad False == False blir
13 == 13.0TrueÄven om ett heltal jämförs med ett decimaltal är de lika stora
13 == '13'FalseAlla tal som jämförs med strängar blir False
13.2 == 13FalseOlika stora värden
13 > 7True13 är större än sju
13 < 7False13 är mindre än sju är ett påstående som är falskt
13<=13True13 är mindre eller lika med 13. Tänk på vad 13 < 13 skulle bli.
7>=13FalseSju är större eller lika med 13 är falskt

Blanda inte ihop (=) med (==). Ett likamedstecken används för att tilldela ett värde från höger till vänster. Två likamedstecken är en jämförelse.

spam = 42 (tilldelning)

if spam == 42: (jämföresle)
print(‘spam är 42’)

Booleska operatorer

Booleska eller logiska operatorer gör att man kan sätta ihop två eller fler jämförelser. De du bör känna till är and, or och not

Vi börjar med ett exempel på hur man kan använda and och or.

'''
På en golfbana ligger ett vatten hinder 100 meter bort
hindret är 25 meter långt. Skriv ett program som talar
om du hamnat i vatten hindret eller inte
'''
langd = int(input('Hur långt?'))

if (langd > 100 and langd < 125):
# båda jämförelserna måste vara sanna för att få skriva
# ut print-satsen  
    print('Tyvärr kom du i vattnet')
else:
# om inte båda jämförelserna är sanna skrivs denna print-sats ut
    print('Du klarade dig')

'''
Det går att göra samma uppgift om man vänder på < och > och byter ut and mot or
och byter plats på 'Tyvärr kom du i vattnet' och 'Du klarade dig'
'''

if (langd < 100 or langd > 125):
# båda jämförelserna måste vara sanna för att få skriva
# ut print-satsen  
    print('Du klarade dig')
# om inte båda jämförelserna är sanna skrivs denna print-sats ut
else:
    print('Tyvärr kom du i vattnet')

I tabellen visas vilka fyra olika alternativ man kan få när man jämför två olika uttryck med and. Under det allmänna fallet finns ett exempel.

UttryckResultat
True and True
(3<5) and (7>2)
True
False and True
(3>5) and (7>2)
False
True and False
(4>1) and (6<2)
False
False and False
(3>4) and (5>8)
True

I tabellen visas vilka fyra olika alternativ man kan få när man jämför två olika uttryck med or. Under det allmänna fallet finns ett exempel.

UttryckResultat
True or True
(3<5) or (7>2)
True
False or True
(3>5) or (7>2)
True
True or False
(4>1) or (6<2)
True
False or False
(3>4) or (5>8)
False
Övningar

Övning 3.2

Gör ett program där användaren matar in sin ålder och får reda på om vad användaren får göra

    • 12 år och yngre: Du är ett barn
    • 13 år – 14 år: Du får utföra lättare arbete
    • 15 år : Du får se barnförbjudna filmer på bio och du får utföra lättare arbete
    • 16 år – 17 år: Du får se barnförbjudna filmer på bio. Du får starta egen firma och du får ta ett normalt arbete
    • 18 år och äldre: Du är myndig och får göra det mesta

Använd if, elif och else. Funktioner du kanske behöver använda är input(). Det går att lösa problemet på mer än ett sätt. Mer info om åldersgränser på BO

Förslag på utskrift om du matar in: 16

Mata in din ålder: 16
Du är 16 år. Du får se barnförbjudna filmer på bio. Du får starta egen firma och du får ta ett normalt arbete

Frågor

 

OBS Frågor från annan källa. Kommer att ändras

What are the two values of the Boolean data type? How do you

write them?

2. What are the three Boolean operators?

3. Write out the truth tables of each Boolean operator (that is, every

possible combination of Boolean values for the operator and what

they evaluate to).

4. What do the following expressions evaluate to?

(5 > 4) and (3 == 5)

not (5 > 4)

(5 > 4) or (3 == 5)

not ((5 > 4) or (3 == 5))

(True and True) and (True == False)

(not False) or (not True)

5. What are the six comparison operators?

6. What is the difference between the equal to operator and the assignment

operator?

7. Explain what a condition is and where you would use one.

8. Identify the three blocks in this code:

spam = 0

if spam == 10:

print(‘eggs’)

if spam > 5:

print(‘bacon’)

else:

print(‘ham’)

print(‘spam’)

print(‘spam’)

9. Write code that prints Hello if 1 is stored in spam , prints Howdy if 2 is

stored in spam , and prints Greetings! if anything else is stored in spam .

10. What can you press if your program is stuck in an infinite loop?

11. What is the difference between break and continue ?

12. What is the difference between range(10) , range(0, 10) , and range(0, 10, 1)

in a for loop?

13. Write a short program that prints the numbers 1 to 10 using a for loop.

Then write an equivalent program that prints the numbers 1 to 10 using

a while loop.

14. If you had a function named bacon() inside a module named spam , how

would you call it after importing spam ?

Extra credit:  Look up the round() and abs() functions on the Internet,

and find out what they do. Experiment with them in the interactive shell

Lämna en kommentar