Kommentarer til opgave 4-6 Opgaverne er stort set OK. De viser at tankegangen er rigtig. Nogle programmer virker ikke, men kræver blot en enkelt rettelse. De bliver godkendt, men I bør selv altså gøre opmærksom på at jeres løsning ikke virker. 1 Rekursionsopgaven nr. 4 Her havde en del problemer. Jeg synes Vinca Nielsen og Hanne Lynghøj lavede en korteste og smarteste løsning: def IsP(word): return word == "" or (word[0]==word[-1]) and IsP(word[1:-1]) Mange, men ikke alle, kommenterer deres løsninger. Det er en rigtig god ide at kommentere for så er det nemmere for mig at gennemskue jeres tankegang, og vurdere om ideen er rigtig. Det er specielt vigtigt når programmet ikke virker. I det tilfælde er det en god ide at gøre som Karina Svanborg. Hun giver en kommentar til programmet # Dette program er baseret på rekursion. Det vil sige et program, der kalder den samme funktion igen # og igen indtil programmet er udført og status enten er sandt eller falsk. Hvis alt det der spørges om # er sandt er ordet et palindrom. Hvis der undervejs opstår noget der ikke er sandt, er det ikke et # palindrom.som udgangspunkt er status sandt. # Jeg starter med at danne en funktion. Denne gentages sålænge det indtastede ord er større end 1. Kommentaren viser at ideen er rigtig nok. Dernæst beskriver Karina hvad problemet er: # Mit program virker ikke, for hvis jeg ændre "kajak" til "kajik" skriver det stadig at det er sandt. # Jeg har svært ved at finde fejlen. # Den rykker ind i ordet som den skal -jeg kan se at den efter "kajak" tjekker at "aja" også er # et palindrom. Det er derfor ikke der fejlen skal findes. Det må være status = True, der er problemet. # Det er ligesom om at det overskygger det hele og gør at den hele tiden skriver at status er True. # Har prøvet at rykke rundt på Status = True, men intet jeg har prøvet har virket. # Håber du kan fortælle mig hvad jeg kan gøre om for at det virker. Det gør det meget nemmere at foreslå rettelser. Der skal blot en enkelt rettelse til før Karinas program virker for det er tænkt rigtigt. Louise Krogh har det samme problem. Hendes program ser således ud: def ispalindrom(string): # Således tager programmet højde for store bogstaver: string = string.lower() # Status er True hvis længden af strengen er over 1 og første bogstav # er det samme som det sidste og så videre indad mod midten. Er dette ikke
# tilfældet er status False. Til sidst returneres status. Desværre virker det # ikke og jeg kan simpelthen ikke begribe hvorfor. Den rykker ikke ind men tjekker # bare de to yderste bogstaver i ordet. status = True if len(string) >1: if string[0]==string[-1]: print ispalindrom(string[1:-1]) print string status = False return status print ispalindrom("kajek") Fejlen ligger her: Først kigger programmet på de to k er i kajek. De er ens og det næste rekursive kald kigger på a og e i aje. De er forskellige, men Louise har en print-sætning i det tilfælde. Det vil sige der ikke returneres noget veldefineret resultat til den kaldende funktion. Ydermere påvirker dette resultat af at analysere aje ikke statusvariablen i det kald der analyserer "kajek". Dette kald tror stadig at Status = True og returnerer True. Derfor rubriceres "kajek" som et palindrom. Rettelsen er den samme som ved Karina. Faktisk kan vi igen få programmet rigtigt ved én enkelt rettelse (markeret med fed): status = True if len(string) >1: if string[0]==string[-1]: status = ispalindrom(string[1:-1]) print string status = False return status print ispalindrom("otto") Samme problem findes hos Martin Philipsen hvor isp(string[1:-1]) skal erstattes med status = isp(string[1:-1]) samt hos Rune Lippert, Sofie Juul Jensen og Torbjørn Stridbæk. 2 Barebones opgaven nr. 5 2.1 Opgave a Clear AUX; Incr AUX; While X not 0 do; Clear X; Clear AUX; End; While AUX not 0 do; Incr X; Clear AUX End; Forslaget Clear AUX While X NOT 0
DECR X DECR AUX While AUX NOT 0 INCR X DECR AUX vil ikke virke, alene af den grund af AUX bliver negativ. 2.2 Opgave b Funktionen ganger X med 2 og lægger resultatet i Z 2.3 Opgave c BNF Grammatik over Bare Bones: Prog ::= Stmlist Stmlist ::= Stm Stmlist Stm Stm ::= CLEAR id ; Stm ::= INCR id ; Stm ::= DECR id ; Stm ::= WHILE id NOT ZERO ; Stmlist ; END ; id = <word> <word> = [a-za-z][a-za-z0-9]* Udvidelse med SET: Stm ::= SET id id Realisering af SET X Y: Først sætter vi y til en værdi fx 3: clear Y; Og så kommer en sekvens hvor Y s værdi kopieres over i X clear AUX; clear X; while Y not 0 do; decr Y; incr X; incr AUX; end; while AUX not 0 do; decr AUX; end; Opgaverne: I opgave c glemmer mange af jer at sørge for statement-listen kan indholde vilkårligt mange statements: det er det den rekursive regel Stmlist ::= Stm Stmlist Stm sørger for: en statement-liste kan bestå af én statement eller af en ny statement-liste efterfulgt af én statement.
Obl øvels 6. Opsummering på Python. 3 Fejlfindingsopogaven nr. 6 Følgende opgaver er en repetition. De går ud på at finde og rette fejl. a. If-statements # a) if a <= 10: print "a is in range 0-10" if a <= 20: print "a is in range 11-20" # b) if a <= 10: print "a is in range 0-10" elif a <= 20: print "a is in range 11-20" (a) Forklar hvad forskellen på blok a) og blok b) er. Blok a: udfører (fejlagtigt) anden print-sætning hvis a er mindre end 10 Blok b: udfører anden printsætning hvis a er mellem 10 og 20 (b) Hvad for en af de 2 blokke regner så rigtigt i den forstand at den udskriver det sande udsagn? Blok b er rigtigt 2. I disse opgaver skal vi se på for- og while-statements list=[12, sild,34, torsk ] for var in range(len(list)): print list[var] (a) Hvordan kan du omskrive ovenstående udtryk med en while-konstruktion, så det stadig gør det samme? Hint: brug var som en tæller der forøges med én for hver iteration. var = 0 while var < len(list): print list[var] var += 1 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] (a) Lav en for-løkke der udskriver hvert andet element fra ovenstående numbers liste. Hint: brug slicen [::2] der laver en ny liste bestående af hvert andet element i den gamle. numbers1 = numbers[::2] for var in range(len(numbers1)): print numbers1[var] Det kan også gøres sådan: Numbers = [1,2,3,4,5,6,7,8,9,10] for i in range(0, len(numbers),2): print Numbers[i]
(b) Lav nu en while-løkke der udskriver hvert andet element. Hint: Brug løsningen fra (a) men udskriv nu kun hver anden. var = 0 while var < len(numbers): if divmod(var,2)[1] == 0: print numbers[var] var += 1 Det kan også gøres sådan: numbers = [1,2,3,4,5,6,7,8,9,10] i = 0 while i < (len(numbers)): print numbers[i] i += 2 Nedenstående kode skal udprinte tallene 0..9, men gør det ikke (lad være at køre programmet som det er!!). run = True a = 0 while run: print a a +=1 (a) Hvad er fejlen i ovenstående kode? Run påvirkes ikke af a s værdi. Den kører i uendelig løkke (b) Ret fejlen og lav en løsning der kan køre. run = True a = 0 while run: if a < 10: print a a += 1 run = False 3. I disse opgaver skal vi se på fil input/output file = open("myfile", "w") lines = file.readlines() print "number of lines in %i = %s" %(file.name, len(lines)) (a) Hvad er der galt i ovenstående kode? Hint: kig på print-sætningen. File.name er en streng, men er markeret som integer (%i) i udskriftsordren. Omvendt for linjeantallet. Endvidere åbnes filen i writemode, den skulle åbnes i readmode. (b) Ret fejlene i ovenstående kode file = open("readme.txt", "r") lines = file.readlines() print "number of lines in %s = %i" %(file.name, len(lines)) number of lines in readme.txt = 1227
mystring = Hello, here is a special offer for you... YOU WANT TO LOSE WEIGHT? The most powerful weightloss is now available without prescription. All natural Adipren 100% Money Back Guarantee! - Lose up to 19% Total Body Weight. - Loss of 20-35% abdominal Fat. - Up to 300% more Weight Loss while dieting. - Reduction of 40-70% overall Fat under skin. - Suppresses appetite for sugar. - Increase metabolic rate by 76.9% without Exercise. - Burns calorized fat. - Boost your Confidence level and Self Esteem. Now with the exclusive NePirem Cinicia Process. file = open("output.txt", "r") file.close() file.write(mystring) (a) Kig på ovenstående kode, og forstå hvad der sker. Hint: I skal huske at lægge en file med navnet output.txt i jeres pyton-mappe. Det er ikke den fejl vi er ude efter. Der er to andre fejl to koden. (b) Ret fejlene i koden og få programmet til at køre. Fejlene er: (1) filen åbnet i read-mode man vi vil skrive på den, og (2) filen lukkes før vi skriver. Den rigtige løsning er: mystring = '''Hello, here is a special offer for you... YOU WANT TO LOSE WEIGHT? The most powerful weightloss is now available without prescription. All natural Adipren 100% Money Back Guarantee! - Lose up to 19% Total Body Weight. - Loss of 20-35% abdominal Fat. - Up to 300% more Weight Loss while dieting. - Reduction of 40-70% overall Fat under skin. - Suppresses appetite for sugar. - Increase metabolic rate by 76.9% without Exercise. - Burns calorized fat. - Boost your Confidence level and Self Esteem. Now with the exclusive NePirem Cinicia Process.''' >>> file = open("output.txt", "w") >>> file.write(mystring) >>> file.close() >>> file = open("output.txt", "r") 4. I disse opgaver skal vi se på funktioner def dict2tuplelist(dict): dict2tuplelist(dict) -> list Input : dictionary Output: liste af tupler af formen (key,value) pass (a) Se på ovenstående definition af en funktion, prøv ud fra dette at danne dig et billede af hvad funktionen skal kunne. Funktionen laver en dictionary om til en liste af tupler. (b) Implementer ovenstående funktion så den liste, den returnerer, har tupler som elementer.
Altså: hvis dictionary en er {'hest': 'horse', 'ko': 'cow', 'faar': 'sheep'} så skal programmet konvertere denne til en liste af tupler: [('hest', 'horse'), ('ko', 'cow'), ('faar', 'sheep')]. Hints: brug listens append-metode. def dict2tuplelist(adict): tupelliste = [] for index in adict: tupelliste.append((index,adict[index])) return tupelliste Det kan også gøres meget simpelt: >>> x = {'hest': 'horse', 'ko': 'cow', 'faar': 'sheep'} >>> x.items() [('ko', 'cow'), ('hest', 'horse'), ('faar', 'sheep')] 5. I denne opgave skal vi se på import af moduler # This is mymodule.py mylist = [2,5,8,10,17,34,37,53] def add(x,y): return x+y def sub(x,y): return x-y # This is myprogram.py import mymodule.py indexes = range(len(mymodule.mylist)) for x in indexes: if mymodule.mylist[x] % 2 == 0: print add(x,mymodule.mylist[x]) print sub(x,mymodule.mylist[x]) (a) Kig på de to ovenstående stykker kode. De tilhører hver sin fil, mymodule.py og myprogram.py. Myprogram.py importerer modulet mymodule.py for at bruge de ting som ligger der. Myprogram.py skal være placeret i mappen site-packages i mappen Lib i Python mappen. Alligevel går det galt. Hvad er der galt? Der er fejl to steder. Hint: 1. kig på navnet på modulet. 2. overvej to former for import-ordrer: import <modulnavn>, og from <modulnavn> import * (1) Når man importerer et modul skal man ikke skrive.py bagefter (2) Når man importerer et modul importerer man ikke de enkelte metoder og variable. Det kan man gøre ved kommandoen from mymodule import * (b) Ret eventuelle fejl så programmet kører og giver følgende output! 2-4 10 13-13 39-31 -46 En mulig løsning: from mymodule import * for x in indexes: if mylist[x] % 2 == 0: print add(x,mylist[x]) print sub(x,mylist[x])