Datorteknisk introduktion Tekniska beräkningar med Python för gymnasiet (β-version!) Teknik 1, 150p Realgymnasiet i Linköping Andreas Göransson 8 maj 2012 1 Mål med avsnittet Vad menas med att tänka som en datavetare? Problemlösning 2 Introduktion till grundläggande begrepp och datorns utveckling Du redogör för några historiskt viktiga tekniska framsteg, befintlig teknik och aktuell teknikutveckling samt beskriver hur teknik och samhälle samspelar. 2.1 Hårdvara 2.1.1 Vad är en dator? ˆ Mekaniska räknehjälpmedel ˆ Elektriska reläer (Konrad Zuse) ˆ Elektronrör (ENIAC) ˆ Transistorn ˆ Integrerade kretsen (IC) Grundläggande tekniska begrepp. ENIAC programmerades genom att koppla om sladdar. EDVAC, ENIACS efterföljare var en stored program computerdär programmet lagrades i ett minne istället. Stored program computer: ˆ Programmerade instruktioner ˆ Data ˆ Lagras i minne (RAM) ˆ Normalt lagras både data och instruktioner i samma minne 1
Tabell 1: Mål och innehåll Syfte Centralt innehåll Moment/Uppgift Kunskaper om teknikutvecklingsprocessen och förståelse av sambanden mellan de olika delarna i den Förmåga att använda teknikvetenskapliga metoder, begrepp och teorier. Kunskaper om hur teknik har utvecklats och utvecklas i samspel med det omgivande samhället samt kunskaper om befintlig teknik och aktuell teknikutveckling. Kunskaper om teknikens roll och drivkrafter ur ett etiskt perspektiv. Kunskaper om hur föreställningar och traditioner inom teknikområdet styr uppfattningar om vad som är manligt och kvinnligt och hur det har påverkat och påverkar teknik och teknikutveckling. Förmåga att kommunicera inom det tekniska området samt kommunicera om teknik Teknikutvecklingsprocessens alla delar från idé och modell, produkt eller tjänst till användning och återvinning med praktisk tillämpning av teknik och teknikutveckling inom ett eller flera teknikområden. Tekniska begrepp, teorier och modeller innefattande beräkningar och rimlighetsbedömningar. Teknikens historia och teknikutvecklingens betydelse för samhället samt introduktion i aktuella utvecklingsområden inom teknik. Grundläggande teknikfilosofi: etiska värderingar och genusstrukturer samt hur de har påverkat och påverkar tekniken, dess användning och tillgänglighet. Hur teknik och teknikens attribut könsmärks. Projektarbets-, kommunikations-, presentations- och modellteknik, till exempel digitala medier och programvaror, manualer och instruktioner, muntliga och skriftliga framställningar samt digitala och manuella tekniker för att skapa modeller. Kommunikations-, dator- och nätverksteknik för lärande och förmedling av teknik och information. Utvecklingsprocessen för ett datorprogram ( system engineering ), olika utvecklingsmetoder som extreme programming. Tekniska begrepp och teorier inom det datortekniska området. T ex hur mycket rymmer en hårddisk, vad är en fil, hur snabbt kan en fil överföras i ett nätverk, hur skapar man ett effektivt datorprogram? Kunskaper om hur dator- och nätverkstekniken utvecklats, dess betydelse för samhället samt kunskaper om aktuell utveckling inom det datortekniska området. Vilka etiska aspekter finns på datoranvändning och informationsöverföring? Hur förhåller sig datorteknik till begrepp som manligt och kvinnligt? I syfte att utveckla förmåga att använda verktyg för dokumentation, presentation och information. Hur dokumenterar man med hjälp av datorn? Hur kan man presentera med datorstöd? Hur dokumenterar vi ett datorprogram? Hur gör man en manual eller en hjälptext till ett datorprogram? Hur skapar vi en matematisk modell och simulerar ett förlopp? Hur kan datornätverk och internet användas för att förmedla teknik och information, t ex bloggar och videoteknik. 2
2.1.2 Material som används i datorer En dator kräver en mängd olika speciella material med vissa kemiska, mekaniska, termiska och elektriska egenskaper. ˆ Magnetminnen ˆ Optiska lagringsmedier ˆ Halvledare i kretsar och komponenter som dioder, transistorer och integrerade kretsar ˆ Kylning ˆ Ledningsmotstånd 2.2 Mjukvara 2.2.1 Operativsystem Ett operativsystem kan beskrivas som det program som alltid finns igång i bakgrunden på en dator och som möjliggör att andra program kan köras. För en programmerare innebär ett operativsystem att vi inte behöver skriva program som kommunicerar direkt med kretsarna eller datorns hårdvara utan att mycket redan finns färdigt för oss. Ett exempel är att vi inte behöver uppfinna ett sätt att spara filer på en magnetisk skiva varje gång vi skriver ett nytt program utan att det redan finns färdiga metoder och funktioner för det i operativsystemet som vi kan anropa och låta göra jobbet åt oss. 2.3 Systemprogram eller hjälpprogram Finns som extra funktioner för att datorsystemet ska fungera, t ex program som kan användas för att ställa in saker i datorn som bildskärmsupplösning eller liknande eller sköta om säkerhetskopiering i bakgrunden. 2.3.1 Applikationsprogram Applikation eller tillämpning är program som vi som slutanvändare kommer i kontakt med. Man gör något med ett sådant program, t ex ordbehandling, kalkyl, presentation, e-post osv. 2.4 Uppgift 1a Du använder tekniska begrepp... Syfte: Att träna på datorns delar samt få träning i användning av dator- och kommunikationsteknik för förmedling av information Gör en poster med datorns hjälp, där delarna i en modern persondator framgår samt deras funktion beskrivs. 3
3 Datorprogram 3.1 Uppgift1b En wiki finns uppsatt för kursen teknik 1 på http://teknikett.wikispaces. com. Varje person i klassen får ett datortekniskt begrepp att skriva en artikel på wikin om (läraren delar ut lista). Din sida ska länka till andra sidor där det är relevant. Du behöver inte länka till alla andra sidor. När du är färdig ska du granska den kompis sida och föreslå förbättringar eller förändringar av den. ˆ datorprogram ˆ process ˆ primärminne ˆ sekundärminne ˆ processor ˆ inenhet ˆ utenhet ˆ programmeringsspråk ˆ kompilator ˆ kompilera ˆ maskinkod ˆ skriptspråk ˆ högnivåspråk ˆ nätverk ˆ bit ˆ byte ˆ systemprogram ˆ tillämpningsprogram ˆ hårddisk ˆ optisk enhet ˆ USB ˆ firewire ˆ VGA ˆ HDMI ˆ nätverkskort 4
3.2 Uppgift 1c Du redogör för tekniska egenskaper(termiska, elektriska, mekaniska och kemiska) hos olika material samt för hur och när de kan användas: Material som har betydelse för datorns och elektronikens utveckling. Vilka material används när man bygger upp en dator, t ex för ledningsbanor på kretskort, kontaktytor och för integrerade kretsar? Vilka elektriska egenskaper är intressanta hos ett halvledarmaterial som kisel eller germanium? Varför är dessa intressanta när vi vill konstruera en dator? Vad menas med att man dopar ett halvledarmaterial och varför gör man det (A) 3.3 Programutveckling med Python Här finns det tekniska begrepp att lära i avsnittet Python är ett så kallat skriptspråk och är mycket spritt idag. Det finns på flera olika plattformar som Linux, Unix, OS X och Windows. Språket är lite speciellt så tillvida att vitutrymme (tabbar och blanksteg) spelar roll. Vi börjar med ett enkelt program som bara skriver ut en text på skärmen: print " Hello World!" Här är print ett så kallat nyckelord eller kommando och texten "Hello World!" en sträng. Vi fortsätter med ett exempel där vi gör en beräkning i Python: a = 2 b = 3 print a+b Här kallas a och b för variabler. De lagrar heltalen 2 och 3 och kommandot print kommer att skriva ut resultatet av beräkningen. Notera att inga citattecken omger a+b. Vi provar nu lite fler räknesätt: a = 2 b = 3 c = 5 print c/a Notera att resultatet av c/a blir 2 och inte 2.5. Detta beror på att Python tolkar a=2 och c=5 som att dessa variabler är heltal. Det innebär i sin tur att resultatet av c/a presenteras som ett heltal. För att komma runt det kan vi se till att en av variablerna innehåller ett flyttal, t ex c=5.0. Då kommer också resultatet att blir ett flyttal och vi får resultatet 2.5. 3.4 Kodstil och kommentarer När man programmerar är det inte bara viktigt att skriva kod som fungerar utan också kod som är lättläst och tydlig. Ett ytterligare sätt är att kommentera koden. Kommentarer i Python inleds med tecknet #. Allt efter detta tecken på en rad ignoreras av Pythontolken. Försök att kommentera det som är svårt att förstå i din kod, varför något står där eller hur det fungerar. Däremot ska du undvika att kommentera det som är självklart eller kommentera allt. Kommentarerna är till för dig eller den som underhåller och utvecklar koden. En annan 5
dokumentationsfunktion är dokumentationssträngar eller docstrings på engelska. Docstrings används för att skapa dokumentation för användaren. Denna kod visas för användaren när kommandot help() ges i pythontolken. En docstring inleds med """. 3.5 Inmatning Oftast vill man läsa in något från tangentbordet, t ex kommandon eller siffror som användaren matar in. I Python görs detta med funktionen raw input(), t ex raw input( Vad heter du? ). Funktionen returnerar en sträng, dvs en text som vi kan spara i en variabel: >>> namn = raw_input ( Ange ditt namn : ) Ange ditt namn : Andreas >>> print namn Andreas >>> 3.6 Uppgift Skriv ett program i Python som frågar efter förnamn och efternamn. Programmet ska sedan skriva ut förnamn och efterman på skärmen. I början av programmet ska uppgiftsnumret, datum och ditt namn framgå: # Uppgift 2 # Andreas Göransson # 2012-01-01 #... din kod här! 3.7 Loopar För att upprepa saker i ett datorprogram kan man skriva samma kommando flera gånger i följd i programmets källkod: i = 0 print i i = i + 1 print i i = i + 1 print i i = i + 1 print i Du inser säkert hur ineffektivt detta sätt att skriva kod skulle vara. Datorn kan köra kommandon upprepade gånger via något som kallas för loop. Ett exempel på loop är en for-sats: for i in range (3) : print i 6
Detta kommer att ge samma resultat som det första exemplet men vi behöver koda mycket mindre! 3.8 Uppgift for-loop Skapa ett program som skriver ut en logaritmtabell för talen 1-100 på skärmen. Tips, funktionen math.log(x,[bas]) finns tillgängligt i modulen math. Utskriften ska se ut som nedan: 3.9 Gruppuppgift Vad skriver följande program ut på skärmen? for i in range ( 10) : for j in range ( 10) : print i,j 3.10 Funktioner För att göra koden lättare att underhålla och mer lättläst och funktionell använder man något som kallas för funktioner i många programspråk. En funktion är ett kodblock som utför en viss uppgift. Likt matematiska funktioner kan vi ge invärden eller indata och få tillbaka returvärden. Funktioner skrivs med nyckelordet def i Python, en förkortning för define. Vi tar ett exempel och skriver en funktion som beräknar en rektangels area utifrån indata i form av bredd och höjd (a, b): #! /usr/bin/python # area.py # Beräknar arean av en rektangel med längden a och höjden b. def area (a,b): return a * b # Anrop av funktionen a = 10 b = 4 print " Arean öfr en rektangel med sidorna a = " + str (a) + " och b = " + str (b) print " är ", area (a,b) Det kanske mest intressanta att notera i kodexemplet är det nya nyckelordet return som helt enkelt talar om vad funktionen ska sända tillbaka för värde. En funktion behöver dock inte returnera något värde utan bara utföra vissa uppgifter. 3.11 Uppgift 2.1 Skriv ett enkelt program i Python som omvandlar temperatur från Celsius till Fahrenheit. Använd funktioner. Om du vill bygga ut programmet sedan kan du lägga till möjlighet för användaren att välja vilken konvertering som ska göras. 7
3.12 Uppgift 2.2 Skriv ett program i Python som räknar ut ersättningsresistansen för en parallellkoppling av resistorer. Börja med att skriva ett program som räknar ut ersättningsresistansen för två motstånd. Gör sedan om programmet så att användaren kan mata in godtyckligt antal resistorer. Använd funktioner i ditt program. 4 Effektivitet hos program, tidskomplexitet Det finns flera sätt att lösa ett givet programmeringsproblem, frågan är vilka sätt som är bättre och vilka som är sämre. För att svara på det behöver vi förstå hur ett program körs eller exekveras av datorn och hur olika algoritmer beter sig när vi skalar upp dem. 4.0.1 Exempel exponentberäkning Vi vill beräkna exponenter med dator och vi tänker oss att ingen ännu skapat en metod för detta. För att implementera en exponentberäkning av a b kan vi helt enkelt låta datorn multiplicera talet a med sig självt b-gånger. Skriv in koden i en ny fil och döp den till exponent.py. Prova att det fungerar att beräkna till exempel 10 100. #! /usr/bin/python # Algoritm för att beräkna a upphöjt till b def exp (a,b): resultat = 1 for i in range (b): resultat = resultat * a return resultat Fundera nu över hur många gånger loopen i programmet ovan körs. Finns det då effektivare sätt att skriva programmet? Med lite kännedom om hur exponenter fungerar och exponentlagarna kan vi tänka på följande omskrivning: 10 8 = (10 2 ) 4 = (10 10) 4 (1) Om vi skulle låta programmet dela upp problemet så att det räknar ut (10 2 ) 4, hur många gånger skulle loopen då köras? def exp2 (a,b): if b == 1: return a if (b / 2) * 2 == b: return exp2 (a*a, b /2) else : return a* exp2 (a,b -1) Poängen här är inte att du ska bli expert på att skriva program för uträkning av exponenter utan att du ska inse att det finns flera sätt att lösa ett givet programmeringsproblem och att dessa sätt belastar datorn olika mycket. Vi små exponenter är det liten skillnad mellan dessa två program men när vi ökar exponenterna skalar lösningarna mycket olika. I första exemplet skalar problemet som du redan sett linjärt, O(n), med exponenten, vilket i och för sig inte är 8
så illa. I det andra exemplet halverar vi problemet vid varje gång vi kör ett funktionsanrop, man säger då att programmet skalar logaritmiskt: O(log n). 5 Datorn som verktyg för teknikutveckling 5.1 Ritning och CAD 5.2 Kommunikation och presentation 5.2.1 Grafritning med Python Python kan användas för att visualisera mätdata och beräkningar i form av grafer. I själva Python finns i grunden inte stöd för detta utan man måste installera och använda någon form av utökning eller modul. Den vanligaste är kanske Pylab. Här följer ett exempel på hur du kan rita en graf till en funktion med Pylab: # -*- coding : cp1252 -*- # bollmodell. py - äberknar en bolls öhjd över marken # Andreas 2012 from pylab import * v0 = 1 # åutgngshastighet i m/ s t = 1.0 # Tiden sekunder åfrn att bollen äslpps g = 9. 82 # Tyngdaccelerationen i m/ s* s def y(t): return v0 * t - 0.5 * g * t ** 2 # En lista med decimaltal mellan 0.0 och 1.0 genereras t = arange (0.0,1.0,0.01) plot (t,y(t)) # Ritar grafen xlabel (" Tid t (s)") # Axelrubrik ylabel (" Hojd y (m)") # Axelrubrik title ("En bolls hojd over marken $y(t)= $") # Titel åp grafen, LaTeX - kod inom $ grid ( True ) # Visa östdlinjer show () # Visa grafen åp äskrmen 5.3 Beräkning, mätning och modellering 5.3.1 Uppgift termokoppen Man vill utveckla en mugghållare till kaffekoppar som ska hålla varma drycker varma längre. För att göra detta finns olika material att tillgå vars termiska egenskaper ni vill undersöka. Drycken kommer att ha temperaturen 80 när det tappas upp. Avsvalning av ett objekt beror av olika faktorer som temperaturskillnaden mot omgivning och det omgivande material värmekonduktivitet. 9
En matematisk modell för förloppet ges av det som brukar kallas Newtons avsvalningsekvation: T (t) = T rum + (T 0 T rum )e kt (2) där T (t) är temperaturen hos drycken vid tiden t, T 0 är temperaturen hos drycken vid försökets start, T rum rumstemperaturen och k en konstant som beror av bland annat material i koppen samt dess form. Mät upp temperaturen för den varma drycken när behållaren omges av olika material. Plotta resultatet i en graf och beräkna konstanten k. ˆ Frågor att besvara... 5.3.2 Uppgift 3 x x B A Figur 1: Uppgift 2 Man vill bygga en låda av plåt. Plåtarna som finns att tillgå har storleken AxB cm. Lådan skall ha så stor volym som möjligt. Utveckla ett datorprogram i Python där en matematisk funktion beräknar volymen för olika mått på lådan. Programmet ska beräkna volymer för olika värden på x i steg om 1 mm. Gör en ritning av den optimala lådan i AutoCAD med korrekt måttsättning. Vid bedömningen av uppgiften kommer läraren att utgå från ˆ Din förmåga att lösa att tekniska problem ˆ Din grad av självständighet i arbetet ˆ Din förmåga att dokumentera arbetet och resultatet ˆ Din förmåga att göra enklare ritningar i CAD-program ˆ Din säkerhet i att utföra tekniska beräkningar och bedöma resultatens rimlighet ˆ Din säkerhet i att använda datorn som verktyg för information och kommunikation 10
Planering Implentering Testning Leverans Underhall 6 Programutveckling 6.1 Programutvecklingsmetodik Konsten att utveckla datorprogram kan sägas vara en variant av teknikutvecklingsprocessen. Det finns flera olika filosofier eller metoder för hur man utvecklar datorprogram. Förr var programutvecklingsprojekt ofta mycket omfattande och detaljerade med stora mängder dokumentation. Man arbetade sekventiellt eller i ett enda stort svep från planering till färdigt program. Som en motreaktion på detta kom iden om lättrörlig eller agil utveckling. Man jobbar istället med fokus på produkten för processen. Man satsar på att tidigt skapa en körbar version av programmet och att släppa nya versioner ofta under utvecklingsprocessen. Genom att låta kunden vara med hela tiden och testa programmet undviker man att utveckla fel saker. En viktig del i agil utveckling är också testning. Man börjar ofta med att skriva testerna som koden ska passera först. Därefter utvecklas koden så att den passerar testet. Det här är ofta ett bakvänt sätt för många att arbeta efter. Oftast utvecklar man något först och sedan kvalitetssäkrar man det, inte tvärtom. Utveckling av datorprogram följer i stort de faser ett teknikutvecklingsprojekt gör: ˆ Planering ˆ Implementering ˆ Testning ˆ Leverans ˆ Underhåll 6.1.1 Planeringsverktyg För att analysera eller konstruera ett datorprogram finns det verktyg som kan hjälpa oss på vägen. Exempelvis flödesdiagram och pseudokod. Flödesdiagrammet visar en grafisk representation av hur programmet rent logiskt arbetar medan pseudokod är ett ett mellansteg mellan flödesdiagram och ren implementering i ett visst programmeringsspråk. Pseudokod är inte standardiserad men oftast utelämnar detaljer som variabeldeklarationer för att göra koden läsbar. Flödesdiagrammen har däremot vissa standardsymboler som man bör använda: 6.1.2 Uppgift a) Konstruera ett flödesdiagram som visar hur programmet exp2 arbetar. b) Konstruera ett flödesdiagram för kvadratrotsalgoritmen. Skriv sedan ned pseudokod för algoritmen. Skriv därefter själva programmet i Python. Fundera ut några testfall som du kan köra för att verifiera att programmet fungerar som det ska. 11
6.2 Uppgift 4 Skapa ett enkelt gissa-tal spel i Python. Börja med att göra ett flödesdiagram för programmet, skriv sedan koden. Spelet ska låta användaren gissa ett tal mellan 1 och 10. Antal gissningar ska skrivas ut på skärmen. Förbättra spelet så att det ger ledtrådar genom att skriva ut på skärmen om gissningen är för låg eller hög. Du kan också skapa en highscorefunktion som låter användaren ange ett namn och som sedan sparar användarens namn och gissningar. Highscorelistan ska visas när ett spel avslutats. 6.3 Dator- och nätverksteknik för lärande och kommunikation 6.3.1 Bloggar 6.3.2 Wikis 6.3.3 RSS 6.3.4 Google+ och Docs 6.3.5 Twitter 6.3.6 Facebook 6.3.7 Lärplattformar och personliga lärmiljöer 12