Logga in
| 11 sidor teori |
| 8 Uppgifter - Nivå 1 - 3 |
| Varje lektion är menad motsvara 1-2 lektioner i klassrummet. |
I den här lektionen går vi igenom följande begrepp:
När man programmerar kallas instruktionerna man skriver till datorn för kod. På samma sätt som människor kommunicerar med varandra på olika språk finns många olika programmeringsspråk, och koden skrivs på olika sätt beroende på vilket man valt. Man säger att språken har olika syntax.
print('Korv')
std::cout << "Korv";
Korvpå skärmen. Olika språk har olika fördelar och man väljer vilket man vill använda beroende på vad man ska programmera. Vissa är t.ex. mer lättlästa medan andra gör mer effektiva beräkningar.
Pröva som exempel att köra koden nedan genom att trycka på Redigera!
-knappen. Du kan också öppna ett blankt kodfönster via knappen Verktyg
uppe till höger. I så fall, eller om du använder en annan programmeringsmiljö än Mathleaks egen, får du kopiera eller skriva av koden nedan. Se till att koden är exakt likadan, annars är det inte säkert att det fungerar!
for tal in [1,2,3,4,5,6]: print(tal*2) if tal == 3: print('Halvvägs!')
Om du får ett felmeddelande, titta igenom koden och se till att den ser ut precis som ovan. Skulle problemet bestå kan det vara en god idé att testa en annan programmeringsmiljö. Om koden körs som den ska får man följande utskrift.
>
2
4
6
Halvvägs!
8
10
12
Om du inte förstår allt som händer i koden är det ingen fara. Det kommer att förklaras senare och för tillfället räcker det med att den fungerar. Men prova att ändra lite i koden för att se vad som händer. Fundera över frågorna nedan.
Startar!och
Färdigpå rätt ställen?
Inom programmering är operatorer tecken som används för att representera olika saker man kan göra. T.ex. representerar operatorn +
att man utför en addition och operatorn <
att man gör en jämförelse. De värden man använder operatorn på kallas operander.
Inom matematik används operatorerna +
, -
, *
och /
. Dessa används också i programmering av precis samma skäl: för att addera, subtrahera, multiplicera och dividera tal. I programmering skrivs potenser med operatorn **
, t.ex. 3**2
för 32. På miniräknare används ^
för detta, men i Python används den operatorn till annat. När flera operatorer används avgör prioriteringsreglerna hur uttrycket ska tolkas:
2+8/5
betyder 2+58(2+8)/5
betyder 52+8.Programmering kan ses som kommunikation med datorn, och utskrifter är datorns svar tillbaka till användaren. Kommandot print()
instruerar datorn att göra en utskrift, där man i parenteserna anger vad som ska skrivas ut. Det kan vara ett tal, en beräkning eller text. Men när man programmerar kallas det inte text
utan strängar. Textsträngar måste markeras med apostrofer som i exemplet nedan.
print(17)
print(9 + 3)
print('Detta är text')
>
17
12
Detta är text
När man använder flera printkommandon efter varandra på detta sätt hamnar utskrifterna på varsin rad. Om man vill att utskrifterna ska hamna på samma rad kan man skriva dem i samma printkommando separerade med komman.
print(17, 9 + 3, 'Detta är text')
>
17 12 Detta är text
Om man skriver text utan apostrofer i ett printkommando kommer Python att tolka det som ett variabelnamn och det som skrivs ut är variabelns värde.
x = 3
print(x)
>
3
När man skriver ut en kombination av text och värden blir det ofta ganska krångligt om man bara använder funktionaliteten i print()
. Då är funktionen format()
användbar, som finns inbyggd i datatypen sträng. Man använder format()
genom att sätta in klammerparenteser i sin sträng på de ställen där man vill sätta in värden. Sedan skriver man en punkt direkt efter den avslutande apostrofen, följt av format()
. Inne i parentesen skriver man de värden som ska sättas in istället för klammerparenteserna, i den ordning de ska sättas ut.
x = 15
y = 37
print('Det första talet är {} och det andra är {}'.format(x, y))
>
Det första talet är 15 och det andra är 37
De värden man sätter in behöver inte vara siffror utan kan exempelvis också vara andra strängar.
namn = 'Tindra'
print('Hej {}!'.format(namn))
>
Hej Tindra!
Skriv ett program som skriver ut Titta, text!
Exempelsvar
print('Titta, text!')
Använd kommandot print()
.
För att skriva ut något använder man kommandot print()
, där parenteserna innehåller det man vill skriva ut. Vi vill skriva ut meddelandet Titta, text!
så vi skriver in det innanför parentesen. För att Python ska förstå att det är en sträng, alltså text, sätter vi apostrofer runt meddelandet.
print('Titta, text!')
Kör man programmet får man följande utskrift.
>
Titta, text!
Mycket kan gå fel när man programmerar och Python försöker identifiera dessa fel när programmet körs. Då får man ett felmeddelande som anger på vilken rad, och ibland även var på raden, felet uppstod. Programmeringsfel delas upp i tre huvudkategorier.
print('Ena parentesen saknas!'
> File "__main__", line 1 print('Ena parentesen saknas!' ^
SyntaxError: Unbalanced bracket (
x
används utan att det getts en betydelse någonstans, så Python vet inte hur det ska användas.print(x)
>
Traceback (most recent call last): File "python", line 1, in <module>
NameError: name 'x' is not defined
print(10^2)
>
8
**
. Rätt sätt att skriva det är 10**2
.Muriel har skrivit ett program men när hon kör det får hon ett felmeddelande. Kör koden, tolka felmeddelandet och hjälp Muriel att laga programmet.
print('Hej, jag heter Muriel!')
print('Vad heter du?')
print('Jag programmerar!')
print('Det är kul!)
print('Vad gör du?')
print('Hej, jag heter Muriel!')
print('Vad heter du?')
print('Jag programmerar!')
print('Det är kul!')
print('Vad gör du?')
Text måste omges av apostrofer när print
-kommandot används.
Vi börjar med att köra koden för att se vilket felmeddelande vi får.
Traceback (most recent call last): File "python", line 4 print('Det är kul!) ^
SyntaxError: EOL while scanning string literal
SyntaxError
betyder att vi har fått ett syntaxfel, alltså att det finns ett fel i hur koden är skriven. Tittar vi där det står File "python", line 4
ser vi att det är på rad 4 som felet finns. På raden efter upprepas dessutom den rad där felet hittades.
print('Det är kul!)
Något har alltså gått fel när vi gör den utskriften. När man skriver ut text med kommandot print
ska man omsluta texten med apostrofer. I utskriften där det blir fel finns en apostrof i början men inte i slutet. Vi måste alltså lägga till det saknade tecknet för att programmet ska fungera.
print('Hej, jag heter Muriel!')
print('Vad heter du?')
print('Jag programmerar!')
print('Det är kul!')
print('Vad gör du?')
>
Hej, jag heter Muriel!
Vad heter du?
Jag programmerar!
Det är kul!
Vad gör du?
I det här fallet kan man faktiskt se att något är konstigt med koden redan innan man kört den. I koden har strängarna färgats gröna, men inte på rad 4. Programmeringsmiljön förstår inte att man har skrivit en sträng så den färglägger den inte. Då kan man anta att något har blivit fel där och att det kan vara en god idé att undersöka vad.
Varför får man fel när man kör följande kodrad och hur kan man få den att fungera?
Print(Kabanoss med ketchup och räksallad)
Traceback (most recent call last):
File "python", line 1
Print(Kabanoss med ketchup och räksallad)
^
SyntaxError: invalid syntax
Vi testar att köra kodraden som den är skriven, vilket ger följande felmeddelande.
Traceback (most recent call last): File "python", line 1 Print(Kabanoss med ketchup och räksallad)
^
SyntaxError: invalid syntax
Vi får ett syntaxfel, vilket innebär att det finns något fel i hur saker är skrivna. Kommandot försöker skriva ut Kabanoss med ketchup och räksallad
, vilket är text. I Python representeras text av strängar som måste vara inneslutna i apostrofer. Vi sätter dit dem.
Print('Kabanoss med ketchup och räksallad')
Trots detta får vi fortfarande fel när vi kör koden!
Traceback (most recent call last):
File "python", line 1, in <module>
NameError: name 'Print' is not defined
Nu är det dock ett NameError som dyker upp, alltså ett undantag. Felmeddelandet säger att vi försöker använda Print
som inte är definierat. Och det stämmer ju, kommandot för att skriva ut saker heter print
, med ett litet p. Vi fixar även det felet.
print('Kabanoss med ketchup och räksallad')
> Kabanoss med ketchup och räksallad
Nu får vi inga felmeddelanden och programmet skriver ut Kabanoss med ketchup och räksallad
, precis som vi ville.
Koden nedan ger ett felmeddelande när det körs. Vad är det som blir fel?
print(5*2/(3-1)+(8-2*3)/(5-(2+3)))
>
Traceback (most recent call last):
File "python", line 1, in <module>
ZeroDivisionError: division by zero
Om man kör koden får man följande felmeddelande.
Traceback (most recent call last):
File "python", line 1, in <module>
ZeroDivisionError: division by zero
Här är det sista raden som spelar roll. division by zero innebär att det blir division med noll någonstans i uttrycket, vilket är odefinierat. Då är det alltså kvoterna i uttrycket vi borde titta på: 5*2/(3-1) och (8-2*3)/(5-(2+3)). Dessa kan man antingen beräkna själv, eller testa separat i Python för att se vilken som inte fungerar. Problemet uppstår i det högra bråket, vars nämnare är noll: 5-(2+3) = 5-5 = 0. Eftersom det inte går att dela med noll fungerar inte programmet.
Moa och Tina har vägt sina marsvin. Moas väger 0,95, 1,1 och 1,25 kg, medan Tinas väger 0,8, 0,9, 1,05 och 1,05 kg. Gör ett program som skriver ut skillnaden mellan medelvikten på Moas och Tinas marsvin.
Ett medelvärde beräknas genom att lägga ihop alla värden och dela med antalet värden.
Medelvärde=Summa av värden/Antal värden
Summan av Moas marsvins vikter är 0.95+1.1+1.25
, och för att bestämma medelvärdet delar vi med 3. För att hela summan, inte bara en av vikterna, ska divideras med 3 måste vi komma ihåg att sätta ut parenteser.
(0.95+1.1+1.25)/3
Medelvikten för Tinas marsvin bestäms på samma sätt.
(0.8+0.9+1.05+1.05)/4
Skillnaden mellan dessa får vi genom att subtrahera det mindre från det större, och för att skriva ut resultatet måste allt sättas i ett print()
-kommando.
print((0.95+1.1+1.25)/3-(0.8+0.9+1.05+1.05)/4)
> 0.1499999999999999
Notera att det verkliga svaret är exakt 0,15kg, inte bara väldigt nära. Men Python har inget sätt att räkna exakt när det gäller decimaltal, utan det kan bara bli ungefär rätt. Därför måste man vara lite försiktig just med decimaltal i programmering och inte ta resultaten för bokstavligt. Heltal kan man däremot räkna helt exakt med!
Hur vet man vilket tal som är störst, och alltså i vilken ordning man ska subtrahera? Ett sätt är att använda abs()
runt differensen. Då beräknas differensens absolutbelopp, vilket gör resultatet positivt även om man subtraherat i fel
ordning som nedan.
print(abs((0.8+0.9+1.05+1.05)/4-(0.95+1.1+1.25)/3))
> 0.1499999999999999
När man programmerar vill man skriva kod som kan återanvändas. Då slipper man skriva ett helt nytt program för varje enskild beräkning man ska göra. Ett viktigt verktyg för det är att skriva funktioner. Detta kommer tas upp närmare senare, men i det här fallet kan man göra en medelvärdesfunktion som sedan kan användas två gånger.
def medelvarde(tallista): return sum(tallista)/len(tallista) print(medelvarde([0.95, 1.1, 1.25]) - medelvarde([0.8, 0.9, 1.05, 1.05]))
> 0.1499999999999999
Det här gör också koden mer läslig, så att man ser vad den gör utan att man behöver förstå hur alla delar fungerar.