TDIU01 - Datortenta (DAT2)

Relevanta dokument
TDIU01 - Datortenta (DAT2)

TDIU Regler

TDP Regler

TDIU Regler

TDIU Regler

Regler. Betygssättning

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

Regler. Betygssättning

TDIU Regler

TDP Regler

TDP Regler

C++ - En introduktion

TDP Regler

TDP Regler

TDP Regler

TDP004 - Datortenta (DAT2)

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

TDIU01 - Programmering i C++, grundkurs

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

TDIU01 / 725G

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

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

TDIU01 - Programmering i C++, grundkurs

C++ - En introduktion

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

TDDI22 (exempel) TDDI22 Tentaregler

TDDI TDDI22 Tentaregler

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

TDDI TDDI22 Tentaregler

TDIU01 Programmering i C++

TDP002 - Datortenta (DAT1)

TDIU20 (exempel) TDIU20 Tentaregler

729G04 Programmering och diskret matematik

729G04 Programmering och diskret matematik

TDP Regler

Introduktionslaboration

kl Tentaupplägg

Introduktionslaboration

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

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

4. Standard-containers. Strömmar och filer

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

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

TDP004 - Datortenta (DAT2)

TDP004 - Datortenta (DAT2)

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

C++ Slumptalsfunktioner + switch-satsen

TDIU TDIU20 Tentaregler

DD2387 Programsystemkonstruktion med C++ Tentamen 2

TDDI TDDI22 Tentaregler

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

TDDI14 Objektorienterad programmering

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

HI1024 Programmering, grundkurs TEN

kl Tentaupplägg

kl Tentaupplägg

Funktionens deklaration

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

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

TDDI TDDI22 Tentaregler

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

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

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

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

TDIU01 - Programmering i C++, grundkurs

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

Tentamen i Introduktion till programmering

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

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

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

HI1024 Programmering, grundkurs TEN

Tentamen EDAF30 Programmering i C++

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

Tentamen EDAF30 Programmering i C++

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

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Tentamen Grundläggande programmering

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Tentamen i Programmering grundkurs och Programmering C

kl Tentaupplägg

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

TDIU TDIU20 Tentaregler

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

kl Tentaupplägg. TIPS 4: Du kan kompilera din kod med följande kommandon g++11, w++11 (för mer varningar)

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Tentamen i DD2387 Programsystemkonstruktion med C++

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

HI1024 Programmering, grundkurs TEN

Tentamen i Programmering grundkurs och Programmering C

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

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

Tentamen ges för: Tentamensdatum: Tid:

Transkript:

TDIU01 - Datortenta (DAT2) 2012-12-18 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 teoretisk uppgift kan endast kompletteras efter förfrågan från rättare. 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. Antal uppgifter 10 Totalt antal poäng 20 Hjälpmedel En c++-bok (tex C++ direkt) Ordbok Ett A4-blad med egna anteckningar i

Betygssättning Poäng som krävs för de olika betygen kan ses i tabell 1. Poängsumma Betyg 1 9 U 10 13 3 14 16 4 17 20 5 Tabell 1: Poängfördelning för betygssättning Bonus från labserien Avklarade deadlines i kursen ger bonus i form av tillgodoräknade uppgifter i den praktiska delen. Denna bonus ges endast under den första ordinarie tentan i samband med kursen. För denna tentamen får student uppgifter tillgodoräknade enligt tabell 2. Vi kontrollerar labstatus under tentans gång och sätter aktuell uppgift som godkänd. Tentasystemet uppmärksammar student när ändringen sker. Antal avklarade deadlines Tillgodoräknad uppgift 2 3 5 4 5 6 6 7 5 och 6 Tabell 2: Tillgodoräknade av uppgifter 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.

Teoretisk del Uppgifterna i denna del kan inte kompletteras. Ni redovisar era svar genom att skriva dem i en textfil per uppgift som ni skickar in via tentasystemet. 1. För varje av följande påståenden ska du svara om det är sant (S) eller falskt (F). För 2- [2 p] 3 korrekta svar ges ett poäng och för 4-5 korrekta svar ges 2 poäng på uppgiften. Ingen motivering krävs. (a) Postfix (i++) och prefix (++i) stegning är samma sak. F: prefix stegning returnerar värdet efter stegning, postfix ger tillbaka värdet innan stegning. (b) Datatypen char kan tolkas som ett heltal. S: Ett tecken kan omvandlas till ett heltalsvärde genom dess position i teckentabellen. (c) Man ska alltid ta parametrar som const-referens om man inte ska ändra på värdet. F: Onödigt att ta PODs (plain old datatypes, inbyggda datatyper) eller pekare som referenser. (d) Den globala funktionen getline() och metoden cin.getline fungerar på samma sätt. F: den globala funktionen läser till en sträng medan istream-metoden läser till en c-sträng. (e) Dynamiskt allokerat minne ska alltid återlämnas med delete. S: Vi ska alltid se till att återlämna de resurser vi allokerat. 2. Varför bör man ta emot komplexa datatyper som const-referenser till sin funktion om man [1 p] inte avser att ändra på parametern? Referens för att undvika onödig kopiering, const för att visa både för användaren och kompilatorn att jag inte avser att ändra på parametern (säkerhet). 3. [1 p] Vad är skillnaden mellan formaterad inläsning till ett tecken (cin >> c) och oformaterad inläsning (cin.get(c))?

