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