Datalogi, grundkurs 1

Relevanta dokument
Datalogi, grundkurs 1. Lösningsförslag till tentamen

Datalogi, grundkurs 1

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Några saker till och lite om snabbare sortering

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Funktionell programmering DD1361

Tentamen i Introduktion till programmering

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Föreläsning 9 Exempel

Datalogi, grundkurs 1 Övningsuppgifter i Scheme. Serafim Dahl, Carina Edlund, m.fl.

Laboration: Whitebox- och blackboxtesting

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

TDDC74 Lab 02 Listor, sammansatta strukturer

Språket Python - Del 2 Grundkurs i programmering med Python

TDDC74 Lab 04 Muterbara strukturer, omgivningar

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Föreläsning 9 Exempel. Intervallhalveringsmetoden. Intervallhalveringsmetoden... Intervallhalveringsmetoden...

Filer. DA2001 (Föreläsning 16) Datalogi 1 Hösten / 19

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

Datalogi, grundkurs 1

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

729G04 Programmering och diskret matematik

Idag: Dataabstraktion

TDDC74 - Lektionsmaterial C

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

Grundläggande datalogi - Övning 1

Programmeringsteknik med C och Matlab

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

729G04 Programmering och diskret matematik. Föreläsning 7

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Ordlistor, filhantering och ut på webben. Linda Mannila

Pythons standardbibliotek

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Deklarationer/definitioner/specifikationer

Programdesign. minnesutrymme storlek på indata. DA2001 (Föreläsning 15) Datalogi 1 Hösten / 20

Datalogi för E Övning 3

Uppgifter teknik HT17 (uppdaterad v. 40)

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

TDDC74 Programmering, abstraktion och modellering. Tentamen

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

TDDC74 Programmering: Abstraktion och modellering Dugga 2, Tid: kl 08-10, Datum:

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Sökning och sortering

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 08-12

Selektion och iteration

Tentamen i. TDDA 69 Data och programstrukturer

Dagens föreläsning Programmering i Lisp Fö 5

DD1361 Programmeringsparadigm. Carina Edlund

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Föreläsning 13 Testning och strängar

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

729G04 Programmering och diskret matematik. Python 3: Loopar

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

TDDC74 Programmering, abstraktion och modellering. Tentamen

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Planering av ett större program, del 2 - for och listor. Linda Mannila

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

TDDC74 Programmering: Abstraktion och modellering. Provkod TEN1, Tid: kl 14-18, , Kåra

TDDC74 Programmering, abstraktion och modellering. Tentamen

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

TDDC74 Programmering: Abstraktion och modellering Datortenta

Tentamen i Grundläggande Programvaruutveckling, TDA548

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Erfarenheter från labben

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Övning 2. (Länkade) Listor, noder

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Övning 1 - Abstrakta datatyper

Övning 6. Ali Tofigh 24 Oktober, 2006

Ändringsbar (mutable compound) data. TDDC74 Programmering: abstraktion och modellering. Sätta - samman listor kopiering. Hitta sista cons-cellen

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

DD1314 Programmeringsteknik

Programdesign. Dokumentera. Dokumentera

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Grundläggande datalogi - Övning 2

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

allt.cl Page 1 of 17 Date: torsdag 7 december 2006

Transkript:

Datalogi, grundkurs 1 Fiktiv Tentamen Lösningsförslag och kommentarer

