Nada

Grudat 2004-10-25

Föreläsning 1: Python!

Kursen

Ettans javaprogrammeringskurs Programkonstruktion följs nu av en datalogisk del som gäller för alla programspråk. På föreläsningarna används språket Python, eftersom algoritmerna framstår tydligare utan Javas komplicerade överbyggnad. Den som föredrar att göra labbarna i något annat språk får göra det. övningsassarna håller sej i regel till Python. Skillnaden är inte så stor.

Datalogikurser världen över är mycket lika varandra. Innehållet är i huvudsak det här.

Därför finns många likvärdiga läroböcker och många användbara webbplatser. Föreläsningsanteckningarna ska dock täcka kursen bra.

När och hur tentamen ska vara får kursdeltagarna bestämma om några veckor. Bland förslagen finns

Python

Python är ett tio år gammalt språk som har blivit mycket populärt på grund av sin enkelhet. Det påminner mycket om Matlab genom att vara interaktivt. Kommandot python kör igång ett system som direktexekverar pythonrader.
>>> 17*666+4711
16033
>>> utrop="Aj"
>>> utrop*9
'AjAjAjAjAjAjAjAjAj'

Jämförelse med Java

Om man i ett javaprogram stryker allt onödigt - huvuden, deklaration, måsvingar, semikolon osv - blir det som står kvar ungefär motsvarande pythonprogram. Som exempel tar vi ett javaprogram som räknar om grader till radianer.
//Detta är filen Radianer.java

import java.io.*;
class Radianer {
    public static void main(String args){
	BufferedReader in = new BufferedReader(
	    new InputStreamReader(System.in));
	System.out.print("Antal grader: ");
	try {
	    String rad = in.readLine();
	    int grader = Integer.parseInt(rad);
	    double radianer = grader*Math.PI/180;
	    System.out.println(radianer+"radianer");
	}
	catch(Exception e){
	    System.err.println("Inget heltal!");
	}
    }
}

Och här har vi motsvarande pythonprogram.
"Detta är filen radianer.py"

from math import pi
grader=input("Antal grader:")
radianer=grader*pi/180
print radianer,"radianer"
Pythonprogrammet körs med python radianer.py. Det behövs ingen separat kompilering motsvarande javac Radianer.java.

Java använder klasser även när programmet inte skapar några objekt, men i Python definierar man en klass bara när man tänker skapa objekt. Det tas upp nästa vecka.

Idealviktsalgoritmen

Eftersom algoritmer är kursens tema ska vi börja med en enkel sådan.
----------------------------------------------
ALGORITM FÖR IDEALVIKT: idealvikt = längd - 110
----------------------------------------------
Vi vill ha ett program som fungerar enligt följande.
   Din längd (cm):188
   Din vikt (kg):80
   Banta 2 kg!
Det ger oss anledning att skriva en if-sats i Python. Kommentarer går från brädhögstecknet till radens slut
"Detta är filen banta.py"                  #Dokumentationstext (frivillig)

langd=input("Din längd (cm):")             #Inga åäö i variabelnamn
idealet=langd-110
vikt=input("Din vikt (kg):")
if vikt>idealt:                            #Kolon efter if,while,for,def
    print "Banta",vikt-idealet,"kg!"       #Indragna rader fixar Emacs
elif vikt<idealet:                         #Else-if skrivs elif
    print "Lägg på dej",idealet-vikt,"kg!"
else:                                      #Även kolon efter else
    print "Du har idealvikt!"
Själva algoritmen kan uppfattas som en funktion från längder till vikter, och den funktionen kan vi skriva så här.
def idealvikt(langd):    
    return langd-110
Om funktionen definieras i samma fil kan den anropas så här.
idealet=idealvikt(langd)
Om funktionen finns i en egen fil formler.py måste den importeras.
"Detta är fortfarande filen banta.py" 
from formler import idealvikt          #from formler import * går också

langd=input("Din längd (cm):")  
idealet=idealvikt(langd)
 - - -

