Programmeringscamp De to opgaver træner begge i at lave moduler som tilbyder services der kan bruges af andre, samt i at implementere services efter en abstrakt forskrift. Opgave 1 beder jer om at implementere den abstrakte datastruktur en kø. Opgave 2 beder jer om at implementere pseudokode der specificerer søgninger i websider. Abstrakte datastrukturer og pseudokode blev gennemgået i uge 44. Mens I udvikler modulerne er det nemmeste at teste funktionerne i selve modulet: Definition af funktioner.. if name == " main ": test af funktioner. Implementer funktionerne én for én og test hele tiden. Opgave 1. Implementering af en kø Opgaven træner i at implementere en abstrakt datastruktur og i at indkapsle den så andre kan bruge det. Den abstrakte datastruktur skal være en kø: En kø er FIFO: first in first out Har følgende metoder: enqueue(elem) indsæt et element bagerst i køen og returner det dequeue() fjern elementet forrest i køen og returner dette. size() returner tal der angiver køens længde isempty() returner Boolean der angiver om køen er tom I behøver kun lave: enqueue, size, og isempty. tail head
2 Tail Head Lav et modul queuemodule hvor følgende klasser er defineret: class element: def init (self,name): self.name = name self.next = None class queue: def init (self): self.tail = None self.head = None Tail peger på køens hale (den sidst tilkomne), head på køens hoved (den først tilkomne). Man laver en ny kø ved at skrive queue() og et nyt element ved at skrive element(navn), f.eks. element( Hansen ) Modulet skal tilbyde følgende services på køer: def enqueue(queue,anelement): '''add anelement as the tail for the queue and return it''' def dequeue(queue): '''remove the head of the queue and return it''' def size(queue): '''return the size of the queue''' def isempty(queue): '''return true if the queue is empty''' Skriv et andet modul der importerer kømodulet. from queuemodule import * Det nye modul skal indeholde følgende kommandoer der bruger jeres implementation print 'lav ny koe' dagligbrugsen = queue() print 'Er koeen tom?', isempty(dagligbrugsen) print 'indsaet tre elementer' enqueue(dagligbrugsen,element('hansen')) enqueue(dagligbrugsen,element('karlsen')) enqueue(dagligbrugsen,element('jensen')) print 'Er koeen tom?', isempty(dagligbrugsen)
3 Og give følgende output lav ny koe Er koeen tom? True indsaet tre elementer Er koeen tom? False Stoerrelse = 3 Stoerrelse = 2 Stoerrelse = 1 Stoerrelse = 0 Stoerrelse = 0 Husk at opdatere køens variable head og tail. Faldgruber i dequeue: Hvad skal der ske hvis vi kalder funktionen på en tom kø? Hvad skal der ske når vi fjerner det sidste element i køen og den bliver tom? Opgave 2. Lav et modul der downloader en webside og søger i den Opgaven træner i at implementere pseudokode samt at indkapsle services i et modul ordfindermodul så andre kan bruge dem. I behøver kun lave 1.1. 1.2 er frivilling. 1.1 Obligatorisk Modulet skal indeholde følgende. Det starter med: import httplib def getwebpage(server,url): '''server er navnet pa en server. Url er dokumentets url. Returnerer HTMLkoden som en string. Hvis der opstaar fejl returneres den tomme string og fejlinformation printes ud Man faar fat i websitets indexside ved at saette url til den tomme streng''' connectionobject = httplib.httpconnection(server)#get the server connectionobject.request("get", url)#send a request result = connectionobject.getresponse()#get the response status = result.status if status == 200: #OK return result.read() else: #not OK print result.status, result.reason return '' Hvis vi vil fiske DMI s side om østjyllands vejr frem skriver man: thepage = getwebpage('www.dmi.dk', '/dmi/index/danmark/regionaludsigten/ostjylland.htm') Server = 'www.dmi.dk', url = '/dmi/index/danmark/regionaludsigten/ostjylland.htm' Dernæst skal det indeholde følgende funktioner, beskrevet i pseudokode: findtags(atext,starttag, endtag) '''returnerer en liste af alle forekomster af starttag...starttag i atext Ved soegning efter links kan starttag f.eks. vaere = <a og sluttag vaere </a>'''
4 initialiser taglisten lav alle bogstaver om til lowercase. Find er case-sensitiv find positionen af første forekomst af start-tag mens vi har fundet et start-tag find slut-tag'et fra en position efter start-taget hvis vi fandt et slut-tag tilfoej hele tag'et til taglisten led efter nyt start-tag fra en position efter slut-taget ellers vi kunne ikke finde tag'et. Hop ud af løkken returner taglisten I skal bruge funktionen find til at løse opgaven. Find er en metode hos typen string. Den kaldes: S.find(sub [,start [,end]]), hvor S er en string, sub er den tekst man vil finde, start angiver den position hvorfra søgningen starter, end den position hvor søgningen slutter. Funktionen returnerer sub s startposition. 'Peter boegh Andersen'.find('boegh') giver f.eks. resultatet 6. Hvis sub ikke kan findes, returneres -1. Find er case-sensitiv. Et muligt output fra funktionen kan være: <a href="/about/website">website maintained by the python community</a> <a href="http://www.xs4all.com/" title="web and email hosting provided by xs4all, netherlands">hosting by xs4all</a> <a href="http://www.pollenation.net/" title="design and content management system by pollenation internet, yorkshire">design by pollenation</a> Man kan f.eks. forestille sig funktionen brugt af en såkaldt webcrawler der systematisk leder nettet igennem efter websider den kan indeksere. Den vil bruge de fundne hyperlinks til at downloade nye websider. Implementer følgende pseudokode: 1.2 Frivillig def findwords(atext, wordlist): '''finder ordne i wordlist i atext. Returnerer en citationsliste med ordenes kontekst''' lav alle bogstaver i wordlist om til lowercase. Find er case-sensitiv initialiser citationslisten for alle ord i ordlisten find foerste forekomst af ordet i atext mens ordet blev fundet tilfoej fundkonteksten til citationslisten find naeste forekomst af ordet i atext returner citationslisten Fundkonteksten laves på følgende måde: def makecontext(awordposition,atext): '''returner 20 bogstaver foran og efter ordpositionen''' hvis positionen er udenfor teksten returner den tomme streng ellers find starten af konteksten find slutningen af konteksten returner atext[start:slutning] Output af findwords, der leder efter ordet python, kan f.eks. være: ally, support other python conferences a the world, and fund python related devel ="about/">about the python software found o:psf%40python.org">psf< sf<span>@</span>python<span>.</s for questions about python, please write :help%40python.org">help lp<span>@</span>python<span>.</s for comments on the python.org web pages
5 Faldgruber i makecontext: hvad skal der ske, hvis der er mindre end 20 bogstaver foran findestedet, eller mindre end 20 bogstaver efter findestedet? Man kan forestille sig funktionen brugt af politiet der leder efter sider med børnepornografi. I skal dernæst lave et nyt modul der importerer jeres modul og anvender dets services. F.eks. således: from ordfindermodul import * thepage = getwebpage('www.python.org', '/psf/') #print thepage linkliste = findtags(thepage,'<a', '</a>')#finder alle hyperlinks for link in linkliste: print link citations = findwords(thepage, ['python','website'])#leder efter ordene python og website for citation in citations: print citation