1. Lösningsförslaget nedan förutsätter ingenting om filens innehåll och är alltså mer generell än nödvändigt: alfa= ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ alfa += alfa.lower() filnamn = input( filnamn? ) f = open(filnamn) count = 0 for line in f: i = 0 j = len(line) while i < j: while i < j and line[i] not in alfa: i += 1 if i < j and line[i] in Pp : count += 1 while i < j and line[i] in alfa: i += 1 print(count, " ord börjar på p i filen ", filnamn, ".", sep= ) Nedanstående förslag till lösning tar hänsyn till att det bara ska finnas bokstäver, blanka och radbyten filnamn = input( filnamn? ) f = open(filnamn) count = 0 for line in f: words = line.split( ) for w in words: if len(w) > 0 and w[0] in Pp : count += 1 print(count, " ord börjar på p i filen ", filnamn, ".", sep= ) f = open( ord.txt ) text = f.read().lower() x = 0 if text[0] == p: x + = 1 for i in range (0, len(text)): if text[i] == and text [i+1] == p x + = 1 print ( Det finns, x, ord som börjar på p ) Missar \np, hade funkat om man först bytt ut \n mot (-2p) Kraschar om filen slutar med ett mellanslag (utanför indexgränsen) (-1p) 1

def count(): f = open( textfil ) s = f.read() # Adds a blank space in front of the string s = " " + s # Replaces \n with blank space s = s.replace( \n, ) # Converts the whole string to lower case s = s.lower() # Now every word will be preceded with s = s.split( p ) summa = s.count() return summa Perfekt! def ordmedp(): textfil = (...) try: f = open(textfil) except IOError: print("filen finns inte eller kan inte läsas!") else: alt = f.read().lower() orden = alt.replace("/n"," ").split() f.close() antal = 0 for i in orden: if i[0] == "p": antal += 1 print(antal, "ord börjar med p") Programmet printer inte en lämplig felmeddelande om man matar in ctrl-c. Bra! Funkar (sånär som på att /n, ska vara \n, inget avdrag för slarvfel som python-interpretatorn skulle tagit hand om). Men... ingen har frågat efter felhanteringen. Inget avdrag naturligtvis men slösa inte tid på sånt vi inte frågar efter! 2. a. Eftersom båda procedurerna tar listan som argument så kan de placeras var som helst i programmet (Era svar är allihop OK) b. (define find-max (lambda (lista) (define inner (lambda (lista max) 2

