FACIT TILL OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Relevanta dokument
OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

FACIT TILL OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

DVG C01 TENTAMEN I PROGRAMSPRÅK PROGRAMMING LANGUAGES EXAMINATION :15-13: 15

FACIT TILL OMTENTAMEN I PROGRAMSPRÅK DVG C01

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

FACIT TILL/TO DVG C01 OMTENTAMEN I PROGRAMSPRÅK PROGRAMMING LANGUAGES RESIT EXAMINATION :15-13: 15

FACIT TILL OMTENTAMEN I PROGRAMSPRÅK DVG C kl. 08:15-13:15

FACIT TILL TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Recitation 4. 2-D arrays. Exceptions

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

LUNDS TEKNISKA HÖGSKOLA Institutionen för Elektro- och Informationsteknik

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Att skriva till och läsa från terminalfönstret

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Tentamen i. TDDA 69 Data och programstrukturer

Styrteknik: Binära tal, talsystem och koder D3:1

Grammatik. BNF-grammatik

12.6 Heat equation, Wave equation

Isometries of the plane

Styrteknik : Funktioner och funktionsblock

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:15 19:15

Discovering!!!!! Swedish ÅÄÖ. EPISODE 6 Norrlänningar and numbers Misi.se

FACIT TILL TENTAMEN I PROGRAMSPRÅK DVG C kl. 08:15-13:15

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Tentamen Grundläggande programmering

PROGRAMMERING-Java Omtentamina

Tentamen Programmering fortsättningskurs DIT950

Grafisk teknik IMCDP IMCDP IMCDP. IMCDP(filter) Sasan Gooran (HT 2006) Assumptions:

Övning 1 - Abstrakta datatyper

denna del en poäng. 1. (Dugga 1.1) och v = (a) Beräkna u (2u 2u v) om u = . (1p) och som är parallell

Preschool Kindergarten

12. Relationer och funktioner

This exam consists of four problems. The maximum sum of points is 20. The marks 3, 4 and 5 require a minimum

1. Varje bevissteg ska motiveras formellt (informella bevis ger 0 poang)

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

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)


TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Solutions to exam in SF1811 Optimization, June 3, 2014

Grafisk teknik IMCDP. Sasan Gooran (HT 2006) Assumptions:

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

(D1.1) 1. (3p) Bestäm ekvationer i ett xyz-koordinatsystem för planet som innehåller punkterna

Materialplanering och styrning på grundnivå. 7,5 högskolepoäng

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

Module 6: Integrals and applications

c = s[2]; /* move chars around */ p = &s[2]; *p = *(p-1); --p; *p = *(p-1); s[0] = c; printf("%s\n",s); /* print the string */ English version

Inlämningsuppgift MiniPlotter

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

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Högskolan i Skövde (SK, JS) Svensk version Tentamen i matematik

12. Relationer och funktioner

Grafisk teknik. Sasan Gooran (HT 2006)

Alfabeten, strängar och språk. String

1. Compute the following matrix: (2 p) 2. Compute the determinant of the following matrix: (2 p)

8 < x 1 + x 2 x 3 = 1, x 1 +2x 2 + x 4 = 0, x 1 +2x 3 + x 4 = 2. x 1 2x 12 1A är inverterbar, och bestäm i så fall dess invers.

Tentamen i Matematik 2: M0030M.

Föreläsning 3. Stack

Scalable Dynamic Analysis of Binary Code

Annonsformat desktop. Startsida / områdesstartsidor. Artikel/nyhets-sidor. 1. Toppbanner, format 1050x180 pxl. Format 1060x180 px + 250x240 pxl.

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

and u = och x + y z 2w = 3 (a) Finn alla lösningar till ekvationssystemet

Föreläsning 3. Stack

Imperative Programming

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Second handbook of research on mathematics teaching and learning (NCTM)

Lösenordsportalen Hosted by UNIT4 For instructions in English, see further down in this document

public boolean containskey(string key) { return search(key, head)!= null; }

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Tentamen i Algoritmer & Datastrukturer i Java

FÖRBERED UNDERLAG FÖR BEDÖMNING SÅ HÄR

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

TDDC77 Objektorienterad Programmering

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

DAT043 Objektorienterad Programmering

Övning 0. Python för den som kan MATLAB. Lättare att läsa färdig kod än att skriva själv Det krävs övning för att automatiskt få detaljerna rätt:

TENTAMEN OOP

Isolda Purchase - EDI

PROGRAMMERING-Java TENTAMINA

