Några tips på vägen kanske kan vara bra. Tentaupplägg denna gång TIPS 1: Läs igenom ALLA uppgifterna och välj den du känner att det är den lättaste först. Det kan gärna ta 10-20 minuter. Försök skriva ner lite saker som kan vara problem i uppgifterna. Om det är något du absolut kommer att fastna på kanske det är fel uppgift. Du tjänar lätt in denna tid 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å (din uppgift kanske). TIPS 3: Sista timmen är vi normalt sett lite snällare och ger eventuellt lite bättre återkoppling på era fel. Innan dess kan man få högre betyg och därför kräver vi att ni har lite mer koll på vad som skall rättas till. Vi ger dock information om vilket symptom felet uppvisar om vi kompletterar er uppgift under hela tentans gång. Om ni är nära G tidigt på tentan kan detta kanske ge G i slutet. Don t give up before the fat lady sings. som de säger. TIPS 4: 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. Vi hinner inte svara på frågor de sista 10 minuterna på tentan. Då ängnar vi all tid åt att rätta uppgifter för att alla skall hinna få svar innan ni går hem. Om det är så att ni skickar in en uppgift precis i slutet av tentan hinner vi förstås inte, men då får ni gärna skicka ett mail för att få reda på hur det gick. Vi rapporterar in resultaten efter det att alla tre passen är avslutade (antagligen dagen efter sista passet). Det tar ett par dagar med pappershantering efter detta så räkna med att det är i LADOK ca en vecka efter sista passet. Kolla med era kompisar om de fått poäng innan innan ni skickar mail till oss. Lycka till med tenterandet och hoppas att alla får G på minst en uppgift idag. M.v.h. /Torbjörn (examinator)
Uppgift 1 (Summera tal) Din uppgift är att skriva ett program som räknar ut summan av alla tal från och med N till och med K (där det är givet att K >= N). Det behövs ingen felhantering av indata, men ditt program får INTE använda sig av några upprepningssatser (for, while och loop) utan MÅSTE använda rekursion för att lösa alla former av upprepningar. Körexempel 1: Mata in N och K (där N <= K): 1 5 Summan av alla tal från 1 till 5 är 15. Körexempel 2: Mata in N och K (där N <= K): 5 10 Summan av alla tal från 5 till 10 är 45. Körexempel 3: Mata in N och K (där N <= K): 1 100 Summan av alla tal från 1 till 100 är 5050. Körexempel 4: Mata in N och K (där N <= K): 100 999 Summan av alla tal från 100 till 999 är 494550. Körexempel 5: Mata in N och K (där N <= K): 23 54 Summan av alla tal från 23 till 54 är 1232. Körexempel 6: Mata in N och K (där N <= K): 723 992 Summan av alla tal från 723 till 992 är 231525.
Uppgift 2 ( Bästa argumentet) Din uppgift är att ta reda på vilket av de argument som skickas in till programmet (som kommandoradsargument) som är längst (d.v.s. bäst i någon mening). Programmet skall dessutom skriva ut detta så som exemplen visar nedan. Om två argument är lika långa är det som ligger först bättre (eftersom det alltid är lättare att komma på argument efter det att någon annan redan gjort det, eller hur?). Det bör poängteras att programmet alltså INTE skall ha egen inmatning utan allt skall komma från argumentlistan som skickas direkt vid programstart. Körexempel 1: >> best_argument Detta är 4 argument. Resultat: Det bästa argumentet var argument.. Körexempel 2 (citationstecken håller ihop argument): >> best_argument Detta är 1 argument. Resultat: Det bästa argumentet var Detta är 1 argument.. Körexempel 3 (även apostrofer håller ihop argument: >> best_argument Detta är 3 argument. Resultat: Det bästa argumentet var Detta är. Körexempel 4: >> best_argument This is two arguments. Resultat: Det bästa argumentet var This is two. Körexempel 5 (saknar argument): >> best_argument Starta programmet med ett positivt antal argument. Körexempel 6 (argumentet består endast av en rad även om den råkar brytas lite här och där): >> best_argument Det är frågan vad som kommer ut av denna långa argumentlista? Det gör att du måste testa för det är >& /dev/null inte så helt uppenbart som du ser i svaret. Gör ett test och om ni kommer på det är ni riktigt kluriga och kan antagligen Unix också, men det är inte nödvändigt. Resultat: Det bästa argumentet var inte så helt uppenbart. TIPS 1: Skriv ut de olika argumenten i ditt program så ser du vad de innehåller. Då kan du själv avgöra bättre om ditt program fungerar. Tag bort utskrifterna innan du skickar in! TIPS 2: De olika inmatningarna finns i den givna filen given_files/input_rows.txt som du kan öppna i Emacs så att du bara kan klippa och klistra in i terminalen. Du kan själv lägga till fler testfall om du kopierar filen från given_files till din mapp.
Uppgift 3 (OB-tärningsstatistik) Det du skall göra i denna uppgift är att ta fram simulerad statistik över vad man får om man slår en s.k. OB-tärning. En OB-tärning kan teoretiskt sett ge alla värden från 1 och uppåt. Man använder en vanlig sexsidig tärning för att utföra denna simulering. För ett slag med en vanlig tärning kan man ju endast få värdena 1-6. För att få fram ett slag med OB-tärningen gör man på följande sätt. Man slår den tärningen. Om det inte blir en sexa tar man värdet av det som står. Om man får en sexa ersätter vi denna med två tärningar och slår dessa och summan av dem blir resultatet. Om det återigen kommer upp en sexa ersätter vi den med två nya och slår om igen. Man kan alltså säga att man ökar antalet tärningar som slås med ett för varje 6:a man slår. När man inte har några 6:or kvar räknar man ihop alla värden på alla tärningar. Några exempel på hur man kan få olika OB-värden: Slag 1: Om det är något av 1-5 => samma värde som står (KLAR) Om det är 6: Ersätt med två nya tärningar. Slag 2: Om båda tärningarna visar 1-5 => summan av dem (KLAR) Om en är 6: Ersätt denna med två nya och behåll värdet av den andra för att räkna ihop med den som inte var 6 senare. Om båda är 6: Ersätt båda med två nya. Räkna ihop värdet av alla fyra senare. Observera att detta kan hålla på i oändlig tid om man hela tiden slår minst en sexa. Vi hoppas att vi inte råkar ut för detta i vår simulering. Då får vi starta om programmet. På filen given_files/dice.adb finns en början på ett program som skall utföra denna simulering. Tanken är att programmet skall slå 10.000 OB-tärningsslag och lagra dem i en vektor. Därefter sorteras alla slag och sen skrivs statistik ut över hur många gånger olika värden förekom. Programmet är inte färdigt. Det som saknas är dels funktionen som slumpar ut ett OBtärningsslag och dels utskriften av tabellen med statistik. De anrop och den kod som redan är given FÅR INTE ändras. Du får dock lägga till annat som du kanske behöver. Körexempel (förkortad tabell av utrymmesskäl, dock är det möjligt att t.ex. 29:an aldrig kom, det största slag vi fått är 52 efter att vi kört programmet ca 30 gånger): Simulering av 10000 OB-tärningsslag. Slag Antal ------------ 1 1690 2 1693 3 1762...... (denna rad blir givetvis tabellrader) 17 15 18 4 19 8 20 11...... (samma här) 27 1 28 1 30 1
Uppgift 4 (Den allseende Maya-pyramiden) Den allseende pyramiden är en symbol som visar ett allseende öga som finns ovanför en pyramid (används bl.a. av Frimurarordern). Helhelten blir ofta lite likt en triangel. Det allseende ögat brukar ofta tolkas som en symbol för Guds öga som vakar över mänskligheten. I denna uppgift skall du få rita en helt ny version av denna allseende pyramid som vi i kursledningen har skapat (inte så snygg som andra varianter, men vi tar inte åt oss någon ära heller). Vi tänker oss att någon fotograferat detta monument och valt att se olika mycket av själva pyramiden. Detta anges av användaren. Vi vill att man skall kunna ta sig upp på pyramiden. Vi fyller därför pyramiden med 1:or och blanktecken på lämpliga platser för att få det att se ut som trappor som går upp till toppen. De tecken vi använder förutom 1:orna är i figurerna nedan: _ - = horisontalix (understrykningsstreck) och bindestreck = vertikalix (lodrätt streck, lodstreck) / \ = snedstreck och bakåtsnedstreck = blanktecken. = punkt och citationstecken Fyra körexempel: Ange pyramidens storlek: 3 Ange pyramidens storlek: 2 -_ _- -_ _- //.\\ //.\\ _\\ // \\ //_ - - - - /11 111 11\ /11 111 11\ Ange pyramidens storlek: 4 Ange pyramidens storlek: 1 -_ _- -_ _- //.\\ //.\\ _\\ // \\ //_ - - - - /11 111 11\ /11 111 11\ /111 11111 111\ TIPS 1: Ledtexten står alltid direkt till vänster i terminalen vid körning. Det lättaste sättet att finna var tecknen står är att jämföra med ledtextens positioner. TIPS 2: Var tredje rad ökar det med antingen en 1:a i mitten, ett blanktecken per delning eller en 1:a per ytterkant. I filen given_files/pyramid.txt finns ett större exempel.