Inledande programmering med C# (1DV402) Tärningarna ska kastas

Relevanta dokument
Övningsuppgift. Repeterbara citat. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Gissa det hemliga talet

Klasser och objekt i C#

Inledande programmering med C# (1DV402) 85%43=42. OBS! Heltal 1 (14)

Övningsuppgift. Bankkonton. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Statistik över heltal

Laborationsanvisning. Digital väckarklocka. Steg 2, laborationsuppgift 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Frekvenstabell över tärningskast med C#

Inledande programmering med C# (1DV402) Introduktion till C#

Övningsuppgift. En array baklänges. Steg 1. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Inledande programmering med C# (1DV402) Introduktion till programmering

Metoder. Inledande programmering med C# (1DV402)

Räkna med C# Inledande programmering med C# (1DV402)

"if"-satsen. Inledande programmering med C# (1DV402)

Inledande programmering med C# (1DV402) Introduktion till. eller så här är det tänkt att fungera.

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Programexempel: tärningsspel. Programexempel: tärningsspel Kasta tärning tills etta. Klassen Die Specifikation. Slumptalsgenerator Klassen Random

Inledande programmering med C# (1DV402) Summera med while"-satsen

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Inledande programmering med C# (1DV402) 85/2=42. OBS! Heltal 1 (13)

Frekvenstabell över tärningskast med C#

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorienterad programmering

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

Övningar Dag 2 En första klass

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Laborationsanvisning. Geometriska figurer. Steg 2, laborationsuppgift 3. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Objekt och klasser - Introduktion

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Java, klasser, objekt (Skansholm: Kapitel 2)

Lösningsförslag övning 2.

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Objektorientering: Lagring och livstid

Creative Commons. en guide för lärare. En guide för lärare

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 11

Malmö högskola 2007/2008 Teknik och samhälle

Introduktion till arv

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

Enkla variabler kontra referensvariabel

Objekt som argument. Föreläsning 7-8 Innehåll. Hur komma åt den andra kvadratens attribut? Anropa metod på objektet självt

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Föreläsning 7-8 Innehåll

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

OOP Objekt-orienterad programmering

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

TDIU01 Programmering i C++

Receptsamling med fil

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Agenda. Objektorienterad programmering Föreläsning 13

C++ Objektorientering - Klasser. Eric Elfving

Laboration A Objektsamlingar

JAVA Mer om klasser och objektorientering

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TDDD78 Objektorientering: Lagring och livstid

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

TUTORIAL: KLASSER & OBJEKT

Objektorienterad programmering Föreläsning 5

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

ID1004 Laboration 4, November 2012

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

TDDC76 - Programmering och Datastrukturer

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

Tentamen i Algoritmer & Datastrukturer i Java

Chapter 4: Writing Classes/ Att skriva egna klasser.

Objektorientering: Lagring, räckvidd och livstid

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Transkript:

Tärningarna ska kastas

Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering med C# vid Linnéuniversitetet. Du får använda detta verk så här: Allt innehåll i detta verk av Mats Loock, förutom Linnéuniversitetets logotyp och symbol samt fotografier, är licensierad under: Creative Commons Erkännande-IckeKommersiell-DelaLika 2.5 Sverige licens. http://creativecommons.org/licenses/by-nc-sa/2.5/se/ Det betyder att du i icke-kommersiella syften får: kopiera hela eller delar av innehållet sprida hela eller delar av innehållet visa hela eller delar av innehållet offentligt och digitalt konvertera innehållet till annat format du får även göra om innehållet Om du förändrar innehållet så ta inte med Linnéuniversitetets logotyp och symbol samt fotografier i din nya version! Vid all användning måste du ange källan: Linnéuniversitetet Inledande programmering med C# och en länk till https://coursepress.lnu.se/kurs/inledande-programmering-med-csharp och till Creative Common-licensen här ovan. 2 (21)

Du har ett problem Du ska skriva ett C#-program som simulerar tärningskast med en eller flera tärningar som har sex sidor. Det måste finnas ett enklare sätt. Eller? 3 (21)

Du måste först lösa hur du gör för att skapa ett slumptal som har värdet 1, 2, 3, 4, 5, eller 6. Klassbiblioteket i dotnetramverket innehåller klassen Random som du kan använda till att generera slumptal. Metoden Next(int minvalue, int maxvalue) som Randomobjektet anropar via referensvariabeln returnerar ett slumptal inom det angivna området (inklusive minvärdet, exklusive maxvärdet). 4 (21)

Problemet löst men Hur enkelt är det att förstå att koden handlar om ett tärningskast? Inte intuitivt uppenbart! Går det inte att efterlikna ett verkligt tärningskast mer? 5 (21)

En idé! Skulle jag inte kunna skapa ett tärningsobjekt, på samma sätt som Random-objektet? Ja, men det finns ingen färdig tärningsklass. Du måste skriva en egen klass. Har du en tärningsklass kan du skapa tärningsobjekt. 6 (21)

Vad utmärker en tärning? För att kunna skriva en tärningsklass måste du först identifiera vad som gör en tärning till en tärning. Något som beskriver tärningen? (attribut) Antalet prickar som visas. (eng. face value) Något du kan göra med tärningen? (operation) Slå tärningen. (eng. throw) Det finns andra attribut, som färg, storlek, etc. men de är inte intressanta att lägga in i en klass i detta fall. och man kan ju t.ex. skaka tärningen (en operation), men det är inte heller intressant. 7 (21)