(cond ((null? lista) max) ((> (car lista) max) (inner (cdr lista) (car lista))) (else (inner (cdr lista) max))))) (inner (cdr lista) (car lista)))) (define (find-max lst) (cond ((empty? (cdr lst)) lst) ((< (car lst) (cadr lst)) (find-max (cdr lst))) ((> (car lst) (cadr lst)) (find-max (cons (car lst) (cddr lst)))) (else (find-max (cdr lst))))) find-max returnerar nu en lista och inte ett element. Åtgärdas genom att ändra till (car lst) i basfallet. (- 2p) (define find-max (lambda (lista) (define inner (lambda (lista max) (cond ((null? lista) max) (( > (car lista) max) (inner (crd lista) (car lista))) (else (inner (cdr lista) max))))) (inner lista (car lista)))) Funkar bra men man kan också anropa med (inner (cdr lista) (car lista)) (i kodens sista rad). c. (define delete-from-list (lambda (lista el) (if (= (car lista) el) (cdr lista) (cons (car lista) (delete-from-list (cdr lista) el))))) (define (delete-from-list lista el) (define (loop lista res) (cond ((null? lista) (reverse res) ((= el (car lista)) (loop (cdr lista) res)) (else (loop (cdr lista) (cons (car lista) res))))) (loop lista ())) Här kommer alla förekomster av elementet el att tas bort (-2p). (define (delete-from-list lst e) (cond ((empty? (cdr lst)) (if (equal? (car lst) e) () 3

lst)) ((equal? (car lst) e) (delete-from-list (cdr lst) e)) (else (cons (car lst) (delete-from-list (cdr lst) e))))) Här kommer alla förekomster av elementet e att tas bort (-2p). 3. a. def cardinal(q): tmp=createqueue() antal = 0 while not empty(q): enqueue(tmp, dequeue(q)) antal += 1 while not empty(tmp): enqueue(q, dequeue(tmp)) return antal def cardinal(q): NyQ = createqueue() antal = 0 while not empty(q): antal += 1 enqueue(nyq, dequeue(q)) return antal, NyQ Kön som hålls av q kommer att tömmas och kommer att vara tom efter det att cardinal körts. Att NyQ returneras kan vara en bra idé men garanterar inte i sig att q återställs. För att q ska återställas måste man anropa på rätt sätt. (-1p om man inte redovisar hur anropet sker) Fallgrop: att man tömmer kön då man räknar antalet element! b. def reverse(q): if not empty(q): e = dequeue(q) reverse(q) enqueue(q, e) return Obs! Man behöver inte returnera kön q, förändringarna som görs i kön i funktionen reverse gäller även utanför den. def reversequeue(q): lista = list() while not empty(q): lista.insert(0, dequeue(q)) for i in lista: enqueue(q, i) Bra lösning som är fullt möjlig i Python. 4

4. a. I ett blackbox-test testar man en algoritm utan annan kunskap än vad den förväntas utföra. Man testar med data som gör resultatet enkelt verifierbart, med typiska indata, med indata på gränsen till vad som ska kunna hanteras och med felaktig indata (om programspråket tillåter det) Helst ska ett blackbox-test utföras av någon som inte känner till implementationen, d.v.s. inte har kunskap om källkoden. (Era svar är allihop OK) b. Ett blackboxtest för deep-sum: 1. Enkelt verifierbara värden: (), (1), ((1)), (1 (1 (1 (1)))) samt samma med element som inte är tal 2. Typiska värden: (1 2 3), (1 (2 (3))), (1 2 (3)) osv 3. Gränsvärden: (10 10, 10 10 ), mm 4. Felaktiga värden: 1, "kalle" Verifikation (jag nöjer mig med två (tre?) uttryck här) (deep-sum (1 (1 (1 ( kalle 1) "hoppsan") #f))) => 1 + (deep-sum ((1 (1 ( kalle 1) "hoppsan") #f))) => 1 + (deep-sum (1 (1 ( kalle 1) "hoppsan") #f)) => 1 + 1 + (deep-sum ((1 ( kalle 1) "hoppsan") #f)) => 1 + 1 + (deep-sum (1 ( kalle 1) "hoppsan")) => 1 + 1 + 1 + (deep-sum (( kalle 1) "hoppsan")) => 1 + 1 + 1 + (deep-sum ( kalle 1)) => 1 + 1 + 1 + (deep-sum 1) => 1 + 1 + 1 + 1 + (deep-sum ("hoppsan")) => 1 + 1 + 1 + 1 + (deep-sum (#f)) => 4 = OK (deep-sum 1) kraschar, ingen koll av att input är en lista så (deep-sum #f) kraschar också Alltså fungerar inte deep-sum enligt specifikationen Ger förslag på en lista man kan skicka in till de olika testerna Lätta värden: (1 2 4 5) Gränsvärden: (Finns väl inga direkta gränsvärden att testa, men kollar så den klarar av en lista i djup 4.) ((((3 4))) 3 4) Typiska värden: (1 2 (3 4 5) (4 5) 4) Felaktiga värden: (ger funktionen ett par) (2.1) Black box-test av Scheme proceduren deep-sum: 5

Lätta värden: (deep-sum (0 0)) --> RÄTT (+ 0 (deep-sum (0))) --> 0 RÄTT (deep-sum (1 2)) --> RÄTT (+ 1 (deep-sum (2))) --> 3 RÄTT Felaktiga värden: (deep-sum ( hej)) --> 0 RÄTT (deep-sum 14) --> Antingen crasher programmet vid (car lista) eller också printer den 0. Båda är inte bra!! Typiska värden: (deep-sum (7 (1 4) 3)) --> RÄTT (+ 7 (+ (+ 1 (+ 4 0)) (+ 3 0))) --> 15 RÄTT Gränsvärden: (deep-sum (1 0.99999999999999999999999)) -> 2, tror jag, men man måste testa. OK Funktionen bör med ett enkelt värde så som (1 (1 1)), vanlig input så som (1 (2 3 (1 4) 4) 4), gränsvärden så som väldigt stora liststrukturer eller listor med stora och små tal. Slutligen bör dålig input undersökas. Vad händer när input är en sträng eller när liststrukturer med både tal strängar eller andra värden blandas. Ignoreras saker som inte inte är tal, kraschar processen eller räknas dessa om till ett värde är olika möjligheter som bör undersökas. OK 5. a. Nej deep-sum är inte svansrekursiv eftersom den i Nej, funktionen är inte svansrekursiv. Den är inte svansrekursiv pga av att det görs en beräkning på det rekursiva anropet. Det görs beräkningar på alla rekursiva anrop, vilket betyder att ingen av dessa anrop är svansrekursiva. Perfekt! b. Vi kom underfund med att deep-sum inte enkelt kan skrivas svansrekursivt (lärarna får skämmas) Det här är inte direkt en uppenbar lösning (define deep-sum (lambda (x) (define inner 6

(lambda (x rest res) (cond ((and (null? x) (null? rest)) res) ((null? x) (inner rest () res)) ((list? (car x)) (inner (cdr x) (append rest (car x)) res)) ((number? (car x)) (inner (cdr x) rest (+ (car x) res))) (else (inner (cdr x) rest res))))) (trace inner) (inner x () 0))) (define deep-sum (lambda (lista) (define inner ;;den inre funktionen tar tre argument (lambda (lista lista2 sum) (cond ((and (null? lista) (null? lista2)) sum) ;;basfall ((null? lista) ;; eftersom vi för över vår ursprungliga (inner lista2 () sum)) ;;lista till lista2 när vi möter en lista ;;i listan måste vi föra tillbaka lista2 ;;till listan för att fortsätta. ((list? (car lista)) ;;ser ifall listan har en lista i sig (inner (car lista) (cdr lista) sum)) ;;svansrekursiva anropet, ;;vi sätter resten av listan till ;;lista2 och den inre listan till lista ((number? (car lista)) ;;om första elementet inte är en lista ;;kollar den om det är en siffra (inner (cdr lista) lista2 (+ sum (car lista))))))) (inner lista () 0))) Bravo! Men, om lista2 innehåller en lista och det dyker upp en till som ska dit så försvinner den ena. Hmm... en illustration behövs nog... (deep-sum (1 2 (3 (4) (5)) (4 5) 4)) -->(inner (1 2 (3 (4) (5)) (4 5) 4) () 0) -->(inner (2 (3 (4) (5)) (4 5) 4) () 1) -->(inner ((3 (4) (5)) (4 5) 4) () 3) -->(inner (3 (4) (5)) ((4 5) 4) 3) -->(inner ((4) (5)) ((4 5) 4) 6) -->(inner (4) ((5)) 6) ;; OBS! ((4 5) 4) försvann 7

-->(inner () ((5)) 10) -->(inner ((5)) () 10) -->(inner (5) () 10) -->(inner () () 15) -->15 (define (svans-deep-sum lista) (define (cond (loop lista res) ((null? lista) res) ((list? (car lista)) (loop (cdr lista) (+ res (loop (car lista) res))) ((number? (car lista)) (loop (cdr lista) (+ res (car lista)))) (else (loop (cdr lista) res)))) (loop lista ())) Blir ju dessvärre inte svansrekursiv! c. def deepsum(lista): summa = 0 if not isinstance(lista, list): return 0 for i in lista: if isinstance(i, list): summa += deepsum(i) elif isinstance(i, int): summa += i elif isinstance(i,float): summa += i return summa Men så krångligt ska det inte vara (minus-poäng till lärarna igen!). def deepsum(x): if len(x)==0: return 0 elif isinstance(x[0],list): return deepsum(x[0]) + deepsum(x[1: ]) elif isinstance(x[0], int): return x[0] + deepsum(x[1: ]) else: return deepsum(x[1: ]) Imponerande tänkt! def deep-sum(lista): summa = 0 for i in lista: 8

if isinstance(i, list): summa += deep-sum(i) else: try: summa += i except ValueError: pass return summa Imponerande tänkt! 9