Rastercell. Digital Rastrering. AM & FM Raster. Rastercell. AM & FM Raster. Sasan Gooran (VT 2007) Rastrering. Rastercell. Konventionellt, AM

Chapter 2: Random Variables

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Viktig information för transmittrar med option /A1 Gold-Plated Diaphragm

Module 1: Functions, Limits, Continuity

6 th Grade English October 6-10, 2014

Authentication Context QC Statement. Stefan Santesson, 3xA Security AB

Uppgift 6A - Frekvenstabell

PROGRAMMERING-JAVA TENTAMINA

Föreläsning 8: Exempel och problemlösning

LULEÅ TEKNISKA UNIVERSITET

Dagens föreläsning. Modeller för programmeringsspråk. - Olika modeller programspråk Interpretator - kompilator. - Syntax - semantik.

Chapter 4: Writing Classes/ Att skriva egna klasser.

Övning 5 ETS052 Datorkommuniktion Routing och Networking

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Calculate check digits according to the modulus-11 method

Transkript:

FACIT TILL OMTENTAMEN I PROGRAMSPRÅK -- DVG C01 130110 kl. 08:15-13: 15 Ansvarig Lärare: Donald F. Ross Hjälpmedel: Bilaga A: BNF-definition Betygsgräns: Kurs: Max 60p, Med beröm godkänd 50p, Icke utan beröm godkänd 40p, Godkänd 30p (varav minimum 20p från tentan, 10p från labbarna) Tenta: Max 40p, Med beröm godkänd 34p, Icke utan beröm godkänd 27p, Godkänd 20p Labbarna: Max 20p, Med beröm godkänd 18p, Icke utan beröm godkänd 14p, Godkänd 10p SKRIV TYDLIGT LÄS UPPGIFTERNA NOGGRANT 1. Ange kortfattade svar på följande uppgifter: (a) Ge en definition av (i) aktuell parameter samt (ii) formell parameter AP: An expression, which can be a value or a variable name, used as an argument in a call to a procedure/function/method. The actuall parameter is bound to the formal parameter att time of call. The binding is determined by the parameter passing semantics. FP: A name, usually typed, used in the body of the procedure/function/method for symbolic manipulation. An actuall parameter is bound to the formal parameter att time of call. The binding is determined by the parameter passing semantics (b) Vad är ett program? program: A program is a sequence of instructions for a machine (½) better - A program is a description of values, properties, methods, problems and solutions. (A Model!) The role of a machine is to speed up the manipulation and evaluation of these descriptions DFR 130110 PS omtentamen FACIT Sidan 1 av 16

(c) Ge en definition av (i) lexeme, (ii) sträng samt (iii) mönster (pattern). Vad är skillnaden de emellan? sträng (string) A finite sequence of characters drawn from some alphabet Σ lexem (lexeme) a sub-string (of a string representing a sentence in a given grammar) of symbols corresponding to a regular expression e.g. "<", "<=", "=", "!=", ">=", ">" and which can be categorised as a token. mönster (pattern) a string used to find a lexeme (substring) in the source code (input string) either by use of regular expressions (where a pattern can be a string literal or a regular expression) or by extracting lexemes from the source code and comparing the lexeme with string literals (patterns) in a table. The usual major difference is that the token ID may have an infinity of lexemes. This aspect is usually solved by defining an ID as beginning with a letter and then any combination of letters and numbers (sometimes also symbols such as underscore). This becomes a regular expression. (d) Vad är förhållandet mellan lexemer och tokens? A lexeme is a substring of the input program text and represents an instance of a class of lexemes which correspond to a token. The function of the lexer is to convert lexemes to tokens for the parser. In most cases, the class of lexemes will contain only 1 pattern e.g. program for the token program. In the case of the token ID, there are a potentially infinite number of lexemes so that the pattern must be specified using for e.g. regular expressions [A..Za..z][A..Za..z0..9]* i.e. alphanumeric strings beginning with a letter. (e) Hur definierar man skillnaden mellan lokala och icke-lokala omgivningar? Lexical (static) semantics, the non-local environment is the next surrounding environment defined in the program text Dynamic semantics the non-local environment is defined as being the environment of the previous call in a call sequence. Totalt 5p DFR 130110 PS omtentamen FACIT Sidan 2 av 16