Formaterad inläsning ignorerar inledande vita tecken (mellanslag, tabulatortecken, nyradstecken osv.), oformaterad läser alltid nästa tecken i bufferten. 4. Varför bör man inte öppna en namnrymd (t.ex. genom att skriva using namespace std;) [1 p] i en inkluderingsfil? För att namnrymden då öppnas i alla program som inkluderar filen.

Praktisk del 5. Denna uppgift kan tillgodoräknas med bonus från labserien. [1 p] Ett binärt träd är en dynamisk datastruktur där varje nod består av ett värde samt två pekare till andra noder i trädet (barn). En pekar på noden till vänster och en på noden till höger. Använd dina kunskaper om enkellänkade listor och tillämpa dem på träd genom att skapa en struct som kan användas för att representera en nod i ett binärt träd som lagrar heltal (int). typedef struct Tree_ Node * Binary_ Tree ; struct Tree_ Node int data ; Binary_ Tree left ; Binary_ Tree right ; ; Eller utan typedef: struct Tree_ Node int data ; Tree_ Node * left ; Tree_ Node * right ; ; 6. Denna uppgift kan tillgodoräknas med bonus från labserien. [2 p] På filen given files/power table.cc finns ett program som skriver ut en tabell över ett antal potenser. Din uppgift är att i filen power.cc skapa den rekursiva funktionen power som ska beräkna x N för heltalen x och N. Du behöver endast skicka in filen power.cc för rättning. Ett poäng för N 0, ett till om den klarar negativa tal. double power ( int x, int n) if (n == 0) return 1; else if ( n < 0) return 1/ power (x,-n); return x* power (x,n -1);

7. På filen given files/lager.cc finns ett program som beräknar lagervärdet givet antal produkter av varje vara samt priset per vara. Din uppgift är att modifiera main-funktionen så att [2 p] programmet läser indata från filen given files/lager.txt. Eftersom programmet ska läsa in data från fil ska du även se till att ledtexterna inte skrivs ut på skärmen. Körexempel: varunamn antal pris ------------------------------------------ Boll 1000 19.80 Studsmatta 25 799.00 Legobitar 100 398.00 Glaskulor 3212 12.90 Boll (grön) 200 24.50 Radiostyrd bil 54 199.00 Kritor 1123 29.90 Färgpennor 203 14.50 Sjörövarsvärd (plast) 132 79.00 Brandbil (elekrisk) 29 499.00 ------------------------------------------ Totalt lagervärde: 198076.00 KRAV: Du får endast göra ändringar i funktionen main och inläsningen ska skötas av den givna funktionen read.

Två viktiga delar som vi tittar på: 1. Filhanteringen: öppna, kontrollera, stäng 2. Bra lösning för utskriften (t.ex. strängström) // lager. cc, endast main - funktionen int main () vector <Item > supply ; int cnt ; ifstream in_file (" lager. txt "); if (! in_file ) cerr << " Filen gick inte att ö ppna, avslutar!" << endl ; return 1; in_ file >> cnt ; ostringstream oss ; for ( int i =1; i <= cnt ; ++i) supply. push_back ( read ( in_file, oss )); in_file. close (); cout << " varunamn antal pris \ n" << setw (43) << setfill ( - ) << \n << setfill ( ); vector < Item >:: const_ iterator it = supply. begin (); for ( size_t i = 0; i < supply. size (); ++i) cout << setw ( 22) << left << it - > name << setw ( 10) << right << it - > stock << setw ( 10) << fixed << setprecision (2) << it -> price << endl ; ++ it; cout << setw (43) << setfill ( - ) << \n << " Totalt lagerv ä rde : " << setw ( 23) << setfill ( ) << right << stock_ value ( supply ) << endl ;

8. Du ska skriva ett program som beräknar differensen mellan två klockslag och skriver ut den [3 p] på nedanstående format. Körexempel 1: Mata in första klockslaget: 10:02:10 Mata in andra klockslaget: 02:30:12 Differensen blir 7 timmar, 31 minuter och 58 sekunder. Körexempel 2: Mata in första klockslaget: 10:02:10 Mata in andra klockslaget: 11:30:12 Differensen blir 1 timmar, 28 minuter och 2 sekunder. Det är givet att användaren endast matar in korrekta tider. Det är också givet att båda klockslagen är under samma dygn (du måste ta reda på vilket som är minst).

