TILDA, ÖVNING 1

Pythonuppgifter, abstrakta datatyper


    Stacken


  1. Filen stack.py
    class Stack:
    
       def __init__(self):
          self.top = None
    
       def push(self,x):
          ny = Node(x)
          ny.next = self.top
          self.top = ny
    
       def pop(self):
          x = self.top.value
          self.top = self.top.next
          return x
    
       def isempty(self):
          if self.top == None: 
             return True
          else: 
             return False
    
    
    class Node:
    
       def __init__(self, x):
          self.value = x
          self.next = None
    
    




    INLÄSNING OCH UTSKRIFT

  2. Skriv ett program som läser in en rad tal och skriver ut dom med ett tal per rad.

    raden = raw_input("Ge en rad tal: ")
    raden_i_delar = raden.split()
    for tal in raden_i_delar:
        print tal
    



    Listan - exempel på en datastruktur i Python

    Data: ett antal tal, tecken eller objekt

    Metoder och operationer:


  3. Skriv ett program som läser in orden från en fil (det är ett ord per rad) och skriver ut dom i bokstavsordning.

    infil = open("tred.txt")
    
    lista = []
    for rad in infil:
        ordet = rad.strip()
        lista.append(ordet)
    lista.sort()
    
    print lista
    


  4. Skriv ett program som jämför hur lång tid det tar att läsa orden från filen med hur lång tid det tar att göra samma sak från en webbsida.

    import urllib
    import time
    
    def lasFilSortera(filnamn):
        infil = open(filnamn)
        lista = []
        for rad in infil:
            ordet = rad.strip()
            lista.append(ordet)
        lista.sort()
        return lista
    
    def lasURLSortera(url):
        infil = urllib.urlopen(url)
        lista = []
        for rad in infil:
            ordet = rad.strip()
            lista.append(ordet)
        lista.sort()
        return lista
    
    
    innan = time.time()
    lista1 = lasFilSortera("tred.txt")
    efter = time.time()
    print "Tid för filläsning:", efter - innan
    
    innan = time.time()
    lista2 = lasURLSortera("http://www.csc.kth.se/utbildning/kth/kurser/DD1320/tild\
    a11/ovn/tred.txt")
    efter = time.time()
    print "Tid för webbläsning:", efter - innan
    


    Egna datastrukturer

    I kursen ska ni själva implementera datastrukturer, oftast genom att skriva egna klasser i Python.

  5. Abstrakt datatyp för temperatur

    * Temperatur kan anges i olika skalor. En abstrakt datatyp minskar risken för missförstånd. Definiera klassen temp med metoderna setK, setC, setF och getK, getC, getF.

    * Använd sedan klassen i ett program som läser in utomhustemperaturen (Celsius) och skriver ut temperaturen så att en amerikan förstår (Fahrenheit).

    Filen temp.py:
    nollC = 273.15                        
    nollF = 255.3722                   #F-nollan i Kelvin
    
    class Temp:
    
        def __init__(self):
            self.K = 0                     #Temperatur i Kelvin
    
        def setK(self,K): 
    	self.K = K
    
        def setC(self,C):
    	self.K = nollC+C
    
        def setF(self,F): 
    	self.K = nollF+5*F/9
    
        def getK(self):   
    	return self.K
    
        def getC(self):   
    	return self.K-nollC
    
        def getF(self):   
    	return (self.K-nollF)*9/5
    
    


  6. Fraction-klassen: Ett exempel från Miller & Ranums bok, s 35:
    # encoding: Latin1 (tillåt å, ä och ö)
    # Fraction-klassen 
    
    class Fraction:
    
        def __init__(self, top, bottom):
            self.num = top
            self.den = bottom
    
        def __str__(self):
            return str(self.num)+"/"+str(self.den)
    
        def show(self):
            print self.num,"/",self.den
    
        def __add__(self,otherfraction):
            newnum = self.num*otherfraction.den + \
                     self.den*otherfraction.num
            newden = self.den * otherfraction.den
            return Fraction(newnum,newden)
    
        def __cmp__(self,otherfraction):
            num1 = self.num*otherfraction.den
            num2 = self.den*otherfraction.num
            if num1 < num2:
                return -1
            else:
                if num1 == num2:
                    return 0
                else:
                    return 1
    

    Svara på följande frågor:

    1. Vad är relationen mellan en klass och ett objekt?
    2. Hur skriver man för att skapa ett Fraction-objekt?
    3. Vad gör __init__?
    4. Vilka av metoderna ovan har returvärden?
    5. Vad är self?
    6. När anropas metoden __str__?
    7. När anropas metoden __add__?
    8. När anropas metoden __cmp__?
    9. Hur används parametern otherfraction i __add__ och __cmp__?


  7. Följande funktion konverterar en sträng från teckenkodningen "iso8859-1" till "utf-8". Gör funktionen generellare så att den kan konvertera från en valfri given teckenkodning till en annan.

    def iso2utf(strang):
        """
        Konverterar från iso8859 till utf-8
        """
        ustrang = strang.decode('iso8859-1')
        return ustrang.encode('utf-8')