commit aecb16fe01100bb4b5b4c8fd47558f8360cdbe97 Author: Jack-Benny Persson Date: Sat Jan 8 20:48:32 2022 +0100 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..7861293 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# Grunderna i programmering +Här finner du all exempelkod för *Grunderna i programmering (andra utgåvan)* +(ISBN: 978-91-983300-5-2). + +Boken går att köpa från [CyberInfo Sverige](https://www.cyberinfo.se/bocker/), +[Bokus](https://www.bokus.com/bok/9789198330052/grunderna-i-programmering/) och +[Adlibris](https://www.adlibris.com/se/bok/grunderna-i-programmering-9789198330052). + +Är du nyfiken på boken så titta gärna i [innehållsförteckningen](https://www.cyberinfo.se/dokument/gip_innehallsforteckning_2a_utg.html). + +## Errata +Trots flera korrekturläsningar och testkörningar av koden har två fel kommit +med i boken. + +* Kodexemplet på sidan 103 saknar kolon och parenteser. Rätt +kod [finns här](sidan_103_ex1.py). +* Det första kodexemplet på sidan 104 har ett felaktigt variabelnamn. Rätt +kod [finns här](sidan_104_ex1.py). + +## Baksidetexten +**Grunderna i programmering** lär ut de grunder du behöver för att komma igång +med programmering i Python och Scratch. Boken börjar med en kort genomgång av +Scratch, och visar med några exempel på hur Scratch kan vara användbart för att +förstå grundläggande koncept i programmering. I denna introduktion får vi också +se hur Pythonkod och Scratchkod faktiskt liknar varandra. + +Därefter går vi vidare med att utforska Python, vilket också är huvudinnehållet +i boken. Men innan vi kastar oss in i programmeringens värld får vi en +genomgång av hur datorn är uppbyggd, och var i datorn saker som kod, variabler, +program med mera sparas. Vi får också se hur allting i datorn hänger samman. +När vi väl har denna förståelse är det dags för programmeringen. Vi börjar med +datatyper och går sedan vidare med if-satser, loopar, standardbiblioteket och +allt som vi behöver kunna för att börja programmera. Allting avslutas med ett +större projekt. + +Boken var från början tänkt som studiematerial till kurser i programmering men +går utmärkt att använda på egen hand för självstudier. Bokens grundtanke är att +lära ut programmering som helhet även om Python används i bokens huvuddel. + +Denna utgåvan har uppdaterats för Scratch 3.0 och Python 3.8. En lång rad andra +uppdateringar och förbättringar har också gjorts. + +## Framsidan +![Grunderna i programmering](gip_omslagsbild_2a_utg.png) diff --git a/gip_omslagsbild_2a_utg.png b/gip_omslagsbild_2a_utg.png new file mode 100644 index 0000000..8b1e706 Binary files /dev/null and b/gip_omslagsbild_2a_utg.png differ diff --git a/sidan_101_ex1.py b/sidan_101_ex1.py new file mode 100644 index 0000000..1dde432 --- /dev/null +++ b/sidan_101_ex1.py @@ -0,0 +1,3 @@ +x = 10 +if not (x > 15): + print ("Sant, eftersom 10 INTE är större än 15") diff --git a/sidan_103_ex1.py b/sidan_103_ex1.py new file mode 100644 index 0000000..dcaab22 --- /dev/null +++ b/sidan_103_ex1.py @@ -0,0 +1,11 @@ +x = 10 +y = 15 + +if ((x > 5) and (y < 10)): + print ("Jag kommer aldrig skrivas ut") + +if ((x > 5) or (y < 10)): + print ("Däremot kommer jag att skrivas ut") + +if ((x == 10) and (y > 12)): + print ("Jag kommer också att skrivas ut") diff --git a/sidan_104_ex1.py b/sidan_104_ex1.py new file mode 100644 index 0000000..8731e0a --- /dev/null +++ b/sidan_104_ex1.py @@ -0,0 +1,3 @@ +namn = input("Ange namn: ") +print ("Hej " + namn) +print (type(namn)) diff --git a/sidan_104_ex2.py b/sidan_104_ex2.py new file mode 100644 index 0000000..23e9330 --- /dev/null +++ b/sidan_104_ex2.py @@ -0,0 +1,7 @@ +x = input("Ange basen: ") +y = input("Ange exponenten: ") +x = float(x) +y = float(y) +s = x**y +print (str(x) + " upphöjt till " + str(y) + " blir " + \ +str(s)) diff --git a/sidan_105_ex1.py b/sidan_105_ex1.py new file mode 100644 index 0000000..be6f007 --- /dev/null +++ b/sidan_105_ex1.py @@ -0,0 +1,6 @@ +x = input("Ange basen: ") +y = input("Ange exponenten: ") +x = float(x) +y = float(y) +s = x**y +print ("%.1f upphöjt till %.1f blir %.1f" %(x, y, s)) diff --git a/sidan_107_ex1.py b/sidan_107_ex1.py new file mode 100644 index 0000000..cedce76 --- /dev/null +++ b/sidan_107_ex1.py @@ -0,0 +1,6 @@ +a = "Hej" +b = "Kalle" +x = 5 +y = 4 +print ("%s %s" %(a, b)) +print ("%d+%d=%d" %(x, y, x+y)) diff --git a/sidan_110_ex1.py b/sidan_110_ex1.py new file mode 100644 index 0000000..fbe0688 --- /dev/null +++ b/sidan_110_ex1.py @@ -0,0 +1,3 @@ +lista = ["Kalle", "Lisa", "Linda"] +for namn in lista: + print ("Hej %s, hur är läget?" %namn) diff --git a/sidan_111_ex1.py b/sidan_111_ex1.py new file mode 100644 index 0000000..02c5a8a --- /dev/null +++ b/sidan_111_ex1.py @@ -0,0 +1,3 @@ +celsius = [10, 15, 20, 25, 30] +for c in celsius: + print ("%dC = %dF" %(c, (c*1.8)+32)) diff --git a/sidan_113_ex1.py b/sidan_113_ex1.py new file mode 100644 index 0000000..a77bdb7 --- /dev/null +++ b/sidan_113_ex1.py @@ -0,0 +1,2 @@ +for c in range(-20, 30, 3): + print ("%dC = %dF" %(c, (c*1.8)+32)) diff --git a/sidan_116_ex1.py b/sidan_116_ex1.py new file mode 100644 index 0000000..6e8bdec --- /dev/null +++ b/sidan_116_ex1.py @@ -0,0 +1,15 @@ +konton = {"Kalle": 300, "Joakim": 1800, "Lisa": 900} + +hogst = 0 +rikast = str() + +for i, j in konton.items(): + print(i, j) + if (hogst == 0): + hogst = j + rikast = i + if (j > hogst): + hogst = j + rikast = i + +print (rikast, "är rikast!") diff --git a/sidan_119_ex1.py b/sidan_119_ex1.py new file mode 100644 index 0000000..3aeb80d --- /dev/null +++ b/sidan_119_ex1.py @@ -0,0 +1,4 @@ +counter = 5 +while counter > 0: + print (counter) + counter = counter - 1 diff --git a/sidan_121_ex1.py b/sidan_121_ex1.py new file mode 100644 index 0000000..ff317d5 --- /dev/null +++ b/sidan_121_ex1.py @@ -0,0 +1,5 @@ +while True: + text = input("Skriv något: ") + if (text == "klar"): + break + print (text) diff --git a/sidan_122_ex1.py b/sidan_122_ex1.py new file mode 100644 index 0000000..dfeb9cb --- /dev/null +++ b/sidan_122_ex1.py @@ -0,0 +1,4 @@ +for i in [1, 2, 3, 4, 5]: + if (i == 3): + continue + print (i) diff --git a/sidan_123_ex1.py b/sidan_123_ex1.py new file mode 100644 index 0000000..2c6080c --- /dev/null +++ b/sidan_123_ex1.py @@ -0,0 +1,9 @@ +a = [1, 2, 3, 4] +b = [5, 6, 7, 8] + +for i in a: + print ("\n" + str(i)) + for j in b: + print (" " + str(j)) + if j == 6: + break diff --git a/sidan_124_ex1.py b/sidan_124_ex1.py new file mode 100644 index 0000000..e5536d0 --- /dev/null +++ b/sidan_124_ex1.py @@ -0,0 +1,12 @@ +antal = 0 +summa = 0 + +while True: + x = input("Ange tal: ") + if (x == "klar"): + break + x = float(x) + summa = summa + x + antal = antal + 1 + +print ("Medelvärdet är %.1f" %(summa/antal)) diff --git a/sidan_131_ex1.py b/sidan_131_ex1.py new file mode 100644 index 0000000..7cb97ff --- /dev/null +++ b/sidan_131_ex1.py @@ -0,0 +1,3 @@ +fil = open('filtest.txt', 'w') +fil.write('Hejsan svejsan\nHur är läget?') +fil.close() diff --git a/sidan_132_ex1.py b/sidan_132_ex1.py new file mode 100644 index 0000000..4f0a5bb --- /dev/null +++ b/sidan_132_ex1.py @@ -0,0 +1,3 @@ +fil = open("filtest.txt") +print (fil.read()) +fil.close() diff --git a/sidan_133_ex1.py b/sidan_133_ex1.py new file mode 100644 index 0000000..5690e46 --- /dev/null +++ b/sidan_133_ex1.py @@ -0,0 +1,7 @@ +fil = open("filtest.txt") +print (fil.read()) +print ("\nFilens namn:", fil.name) +print ("Filens läge:", fil.mode) +print ("Är filen stängd?", fil.closed) +fil.close() +print ("Är filen stängd?", fil.closed) diff --git a/sidan_136_ex1.py b/sidan_136_ex1.py new file mode 100644 index 0000000..3138fe3 --- /dev/null +++ b/sidan_136_ex1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +# alice.py, version 1 + +# Skapa en ordlista som ska användas för att räkna ord +rakna = dict() + +# Öppna filen med open, läs in innehållet till 'innehall' +# och byt ut tecknen ,.' mot mellanslag. Gör sen om +# allt till små bokstäver +fil = open("alice.txt") +innehall = fil.read() +innehall = innehall.replace(",", " ").replace(".", " ")\ + .replace("'", " ").lower() + +# Dela upp hela innehållet i enstaka ord i en lista +ord = innehall.split() + +# Loopa igenom ord för ord. Om ordet inte redan finns +# i 'rakna' läggs det in och sätts till 1. Om det +# redan finns, addera med 1. +for o in ord: + if (o not in rakna): + rakna[o] = 1 + else: + rakna[o] = rakna[o] + 1 + +# Vänd på nyckel och värde +omvand = dict() +for k, v in rakna.items(): + omvand[v] = k + +# Sortera i omvänd ordning +sorterad = sorted(omvand.items(), reverse=True) + +# Skriv ut de 10 mest frekventa orden och hur +# hur många gånger de förekommer +hogsta = 0 +for i, j in sorterad: + print (j, "\t", i) + hogsta = hogsta + 1 + if hogsta == 10: + break diff --git a/sidan_140_ex1.py b/sidan_140_ex1.py new file mode 100644 index 0000000..dc0132b --- /dev/null +++ b/sidan_140_ex1.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +# alice.py, version 2 + +# Skapa en ordlista som ska användas för att räkna ord +rakna = dict() + +# Öppna filen med open, läs in innehållet till 'innehall' +# och byt ut tecknen ,.' mot mellanslag samt gör om allt +# till små bokstäver. +fil = open("alice.txt") +innehall = fil.read().replace(",", " ").replace(".", " ")\ + .replace("'", " ").lower() + +# Dela upp hela innehållet i enstaka ord i en lista +ord = innehall.split() + +# Loopa igenom ord för ord, om ordet inte redan finns lägg +# in ordet, sätt standardvärde 0 och addera 1. Om ordet +# redan finns, addera bara 1 till ordet. +for o in ord: + rakna[o] = rakna.get(o, 0) + 1 + +# Specialfunktion som gör att nyckeln hämtas från en ny +# egen funktion och returneras direkt från ordlistan +# (värdet). +sorterad = sorted(rakna.items(), key=lambda x: x[1], \ + reverse=True) + +# Skriv ut de 10 mest förekomna orden tillsammans med +# antalet. +hogsta = 0 +for i, j in sorterad: + print (i, "\t", j) + hogsta += 1 + if hogsta == 10: + break diff --git a/sidan_145_ex1.py b/sidan_145_ex1.py new file mode 100644 index 0000000..8df5b0d --- /dev/null +++ b/sidan_145_ex1.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +# Valutaomräkningsprogram, version 1 +import pickle + +ladda = input("Vill du ladda tidigare kurs? (j/n): ") +if (ladda == "j"): + kurs = pickle.load(open('kurs.p', 'rb')) +elif (ladda == "n"): + kurs = float(input("Ange ny USD-kurs: ")) + pickle.dump(kurs,open('kurs.p', 'wb')) +else: + print ("Var god svara (j)a eller (n)ej") + quit() + +usd = float(input("Ange summa i USD: ")) +print ("%.2f USD motsvarar %.2f SEK" \ + %(usd, usd*kurs)) diff --git a/sidan_149_ex1.py b/sidan_149_ex1.py new file mode 100644 index 0000000..ff9cafb --- /dev/null +++ b/sidan_149_ex1.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# Valutaomräkningsprogram, version 2 +import pickle + +ladda = input("Vill du ladda tidigare kurs? (j/n): ") +if (ladda == "j"): + try: + kurs = pickle.load(open('kurs.p', 'rb')) + except FileNotFoundError: + print ("Det finns ingen tidigare sparad kurs.") + kurs = float(input("Ange ny USD-kurs: ")) + pickle.dump(kurs,open('kurs.p', 'wb')) +elif (ladda == "n"): + kurs = float(input("Ange ny USD-kurs: ")) + pickle.dump(kurs,open('kurs.p', 'wb')) +else: + print ("Var god svara (j)a eller (n)ej") + quit() + +usd = float(input("Ange summa i USD: ")) +print ("%.2f USD motsvarar %.2f SEK" \ + %(usd, usd*kurs)) diff --git a/sidan_152_ex1.py b/sidan_152_ex1.py new file mode 100644 index 0000000..d01b1c2 --- /dev/null +++ b/sidan_152_ex1.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + +while True: + try: + tal = int(input("Skriv ett heltal: ")) + except: + print ("Skriv endast heltal") + else: + print ("Du skrev", tal) + break diff --git a/sidan_153_ex1.py b/sidan_153_ex1.py new file mode 100644 index 0000000..ca5f7d1 --- /dev/null +++ b/sidan_153_ex1.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# Valutaomräkningsprogram, version 3 +import pickle + +# Fråga användaren om han vill ladda en tidigare kurs +ladda = input("Vill du ladda tidigare kurs? (j/n): ") +if (ladda == "j"): + + # Påbörja felhanteringen för filöppningen + try: + kurs = pickle.load(open('kurs.p', 'rb')) + # Om filen inte finns, skriv ut ett meddelande + # och fråga användaren om en ny kurs (om och om + # igen till tills ett tal har lästs in). Spara + # sedan den nya kursen. + except FileNotFoundError: + print ("Det finns ingen tidigare sparad kurs.") + while True: + try: + kurs = float(input("Ange ny USD-kurs: ")) + except ValueError: + print ("Ange endast flyttal eller heltal") + else: + pickle.dump(kurs,open('kurs.p', 'wb')) + break + # Om vi inte har rättigheter att läsa filen, avsluta + # och skriv ut ett felmeddelande. + except PermissionError: + print ("Något är fel med rättigheterna för kurs.p") + quit() +elif (ladda == "n"): + # Repetera tills ett flyttal har lästs in. + while True: + try: + kurs = float(input("Ange ny USD-kurs: ")) + except ValueError: + print ("Ange endast flyttal eller heltal") + else: + pickle.dump(kurs,open('kurs.p', 'wb')) + break +else: + print ("Var god svara (j)a eller (n)ej") + quit() + +# Repetera tills ett flytttal har lästs in som SEK +while True: + try: + usd = float(input("Ange summa i USD: ")) + except ValueError: + print ("Ange endast flyttal eller heltal") + else: + break +# Skriv ut svaret +print ("%.2f USD motsvarar %.2f SEK" \ + %(usd, usd*kurs)) diff --git a/sidan_158_ex1.py b/sidan_158_ex1.py new file mode 100644 index 0000000..2b18447 --- /dev/null +++ b/sidan_158_ex1.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +def artig(namn): + print("Hej",namn + ", hur mår du idag?") + +artig("Kalle") diff --git a/sidan_160_ex1.py b/sidan_160_ex1.py new file mode 100644 index 0000000..12b633c --- /dev/null +++ b/sidan_160_ex1.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +def hej(): + print ("Jag kommer bara att säga hej") + +hej() diff --git a/sidan_160_ex2.py b/sidan_160_ex2.py new file mode 100644 index 0000000..2bb9af4 --- /dev/null +++ b/sidan_160_ex2.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +def ranta(kr, ranta, ar): + ranta = (ranta / 100) + 1 + svar = kr*ranta**ar + print (svar) + +pengar = float(input("Ange hur mycket pengar du har \ +på kontot: ")) +procentRanta = float(input("Ange ränta i procent: ")) +antalAr = float(input("Hur många år ska pengarna stå på \ +kontot? ")) + +ranta(pengar, procentRanta, antalAr) diff --git a/sidan_162_ex1.py b/sidan_162_ex1.py new file mode 100644 index 0000000..cdd379e --- /dev/null +++ b/sidan_162_ex1.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +def ranta(kr, ranta, ar): + ranta = (ranta / 100) + 1 + svar = kr*ranta**ar + print (svar) + +pengar = float(input("Ange hur mycket pengar du \ +har på kontot: ")) +procentRanta = float(input("Ange ränta i procent: ")) +antalAr = float(input("Hur många år ska pengarna stå \ +på kontot? ")) + +ranta(ar = antalAr, ranta = procentRanta, kr = pengar) diff --git a/sidan_163_ex1.py b/sidan_163_ex1.py new file mode 100644 index 0000000..345e214 --- /dev/null +++ b/sidan_163_ex1.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +def ranta(kr, ranta, ar): + ranta = (ranta / 100) + 1 + svar = kr*ranta**ar + return (svar) + +pengar = float(input("Ange hur mycket pengar du har \ +på kontot: ")) +procentRanta = float(input("Ange ränta i procent: ")) +antalAr = float(input("Hur många år ska pengarna stå på \ +kontot? ")) + +# Spara till variabel och använd i print +tot = ranta(ar = antalAr, ranta = procentRanta, kr = \ + pengar) +print ("Jag har", tot, "kr på kontot efter", antalAr, \ + "år") + +# Samma funktion, fast med andra värden +print ("Med 30000 kr med 3% ränta har du", \ + ranta(30000, 3, 8), "kr efter 8 år") + +# Använd i en ny beräkning +print ("Dubbelt upp blir", (ranta(pengar, procentRanta, \ + antalAr)*2)) diff --git a/sidan_165_ex1.py b/sidan_165_ex1.py new file mode 100644 index 0000000..a249240 --- /dev/null +++ b/sidan_165_ex1.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + +var = "Lisa" + +def funk1(): + var = "Kalle" + return var + +print ("Inuti funk1 är 'var':", funk1()) +print ("Globalt är 'var':", var) diff --git a/sidan_166_ex1.py b/sidan_166_ex1.py new file mode 100644 index 0000000..ec6ae79 --- /dev/null +++ b/sidan_166_ex1.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +var = "Lisa" + +def funk1(): + var = "Kalle" + return var + +var = "Anna" + +print ("Inuti funk1 är 'var':", funk1()) +print ("Globalt är 'var':", var) diff --git a/sidan_166_ex2.py b/sidan_166_ex2.py new file mode 100644 index 0000000..7febe1e --- /dev/null +++ b/sidan_166_ex2.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +y = 8 + +def kvadrat(x): + print ("Globalt y = ", y) + return x**2 + +def kub(z): + print ("Globalt y = ", y) + return z**3 + +print (kvadrat(5)) +print (kub(5)) diff --git a/sidan_168_ex1.py b/sidan_168_ex1.py new file mode 100644 index 0000000..de29514 --- /dev/null +++ b/sidan_168_ex1.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 + +var = "Lisa" + +def funk1(): + global var + var = "Kalle" + return var + +print ("Inuti funk1 är 'var':", funk1()) +print ("Globalt är 'var':", var) diff --git a/sidan_169_ex1.py b/sidan_169_ex1.py new file mode 100644 index 0000000..a9b2e15 --- /dev/null +++ b/sidan_169_ex1.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 + +def ranta(kr, ranta=2, ar=1): + ranta = (ranta / 100) + 1 + svar = kr*ranta**ar + return (svar) + +print(ranta(55000)) diff --git a/sidan_171_ex1.py b/sidan_171_ex1.py new file mode 100644 index 0000000..255425b --- /dev/null +++ b/sidan_171_ex1.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +# alice.py, version 3 + +# Denna funktion ersätter lambda +def funk(x): + return x[1] + +rakna = dict() +fil = open("alice.txt") +innehall = fil.read().replace(",", " ").replace(".", " ")\ + .replace("'", " ").lower() +ord = innehall.split() + +for o in ord: + rakna[o] = rakna.get(o, 0) + 1 + +# key=funk ersätter lambda från förra versionen +sorterad = sorted(rakna.items(), key=funk, reverse=True) + +hogsta = 0 +for i, j in sorterad: + print (i, "\t", j) + hogsta += 1 + if hogsta == 10: + break diff --git a/sidan_172_ex1.py b/sidan_172_ex1.py new file mode 100644 index 0000000..cef15b0 --- /dev/null +++ b/sidan_172_ex1.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 + +def fPlus(x): + return x + 1 + +lPlus = lambda x: x + 1 + +print (fPlus(5)) # Den vanliga funktionen +print (lPlus(10)) # Lambda-funktionen diff --git a/sidan_173_ex1.py b/sidan_173_ex1.py new file mode 100644 index 0000000..c877e84 --- /dev/null +++ b/sidan_173_ex1.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +addera = lambda x: x + 3 +multi = lambda x: addera(x * 3) + +print (multi(5)) diff --git a/sidan_174_ex1.py b/sidan_174_ex1.py new file mode 100644 index 0000000..c0c0e8e --- /dev/null +++ b/sidan_174_ex1.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +def kvadrat(x): + """Denna funktion 'höjer upp' x med 2, + alltså får vi kvadraten på ett tal x.""" + return x**2 + +def kub(x): + """Denna funktion 'höjer upp' x med 3, + alltså får vi kuben på ett tal x.""" + return x**3 + +print (help(kub)) diff --git a/sidan_176_ex1.py b/sidan_176_ex1.py new file mode 100644 index 0000000..e1018ba --- /dev/null +++ b/sidan_176_ex1.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# Filen minmatte.py + +def kvadrat(x): + """Denna funktion 'höjer upp' x med 2, + alltså får vi kvadraten på ett tal x.""" + return x**2 + +def kub(x): + """Denna funktion 'höjer upp' x med 3, + alltså får vi kubiken på ett tal x.""" + return x**3 diff --git a/sidan_176_ex2.py b/sidan_176_ex2.py new file mode 100644 index 0000000..3a90bf7 --- /dev/null +++ b/sidan_176_ex2.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 +# Filen rakna.py + +import minmatte + +print (minmatte.kub(5)) diff --git a/sidan_177_ex1.py b/sidan_177_ex1.py new file mode 100644 index 0000000..47fed2e --- /dev/null +++ b/sidan_177_ex1.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# Filen rakna.py + +from minmatte import * + +print (kub(5)) +print (kvadrat(5)) diff --git a/sidan_177_ex2.py b/sidan_177_ex2.py new file mode 100644 index 0000000..6b48861 --- /dev/null +++ b/sidan_177_ex2.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# Filen rakna.py + +from minmatte import kub + +print (kub(5)) +print (kvadrat(5)) diff --git a/sidan_183_ex1.py b/sidan_183_ex1.py new file mode 100644 index 0000000..04e1f33 --- /dev/null +++ b/sidan_183_ex1.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +import datetime + +veckodagar = ["måndag", "tisdag", "onsdag", + "torsdag", "fredag", "lördag", + "söndag"] + +ar = int(input("Ange år med fyra tecken: ")) + +print ("Julafton år", str(ar), "är en", +veckodagar[datetime.date(ar, 12, 24).weekday()]) diff --git a/sidan_185_ex1.py b/sidan_185_ex1.py new file mode 100644 index 0000000..c53d6db --- /dev/null +++ b/sidan_185_ex1.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +import math + +try: + t = int(input("Ange täljaren: ")) + n = int(input("Ange nämnaren: ")) +except ValueError: + exit("Ange endast heltal") + +sgd = math.gcd(t, n) + +print ("SGD är:", str(sgd)) +print (str(t) + "/" + str(n), "=", \ + str(int(t/sgd)) + "/" + str(int(n/sgd))) diff --git a/sidan_192_ex1.py b/sidan_192_ex1.py new file mode 100644 index 0000000..063215f --- /dev/null +++ b/sidan_192_ex1.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +import urllib.request + +# Vi börjar med att skapa ett objekt +url = urllib.request.urlopen\ + ("http://jackbenny.se/test.html") + +# Nu läser vi in HTML-dokumentet +html = url.read() + +# Därefter måste vi omkoda byte till en sträng för att +# t.ex. radbrytningar ska fungera korrekt +htmlUtf = html.decode("utf-8") + +# Visa HTML-dokumentet +print (htmlUtf) diff --git a/sidan_198_ex1.py b/sidan_198_ex1.py new file mode 100644 index 0000000..370bad0 --- /dev/null +++ b/sidan_198_ex1.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# Filen husdjur.py + +class Husdjur: + + # Skapa grunden och attributen + def __init__(self, namn, art, + farg, laten, atit=0): + self.namn = namn + self.art = art + self.farg = farg + self.laten = laten + self.atit = atit + + def gorLjud(self): + print (str(self.laten + " ") * 3) + + def mata(self): + print (self.namn, "äter sin mat.") + self.atit = self.atit + 1 + print (self.namn, "har ätit", self.atit, "ggr.") + + def __str__(self): + return ("%s är en %s %s" % + (self.namn, self.farg, self.art)) diff --git a/sidan_201_ex1.py b/sidan_201_ex1.py new file mode 100644 index 0000000..7c3d681 --- /dev/null +++ b/sidan_201_ex1.py @@ -0,0 +1,17 @@ +class Hund(Husdjur): + def __init__(self, namn, farg, ras, atit=0): + Husdjur.__init__(self, namn=namn, farg=farg, + atit=atit, art="hund", laten="Voff") + self.ras = ras + + def vilkenRas(self): + return (self.namn + " är en " + self.ras) + +class Katt(Husdjur): + def __init__(self, namn, farg, ras, atit=0): + Husdjur.__init__(self, namn=namn, farg=farg, + atit=atit, art="katt", laten="Mjau") + self.ras = ras + + def vilkenRas(self): + return (self.namn + " är en " + self.ras) diff --git a/sidan_206_ex1.py b/sidan_206_ex1.py new file mode 100644 index 0000000..0946c2a --- /dev/null +++ b/sidan_206_ex1.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import urllib.request + +# Vi börjar med att skapa ett objekt +url = urllib.request.urlopen\ + ("http://jackbenny.se/logg.txt") + +# Nu läser vi in loggfilen +loggfil = url.read() + +# Därefter måste vi omkoda byte till en sträng för att +# t.ex. radbrytningar ska fungera korrekt +loggfilUtf = loggfil.decode("utf-8") + +print (loggfilUtf) diff --git a/sidan_208_ex1.py b/sidan_208_ex1.py new file mode 100644 index 0000000..da6c076 --- /dev/null +++ b/sidan_208_ex1.py @@ -0,0 +1,5 @@ +# Dela upp strängen i enstaka rader istället +rader = loggfilUtf.splitlines() + +# Testa att skriva ut tredje raden +print (rader[2]) diff --git a/sidan_209_ex1.py b/sidan_209_ex1.py new file mode 100644 index 0000000..5cd5e55 --- /dev/null +++ b/sidan_209_ex1.py @@ -0,0 +1,3 @@ +for rad in rader: + if "Invalid user" in rad: # Rader som har Invalid user + print (rad) # Skriv ut rader som har 'Invalid user' diff --git a/sidan_209_ex2.py b/sidan_209_ex2.py new file mode 100644 index 0000000..634ccf0 --- /dev/null +++ b/sidan_209_ex2.py @@ -0,0 +1,4 @@ +for rad in rader: + if "Invalid user" not in rad: # INTE har söksträngen + continue +print (rad) # Skriv ut rader som har 'Invalid user' diff --git a/sidan_210_ex1.py b/sidan_210_ex1.py new file mode 100644 index 0000000..1d963a2 --- /dev/null +++ b/sidan_210_ex1.py @@ -0,0 +1,10 @@ +raknare = 0 # Räknare till antalet försök +ipLista = list() # I denna sparar vi IP-adresser +for rad in rader: + if "Invalid user" not in rad: # INTE har söksträngen + continue # hoppas över. + raknare = raknare + 1 # Addera 1 till antalet försök + ord = rad.split() # Dela upp raden i enskilda ord + ip = ord[9] # Fält 9 är IP-adressen + if ip not in ipLista: # Om inte adressen redan finns, + ipLista.append(ip) # så lägg till den diff --git a/sidan_210_ex2.py b/sidan_210_ex2.py new file mode 100644 index 0000000..63340ad --- /dev/null +++ b/sidan_210_ex2.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import urllib.request + +# Vi börjar med att skapa ett objekt +url = urllib.request.urlopen\ + ("http://jackbenny.se/logg.txt") + +# Nu läser vi in loggfilen +loggfil = url.read() + +# Därefter måste vi omkoda byte till en sträng för att +# t.ex. radbrytningar ska fungera korrekt +loggfilUtf = loggfil.decode("utf-8") + +# Dela upp strängen i enstaka rader istället +rader = loggfilUtf.splitlines() + +raknare = 0 # Räknare till antalet försök +ipLista = list() # I denna sparar vi IP-adresser +for rad in rader: + if "Invalid user" not in rad: # INTE har söksträngen + continue # hoppas över. + raknare = raknare + 1 # Addera 1 till antalet försök + ord = rad.split() # Dela upp raden i enskilda ord + ip = ord[9] # Fält 9 är IP-adressen + if ip not in ipLista: # Om inte adressen redan finns, + ipLista.append(ip) # så lägg till den + +# Skriv ut resultatet på skärmen +print ("\nTotalt antal försök:", raknare) +print ("\nLista över IP-adresser") +for adress in ipLista: + print (adress) diff --git a/sidan_212_ex1.py b/sidan_212_ex1.py new file mode 100644 index 0000000..f3066d2 --- /dev/null +++ b/sidan_212_ex1.py @@ -0,0 +1,7 @@ +# Be användaren om en adress +adress = input("Ange adress till loggfilen: ") + +# Om adressen är kortare än ett tecken angav +# användaren ingen adress, så vi kör på default +if (len(adress) < 1): + adress = "http://jackbenny.se/logg.txt" diff --git a/sidan_213_ex1.py b/sidan_213_ex1.py new file mode 100644 index 0000000..da019f5 --- /dev/null +++ b/sidan_213_ex1.py @@ -0,0 +1,12 @@ +# Try-block för att testa om adressen finns och är +# giltig. +try: + # Vi börjar med att skapa ett objekt + url = urllib.request.urlopen\ + (adress) +except ValueError: + quit("Ogiltigt adressformat") +except urllib.error.URLError: + quit("Fel eller okänd adress") +except urllib.error.HTTPError: + quit("Fel adress, det finns inget där") diff --git a/sidan_214_ex1.py b/sidan_214_ex1.py new file mode 100644 index 0000000..4a13b2b --- /dev/null +++ b/sidan_214_ex1.py @@ -0,0 +1,3 @@ +# Testa ifall det är loggfil, och om inte, avsluta. +if "]:" not in loggfilUtf: + quit("Det där verkar inte vara en loggfil") diff --git a/sidan_214_ex2.py b/sidan_214_ex2.py new file mode 100644 index 0000000..62c5638 --- /dev/null +++ b/sidan_214_ex2.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +import urllib.request + +# Be användaren om en adress +adress = input("Ange adress till loggfilen: ") + +# Om adressen är kortare än ett tecken angav +# användaren ingen adress, så vi kör på default +if (len(adress) < 1): + adress = "http://jackbenny.se/logg.txt" + +# Try-block för att testa om adressen finns och är +# giltig. +try: + # Vi börjar med att skapa ett objekt + url = urllib.request.urlopen\ + (adress) +except ValueError: + quit("Ogiltigt adressformat") +except urllib.error.URLError: + quit("Fel eller okänd adress") +except urllib.error.HTTPError: + quit("Fel adress, det finns inget där") + +# Nu läser vi in loggfilen +loggfil = url.read() + +# Därefter måste vi omkoda byte till en sträng för att +# t.ex. radbrytningar ska fungera korrekt +loggfilUtf = loggfil.decode("utf-8") + +# Testa ifall det är loggfil och om inte, avsluta. +if "]:" not in loggfilUtf: + quit("Det där verkar inte vara en loggfil") + +# Dela upp strängen i enstaka rader istället +rader = loggfilUtf.splitlines() + +raknare = 0 # Räknare till antalet försök +ipLista = list() # I denna sparar vi IP-adresser +for rad in rader: + if "Invalid user" not in rad: # INTE har söksträngen + continue # hoppas över. + raknare = raknare + 1 # Addera 1 till antalet försök + ord = rad.split() # Dela upp raden i enskilda ord + ip = ord[9] # Fält 9 är IP-adressen + if ip not in ipLista: # Om inte adressen redan finns, + ipLista.append(ip) # så lägg till den + +# Skriv ut resultatet på skärmen +print ("\nTotalt antal försök:", raknare) +print ("\nLista över IP-adresser") +for adress in ipLista: + print (adress) diff --git a/sidan_99_ex1.py b/sidan_99_ex1.py new file mode 100644 index 0000000..0fa5b84 --- /dev/null +++ b/sidan_99_ex1.py @@ -0,0 +1,5 @@ +x = 50 +if (x > 20): + print (str(x) + " är större än 20") +if (x > 10): + print (str(x) + " är större än 10") diff --git a/sidan_99_ex2.py b/sidan_99_ex2.py new file mode 100644 index 0000000..4285e09 --- /dev/null +++ b/sidan_99_ex2.py @@ -0,0 +1,8 @@ +namn = "Karin" +if (namn == "Karin"): + print ("Hej Karin, välkommen till systemet") + inloggad = 1 + x = 9**2 + print (x) +print ("Nu är vi utanför if och denna meningen skrivs \ +alltid")