Ren problemlösning, hitta vilken som är störst och beräkna differensen eller ta beloppet av differensen. Sköt utskriften på ett snyggt sätt. # include < iostream > using namespace std ; struct Time int h,m,s; ; Time read (); int to_ sec ( const Time &); Time to_time ( int ); int main () cout << " Mata in f ö rsta klockslaget : "; Time t1 = read (); cout << " Mata in andra klockslaget : "; Time t2 = read (); int dt = to_sec (t1)- to_sec (t2 ); if (dt < 0) dt = -dt; Time diff = to_ time ( dt ); cout << " Differensen blir " << diff. h << " timmar, " << diff. m << " minuter " << " och " << diff. s << " sekunder." << endl ; Time read () Time t; char c; cin >> t.h >> c >> t.m >> c >> t.s; return t; int to_sec ( const Time &t) return 3600* t.h + 60* t.m + t.s; Time to_time ( int sec ) Time t; t.h = sec /3600; sec %= 3600; t.m = sec /60; sec %= 60; t.s = sec ; return t;

9. Skapa ett program som beräknar medelvärdet av ett antal tärningskast. Programmet ska [4 p] ta två heltal som kommandoradsargument. Det första heltalet ska bestämma antal kast och det andra bestämmer antal sidor på tärningen. Om användaren ger fel argument ska programmet skriva ut ett felmeddelande och avslutas. Körexempel: zaza1: a.out 5 3 Medelvärdet av 5 slag med en 3-sidig tärning blev 2.40 zaza1: a.out d 23 Antal tärningar och sidor måste matas in som positiva heltal! KRAV: Resultatet av tärningskasten måste slumpas fram.

För hantering av kommandoradsargument ges totalt två poäng (kontroll + omvandling) Slumptalshantering och utskrift/medelvärdesberäkning ger ett poäng vardera. Går även bra med rand-funktionen från cstdlib men då måste den seedas manuellt. # include < iostream > # include < random > # include < string > # include < cctype > # include < iomanip > using namespace std ; bool check_ input ( const string & str ) for ( size_t i = 0; i < str. length (); ++i) if (! isdigit ( str.at(i ))) return false ; return true ; int main ( int argc, char * argv []) if ( argc!= 3) cerr << " Fel antal argument!\ n" << " Programmet ska anropas enligt " << argv [0] << " N M\n" << " D ä r N ä r antal t ä rningskast och M antal sidor." << endl ; return 1; else if (! check_input ( argv [1])! check_input ( argv [2])) cerr << " Antal t ä rningar och sidor m å ste matas in som " << " positiva heltal!" << endl ; return 2; int num_dice = atoi ( argv [1]), dots = atoi ( argv [2]); double sum = 0; // f ö r att slippa castning i medelber ä kning... random_ device rnd ; for ( int i = 0; i< num_dice ; ++i) sum += rnd () % dots + 1; cout << " Medelv ä rdet av " << num_ dice << " slag med en " << dots << "- sidig t ä rning blev " << fixed << setprecision (2) << sum / num_ dice << endl ; return 0;

10. Skriv ett program som låter användaren mata in en sträng bestående av maximalt 20 tecken. De tecken användaren matar in är i intervallet [ a, z ]. Inga andra tecken behöver [3 p] hanteras då användaren är en snäll assistent som har koll på sina inmatningar. Användaren kan mata in en godtyckligt lång sträng (om det är fler än 20 tecken skall endast de första 20 tecknen räknas som inmatning, resten skall ignoreras). Om användaren endast trycker på <ENTER>-knappen, d.v.s. inte matar in något, skall programmet avslutas. Om användaren matar in minst ett tecken skall inmatningen skrivas ut enligt nedan och en ny inmatning skall tillåtas (utan att man behöver starta om programmet). Körexempel: Mata in en sträng med maximalt 20 tecken: abcdefghijklmnopqrstuvwxyz a b c d Mata in en sträng med maximalt 20 tecken: abcdefghijklmnopqrstuvwxyz q w e r t y u i o p abcd qwertyuiop Mata in en sträng med maximalt 20 tecken: Inget att skriva ut. Tack för idag!

Går såklart att lösa även utan iteratorer. getline är en smidig lösning (ingen given begränsning på hur många tecken vi får läsa in) men en alternativ lösning kan vara en loop som antingen läser till slutet av raden eller maximalt 20 tecken och därefter ignorerar resten. // Lite fusk med må svingarna för att få plats på sidan... # include < iostream > # include < string > using namespace std ; int main () string str ; for (;;) cout << " Mata in en str ä ng med maximalt 20 tecken : "; getline (cin, str ); if ( str. length () == 0) break ; string :: const_ iterator end = str. end (); if ( str. length () > 20) end = str. begin () + 20; for ( char c = a ; c <= z ; ++c) cout << c; cout << endl ; for ( string :: const_iterator it=str. begin (); it < end ; ++ it) for ( int i = a ; i < *it; ++i) cout << ; cout << * it << endl ; cout << " Tack för idag!" << endl ; Kodruta 1: getline-lösning // alternativ inl ä sning, ist ä llet f ö r getline char c; for ( int i = 0; i < 20 && cin. peek ()!= \n ; ++i) cin. get (c); str. push_back (c); do cin. get (c); while (c!= \n ); Kodruta 2: loop-lösning