TDIU01 - Datortenta (DAT2)

Relevanta dokument
TDIU01 - Datortenta (DAT2)

TDP Regler

TDP Regler

TDIU Regler

TDIU Regler

TDIU Regler

Regler. Betygssättning

TDIU Regler

TDP Regler

Regler. Betygssättning

TDIU01 - Programmering i C++, grundkurs

TDP Regler

TDIU01 / 725G

TDP Regler

TDP Regler

TDP004 - Datortenta (DAT2)

TDIU01 - Programmering i C++, grundkurs

TDIU01 (725G67) - Programmering i C++, grundkurs

TDDI TDDI22 Tentaregler

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

TDDI22 (exempel) TDDI22 Tentaregler

TDIU01 - Programmering i C++, grundkurs

TDIU20 (exempel) TDIU20 Tentaregler

C++ - En introduktion

TDDI TDDI22 Tentaregler

TDP Regler

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

TDDC76 - Programmering och Datastrukturer

TDP004 - Datortenta (DAT2)

TDIU01 Programmering i C++

TDP004 - Dugga All kod som skickas in för rättning ska kompilera och vara väl testad.

TDDI TDDI22 Tentaregler

TDP004 - Datortenta (DAT2)

TDP002 - Datortenta (DAT1)

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

C++ Slumptalsfunktioner + switch-satsen

TDIU01 - Programmering i C++, grundkurs

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

Föreläsning 4: Filer och strömmar

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

DD2387 Programsystemkonstruktion med C++ Tentamen 2

C++ - En introduktion

TDIU TDIU20 Tentaregler

TDP004 - Tentamen All form av kontakt mellan studenter under tentamens gång är strängt förbjuden.

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Föreläsning 1: Momstabellen i C++

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Introduktionslaboration

Introduktionslaboration

Tentamen EDAF30 Programmering i C++

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

TDP004 - Tentamen All kod som skickas in för rättning ska kompilera och vara väl testad.

Tentamen i Introduktion till programmering

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

TDDI TDDI22 Tentaregler

TDIU01 - Programmering i C++, grundkurs

Tommy Färnqvist, IDA, Linköpings universitet

TDP004 - Tentamen All form av kontakt mellan studenter under tentamens gång är strängt förbjuden.

Tentamen i DD2387 Programsystemkonstruktion med C++

729G04 Programmering och diskret matematik

TDP004 - (För)Tentamen

Tentamen TEN1 HI

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Del6 Strömmar Ämnesområden denna föreläsning:

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

PROGRAMMERING-JAVA TENTAMINA

kl Tentaupplägg

HI1024 Programmering, grundkurs TEN

TDIU01 - Programmering i C++, grundkurs

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

OOP Tentamen

729G04 Programmering och diskret matematik Tenta kl 14:00-18:00

Tentamen EDAF30 Programmering i C++

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

729G04 Programmering och diskret matematik

Tentamen: Datordel Programmeringsteknik

4. Standard-containers. Strömmar och filer

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 19.

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

TENTA: TDDD11 & TDDC68. Tillåtna hjälpmedel. Starta Emacs, terminal och tentakommunikationsfönster. Skicka in frågor och uppgifter

TDIU TDIU20 Tentaregler

Kap 6: Lista, stack och kö

Tentamen EDAF30 Programmering i C++

TDDI14 Objektorienterad programmering

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Tentamen EDAF30 Programmering i C++

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Uppgift 1 ( Betyg 3 uppgift )

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Abstrakta datastrukturer

Tentamen Objektorienterad Programutveckling med C++

Övning från förra gången: readword

Tentamen TEN1 HI

Transkript:

TDIU01 - Datortenta (DAT2) 2013-03-25 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. Uppgifter som skickas in efter tentatidens slut rättas inte. Ingen kompletteringsmöjlighet ges de sista tio minuterna. En praktisk uppgift får kompletteras så länge följande villkor är uppfyllda: Uppgiften har inte betygsatts med betyget U eller maxpoäng för uppgiften samt Tidigare kompletteringsförsök har resulterat i en ökning i poäng eller Tidigare inskickning gav betyg Kompletteras En uppgift som inte längre kan kompletteras kommer ges poäng på formen Np Klar (där N är vår poängbedömning för uppgiften) Kompilerande kod är ett grundkrav för poängsättning, kod som är bortkommenterad på grund av kompileringsfel kan dock ge poäng. 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. VÄND... Antal uppgifter 6 Totalt antal poäng 20 En c++-bok (tex C++ direkt) Hjälpmedel Ordbok Ett A4-blad med egna anteckningar i

Betygssättning Preliminär betygsfördelning kan ses i tabell 1. Poängsumma Betyg 1 8 U 9 13 3 14 16 4 17 20 5 Tabell 1: Poängfördelning för betygssättning Bonus från labserien På omtentamen ges ingen bonus från labserien. Information Inloggning Logga in på tentakontot enligt instruktioner från assistent i sal. Följ därefter 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 För att kompilera med c++11-standarden kan du använda aliaset g++11. 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.

1. Skriv en funktion int to string som tar emot ett heltal som enda parameter och returnerar [1 p] en strängrepresentation av detta tal. TIPS: En strängström kan vara bra att ha... Svar: Löses lättast med en strängström men visar även en alternativ lösning. #include <string> #include <sstream> using namespace std; string int_to_string(int n) stringstream ss; ss << n; return ss.str(); #include <string> using namespace std; string int_to_string(int n) string res; int last; bool negative; char c; if (n < 0) negative = true; n = -n; do last = n % 10; c = last + 0 ; n /= 10; res.insert(res.begin(), c); while (n > 0); if (negative) res.insert(res.begin(), - ); return res;

2. I vissa sällskapsspel vill man få saker att hända lite slumpmässigt och använder då tärningar. [2 p] Med två 6-sidiga tärningar kan man normalt sätt få slumptal i intervallet 2 till 12. Ett företag ville skapa ett system för att slumpa värden utan en övre gräns och hittade då på systemet ObDie (Ob som i obegränsad). Följande utfall kan fås när du slår en ObDie: 1. Om ditt slag är under 6, blir detta ditt svar. 2. Annars slår du två nya ObDie och tar summan av dessa som ditt svar. Med denna beskrivning kan man se att vi skulle kunna behöva slå tärningar i all oändlighet men troligen kommer vi till slut få ett resultat. Följande exempel beskriver de olika fall som kan ske: 1. Anna slår en ObDie, hon slår en fyra och detta är hennes resultat. 2. Per slår en ObDie, han slår en sexa och slår därmed två nya tärningar. Dessa blir 4 respektive 3 och resultatet av hans slag blir då 4 + 3 = 7. 3. Johan slår en ObDie, han slår en sexa. Nästföljande slag ger 5 och 6. Han behåller då femman och slår om sexan och får därmed 3 och 2. Summan blir då 5 + 3 + 2 = 10. Skriv en funktion obd som anropas utan parametrar och returnerar resultatet av ett slag med en ObDie. KRAV : Uppgiften ska lösas rekursivt. Svar: #include <random> int obd() std::random_device rnd; int val = rnd() % 6 + 1; if ( val!= 6 ) return val; return obd() + obd();