Ett första utkast till en tärningsklass I C# definieras en ny klass med nyckelordet class, ett namn och ett par klammerparenteser. Klassen har ett fält som beskriver antalet prickar tärningen visar. Metoden Throw() simulerar ett tärningskast genom att det genererade slumptalet sparas i fältet _facevalue. Värdet som _facevalue tilldelats returneras därefter. 8 (21)

Fungerar klassen bra nu? Eller Nu är det enklare att förstå att det handlar om tärningskast. Så långt så bra Fältet _facevalue är publikt och därmed helt oskyddat. Av misstag skulle det vara möjligt att ändra antalet prickar till ett värde mindre än 1 eller större än 6. INTE BRA! 9 (21)

Skydda datat! Fältet deklareras som ett privat fält och är inte tillgängligt utanför klassen. Via en egenskap görs det privata fältet _facevalue tillgängligt. En egenskap är en blandning mellan ett fält och en metod, och innehåller två metoder som inleds med nyckelorden get och set. get-metoden innehåller kod som körs då egenskapen läses. set-metoden innehåller kod som körs då något tilldelas egenskapen. value är en dold parameter av samma typ som egenskapen. Ett steg i rätt riktning, men fortfarande går det av misstag att ändra antalet prickar via egenskapen till ett värde mindre än 1 eller större än 6. 10 (21)

Kontrollera datat Genom att låta set-metoden i egenskapen kasta ett undantag om värdet är mindre än 1 eller större än 6 är det helt omöjligt att tilldela fältet _facevalue ett ogiltigt värde med hjälp av egenskapen. Bra! Nu är fältet som representerar resultatet av ett tärningskast skyddat. 11 (21)

Fungerar klassen bra nu då? Eller Ingen större skillnad mot förra försöket. Nu är det dock helt omöjligt att skapa ett Die-objekt med ett annat värde än 1, 2, 3, 4, 5 eller 6. Eller? Vad är det som skrivs ut? Var kommer 0 ifrån? Die-objektet har inte initierats till ett giltigt värde. Fältet _facevalue får värdet 0 då ett nytt objekt instansieras. Du måste använda en konstruktor! 12 (21)

En egen standardkonstruktor Klassen har kompletterats med en egen standardkonstruktor, en konstruktor som inte tar några parametrar. Konstruktorn är en speciell publik metod som har samma namn som klassen men kan inte returnera något värde (inte ens void). Genom att anropa Throw() tilldelas _facevalue ett giltigt värde. När du skapar ett nytt objekt med new, skapas objektet av Common Language Runtime (CLR) som då använder klassdefinitionen. Minne allokeras till fälten som definieras av klassen och sedan anropas konstruktorn för att utföra den initiering av fälten som krävs. 13 (21)

Ett stort men Mats har gjort fel! Klassen är i och för sig komplett gällande fält, egenskaper, konstruktorer och metoder. Men den fungerar inte bra Ja, jag vet. Problemet är metoden Throw() som ju ger samma resultat om jag så anropar den 100 gånger. 14 (21)

Felet identifierat Problemet är att ett nytt Random-objekt skapas varje gång metoden anropas. Då metoden anropas i en for -sats går det så fort att datorns klocka inte hinner gå, och klassen Random använder datorns tid för att skapa det första slumptalet. Samma tid ger samma slumptal! Aha! OK! Då förstår du säkert att du bara behöver se till att det skapas ett Random-objekt per tärning. Eller hur!!? 15 (21)

och åtgärdat Genom låta Random-objektet bli ett fält och instansiera objektet i konstruktorn kommer det bara att finnas ett enda Random-objekt per Dieobjekt, och nu kommer olika värden returneras då metoden Throw() anropas i en for -sats. 16 (21)

Ett litet men Det där med Random är ju fixat. Men varför fungerar det inte nu då? Vet inte. Men problemet är att då jag skapar två Die-objekt får jag samma serie! 17 (21)

Ännu ett fel identifierat Problemet är att då två Die-objekt skapas omedelbart efter varandra utgår Die-objektens respektive Random-objekt från samma tidpunkt, samma slumptalsfrö. Rätt slutsats! Istället för att använda datorns klocka, varför då inte slumpa slumptalsfröet som Random-objekten ska utgå ifrån? 18 (21)

och åtgärdat Klassen har kompletterats med ett statisk read-only Random-referens. Att referensen är statiskt innebär att den är gemensamt för alla objekt som instansieras av klassen. Det finns med andra ord bara ett enda _randomseed-objekt. readonly har i princip samma effekt som const. Då ett nytt Die-objekt skapas instansieras samtidigt ett nytt Random-objekt med ett framslumpat slumptalsfrö. 19 (21)

Inga fler men 20 (21)

Nu ska du kunna Definiera en klass innehållande data och metoder. Skapa objekt med new och en konstruktor. Förstå hur private och public används. Använda egenskaper för att kapsla in fält. Skapa data som delas mellan alla instanser av samma klass, med static. 21 (21)