Skottårsalgoritmen

------------------------------------------------------------
ALGORITM FÖR SKOTTÅR: Om årtalet är delbart med fyra är det oftast skottår.
För årtal som slutar på 00 måste dock även seklet vara delbart med fyra. ------------------------------------------------------------
Vi vill ha en funktion från årtal till dagantal och den kan få finnas i filen year.py
"Nyttiga funktioner av årtalet"

def days(year):
    "Kollar skottår"           #Dokumentationstext får finnas här
    if year%4!=0:              #y%4 är resten när y delas med fyra
        return 365             #Vanliga ickeskottår
    if year%100!=0:            #Vanliga skottår
        return 366
    if (year%400)==0:	       #År av typen 2000
        return 366
    return 366                 #År av typen 1900
Om vi i huvudprogrammet vill tabellera funktionen behövs en for-slinga.
"Tabellerar dagantalet för åren 1900...2000"

from year import days
for year in range(1900,2001):  #Övre gränsen kommer inte med
    print year,days(year)      #1900 365  (det blir en snygg tabell)
Om slingan ska starta från noll räcker range(2001), om den ska hoppa fram med steget fem skrivs det range(1900,2001,5). Men man kan också genomlöpa vilken lista som helst:
  for x in [17,666,4711]: print x*x
  for y in "rdtls": print y+"imma" 

Horners algoritm för polynomvärden

Att beräkna ett polynom term för term är oekonomiskt. I nummekursen lärdes följande effektiva algoritm ut.
------------------------------------------------------------
ALGORITM FÖR BERÄKNING AV POLYNOMETS VÄRDE FÖR GIVET X: Sätt y=0
Upprepa följande sats för alla polynomkoefficienter
y=y*x+koefficient
------------------------------------------------------------
Exempel: Andragradspolynomet 2x*x+3x-5 beräknas som
   y=0
   y=y*x+2
   y=y*x+3
   y=y*x-5
I filen poly.py programmerar vi detta så här
def polyval(p,x):
    "Polynomvärdesberäkning enligt Horner"
    y=1
    for c in p:
        y=x*y+c
    return y

def polytab(p,start,slut,steg=1):    #Om inte steg anges i anropet blir det 1
    "Tabellerar polynomvärden"
    x=start
    while x<=slut:
        print x,polyval(p,x)
        x=x+steg                     #Kan också skrivas x+=steg
Huvudprogrammet tillverkar en vektor med polynomets koefficienter och skickar med den i anropet.
from poly import polytab

pol=[2,3,-5]
polytab(pol, 0, 1, 0.1)       #Tabell för x = 0.0, 0.1,..., 1.0
print "--------------------"  #Eller print "-"*20
polytab(pol, 0, 5)            #Tabell för x = 0, 1, 2, 3, 4, 5
I snygga tabeller vill man kunna kräva exempelvis högerjusterad utskrift i ett fält med bredden 10. Det finns förstås metoder för det.
x=0.1                         #Ett tal som vi vill skriva ut snyggt
tal=str(0.1)                  #Talet görs först om till textsträng
print "Tal:",tal.rjust(10)    #Tal:        0.1
print "Tal:",str(x).rjust(10) #Kan göras i samma sats

Vetenskapligt

All utbildning på KTH ska vila på vetenskaplig grund och varje kursledare ska förutom kursens stoff försöka bibringa deltagarna ett vetenskapligt förhållningssätt. Några minuter av varje föreläsning tänker jag ägna åt vetenskapligheter. Det glömde jag visst den här gången, annars hade jag sagt följande.

Svenska nobelpristagare i fysik

Det har funnits fyra, varav två varit professorer här på Teknis. Hannes Alfvén, den störste av dom, var professor i teoretisk elektroteknik på KTH. Han efterträddes av kultprofessorn Erik Hallén. Själv övergick han till plasmafysik och kosmologi. Känd kärnkraftsmotståndare.

Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 25 oktober 2004
Tekniskt stöd: <webmaster@nada.kth.se>