Programmeringsteknik, datordel 160113

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)