3. Skapa ett program som ber användaren mata in en följd av heltal. Lagra dessa heltal i en så [5 p] kallad stack och skriv sedan ut talen i omvänd ordning. Stacken ska du skapa själv genom att implementera den som en enkellänkad lista där varje nytt element läggs först i listan (push) och när ett element hämtas tas det ut från början av listan (top). Skapa åtminstone följande funktioner: void push (Stack, int) Lägg till ett element till stacken int top (Stack) Titta på första elementet i stacken (ge tillbaka 0 om det inte finns några element) void pop (Stack) Tag bort första elementet i stacken bool empty (Stack) Ger true om stacken är tom Körexempel: Mata in tal (avsluta med 0): 1 4 2 5 7 9 2 11 12 42 0 Talen i omvänd ordning: 42 12 11 2 9 7 5 2 4 1 KRAV : Ditt program får inte innehålla minnesläckor. Allt minne du allokerar måste återlämnas. Svar: INGEN minnesläcka! Någon minnesläcka ger 2p avdrag. Inget krav på uppdelning på flera filer. Viktigt med kontroll av tom stack i top/pop. 1p avdrag per fel. Vettiga försök på samtliga funktioner krav för poäng. Kod på nästa sida...

#include <iostream> using namespace std; typedef struct node * Stack_Type; void push(stack_type &, int); int top(stack_type); void pop(stack_type &); bool empty(stack_type); int main() Stack_Type s = nullptr; cout << "Mata in tal (avsluta med 0): "; int d; while ( cin >> d && d!= 0) push(s,d); cout << "Talen i omvänd ordning: "; while (! empty(s) ) cout << top(s) << ; pop(s); cout << endl; struct node int data; Stack_Type next; ; void push(stack_type &s, int v) s = new nodev,s; int top(stack_type s) if ( s!= nullptr ) return s->data; return 0; void pop(stack_type &s) if ( s!= nullptr ) Stack_Type tmp = s; s = s->next; delete tmp; bool empty(stack_type s) return s == nullptr;

4. Skapa en funktion som tar emot två strängar, härmed kallade A och B, som kontrollerar [3 p] hur många gånger sträng A förekommer i sträng B. Funktionen ska heta count. Skapa även ett huvudprogram som testar count enligt nedanstående körexempel. Körexempel 1: Mata in söksträng: en ball groda dansar aldrig ensam Mata in söknyckel: al "al" hittades 2 gånger i "en ball groda dansar aldrig ensam". Körexempel 2: Mata in söksträng: ljuslykta Mata in söknyckel: penna "penna" hittades 0 gånger i "ljuslykta". Svar: Följande bör ingå i en fullständig lösning: Kontroll av längd vad händer om söknyckeln påbörjas i slutet av strängen? vad händer om söknyckeln är längre än strängen? Huvudprogram med matchande utskrift som körexemplet Count ger max 2p, main 1p. Om main endast har vanlig formaterad inläsning (cin >> str) ges 0p (getline eller liknande krävs) Kod på nästa sida...

#include <iostream> #include <string> using namespace std; int count(const string &, const string &); int main() string stack,key; cout << "Mata in söksträng: "; getline(cin, stack); cout << "Mata in söknyckel: "; getline(cin, key); cout << " << key << "\" hittades " << count(stack,key) << " gånger i \"" << stack << "\"." << endl; Två varianter på count: int count(const string & stack, const string & key) int n = 0; for ( int i = 0; i < stack.length() - key.length(); ++i ) if ( stack.substr(i,key.length()) == key ) ++n; return n; int count(const string & stack, const string & key) int n = 0; for ( size_t i = 0; i < stack.length() - key.length(); ++i ) if ( stack.at(i) == key.at(0) ) bool found = true; for ( size_t j = 1; i < key.length(); ++j ) if ( stack.at(i+j)!= key.at(j) ) found = false; break; if ( found ) ++n; return n;

