Övnings- och examinationsuppgifter C# - programmering I (FYD421) Version 2.3 24:e januari 2014 Huvudförfattare: Peter Klason (peter.klason@physics.gu.se) Medförfattare: Per Sillrén, Patrik Johansson, Andreas Heinz, Jonas Einarsson
I. INTRODUKTION Välkommen till FYD421 C#-programmering I. Kursen ingår i programmet Datorstödd Fysikalisk Mätteknik (DFM), men kan även läsas separat, och har som syfte att lära dig grunderna i programmeringsspråket C#. I påbyggnadskursen FYD431 C#-programmering II är syftet att använda C# för att utveckla avancerade styr-, regler- och mätprogram. Kursen går som halvfartskurs på kvällstid. Detta kompendium kompletterar föreläsningarna och innehåller förutom examinationsuppgifterna. Ditt kursbetyg kommer baseras på (se examination nedan), ett antal övningsuppgifter vilkas syfte är att hjälpa dig att komma igång. II. Översiktligt innehåll C#-programmering I fokuserar på grunderna i C# och.net ramverket. Du lär dig göra både konsol- och Windowsbaserade applikationer. Mer detaljerat innehåll fås på hemsidan och via föreläsningarna. Labb av kursen inkl. examinationen är uppdelad i tre delar: 1) Allmän kunskap och grunder i C# 2) Objekt-orienterad programmering i C# 3) Avancerad C# och Windows-applikationer Varje del motsvaras av ett kapitel. Varje del innehåller både övnings- och examinationsuppgifter. III. Examination Följande gäller: Kursen examineras helt med examinationsuppgifterna (alltså ingen tentamen). All redovisning sker under schemalagd laborationstid (alltså ej via inlämning). Alla uppgifter har ett poängvärde och du får dessa poäng efter godkänd redovisning. Du måste ha minst 3 poäng per kapitel för att få minst betyget Godkänd. Ditt slutbetyg på kursen bestäms utifrån följande kriterier: Betyget Godkänd: är normalbetyget. Koden skall vara välskriven och kommenterad och givetvis lösa uppgiften på ett sätt som utnyttjar C# och.net på ett bra sätt. Dina program ska hantera fel på ett korrekt sätt; somexempel: om användaren ska mata in heltal ska programmet kontrollera att bara heltal matas in, hantera alla eventuella undantag, och om något blir fel ska ett felmeddelande genereras. Du måste minst kommit upp i 12 redovisade poäng senast vid sista laborationstillfället. Betyget Väl Godkänd: här krävs lite mer utöver kraven för godkänd; - att dina laborationsuppgifter uppvisar en allmänt god programmeringsteknisk kvalitet - att du följer anmodad kodstandard - att du kommenterar koden väl - att lösningarna meningsfullt utnyttjar C# och.net ramverkets finesser - att de färdiga programmen är användarvänliga. Du måste minst kommit upp i 20 redovisade poäng senast vid sista laborationstillfället. 2
Examinationens utförande: För att det ska bli lättare att redovisa skall du göra följande: Gör en Solution för varje kapitel och kalla den KapitelX där X är kapitelnumret. Lägg varje solution i en egen mapp (enklast genom att låta Create directory for solution vara förkryssat.) För varje uppgift i kapitlet: Gör ett projekt med namnet UppgiftY där Y är uppgiftsnumret. I slutändan kommer du alltså ha tre solutions (en per kapitel) med ett antal projekt i varje. IV. Övrig information Under kursen kommer programmet Microsoft Visual Studio 2010 Professional (VS2010) att användas till att skapa konsol- och Windowsapplikationer. Vi kommer också att använda Measurement Studio (MS). Dessa programvaror finns installerade i ET- och EP-labben (där laborationerna utförs). Utöver detta så har du tillgång till VS2010 inom ramen för MSDNAA om du saknar MSDNAA så kontakta kursansvarig för mer information. Aktuell kurslitteratur hittar du via föreläsningarna och hemsidan. Det finns även mycket bra material om C# att tillgå på internet. Följande länkar kan komma till användning under kursens gång: - http://www.java2s.com/tutorial/csharp/catalogcsharp.htm - http://www.csharp-station.com/tutorial.aspx - http://msdn.microsoft.com/en-us/library/67ef8sbd.aspx Om du stöter på frågor under kursens gång så utnyttja gärna de tillfällen som finns, d.v.s. i anslutning till föreläsningar och handledningstillfällen. Viss hjälp går att få via e-post, men det är mycket bättre att du frågar vid de schemalagda tillfällena. Kom ihåg, det finns inga dumma frågor bara dumma svar :-) 3
Kapitel 1: Allmän kunskap och grunder i C# Mål: Du ska kunna skriva ett enkla C#-program som läser in data från tangentbordet eller från filer, utför beräkningar och presenterar resultatet. Du ska även behärska fält. Övningsuppgifter Ö1 Skriv ett program som beräknar den återstående restiden om man vet medelhastigheten i km/h och återstående körsträcka i mil. Du kan anta att medelhastigheten hålls hela den återstående körsträckan. Resultatet ska presenteras som i figuren. Ö2 Skriv ett program som skapar ett mönster av 16 rader och 32 kolumner enligt figuren nedan. Du får bara använda följande satser en gång vardera för utskrift: Console.Write( ); Console.Write( * ); Console.WriteLine(); Ö3 Skriv ett program som uppmanar användaren att mata in hur många heltal som ska sparas. Lägg in heltalen i ett fält och skriv sedan ut fältets innehåll baklänges. Skapa en metod som sköter inläsningen av heltalen. Testkör programmet och se att det stämmer överens med figuren. 4
Ö4. Skriv ett program som ber användaren mata in ett tresiffrigt tal. Programmet ska sedan beräkna summan av de tre siffrorna. Om t.ex. 483 matas in ska programmet visa att summan blir 15. Examinationsuppgifter Uppgift 1.1 (1p) Skriv ett program som skapar ett fält med 10 000 slumptal mellan 0 och 9. Programmet ska sedan visa hur många tvåor och nior det finns i fältet. Uppgift 1.2 Växelpengar (1p) När du handlar i en affär och betalar kontant får du kanske växel tillbaka. I regel får affärsbiträdet hjälp av kassaapparaten med att beräkna summan man ska få tillbaka, men inte alltid vilka sedlar och mynt som ska lämnas tillbaka. Skriv ett program som beräknar den växel biträdet ska ge tillbaka i samband med ett köp. Programmet ska, förutom att presentera beloppet kunden får tillbaka avrundat till närmsta 50-öring, även bestämma vilka, och antalet, sedlar och mynt. Kunden ska få så få sedlar och mynt som möjligt tillbaka. Programmet ska kunna ge växel tillbaka med sedlar av valörerna 1000, 500, 100, 50 och 20 samt mynten 10, 5, 1 och 50-öring. Du kan anta att det alltid finns tillräckligt antal av de sedlar och mynt som krävs. Skriv endast ut de valörer som ska lämnas tillbaka. Eventuella fel i samband med inmatningen ska tas om hand. Använd try/catch och fånga lämpligt undantag (exception). Glöm inte att testa programmet. Om t.ex. en kund handlar för 371,38 kr avrundas beloppet till 371,50 kr. Om kunden betalar med en 1000 kr sedel ska kunden få 628,50 kr tillbaka, fördelat enligt figuren. Uppgift 1.3 Effektiv vindavkylning (1p) Du upplever säkert en lägre temperatur, än vad termometern visar, då det blåser. Men vilken temperatur är det du upplever? SMHI använder Oszevskis och Bluesteins formel (fr.o.m. vinter 2003/2004) för att beräkna den effektiva temperaturen, som ser ut på följande sätt: T eff = + 0.16 0.16 13.126667 + 0.6215* T 13.924748* v 0.4875195* T * v 5
där ν är vindhastigheten och T är temperaturen. Mer information finns att tillgå på: http://www.smhi.se/sgn0102/n0205/faktablad_vindavkylning.pdf Skriv ett program som visar en tabell med den beräknade effektiva temperaturen för olika temperaturer och vindhastigheter enligt figuren. Den effektiva temperaturen ska presenteras som ett heltal. Om den effektiva temperaturen mindre eller lika med -28ºC ska temperaturen skrivas ut med blå text på grå bakgrund. Använd egenskaperna Console.BackgroundColor och Console.ForegroundColor samt metoden Console.ResetColor() för att påverka vilka färger som ska användas. Den blå linjen anger den temperatur vid vilken det är risk för köldskador. Uppgift 1.4 Hitta topparna (2p) Gör ett program som läser in en textfil med mätdata. Filen innehåller intensitet som funktion av våglängd. Programmet ska lokalisera antalet toppar, topparnas position och intensitet. Utöver detta ska man som användare kunna sätta ett villkor för hur stor intensitet en topp måste ha för att få klassificeras som en topp. Till exempel kan användaren välja att en topps maxvärde måste vara över 1 för att få vara en topp. Filen med mätdata fås av labassistenterna. Uppgift 1.5 Bowlingspel (2p) I bowling ska man med ett klot försöka få ner 10 käglor. Man har två slag på sig. Om man lyckas få ner alla 10 i första slaget kallas det för strike och om alla käglor fallit ner efter två slag kallas det för spärr. Poängsättningen beräknas på ett litet speciellt sätt: En serie innehåller 10 rutor I varje ruta får man göra högst två slag Slår man en strike får man 10 poäng plus lika många poäng som antalet käglor man kommer att slå ner i nästkommande två slag Slår man en spärr för man 10 poäng plus lika många poäng som antalet käglor man slår ner i nästa slag Finns det käglor kvar efter sina två slag får man lika många poäng som antalet käglor man slagit ner i de två slagen Om man får strike i sista rutan, dvs. ruta 10, får man två extra slag och lika många poäng i sista rutan som antalet nedslagna käglor i de tre sista slagen. Om man får spärr i sista rutan får man ett extra slag och lika många poäng i sista rutan som antalet nedslagna käglor i de tre sista slagen. Skriv ett C#-program som frågar efter antalet käglor som slås ned i varje slag och beräknar totala antalet poäng i en serie. 6
Uppgift 1.6 Bowlingspel fortsättning (1p) Utöka ditt program så att du får ett bowlingspel. Programmet ska kunna ha 1-3 spelare och mha slumptal ska programmet slumpa fram hur många käglor spelarna slår ner i resp. ruta. Via en lämpligt vald tangent kastar man sitt klot. Som utskrift ska visas hur många käglor som välts ner och totala poäng varje spelare har lyckats skrapa ihop. Uppgift 1.7 Frekvenstabell och kommaseparerade värden (1p) Du ska i denna uppgift skriva ett program som öppnar en textfil med kommaseparerade värden. Programmet ska sedan läsa in filen rad för rad och analysera värdena i textfilen. Slutligen ska programmet skapa en frekvenstabell över respektive värde. Du ska med andra ord räkna hur många gånger varje värde finns i textfilen. Ett Dictionary kommer väl till pass för denna uppgift, med det kan du koppla ett värde till antalet gånger det förekommer. Textfilen, som fås av labassistenterna, innehåller resultatet från en av basårets tentor i Fysik del A. Uppgift 1.8 Numerisk integrering (1p) Skriv ett program som numeriskt beräknar en integral. Den enklaste numeriska integrationsmetoden tillämpar den så kallade trapetsregeln. X-axeln delas då upp i N 1 intervall [x i,x i+1 ], som alla är Δx= x i+1 - x i långa för 0 i N. Lösningen till integralen ges då av F = % a b N#1 $ f ( x)dx! "x f x i i=0 ( ) där variablerna x 0 = a, x N = b. Antalet intervall, N, skall anges av användaren (större N ger ett bättre värde på integralen men innebär samtidigt att programmet tar längre tid att köra). Programmet ska fungera för godtycklig integral (som finns i källkoden och som inte ska anges av användaren). Principen för beräkning av integralen visas i figuren nedan. 7
Kapitel 2: Objekt- orienterad programmering i C# Mål: Du ska förstå och kunna hantera klasser, egenskaper, metoder, parametrar, returvärden och arv. Du ska dessutom förstå och kunna använda statiska metoder och egenskaper. Det är också viktigt att du förstår skillnaden mellan variabler av värdetyp och referenstyp och vad skillnaderna får för följder. Övningsuppgifter Ö1 Skapa en klass Book för att hålla reda på bok-objekt. Varje bok-objekt ska ha en titel, författare, förlag och ISBN. Du kan för enkelhets skull låta ISBN vara av typen string istället för någon numerisk typ. Detta gör att ISBN kan ha en 0:a som första siffra eller inkludera någon bokstav. Klassen ska också ha en metod, DisplayBook(), som skriver ut informationen till konsolfönstret. Testkör programmet genom att skapa minst tre stycken bok-objekt. Examinationsuppgifter Uppgift 2.1 PointD (1p) Skapa ett klassbibliotek (New Project -> Class Library) och kalla det för MinaKlasser Döp om Class1.cs till PointD.cs En punkt i ett tvådimensionellt koordinatsystem kan anges på formen (X,Y). Skriv en klass PointD som beskriver punkter på denna form. Observera att X och Y ska vara av typen double och att de ska implementeras som automatiska egenskaper (Auto- Implemented Properties). Gör två konstruktorer: en som inte har några parametrar och sätter X och Y till noll, och en som tar två parametrar av typen double och sätter X och Y till värdet av dessa parametrar Gör två operatorer + och som adderar respektive subtraherar två PointD objekt Skriv en statisk metod Distance som tar två PointD objekt som argument och returnerar avståndet mellan punkterna. Avståndet beräknas med Pytagoras sats. Skriv ett program som använder PointD.cs och dess element. Uppgift 2.2 XYData (1p) Lägg i MinaKlasser till en klass XYData som har en automatisk egenskap data av typen BindingList<PointD> Gör en default-konstruktor som initierar data till en tom lista Gör en metod SetData som tar två fält av typen double och sätter data till att stämma överens med dessa. Om de två fälten är olika långa ska ett undantag av typen ArgumentException kastas. Gör ytterligare en konstruktor som tar två fält av typen double och anropar setdata med dessa Skriv en instansmetod FindPeaks som hittar maxima i datan och returnerar ett fält av typen double som innehåller x-koordinaterna för topparna. Skriv en instansmetod som returnerar en ny instans av XYData som innehåller kvadraten av data Uppgift 2.3 Statisk Variabel (1p) Skriv en klass som innehåller en statisk variabel som håller reda på hur många objekt av klassen som existerar för tillfället. Det ska dessutom finnas en statisk funktion som returnerar detta antal. Varje objekt i klassen ska även ha en instansvariabel som automatiskt tilldelas ett unikt id-nummer 8
när objektet skapas. Detta id-nummer ska inte kunna ändras efter att det har initieras. Markera därför instansvariablen som readonly. Uppgift 2.4 Kalender (2p) Skriv ett program som fungerar som en kalender. Det ska innehålla en klass med information om möten (var det är, när det sker, hur länge det varar, vilka som kommer vara där med mera). Programmet ska kunna spara möten och när användaren skriver in ett datum ska den dagens möten listas. Det ska också vara möjligt att få fram detaljerna för ett specifikt möte. I programmet ska det gå att lägga till, ta bort och ändra möten. Använd olika klasser för olika typer av möten och utnyttja arv inom objektorienterad programmering. Uppgift 2.5 Sorteringsklass (2p) (a) Du ska skapa en klass, Student, som hanterar ett godtyckligt antal studenter. Intressant information att lagra är åtminstone namn och ålder. Klassen ska vara sorteringsbar och detta åstadkommer du genom att implementera gränssnittet IComparable<T>, där T står för klassens namn. Du måste lägga till metoden CompareTo i klassen Student. Klassen Student ska ha privata fält för den information som lagras och till fälten ska det finnas publika egenskaper. Vidare ska klassen ha en konstruktor för att initiera ett objekt. För att testa klassen väljer du samlingsklassen List<T>. Du ska göra ett program som skriver ut en lista på personer i den ordning de lags till. Därefter ska programmet skriva ut en lista där personerna är sorterade på namn. Har två personer samma namn ska de sorteras efter ålder. (2p) (b) Utöka klassen Student i uppgift (a) så att det går att sortera på studenternas ålder likväl som på deras namn. Ett tips är att implentera gränssnittet IComparer<T>, läs i on-line -hjälpen för hur gränssnittet IComparer<T> kan användas för att sortera en klass. (1p) Uppgift 2.6 Gissa hemliga talet (2p) I denna uppgift ska du göra ett program där användaren har sju försök på sig att gissa ett heltal mellan 0 och 100. Följande krav måste uppfyllas: Användaren har sju (7) försök på sig att gissa rätt tal. Det ska inte gå att göra fler gissningar. En klass ska skapas för detta ändamål. Klassen ska ha lämpliga fält, egenskaper, metoder och konstruktorer. Antalet gissningar användaren har på sig ska lagras i en publik namngiven konstant. Det hemliga numret, som slumpats fram, ska inte kunna kommas åt. Klassen ska ha ett fält som håller reda på hur många gissningar som gjorts. Klassen ansvarar för att skriva ut om användaren gissat rätt tal, gissat för lågt, gissat för högt och om användaren förbrukat alla gissningar. Utskriften ska se ut som på skärmdumpen. En gissning görs genom att en metod i klassen anropas. Metoden ska skriva ut ett lämpligt meddelande beroende på resultatet av gissningen och metoden returnera true annars false. När användaren gissat rätt eller antalet gissningar är slut ska användaren få välja om han vill avsluta eller fortsätta en gång till. Om användaren matar in N ska programmet avslutas. 9
Uppgift 2.7 Statistik (2p) Du ska göra ett program som analyserar två serier om minst tio heltal vardera, gärna flera. Programmet ska presentera det största och det minsta värdet för respektive serie. Seriernas medelvärden ska också beräknas och presenteras. Slutligen ska programmet även avgöra vilken serie som har störst medelvärde. Skapa en klass Statistik som håller reda på de två serierna. Klassen ska inte lagra alla inmatade heltal utan den ska bara lagra den information som krävs för att presentera största och minsta värdet samt medelvärdet. Skapa klassen enligt klassdiagrammet. Som du ser har klassen en egen variant av metoden ToString() (som ni alla vet deklareras av basklassen Object). Metoden ToString() skriver ut seriens summa, medelvärde och största resp. minsta värdet. Metoden LasHeltal i klassen Program används för att läsa in och kontrollera de heltal som ska ingå i respektive serie. Använd int.tryparse i metoden LasHeltal för att kontrollera att det är heltal som matas in. Varje inläst heltal läggs till det Statistik-objekt som statistik refererar till med hjälp av metoden Add. Metoden LasHeltal anropas m.a.o. ifrån metoden Main. 10
11
Kapitel 3: Avancerad C# och grafiska komponenter Mål: Du introduceras till en del av alla de grafiska hjälpmedel och finesser som finns att tillgå i C# och VS 2010. Du lär dig att göra Windowsapplikationer. Övningsuppgift Ö1. Gör en Windowsapplikation som beräknar momsen för en viss vara. När användaren trycker på knappen beräkna ska momsen beräknas och visas m.h.a en label längs ner i fönstret. Varans pris exkl. moms ska matas in i en TextBox och momssatsen ska matas in via en NumericUpDown. Svaret ska innehålla pris exkl. moms, momsen och pris inkl. moms. Examinationssuppgifter Uppgift 3.1 Enkel Miniräknare (1p) Gör en Windowsapplikation som fungerar med funktionerna i figuren. Uppgift 3.2 Avancerad miniräknare (1-2 p) Utöka miniräknaren med fler funktioner. Kreativitet uppmuntras! Ju fler funktioner desto fler poäng får du på uppgiften. Minst 4 nya olika typer av funktionerkrävs för att få 1 poäng. Uppgift 3.3 Lissajoufigurer (1p) I denna uppgift ska ni skapa de klassiska Lissajoufigurerna. Dessa figurer uppstår när man har två sinusvågor med olika frekvens. De två sinusvågorna plottas i en XY-plot, där ena sinusvågen anger X-värdena och den andra Y-värdena. Låt amplituden på sinusvågorna vara 1 V. Med hjälp av 12
kontroller ska man kunna reglera de två sinusvågornas resp. frekvens. Resultatet ska visas i en ScatterGraph. Programmet ska även ha en CheckBox, om den är markerad ska en Legend visas. Uppgift 3.4 User controls, Model-View-Controller och Bindings (2p) I den här uppgiften ska du göra ett program enligt arkitekturmönstret model-view-controller (MVC). Idén med MVC är att separera databehandling (model) från dess grafiska representation (view). Kommunikationen mellan modellen och vyn sköts av controllern. Vilka ickefunktionella krav påverkas av MVC arkitekturen? Konstruera ett program som ser ut som figuren nedan. Programmet ska bestå av två klasser, en controller-klass och en view-klass. - Låt controllern representeras av Form-klassen som skapas när du skapar ett nytt projekt. Controller-klassen ska ha en instansvariabel av typen XYData och ska i konstruktorn koppla denna till view-objektet. Controllern ska även implementera händelsehanterare för knapparna Plot sinewave, Find peaks och FFT (Fourier-transform) på lämpligt sätt. - View-klassen ska vara en User control (använd menyalternativet Project:Add User Control ) med en ScatterGraph och en DataGridView. Använd GUI-editorn för att binda DataGridView-objektet till ett objekt av typen XYData (se Property-fönstrets DataSource-fält). För att kopplingen ska fungera måste View-klassen ska ha en instansmetod setdatasource som kopplar ett specifikt XYData-objekt till DataGridViewobjektet. För att grafen ska uppdateras när listan ändras implementerar du händelsen ListChanged för BindingSource-objektet. 13
Uppgift 3.5 Trafikljus (2p) Ditt företag har fått i uppdrag att tillverka ett kontrollsystem för trafikljusen i en mycket trafikerad 4-vägskorsning. Varje trafikljus består av grönt, gult och rött ljus. Ljusperioden för de olika färgerna ska vara: Rött ljus: 4s Gult ljus: 2 s Grönt ljus: 4 s Ljusen ska lysa på följande sätt: 14
Norr Söder Väster Öster Grönt Grönt Rött Rött Gult Gult Rött Rött Rött Rött Grönt Grönt Rött Rött Gult Gult Uppgift 3.6 Trafikljus del II. (1p) Utöka föregående uppgift med att lägga till ett trafikljus för fordon som ska svänga höger. Om sensorn (i detta fall en knapp under ljusen) som indikerar att det finns fordon som ska svänga höger är påslagen, följer trafikljusen som högersväng samma mönster som ovan. Det vill säga om ett fordon vid trafikljuset i norr ska svänga höger är trafikljuset för högersväng grönt, när trafikljuset i norr är grönt. Uppgift 3.7 Klocka (3p) Som forskare har man flera arbetsuppgifter, t.ex. forskning och undervisning. För att lättare hålla reda på hur mycket tid man lägger ner på de olika arbetsuppgifterna ska du göra ett program som håller reda på hur mycket tid man under en dag lägger ner på forskning, undervisning och lunch. Programmet ska se ut ungefär som i figuren. 15
Överst i fönstret visas vad klockan är. Sedan väljer man genom att trycka på resp. knapp vilken sysselsättning man roar sig med för tillfället. Om tex knappen Forskning trycks in ska tiden som visas vid forskning öka för varje sekund som går. Du ska med andra ord ha fyra stycken klockor, en för vanliga klockan och tre som håller reda på hur mycket tid du lägger ner på respektive sysselsättning. Du avgör själv om du vill att sekunderna ska visas för klockarna för resp. sysselsättning. När den sammanlagda tiden för Undervisning och Forskning uppgår till 8h ska en diod börja visas med texten Åk HEM!!!. Dioden ska blinka mellan svart och röd med en sekunds mellanrum. När dioden är röd ska texten Åk HEM!!! visas. När man trycker på knappen Spara ska tiden man lagt ner på de tre sysselsättningarna sparas i en textfil med lämpligt namn. Filen ska även innehålla dagens datum. Programmet ska sedan avslutas. Du ska skapa två stycken klasser för att visa tiden. Klasserna ska vara utformade enligt klassdiagrammen nedan. Klassen NumberDisplay simulerar en nummerdisplay med två stycken siffror. Egenskapen Number som är kopplad till fältet _number säkerställer att det är omöjligt att sätta ett värde mindre än 0 och större än största tillåtna värdet, _maxnumber. Om ett ogiltigt värde matas in ska ett ArgumentException kastas. Klassen har två konstruktorer, i den ena sätts Number = 0. Metoden GetDisplayNumber() returnerar aktuellt värde. Är värdet mindre än 10 läggs en nolla till först i strängen, tex om det aktuella värdet är 3 returneras 03. Med metoden Increment() ökas det aktuella 16
värdet med ett. Om det aktuella värdet skulle bli större än det _maxnumber sätts det aktuella värdet till 0. Klassen ClockDisplay använder tre stycken NumberDisplay-objekt för att simulera en digital klockdisplay. Det booleska fältet _visasek sätts till true om man vill att även sekunderna ska visas när man presenterar tiden. Metoden GetTime() ska returnera aktuell tid på formen 12:45:10 i form av en sträng. Metoden SetTime() används för att ställa tiden. Defaultkonstruktorn ska sätta tiden till 00:00:00. Alla konstruktorer ska använda metoden SetTime() för att ställa tiden. Metoden TimeTick() låter klockan gå en sekund. För denna uppgift ska du skapa fyra stycken ClockDisplayobjekt, en som visar vad tiden är och en för varje sysselsättning. Det ClockDisplay-objektet som visar vad tiden är ska när programmet börjar initieras till rätt tid med hjälp av DateTime. Uppgift 3.8 Egen uppgift (1-3p) Gör en egen uppgift - inklusive ett förslag till lösning. Bedöm också svårighetsgraden på uppgiften genom att ge den poäng mellan 1 till 3 p. (Du får inte nödvändigtvis samma poäng vid redovisningen.) LYCKA TILL! 17