Linköpings universitet Institutionen för datavetenskap, IDA Olle Willén februari 2009 Tentamen TDDB53 KOMPLETTERANDE HEMTENTAMEN TDDB53 Programmering i Ada för MI (MI-ADA) i februari 2009 Tentan lämnas ut 27/2 vid ca kl 13.00 och skall lämnas in senast 4/3 kl 13.00 till Olle Willén. Hjälpmedel: Godkännande: Försäkran: Andra personers assistans och datorer är otilllåtna hjälpmedel! Allt annat är tillåtet. Tentamen ger godkänt eller inte godkänt. För godkänt krävs 10 godkända uppgifter, inklusive eventuell bonus. Godkända uppgifter från senaste ordinarie hemtenta räknas tillgodo. En sådan skall fyllas i och lämnas tillsammans med tentasvaren. Den finns sist i detta häfte.
Kompl. hemtentamen i TDDB53 Programmering i Ada för MI (MI-ADA) 2(6) Varje uppgift ger godkänt (G) eller underkänt (U). 1. Redogör för den sats i Ada som startar med ordet while. Beskriv dels skrivsättet så allmängiltigt och uttömmande som möjligt, dels utförandet. 2. Ge så illustrativa svenska synonymer som möjligt till de två Ada-begreppen sats resp värde. Använd enstaka ord eller fåordiga formuleringar. 3. Förklara begreppet lokal variabel. 4. Deklarationen av en subrutin har följande inledning: function Fie(x : Float) return Boolean... Beskriv så fullständigt och allmängiltigt som möjligt vilka konstruktioner som då måste finnas på de platser som i nedanstående sats markeras med α resp β. α := Fie(β) 5. Vad menas med begreppet range? Ge också ett konkret exempel på var (i vilken konstruktion) en sådan kan användas i ett Ada-program. 6. Beskriv generellt, utan detaljer och på vanlig svenska, vilket värdet av nedanstående uttryck är, utifrån varje tänkbart värde på Integer-variabeln k. k / Integer Max(1, abs(k)) 7. S är deklarerad som Integer. Vilka värden, i tur och ordning, kommer S att ha vid markeringen när nedanstående utförs? for i in 2.. 5 loop S := i; for j in reverse 0.. 6 loop exit when S > 100; S := S * i;
Kompl. hemtentamen i TDDB53 Programmering i Ada för MI (MI-ADA) 3(6) 8. I satsen här intill är X och Y heltalsvariabler. Tolka satsen och ange på ett förenklat vardagligt eller matematiskt sätt under vilka omständigheter den Booleska variabeln P blir true. if Y > 1 then if X < 1 then P := False; else P := not(y < X); elsif Y < X then P := false; elsif Y = X then P := Y = 1; else P := False; 9. Deklarationerna nedan är givna. Ett huvudprogram har variabeln Data av typen List och gör anropet Rev(Data) som ska se till att vända innehållet i Data bakfram. Vad är det emellertid för fel på Rev? type List is array(1.. 100) of Integer; procedure Rev(lst : in out List) is t : Integer; begin for i in 1.. 100 loop t := lst(i); lst(i) := lst(101 - i); lst(101 - i) := t; end Rev; 10. Här existerar samma datatyp List som ovan. När C nedan anropas tar den emot en List med tal i icke fallande storleksordning. Förklara vad det då är för karaktäristik av denna List som beskrivs av utskriften från proceduren. procedure C(the_list : List) is f : Integer := 1; ind : Integer := 1; begin while ind <= the_list Last loop while ind <= the_list Last loop exit when the_list(ind) /= the_list(f); ind := ind + 1; Put(the_list(f), 3); Put(" x "); Put(ind - f, 3); New_Line; f := ind; end C;
Kompl. hemtentamen i TDDB53 Programmering i Ada för MI (MI-ADA) 4(6) 11. En viss matematisk egenskap hos hela tal kan avgöras av funktionen nedan. Funktionen levererar nämligen true bara om dess parameter har egenskapen i fråga. Förklara med funktionen som utgångspunkt och på något matematiskt uttryckssätt vad denna egenskap innebär. function Is_P(N : Integer) return Boolean is X : Integer := 1; begin if N > 0 then loop if X < N then X := X + X + 1; else return X = N; return False; end Is_P; 12. Man har installerat automatiska mätutrustningar på var och en av 10 apparater, vilka klarar av att registrera antalet fel per apparat under varje timme (0.. 23) i en hel vecka. Varje apparat är också försedd med en unik identitet. Variabeln FelRapport nedan innehåller denna datasamling i Ada. Rita och förklara hur variabeln strukturellt är uppbyggd, så att någon som inte är initierad ändå förstår. subtype ApparatId is String(1.. 4); subtype ApparatNummer is Integer range 1.. 10; type Dag is (Mån, Tis, Ons, Tor, Fre, Lör, Sön); type FelFrekvens is array(dag, 0.. 23) of Integer; type ApparatData is record -- Apparatid och felfrekvens för veckans alla timmar: Identitet : ApparatId; FelAntal : FelFrekvens; end record; type VeckoRapport is array(apparatnummer) of ApparatData; FelRapport : VeckoRapport; 13. Friidrottsdisciplinen tiokamp går ut på att deltagarna tävlar i 10 olika friidrottsgrenar, uppnår ett resultat i varje gren, och också tilldelas ett poängvärde (enligt en viss formel) för vardera resultatet. 2.20 i höjd ger t ex 992 poäng, för män. Summan av de tio poängvärdena ska utgöra tiokampens slutresultat. Variabeln Sammanställning nedan innehåller resultaten från en tävling mellan AntalTävlande deltagare. Uppgift: Skriv den bit lösryckta kod som ser till att räkna ut varje deltagares summapoäng (TotalPoäng) efter genomförda deltävlingar. (Koden på nästa sida)
Kompl. hemtentamen i TDDB53 Programmering i Ada för MI (MI-ADA) 5(6) (Uppgift 13, forsättning) type Gren is (Löpning100, Länghopp, Kula, Höjdhopp, Löpning400, Löpning110Häck, Diskus, Stavhopp, Spjut, Löpning1500); type GrenResultat is record DelResultat : Float; -- Resultatet i viss gren DelPoäng : Integer; -- Poängen för det resultatet end record; type ResultatLista is array(gren) of GrenResultat; subtype NamnTyp is String(1.. 25); -- Typ för personnamn. type Deltagare is record Namn : NamnTyp; -- En tävlandes namn, Resultat : ResultatLista; -- resultat i alla grenar, TotalPoäng : Integer; -- och summapoäng. end record; MaxAntalTävlande : constant Integer := 20; type ResultatTabell is array(1.. MaxAntalTävlande) of Deltagare; -- Verkligt antal tävlande och alla tävlandes resultat: AntalTävlande : Integer; Sammanställning : ResultatTabell; 14. Det existerar en procedur proc (som du alltså inte ska skriva!) som tar emot en Integer- och en Floatparameter. proc ska nu anropas ett antal gånger och i de successiva anropen få parameterparen (1, 1.0), (-1, 2.0), (1, 6.0), (-1, 24.0), (1, 120.0), (-1, 720.0) etc enligt samma mönster, så länge den andra parametern är < 10 12. Skriv de (lösryckta) rader kod som åstadkommer detta, och de nödvändiga deklarationerna. Du ska givetvis använda en repetition där värden varierar på något sätt, inte en radda anrop av proc. 15. En subrutin vilken anropas som Toggle(t), där t är någon Boolesk variabel, ska se till att t efter anropet bytt värde, antingen från true till false eller tvärtom. Skriv denna subrutin.
Kompl. hemtentamen i TDDB53 Programmering i Ada för MI (MI-ADA) (Använd denna sida som försättsblad till det du lämnar in - häfta ihop.) [väl textat namn] [tydligt personnummer] FÖRSÄKRAN Härmed försäkrar jag på min heder att jag inte utnyttjat andra hjälpmedel än de tillåtna under denna tentamen, och att de svar jag redovisat är mina egna formuleringar. Linköping den [underskrift] För examinator 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: Bonus: Godkänd Underkänd Saknas Antal G Tentan är godkänd Tentan är underkänd