5. Skapa ett program som slumpar ett datum mellan år 1000 och 1999. Efter att ett datum har [4 p] slupats fram ska det skrivas ut på skärmen. Datumet ska internt lagras i en egendefinierad posttyp (struct). Alla datum i intervallet ska ha lika stor sannolikhet att slumpas fram av ditt program. Datumet som slumpats fram måste vara ett giltigt datum. Du ska dock inte ta hänsyn till skottår. För full poäng måste problemet delas upp i väl avgränsade, logiska, delar där varje del behandlas av en eller flera funktioner. Körexempel 1: Ett datum: 1932-02-04 Körexempel 2: Ett datum: 1202-03-12 Svar: Max 2p utan underprogram. Problemet bör delas in i delarna slumpa föjt av skriv ut. Slumpningen går att dela in i fler delar, t.ex. kontroll av antal dagar i en viss månad. Max 3p om uppdelningen känns onaturlig. Om c-slumpning (rand()) används måste fröet nollställas (srand). (1p avdrag) Vi godkänner if- och case-lösningar för beräkning av antal dagar så länge de ligger väl avgränsade (egen funktion eller dylikt). #include <iostream> #include <random> #include <iomanip> using namespace std; struct date_type int year,month,day; ; date_type generate(); void print(const date_type &); int main() cout << "Ett datum: "; print(generate()); cout << endl; void print(const date_type &d) char fill = cout.fill(); cout << setfill( 0 ); cout << d.year << - << setw(2) << d.month << - << setw(2) << d.day; cout << setfill(fill);

Två alternativa lösningar på generate: date_type generate() random_device rnd; date_type d; vector<int> days_in_month = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; d.year = rnd() % 1000 + 1000; d.month = rnd() % 12 + 1; d.day = rnd() % days_in_month[d.month] + 1; return d; date_type generate() random_device rnd; date_type d; d.year = rnd() % 1000 + 1000; int day = rnd() % 365 + 1; vector<int> days_in_month = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; for (size_t i = 1; i < days_in_month.size(); ++i ) if ( days_in_month[i] >= day ) d.month = i; d.day = day; break; day -= days_in_month[i]; return d;

6. Du ska skapa ett program som samsorterar två filer innehållandes heltal. Varje fil innehåller [5 p] en sorterad mängd heltal och filernas namn ges på kommandoraden. Resultatet ska sedan skrivas ut i terminalfönstret. Om någon av de två indatafilerna saknas eller inte går att öppna ska programmet skriva ut ett felmeddelande och avslutas. I mappen given files finns det datafiler med namn på formen data*.txt som du kan testa programmet med. Tänk på att inte lagra allt för mycket i ditt program. Filerna skulle kunna vara väldigt stora och du bör nyttja att de redan är sorterade. Körexempel: zaza2: merge data10.txt data5.txt Merging "data10.txt" and "data5.txt"... Done, results: 4 9 14 496 622 1689 3185 3368 3701 4571 5526 5910 5943 7180 9040 Svar: Saker att tänka på: Kontroll av kommandoradsargument Filhantering, öppning, kontroll Lagring - endast ett tal per fil behöver hanteras åt gången. Max tre poäng om filerna mellanlagras i minnet. Filerna kan ha (har troligen) olika längd... Vad händer med det sista talet som lästes in från den fungerande filen? #include <iostream> #include <fstream> using namespace std; void merge(istream & f1, istream & f2); int main(int argc, char * argv[]) if ( argc < 3 ) cerr << "Usage: " << argv[0] << " file1 file2" << endl; return 1; ifstream file1(argv[1]); if (!file1 ) cerr << "could not open file \"" << argv[1] << "\"!\n"; return 2; ifstream file2(argv[2]);

if (!file2 ) file1.close(); cerr << "could not open file \"" << argv[2] << "\"!\n"; return 3; cout << "merging \"" << argv[1] << "\" and \"" << argv[2] << "\"..." << endl; cout << "Done, results:" << endl; merge(file1,file2); void print_rest_of_file(istream & is) int i; while ( is >> i ) cout << i << ; void merge(istream & f1, istream & f2) int n1,n2; f1 >> n1; f2 >> n2; while ( f1 && f2 ) if ( n1 <= n2 ) cout << n1 << ; f1 >> n1; else cout << n2 << ; f2 >> n2; if (f1.good()) cout << n1 << ; print_rest_of_file(f1); else if (f2.good()) cout << n2 << ; print_rest_of_file(f2); cout << endl;