Tentaupplägg TIPS 1: Läs igenom ALLA uppgifterna. Välj den du känner är lättast först. Det kan gärna ta 10-20 minuter. Försök skriva saker som kan vara problem i uppgifterna. Är det något du absolut kommer att fastna på så kanske det är fel uppgift att ge sig på. Tiden du lägger på att noga läsa uppgifterna tjänar du in på att välja rätt uppgift. TIPS 2: Kolla ibland till kommunikationsfönstret. Det kan ha kommit information till alla utan att ni skickat in en fråga. Kanske gäller det dig också (d.v.s. den uppgift du jobbar med). TIPS 3: Om ni har problem med kompilator, Emacs eller annat som INTE har med uppgifterna att göra, räck upp handen så kommer en assistent. Detsamma gäller om hur man kopierar givna filer " cp given_files/*. " eller liknande. Frågor om själva uppgifterna tar vi i första hand via tentasystemet. I körexemplen har vi markerat det som användaren matar in på tangentbordet med fet och kursiverad stil. Tänk på att körexemplen bara är ett exempel på när programmet körs. Testa ditt program noga och tänka över hur programmet skall fungera vid andra indata. Vi hinner normalt sett inte svara på frågor de sista 10 utminutera på tentan. Då ägnar vi all tid åt att rätta uppgifter för att alla skall hinna få svar innan ni går hem. Betygsgränser: Tid 1 poäng 19:00 (21:00) Betyg 3 3 poäng 18:00 (19:30) Betyg 4 3 poäng 16:30 (17:30) Betyg 5 4-6 poäng 18:00 (19:30) Betyg 5 Bonustid från laborationerna tillkommer till dessa tidsgränser. Tiden för betyg 3 överstiger dock aldrig 5 timmar. OBS: Delpoäng delas inte ut på uppgifterna. För att få poäng på en uppgift måste man alltså lösa uppgiften helt (och enligt specifikation). Lycka till med tenterandet och hoppas att alla får G på minst en uppgift idag. M.v.h. /Torbjörn (examinator)
Uppgift 1 - Byt enhet [1p] Skriv ett program där användaren får ange ett visst belopp och enheten. Användaren skall också ange vilken enhet som den vill omvandla till. Följande enheter skall stödjas: (tum, fot, aln, meter, millimeter, yard, mile). Vi avrundar alltid till närmsta heltal. Om resultatet skulle bli så litet att det avrundas till noll så skall användaren få mata in på nytt. Här är en tabell med vad som gäller för enheterna: 1 tum = 2,54 cm 1 fot = 30,48 cm 1 aln = 59,3808 cm 1 yard = 91,44 cm 1 meter = 100 cm 1 mile = 160934 cm Körexempel 1: Mata in en längd i: 36 Mata in vilken enhet detta var: yard Mata in vilken enhet du vill byta till: tum 36 yard är 1296 tum. Körexempel 2: Mata in en längd i: 30 Mata in vilken enhet detta var: yard Mata in vilken enhet du vill byta till: mile Det blev för lite! Mata in igen! Mata in en längd i: 30 Mata in vilken enhet detta var: mile Mata in vilken enhet du vill byta till: yard 30 mile är 52800 yard.
Uppgift 2 - Pi med slumptal [2p] Om du skapar en kvadrat med sidan s (enheten är inte viktig) och i den har en perfekt cirkel med radien r kan du räkna ut ett närmevärde på Pi med hjälp av slumptal. Detta går till på följande sätt: Du slumpar ut en punkt (två koordinater) i kvadraten. Om denna punkt har ett avstånd som är mindre än eller lika med cirkelns radie så ingår denna punkt i cirkelns area. Alla punkter som slumpas ingår i kvadratens area. Genom att hoppas på att punkterna fördelas jämt över kvadratens yta kan vi anse att antalet punkter inom cirkeln borde vara i proportion till cirkelns area och antalet punkter i kvadraten är proportionellt mot kvadratens area. Vi vet formlerna för att räkna ut kvadraten och cirkeln men vi ser pi som variabel och löser ut den så får vi: A_cirkel / A_kvadrat = Pi * r² / s² Pi = (s² * A_cirkel) / (r² * A_kvadrat) = 4 * A_cirkel / (1 * A_kvadrat) Exakt hur lång sidan på kvadraten är kan du själv välja. Ju större kvadrat du har, desto noggrannare borde resultatet bli. Slumpa 1 000 000 000 punkter och för varje 10 000 000:te skall man skriva ut vilket närmevärde man ligger på för tillfället (med 6 decimaler). Körexempel: 10000000 3.141577 20000000 3.141327 30000000 3.141158 40000000 3.141176 50000000 3.141273 60000000 3.141269 70000000 3.141227 80000000 3.141196 90000000 3.141136 100000000 3.141144 110000000 3.141158 (programmet fortsätter ett bra tag till...)
Uppgift 3 - Sifferdifferens [1p] I matematiken finns det ett begrepp som kallas siffersumma, det innebär att man tar ett tals siffror och summerar dem, t.ex. talet 4403 ger 4+4+0+3 = 11. Vi definierar i denna uppgift begreppet sifferdifferens som fungerar på ett liknande sätt, fast vi använde minus istället för plus. Här kommer några exempel. Sifferdifferensen av 4403 => 4-4 - 0-3 = -3 Sifferdifferensen av 11 => 1-1 = 0 Sifferdifferensen av 75127 => 7-5 - 1-2 - 7 = -8 Sifferdifferensen av -365 => - 3-6 - 5 = -14 Sifferdifferensen av 1 => 1 = 1 Sifferdifferensen av -5 => -5 = -5 Sifferdifferensen av 9000 => 9-0 - 0-0 = 9 Alltså, man tar de individuella siffrorna och sätter minus emellan dem, sedan räknar man ut uttrycket. Skriv en rekursiv funktion siffer_diff som tar exakt en parameter (ett heltal) och returnerar dess sifferdifferens. Givetvis behöver du också ett huvudprogram som testar ditt program.
Uppgift 4 - Räkna then och else [2p] Skriv ett program som läser igenom sin egen kod och räknar hur många "then" och "else" (OBS små bokstäver!) det finns i den. Detta kan vara intressant för att veta hur många if-grenar man har använt *. Du kan anta att koden inte har rader som är längre än 100 tecken och att orden "then" och "else" aldrig förekommer mer än en gång per rad. (i körexemplen nedan tänker vi oss att vi kör koden på olika filer). Körexempel 1: then: 131 st else: 56 st Körexempel 2: then: 72 st else: 18 st Körexempel 3: then: 10 st else: 10 st Körexempel 4: then: else: 0 st 0 st TIPS: Det kan vara bra med underprogram i denna uppgift också. * Detta är egentligen inte helt sant eftersom orden "then" och "else" kan förekomma i strängar och även används till annat inom språket Ada.