2. BNF-definitioner Titta noggrant på grammatiken i bilaga A. Utöka denna BNF-definition för att hantera funktioner. Ange alla antagande. 5p [function def list] ::= e [function def] [function def list] [function def] [function def] ::= [function header] [var part] [stat part] [function header] ::= function id ( [parameter list] ) : [ type] ; [parameter list] [param dec list] [param dec] ::= e [param dec list] ::= [param dec] [param dec list], [param dec] ::= { var } [id list] : [type] Now add the [function def list] into the grammar [program] ::= [prog header] [var part] [function def list] [stat part] NB it is also an idea to update [operand] [operand] ::= id number [function call] [function call] ::= id ( actual param list ) [actual param list] ::= e [expression list] [expression list] ::= [expr] [expression list], [expr] By analogy with a program The parameter list may be empty (design decision) This is also similar to a [var dec list] except that it is separated by a comma and not terminated by a semicolon The var part is optional here I use EBNF [param dec] ::= var [id list] : [type] [id list] : [type] Would be the alternative DONE! DFR 130110 PS omtentamen FACIT Sidan 3 av 16

3. Parser En parser delas upp i 2 komponenter (i) den lexikaliska analysatorn och (ii) den syntaktiska analysatorn. Varför gör man en sådan uppdelning. Vilka uppgifter har dessa 2 komponenter? Använd gärna konkreta exempel i ditt svar. Svar ingående. 5p Example: program testok1(input, output); var A, B, C: integer; begin A := B + C * 2 end. Lexer Analyses the input program text (above) and identifies lexemes which fall into 3 categories 1. strings beginning with a letter ID names or Keywords 2. strings beginning with a digit numbers 3. all other strings For the above program the lexemes are:- "program testok1 ( input, output ) ; var A, B, C : integer ; begin A := B + C * 2 end. The ID name/keyword distinction may be solved by using a keyword table to identify keywords if the lexeme is not found in the table then the lexeme is considered an ID The lexer returns a token stream to the parser (on demand). For the above program these tokens will be:- PROGRAM ID LP INPUT COMMA OUTPUT RP SCOLON VAR ID COMMA ID COMMA ID COLON INTEGER SCOLON BEGIN ID ASSIGN ID PLUS ID TIMES NUM END DOT In addition, the lexer will remove white space. Each lexeme is held in a buffer for use by the parser which for example in the case of Ids may load DFR 130110 PS omtentamen FACIT Sidan 4 av 16

the corresponding ID (variable name) into the symbol table together with other attributes such as type, kind, size, address (offset). Parser The parser requests tokens from the lexer which it tries to match with terminal symbols in the grammar (See Appendix A). In a Recursive Descent Predictive Parser (RDPP), the nonterminal symbols in the grammar are implemented as procedure calls which trace out a virtual parse tree. For IDs, the parser will add these to the symbol table in the var_part phase. This allows the following semantoc checks to be made 1. doubly declared identifiers 2. undeclared identifiers in the stat_part phase 3. type checking in expressions and assignment The parser may also calculate the space required for the data objects in the program and enter this information in the symbol table. You could draw the parse tree for the above program. DFR 130110 PS omtentamen FACIT Sidan 5 av 16

4. Parameterhantering Ge detaljerade och konkreta programexempel för att illustrera hur värdeanrop ( call-byvalue ), referensanrop ( call-by-reference ) samt värderetur ( call-by-value-return ). I varje fall, förklara vilka mekanismer man använder sig av när man implementerar parameteröverförning ( parameter passing ) och rita bilder av stackrammar ( stack frames ) för att visa hur detta fungerar i ett exekveringssystem. See the revision notes (or previous facits) for examples of these marks for good illustrations and explanations. Points to note Discuss both f(ap) and f(2+2) i.e. an actual parameter which is an ID and one which is an expression What happened in call-by-reference with expressions? 5p DFR 130110 PS omtentamen FACIT Sidan 6 av 16

5. Parseträd expr -> term R1 R1 -> e '+' term R1 term -> factor R2 R2 -> e '*' factor R2 factor -> '(' expr ')' DIGIT (e = empty) Titta noggrant på grammatiken ovan. Rita parseträdet för uttrycket (2+2)*2. 5p DFR 130110 PS omtentamen FACIT Sidan 7 av 16

expr factor term R2 R1 e ( expr ) * factor R2 digit e term R1 2 factor R2 + term R1 digit e factor R2 e 2 digit e 2 ( 2 + 2 ) * 2 DFR 130110 PS omtentamen FACIT Sidan 8 av 16

