Datalogi, grundkurs 1 Tentamen 10 december 2008 Hjälpmedel: Några fakta om Standard Pascal, Revised5 Report on the Algorithmic Language Scheme, Tänk på: Skriv högst en uppgift på varje blad. Använd endast framsidan på varje blad. Uppgifterna kommer inte i svårighetsordning. Skriv tydligt, motivera svaren – endast begriplig och läsbar lösning ger poäng. Maximal poäng finns angiven inom parentes vid varje uppgift. Totalt kan tentamen ge 60 poäng, varav 30 säkert ger godkänt. Lycka till, Serafim 1. a. (2p) Vad är ett black-box-test och vem bör utföra ett sådant? b. (2p) Vad är ett glass-box-test och vem bör utföra ett sådant? 2. Proceduren prime? (define prime? (lambda (n) (define interval-list (lambda (m n lst) (if (> m n) lst (interval-list (+ 1 m) n (append lst (list m)))))) (define remove-multiples (lambda (n lst) (cond ((null? lst) ’()) ((= (modulo (car lst) n) 0) (remove-multiples n (cdr lst))) (else (cons (car lst) (remove-multiples n (cdr lst))))))) (define sieve (lambda (lst) (if (null? lst) ’() (cons (car lst) (sieve (remove-multiples (car lst) (cdr lst))))))) (= n (car (reverse (sieve (interval-list 2 n ’()))))))) kontrollerar om dess argument n är ett primtal genom att interval-list bygger en lista med alla tal från och med 2 och upp till och med det argument man anropar prime? med. Därefter plockar sieve bort alla tal som inte är primtal ur listan så att endast primtalen finns kvar och använder då proceduren remove-multiples som hjälp-procedur. Metoden är gammal (grekisk) och kallas för ”Eratostenes såll” (”sieve” = ”såll”). Om argumentet n i anropet till prime? fortfarande är kvar i listan kommer det stå sist och är ett primtal, där (car (reverse (sieve (interval-list 2 n ’())))) plockar ut det sista talet i listan. a. (6p) Avgör, för var och en av de lokala procedurerna i prime? om proceduren är svansrekursiv eller inte. Motivera noga. 1 av 3 b. (7p) Eftersom minst en av de lokala procedurerna inte är svansrekursiv blir din uppgift att modifiera prime? så att alla lokala procedurer blir svansrekursiva. Det är OK att göra en annorlunda lösning. c. (2p) I ett ”black-box”-test skall man testa med felaktiga värden. prime? klarar inte det med sin nuvarande utformning. Föreslå en modifiering som gör att prime? fungerar vettigt även om man anropar med t.ex. (prime? 1), (prime? ’kalle) eller (prime? 3.14). 3. (10p) Skriv ett Pascalprogram som läser igenom en textfil och skriver ut hur många heltal som finns i filen. 4. Proceduren sort nedan avses sortera de element i vektorn v som ligger på platserna fr.o.m. v[m] t.o.m. v[n] PROCEDURE sort(VAR v: vector; m, n: Integer); VAR i: Integer; BEGIN FOR i := n downto Succ(m) DO IF v[i] < v[Pred(i)] THEN swap(v[i], v[Pred(i)]); IF Succ(m) < n THEN sort(v, Succ(m), n); END; a. (3p) Hur ska vektorn v vara deklarerad för att proceduren ska kunna fungera? b. (4p) Proceduren kan effektiviseras (marginellt) utan att rekursionen elimineras genom att man slutar sorteringen om inget ändrats under en genomgång av vektorn. Inför den förbättringen. c. (7p) Skriv om proceduren så att den inte utnyttjar rekursion. d. (4p) Skriv proceduren swap. Motivera noga var, i förhållande till sort, swap måste respektive kan placeras. 5. Man vill skapa ett enkelt register för att hålla reda på priser och kvaniteter för varor i ett varuhus och har valt Scheme som språk. Den struktur man valt ser ut så En post är en lista med (varunr varutyp pris sort kvantitet). Registret är en lista med poster (ett utsnitt av registret): ((312 "cykel" 2530 styck 828) (315 "vetemjöl" 9.45 kg 213) 2 av 3 (316 "socker" 22.10 kg 200) ... ) där man kan läsa ut att vara nummer 312 är en cykel som kostar 2530 kr styck och det finns 828 st. i lager, att vara nummer 315 är vetemjöl till 9.45 kr per kg med 213 kg i lager, o.s.v. a. (5p) Skriv konstruktorer och selektorer med beskrivande namn (namn som på ett begripligt sätt accocierar till vad proceduren gör) för både poster (konstruktion av en post och läsa av delarna), och hantering av registret (sätta in, hämta poster). b. (8p) Skriv med hjälp av de i föregående deluppgift definierade procedurerna en procedur som beräknar det totala värdet som varulagret motsvarar, d.v.s . För högsta poäng ska din lösning vara svansrekursiv. 3 av 3