Programmeringsteknik 7,5 högskolepoäng Provmoment: Tentamen - datordel Ladokkod: NPT021 Tentamen ges för: ASYAR15h TentamensKod: Tentamensdatum: 2016-01-13 Tid: 14-19, disponeras fritt av tentand mellan teori- och datordel. Genomförande: Tentamen inleds med teoridel. När student lämnar in sina svar på teoridelen får hen tillgång till inloggningsuppgifter och datordelen av tentamen. Hjälpmedel: Inga Kursansvarig lärare: Cecilia Sönströd Ansvarig för tentamen: Jens Holgersson Totalt antal poäng på tentamen: 60 (sammanlagt på teori- och datordel) För att få respektive betyg krävs: Godkänd 30 poäng Väl godkänd 45 poäng Anvisningar för programmeringsuppgifter: • Arbeta i ett enda projekt. • Observera att den c-kod som lämnas in skall vara körbar, dvs. ni måste kompilera om efter er sista ändring i koden och kontrollera att den slutgiltiga koden inte ger kompileringsfel. • Kod som inte fungerar måste därför vara bortkommenterad. • Endast det som ligger i respektive projektmapp kommer att bedömas. Lösningarna rättas i befintligt skick. • Såväl funktionalitet som struktur bedöms, vilket innebär att: • Även en lösning som inte är fullständig kan ge poäng • Poängavdrag kan ges för onödigt komplicerade eller ostrukturerade lösningar. • Koden behöver endast kommenteras när det står så i uppgiften. • Kommandon från bibliotek (även Roberts) får användas fritt. Nästkommande tentamenstillfälle: 2016-03-04 Rättningstiden är i normalfall 15 arbetsdagar, annars är det detta datum som gäller: 1) I denna uppgift skall ni skriva några funktioner som behövs för att implementera den välkända ordleken Hangman (’hänga gubben’). Ordleken fungerar på följande sätt: ett visst hemligt ord skall gissas. Ordet representeras från början för spelaren med stjärnor istället för bokstäver. Spelaren gissar en bokstav i taget. När en bokstav som finns i ordet gissas, så ersätts stjärnorna i ordet med denna bokstav på de platser den finns. I vår variant av spelet fortsätter gissandet till hela ordet är klart. En exempelkörning av programmet kan se ut på följande sätt: Welcome to a non-violent version of the Hangman game. The secret word is ****** Please input your guess: A Bad luck! The letter A is not present in the word. The secret word is ****** Please input your guess: C Well done! The letter C is present in the word. The secret word is C****C Please input your guess: E Well done! The letter E is present in the word. The secret word is CE***C Please input your guess: L Well done! The letter L is present in the word. … The secret word is CELT*C Please input your guess: I Well done! The letter I is present in the word. The secret word is CELTIC You have cracked the puzzle in 7 guesses. Uppdelningen i funktioner är given och skall följas, dvs. varje funktion skall göra exakt det som anges och inget annat. Däremot ingår som en del i uppgifterna b) och c) att utifrån beskrivningen skapa rätt prototyp till varje funktion. Ni behöver endast ta hänsyn till versaler (STORA BOKSTÄVER) i det engelska alfabetet, dvs. bokstäverna A-Z. Samtliga strängfunktioner från Roberts bibliotek får användas fritt. a) En viktig del i programmet är att kunna avgöra om en viss bokstav förekommer i ett ord. Skapa en funktion som utför detta. Funktionen skall ha prototypen: bool letterInWord(char letter, string word); b) Skapa en funktion som tar ett heltal som argument och slumpar fram ett ord bestående av bokstäverna A-Z som har den längd som anges i argumentet. c) Skapa en funktion som tar två strängar och ett tecken. Den ena strängen representerar det ord som skall gissas och den andra representerar aktuell status på gissningen, dvs. en mix av bokstäver och *. Tecknet representerar en gissad bokstav. Funktionen skall returnera en sträng som består av den uppdaterade gissningssträngen, dvs. där stjärnor ersatts av bokstäver på de platser där gissad bokstav finns. Om bokstaven finns i ordet, men redan är röjd i gissningen, dvs. inte är en stjärna, så händer ingenting med gissningen, dvs. funktionen skall returnera gissningen som det såg ut förut. d) Skriv slutligen ett huvudprogram, som testar funktionerna ovan genom att göra följande: 1. Slumpa fram ett ord av längden sex 2. Låt användaren gissa bokstäver tills hela ordet är knäckt. Ni kan bortse från det fall när användaren gissar på en bokstav som redan är röjd, genom att då skriva ”well done, etc…” och räkna upp antalet gissningar. 3. Håller reda på antal gissningar och skriver ut det på slutet. e) För stilpoäng (ej inkluderat i tentamens totalpoäng): vilken är sannolikheten att det slumpade ordet är CELTIC? (15 p) 2) I denna uppgift ska ni jobba med vektorer som representerar matriser, närmare bestämt addition av matriser i en och två dimensioner och multiplikation av matris med skalär. För att underlätta visas nedan exempel på dessa operationer: Exempel 1. Addition av två rad-matriser: a+b = (2,3,4) + (5,6,7) = (2+5,3+6,4+7). Exempel 2. Multiplikation av matris med skalär: 5a = 5(1,2,3) = (5*1,5*2,5*3). Exempel 3. Addition av två vektorer av högre grad: + = . Uppgift a – addition: Skapa två heltalsvektorer med plats för minst tre tal vardera som ska representera matriser (viktigt är att se till att bägge matriserna är lika stora). Inläsning är inte i fokus så ni kan definiera valfria heltal när ni skapar vektorerna. Dessa skall skickas till en funktion void addVector(…) som genomför själva additionen av matriserna. Skriv ut både de initiala vektorerna och resultatet på valfritt sätt. Uppgift b – multiplikation av matris med skalär: Lägg nu till en heltalsvektor med plats för minst tre tal. Denna plus ett heltal (skalären) ska skickas till en funktion void multVectorScal(…) som genomför multiplikationen med skalären. Presentera både den initiala vektorn och resultatet på valfritt sätt. Uppgift c - Addition av flerdimensionella matriser: Addera två heltalsvektorer som ska representera matriser av minst den storlek som visas i exempel3 ovan. Dessa ska skickas till funktionen void addTwoDimVector(…) där additionen genomförs. Även i denna uppgift ska de ursprungliga matriserna och resultatet presenteras på lämpligt sätt. Lägg märke till att det är av stor vikt att ni delar upp era program i väl avgränsade delar. Övriga eventuella funktionsparametrar och/eller hjälpfunktioner som kan underlätta är helt upp till er att välja. (15p) 3) I denna uppgift skall ni tillverka ett programskelett för ett enkelt register över Sveriges kommuner. Lagringsstrukturen skall följa instruktionerna nedan till punkt och pricka. Lösningar med felaktig lagringsstruktur kommer att ge noll poäng på uppgiften. Vi börjar med att ge typdefinitioner som ni skall använda för att skapa egna structar. Skriv alltså in detta i ert program innan ni börjar koda. typedef struct{ string municipality; int population; int employed; int unEmployed; }*sMun; /* Sweden’s Municipalities=Sveriges kommuner */ Förklaring till structens attribut: municipality = kommunnamn population = invånare employed = anställda unemployed = arbetssökande a) Skapa en typdefinition för en post (struct) med namnet sMunDB, vilken innehåller nedanstående delar. Posten skall vara av pekartyp. En dynamisk vektor med initialstorlek 23 (definieras av en konstant i programmet) av kommuner som kan innehålla demografisk information, dvs. elementtypen skall vara sMun. Ett heltal för antal platser i vektorn Ett heltal för antal inlagda kommuner i vektorn b) Skapa en funktion som låter användaren mata in uppgifter om en kommun. Felkontroll skall ske för inmatning. Om användaren anger blankt kommunnamn (dvs. endast trycker på ENTER), eller anger ett kommunnamn längre än 16 tecken, eller kortare än fem tecken, ska funktionen avbryta exekveringen och returnera NULL till den anropande funktionen. För de heltal som matas in skall ni kontrollera att det inmatade talet >0. Om inte, skall användaren få ett felmeddelande och ny chans att mata in tills korrekt input erhålls. Denna felkontroll bör ligga i en egen funktion. c) Skapa en funktion som för varje kommun i databasen skriver ut kommunens namn och antal invånare. d) Skapa en funktion för att skriva ut genomsnittligt antal invånare per kommun i databasen. e) Knyt ihop allt med ett litet huvudprogram där användaren kan testa att lägga till ett par kommuner med demografisk information. Ni kan t ex använda nedstående inmatningsdata för att testa programmet. Kommunnamn = municipality Borås Göteborg Skövde Invånare = population 107022 541145 53134 Anställda = employed 83156 396118 41870 Arbetsökande = unEmployed 8562 47621 4038 Tips: Glöm inte att initialisera databasen. Glöm inte att frigöra minnet. (15 p)