Regler Student får lämna salen tidigast en timme efter tentans start. Vid toalettbesök eller rökpaus ska pauslista utanför salen fyllas i. All form av kontakt mellan studenter under tentans gång är strängt förbjuden. Böcker och anteckningssidor kan komma att granskas av tentavakt i samband med tentans start samt under tentans gång. Frågor om specifika uppgifter eller om tentan i stort ska ställas via tentasystemet. Systemfrågor kan ställas till assistent i sal. Ingen uppgift rättas efter tentatidens slut. Så länge en uppgift inte har betyget Underkänd kan den kompletteras till godkänt. Ingen kompletteringsmöjlighet ges de sista tio minuterna. Inga elektroniska hjälpmedel får medtas. Mobiltelefon ska vara avstängd och ligga i jacka eller väska. Inga ytterkläder eller väskor får förvaras vid skrivplatsen. Antal uppgifter 5 Antal sidor (exklusive denna) 5 Hjälpmedel En bok om C++ (t.ex. C++ Direkt) Ett A4-ark med egna anteckningar Betygssättning Tentan innehåller fem uppgifter. För godkänt betyg krävs minst två avklarade uppgifter. För gränser för högre betyg, se i tabell 1. Om du har, av LiU godkänd, förlängd skrivtid gäller istället tabell 2. Tid (timmar) Antal uppgifter Betyg 3 3 5 4 4 5 4 3 4 Tabell 1: Gränser för högre betyg Tid (timmar) Antal uppgifter Betyg 4 3 5 5.5 4 5 5.5 3 4 Tabell 2: Gränser vid förlängd skrivtid Bonus från labserien Varje avklarad deadline i labserien ger fem minuter extra till tidsgränserna för högre betyg (tabell 1 och 2). Om du är osäker på hur mycket bonus du har kan du fråga detta via tentasystemet. VÄND!
Information Inloggning Logga in på tentakontot med följande användaruppgifter: Användarnamn: examx Lösenord: kluring1 Följ menyvalen så långt det går tills du ska mata in ett engångslösenord. Tag fram ditt LiU-kort och visa det för tentavakten för att få detta lösenord. När du är inloggad är det viktigt att du startar tentaklienten genom att högerklicka på bakgrunden och välja tentaklient i menyn. Kompilering Det finns ett antal olika alias som kan förenkla vid kompilering: g++11 Kompilering med c++11-standarden w++11 Kompilering med c++11-standard samt varningsflaggor g++11filter g++11 med gccfilter - ett program som snyggar till kompileringsmeddelanden w++11filter w++11 med gccfilter C++ reference Det finns en spegling av siten cplusplus.com tillgänglig i tentasystemet. Se information i separat dokument för användning av detta. Avslutning Tryck på knappen märkt exit i menyn längst nere på skärmen och välj ok. Vänta ett tag och tryck sedan på knappen Avsluta tentamen när det är möjligt. När detta är gjort är det omöjligt att logga in igen.
Uppgift 1 Skapa en funktion split som tar emot en sträng och ett tecken (en avgränsare). Din funktion ska returnera en vector fylld med strängar som motsvarar originalsträngen uppdelad vid alla förekomster av avgränsaren. Funktionen ska även kunna anropas utan avgränsare och ska då dela upp strängen vid förekomster av mellanslag. Om det förekommer flera avgränsare i rad ska dessa hanteras som en avgränsare. Om en avgränsare förekommer i början eller slutet av originalsträngen ska denna ignoreras. Se tabell 3 för exempeldata till din funktion. Skapa även ett huvudprogram för att testa din funktion noggrant. Indata sträng avgränsare Returdata "Emma Emanuelsson" {"Emma", "Emanuelsson"} "Eric:Elfving:3D450" : {"Eric", "Elfving", "3D450"} Tabell 3: Exempeldata till split
Uppgift 2 Labyrinter kan innebära intressanta problem. I denna uppgift ska du skapa ett program som följer en given väg genom en labyrint och tar reda på vart vi tar oss ut ur labyrinten. Antag att vi har labyrinten i figur 1. Din uppgift är att börja på position (1,1) (övre vänstra hörnet), följa pilarna enligt figur 2 och ta reda på var labyrinten slutar. Eftersom det redan är givet i figuren vart labyrinten slutar ska vi i denna uppgift låta användaren mata in labyrinten som ska lösas. Då det är svårt att mata in pilar på tangentbordet kommer användaren mata in tre saker, antal rader (R) och kolumner (K) i labyrinten samt en R*K tecken lång sträng innehållandes bokstäverna unvh för upp, ner, vänster respektive höger. Labyrinten i figur 1 kommer då matas in enligt körexempel 1. Observera att tecknen i strängen beskriver labyrinten radvis. Ditt program ska skriva ut den tänkta koordinat som är den första man når efter att man följt vägen genom labyrinten. Figur 1: Exempellabyrint (1,1) (5,1) Figur 2: Lösning till labyrinten i figur 1 Körexempel 1 Mata in storlek: 5 4 Mata in labyrint: hnhhnvunnnuvnuuhhhuu Labyrinten når sitt slut i ruta (5,1) Körexempel 2 Mata in storlek: 3 2 Mata in labyrint: vunhnn Labyrinten når sitt slut i ruta (0,1) Det är givet att labyrinten som matas in alltid har ett slut samt att användarinmatning alltid är korrekt. OBS: Du får använda dig av if- eller switch-satser för att göra olika saker för de olika riktningarna. TIPS 1: Fundera på vilket tecken i strängen den andra/tredje/osv raden i labyrinten startar på. TIPS 2: Tänk på att inte alla rutor kommer besökas av vägen genom labyrinten.
Uppgift 3 I UNIX-system finns det ett program som heter fmt. Detta program tar emot en inmatad text och slår samman och bryter rader för att få så jämn radlängd som möjligt i utskriften (så nära, men inte över, maximal radlängd som möjligt). I denna uppgift ska du göra en variant av fmt som formaterar texten enligt följande regler: En ny rad får inledas närhelst ett mellanslag hittas i indatat. En radbrytning får tas bort från indatat så länge följande INTE gäller: 1. Den bryter en tom rad ELLER 2. Den följs av ännu ett nyradstecken När en radbrytning tas bort ska det ersättas med ett mellanslag. Ingen rad i utskriften får avslutas med mellanslag. Alla ord som är längre än den maximala radlängden ska stå på egna rader i utskriften. Ditt program ska läsa indata från standard inmatningsström (cin) och skriva ut på standard utmatningsström (cout). Maximal radlängd ska vara 72 tecken. Du kan anta att ord endast separeras med ett enkelt mellanslag eller ett eller flera nyradstecken. Antag att vi har följande indata till programmet (finns som given fil given_files/fmt_data.txt): Unix fmt The unix fmt program reads lines of text, combining and breaking lines so as to create an output file with lines as close to without exceeding 72 characters long as possible. The rules for combining and breaking lines are as follows. 1. A new line may be started anywhere there is a space in the input. If a new line is started, there will be no trailing blanks at the end of the previous line or at the beginning of the new line. 2. A line break in the input may be eliminated in the output, provided it is not followed by a space or another line break. If a line break is eliminated, it is replaced by a space. Då ska detta generaras av ditt program: zaza10:./a.out < given_files/fmt_data.txt Unix fmt The unix fmt program reads lines of text, combining and breaking lines so as to create an output file with lines as close to without exceeding 72 characters long as possible. The rules for combining and breaking lines are as follows. 1. A new line may be started anywhere there is a space in the input. If a new line is started, there will be no trailing blanks at the end of the previous line or at the beginning of the new line. 2. A line break in the input may be eliminated in the output, provided it is not followed by a space or another line break. If a line break is eliminated, it is replaced by a space.
Uppgift 4 Skapa ett program som tar emot 0 eller flera kommandoradsargument och skriver ut summan av alla heltal som gavs på kommandoraden. Argument som innehåller icke-numeriska värden ska ignoreras av programmet. Detta gäller även om tal förekommer i ett ord. Endast heltal ska summeras, decimaltal ska även de ignoreras då de innehåller icke-numeriska tecken (en punkt). Körexempel 1 zaza10>./a.out 23 kalle 12 anna 3 Summa: 38 Körexempel 2 zaza10>./a.out Summa: 0 Körexempel 3 zaza10>./a.out 23 H3J 7.4 Summa: 23
Uppgift 5 När Anders är på simhallen och motionssimmar får han ofta problem med att andra är ivägen. Detta gäller speciellt eftersom han brukar simma snabbast av alla han delar bana med. I denna uppgift ska vi hjälpa Anders att räkna ut hur länge han behöver vänta för att kunna simma så lång sträcka som möjligt innan han når upp till andra simmare. Anders vill ha ett program där han kan mata in hur många simmare han delar bana med samt hur snabbt varje person simmar 50 meter (i hela sekunder). Dessutom vill han inte vänta allt för länge så ditt program ska alltid ge en tid som är mindre än två minuter (120 sekunder) som svar. Anders simmar främst på Linköpings Simhall så du kan anta att bassänglängden är 25m och man därmed återkommer till startpositionen efter 50 meter. Du kan även anta att de andra simmarna aldrig krockar med varandra och inte får några problem när de hinner ikapp varandra. Vi antar att alla andra startar exakt samtidigt där Anders står och att Anders vill veta nästa tillfälle då han har så långt avstånd som möjligt till den närmsta simmaren, möten räknas inte (det hade så klart varit bäst att starta innan klungan). De övriga fortsätter simma oabrutet tills Anders startar. Körexempel 1 Mata in antal simmare: 1 Hastighet för simmare 1: 40 Starta om 40 sekunder. Körexempel 2 Mata in antal simmare: 2 Hastighet för simmare 1: 45 Hastighet för simmare 2: 90 Starta om 90 sekunder. Körexempel 3 Mata in antal simmare: 4 Hastighet för simmare 1: 102 Hastighet för simmare 2: 65 Hastighet för simmare 3: 49 Hastighet för simmare 4: 86 Starta om 49 sekunder. Körexempel 4 Mata in antal simmare: 3 Hastighet för simmare 1: 40 Hastighet för simmare 2: 23 Hastighet för simmare 3: 56 Starta om 112 sekunder. OBS: Avrundningsfel i storleksordningen ±1 sekund accepteras. TIPS: Fundera på vart varje simmare är vid en viss tidpunkt.