6. Prolog Predikat Skriv predikatet append(+lista1,+lista2,-lista3), som tar Lista1 och Lista2 som inparametrar och skapar en ny lista, Lista3, där elementen från Lista1 placeras före elementen från Lista2 Exempel:?-append([1, 2, 3], [a, b], X). X = [1, 2, 3, a, b] (1 p) Laborationen I laboration 2 skulle du skriva en parser för ett enkelt Pascalprogram. Parsningsprogrammet kunde delas upp i tre delar: inläsning från fil, lexikalanalys och syntaxanalys. Lexikalanalysdelen fick en lista med fyra typer av lexem (= nyckelord, specialtecken, variabelnamn och heltal) från inläsningsdelen och den listan omvandlades ett lexem i taget till en lista av tokens för vidare behandling i syntaxanalysdelen. a) Skriv predikatet lexer som med hjälp av predikatet match gör om ett lexem i taget till motsvarande token. (1 p) b) Beskriv utförligt, gärna med hjälp av kod, hur match gör omvandlingen till tokens. Beskrivningen skall innehålla minst tre olika typer av lexem. (3 p) Totalt 5p DFR 130110 PS omtentamen FACIT Sidan 9 av 16

7. Objektorientering 5 poäng: A. Vilka följder får det att en klass är abstrakt inom objektorientering? Varför deklarerar man vissa klasser abstrakta? B. Givet följande program skrivet i Java. Vad skrivs ut när programmet utförs och varför? Utöver att ange rätt utskrift från programmet ska du alltså även redogöra för de mekanismer som gör att utskriften blir som den blir. class A { public void f() {System.out.println ("A.f");} } (1p) (1,5p) class B extends A { public void f() {System.out.println ("B.f");} } class Program { static void p(a o) {o.f();} public static void main(string[] args) { A a = new A(); B b = new B(); A ab = new B(); p(a); p(b); p(ab); } // main } // class Program C. Antag att följande klass Integer är definierad i Java med metoderna getvalue som läser av det aktuella värdet och setvalue som definierar ett nytt: class Integer { public Integer(int value) {setvalue(value);} public int getvalue() {return value;} public void setvalue(int newvalue) {value = newvalue;} //... more functions... private int value; }; // Integer (2,5p) Vi önskar definiera addition av heltal och utvidgar därför klassdefinionen av Integer med följande metoder och tillhörande implementationer: void add1(integer i) {setvalue(getvalue() + i.getvalue());} void add2(integer i) {this.setvalue(this.getvalue() + i.getvalue());} Integer add3(integer i) {return new Integer(value + i.getvalue());} Integer add4(integer i) {return new Integer(getValue() + i.getvalue());} void add5(integer i, Integer j) {j = new Integer(getValue() + i.getvalue());} Förklara och kommentera skillnaden i synsätt, utförande och resultat mellan följande par av funktioner: i. add1 och add2 ii. iii. iv. add1 och add4 add3 och add4 add4 och add5 DFR 130110 PS omtentamen FACIT Sidan 10 av 16

För vart och ett av de fem förslagen, kommentera om namnet add på funktionen (bortse från numret) är lämplig och föreslå ev ett bättre namn, allt enligt minsta förvåningens princip *. *) Minsta förvåningens princip (The Principle of Least Astonishment, POLA eller PLA) sager bl.a.: Speciellt ska en programmerare försöka tänka på vilket beteende som kommer att förvåna någon som använder sig av programmet minst, snarare än det beteende som verkar mest naturligt för någon som känner till programmets inre arbetssätt. Totalt 5p DFR 130110 PS omtentamen FACIT Sidan 11 av 16

8. Lisp Anta att det finns en function make-book (defun make-book (title author class) (list (list 'title title) (list 'author author) (list 'class class) ) ) och anta att books är definierad genom (setf books (list (make-book '(Artificial Intelligence) '(Patrick Henry Winston) '(Technical AI)) (make-book '(Common Lisp) '(Guy L Steele) '(Technical Lisp)) (make-book '(Moby Dick) '(Herman Melville) '(Fiction)) (make-book '(Tom Sawyer) '(Mark Twain) '(Fiction)) (make-book '(The Black Orchid) '(Rex Stout) '(Fiction Mystery)) ) ) Warning: Declaring BOOKS special. (((TITLE (ARTIFICIAL INTELLIGENCE)) (AUTHOR (PATRICK HENRY WINSTON)) (CLASS (TECHNICAL AI))) ((TITLE (COMMON LISP)) (AUTHOR (GUY L STEELE)) (CLASS (TECHNICAL LISP))) ((TITLE (MOBY DICK)) (AUTHOR (HERMAN MELVILLE)) (CLASS (FICTION))) ((TITLE (TOM SAWYER)) (AUTHOR (MARK TWAIN)) (CLASS (FICTION))) ((TITLE (THE BLACK ORCHID)) (AUTHOR (REX STOUT)) (CLASS (FICTION MYSTERY)))) DFR 130110 PS omtentamen FACIT Sidan 12 av 16

