TILDA, ÖVNING 1 (Lindas grupp 4 sept 2008) Pythonuppgifter, abstrakta datatyper, listor med pekare ______________________________________________________________________ ********************************************************************** 1 TID-MODULEN Skriv ett program som tickar fram en stjärna i sekunden och så småningom talar om hur länge det är sen UNIX startade. ______________________________________________________________________ # -*- coding: Latin-1 -*- """Tickar fram stjärnor, beräknar tid sedan UNIX-starten 1 jan 1970""" from time import sleep,time for i in range(10): sleep(1) print "*", print s = int(time()) m = s/60 s = s%60 h = m/60 m = m%60 d = h/24 h = h%24 print "UNIX har nu gått i",d,"dagar,",h,"h,",m,"min,",s," s" _________________________________________________________________ ********************************************************************** 2 TIDTAGNING Skriv ett program som mäter hur lång tid en funktion tar. _________________________________________________________________ # -*- coding: Latin-1 -*- # Tidtagningsprogram import time def sov(): """ Sover i pi sekunder """ time.sleep(3.14) innan = time.time() sov() efter = time.time() print efter - innan _________________________________________________________________ ********************************************************************** 3 INLÄSNING OCH UTSKRIFT 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 = rad.split() for tal in raden_i_delar: print tal ______________________________________________________________________ ********************************************************************** 3 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 gaslag.py som beräknar trycket för en gasvolym med anropet tryck(V,T,n), där T har din abstrakta datatyp. Körexempel: Antal mol (0 avslutar):1 Gasvolym (m3):1 Temp (18 C, 291 K eller 64.4 F, obs blanksteget):373.15 K K: 373.15 C: 100.0 F: 212.01000012 Tryck (Pa): 3102.555675 Antal mol (0 avslutar):0 ______________________________________________________________________ Filen temp.py: # -*- coding: Latin-1 -*- """Abstrakt datatyp för temperatur""" nollC = 273.15 nollF = 255.3666666 #F-nollan i Kelvin class Temp: 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 ______________________________________________________________________ Filen gaslag.py: # -*- coding: Latin-1 -*- """Allmänna gaslagen""" from temp import Temp from sys import exit def tryck(V,T,n): R = 8.3145 #gaskonstanten J/mol*K K = T.getK() #Kelvin return n*R*K/V #trycket enligt gaslagen T = Temp() while True: n = input("Antal mol (0 avslutar):") if n == 0: exit() V = input("Gasvolym (m3):") indata = raw_input("Temp (18 C, 291 K eller 64.4 F, observera mellanslaget):") rad = indata.split() grader = float(rad[0]) skalan = rad[1] if skalan=="K": T.setK(grader) if skalan=="C": T.setC(grader) if skalan=="F": T.setF(grader) print "K:",T.getK() print "C:",T.getC() print "F:",T.getF() print "Tryck (Pa):",tryck(V,T,n) print ______________________________________________________________________ ********************************************************************** 4 NÄST ÖVERSTA NODEN BORT * Du har en stor stack under pekaren top. Skriv en sats som tar bort näst översta posten! ______________________________________________________________________ Filen stack.py (känd från föreläsning, så när som på två nya metoder): class stack: top = None def push(self,x): ny = node() ny.value = 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 1 else: return 0 def nastoverstabort(self): p = self.top p.next = p.next.next def varannanbort(self): p = self.top while p!= None: p.next = p.next.next p = p.next class node: value = None next = None ______________________________________________________________________ ********************************************************************** 5 KONTROLLERA HTML-TAGGAR (KAP 2.9, UPPG 9) Skriv ett program som med hjälp av en stack kontrollerar om html-taggar i en inmatatad sträng matchar. Exempel på html-kod: Kurshemsida för tilda08 ______________________________________________________________________ # -*- coding: Latin-1 -*- from stack import Stack def getTag(symbolString,index): tag = "" while index < len(symbolString) and symbolString[index] != ">": tag = tag + symbolString[index] index = index + 1 tag = tag + ">" if tag[1] == "/": closing = True else: closing = False return tag, closing, index def parChecker(symbolString): s = Stack() balanced = True index = 0 while index < len(symbolString) and balanced: symbol = symbolString[index] if symbol in "<": tag, closing, index = getTag(symbolString, index) if not closing: s.push(tag) else: top = s.pop() print top,tag if not matches(top, tag): balanced = False index = index + 1 if balanced and s.isEmpty(): return True else: return False def matches(open, close): return open[1:-1] == close[2:-1] def main(): print "Ge en rad så kollar jag om parenteserna matchar!" str = raw_input("Din rad:") if parChecker(str) == True: print "Parenteserna är OK" else: print "Dina parenteser matchar tyvärr inte." main() ______________________________________________________________________ **********************************************************************