TILDA, ÖVNING 1 (Mikas grupp 5 sept 2007) Abstrakta datatyper, listor med pekare 1 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 2 NÄST ÖVERSTA NODEN BORT * Du har en stor stack under pekaren top. Skriv en sats som tar bort näst översta posten! * Lös samma uppgift abstrakt, alltså med anrop till push och pop! 3 VARANNAN POST BORT * Ta bort varannan post ur en stack genom att pekmeka! * Lös uppgiften abstrakt med hjälp av en extra stack! ====================================================================== Filen temp.py: "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: "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 1: n=input("Antal mol (0 avslutar):") if n==0: exit() V=input("Gasvolym (m3):") rad=raw_input("Temp (18 C, 291 K eller 64.4 F, obs blanksteget):").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 ______________________________________________________________________ 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 ______________________________________________________________________ Filen stacktest.py: from stack import stack s=stack() # Näst översta bort med pekmek i stack-klassen for i in range(10): s.push(i) s.nastoverstabort() while not s.isempty(): print s.pop() print "---------------------------" # Näst översta bort, abstrakt for i in range(10): s.push(i) x=s.pop() y=s.pop() s.push(x) while not s.isempty(): print s.pop() print "---------------------------" # Varannan bort med pekmek i stack-klassen for i in range(10): s.push(i) s.varannanbort() while not s.isempty(): print s.pop() print "---------------------------" # Varannan bort med hjälp av extrastack for i in range(10): s.push(i) s2=stack() while not s.isempty(): s2.push(s.pop()) x=s.pop() while not s2.isempty(): s.push(s2.pop()) while not s.isempty(): print s.pop() print "---------------------------" ______________________________________________________________________