i. Vad gör följande kod i Lisp? Beskriv ingående hur koden fungerar. Ange gärna ett exempel. Vad är resultatet av denna funktion tillämpad på books (ovan)? Ange alla antagande. > (defun list-fiction-books (books) (cond ((endp books) nil) ((fictionp (first books)) (cons (first books) (list-fiction-books (rest books)))) (t (list-fiction-books (rest books))) )) 2p ii. Skriv pseudokod till en Lisp funktion fictionp för koden i del i. 1p iii. Skriv pseudokod till en Lisp funktion book-last-name. Ett exempel av en tillämpning av funktionen finns nedan tillsammans med svaret. Vad måste man tänka på när man skriver sådana Lisp funktioner?. (mapcar #'book-last-name books) (WINSTON STEELE MELVILLE TWAIN STOUT) 2p Totalt 5p Points to think about (a) the name of the function filter the original books list to give the subset containing fiction books e.g. output is expected to be (((TITLE (MOBY DICK)) (AUTHOR (HERMAN MELVILLE)) (CLASS (FICTION))) ((TITLE (TOM SAWYER)) (AUTHOR (MARK TWAIN)) (CLASS (FICTION))) ((TITLE (THE BLACK ORCHID)) (AUTHOR (REX STOUT)) (CLASS (FICTION MYSTERY)))) (b) the structure of the function is a classic Lisp cliché with a filter predicate (c) Assume fictionp yields true when the class contains the symbol fiction DFR 130110 PS omtentamen FACIT Sidan 13 av 16

(d) Now start the analysis a. Check for the empty list end the recursive call b. Look at the first of books and check that book (see structure above) to see if it satisfies the fictionp predicate (so far guessing what this does) c. If the fictionp predicate is true then construct a list containing the first book and list-fiction-books applied to the rest of the books list d. If fictionp is not true then ignore the first book in the list (since the book is not in the class fiction) and apply list-fiction-books to the rest of the books list and return the result DFR 130110 PS omtentamen FACIT Sidan 14 av 16

iv. Skriv pseudokod till en Lisp funktion fictionp för koden i del i. Points to think about 1p (a) fictionp works on a book object e.g. ((TITLE (MOBY DICK)) (AUTHOR (HERMAN MELVILLE)) (CLASS (FICTION))) (b) there are 2 stages required a. extract the class for the book (a list) b. determine if the symbol is in this list (actually the second element of the list, which is itself a list). (c) The first stage find the class (defun book-class (book) (second (assoc 'class book)) ) (d) The second stage determine if the symbol fiction is a member of the class list (defun fictionp (book) (member 'fiction (book-class book)) ) v. Skriv pseudokod till en Lisp funktion book-last-name. Ett exempel av en tillämpning av funktionen finns nedan tillsammans med svaret. Vad måste man tänka på när man skriver sådana Lisp funktioner?. (mapcar #'book-last-name books) (WINSTON STEELE MELVILLE TWAIN STOUT) As above, this is a 2 stage process 2p (defun book-author (book) (second (assoc 'author book)) ) (defun book-last-name (book) (first (last (book-author book))) ) DFR 130110 PS omtentamen FACIT Sidan 15 av 16

Bilaga A - Grammatik: Pascallik språk 1. [prog] ::= [prog header] [var part] [stat part] 2. [prog header] ::= program id ( input, output ) ; 3. [var part] ::= var [var dec list] 4. [stat part] ::= begin [stat list] end. 5. [var dec list] ::= [var dec] [var dec list] [var dec] 6. [var dec] ::= [id list] : [type] ; 7. [stat list] ::= [stat] [stat list] ; [stat] 8. [stat] ::= [assign stat] 9. [assign stat] ::= id := [expr] 10. [expr] ::= [term] [R1] 11. [R1] ::= e + [term] [R1] 12. [term] ::= [factor] [R2] 13. [R2] ::= e * [factor] [R2] 14. [factor] ::= ( [expr] ) [operand] 15. [type] ::= integer 16. [id list] ::= id [id list], id 17. [operand] ::= id number DFR 130110 PS omtentamen FACIT Sidan 16 av 16