Mekaniska räkneverk används fortfarande, t.ex. för att räkna antal passagerare på färjor. Skriv en klass som motsvarar ett sådant räkneverk.
Räkneverket lagrar ett heltalsvärde. Man göra tre saker med det:
Din klass ska ha en metod för var och en av dessa och en konstruktor som initierar ställningen till 0.
Skriv ett program där användaren anger ett filnamn som programargument. Detta ska vara en existerande textfil med heltal separerade med mellanrum. Använd två instanser av klassen i föregående uppgift för att räkna antalet udda och jämna tal. Skriv ut antal udda och jämna tal i filen på standard output. Om filen inte finns ska programmet skriva detta på svenska och sedan avsluta. Om filen innehåller annat än heltal ska programmet skriva detta och sedan avsluta.
Implementera en klass som representerar delmängder av ändliga mängder. För en mängd av storlek n ska heltal 0,1,…,n − 1 användas för att representera de olika elementen i mängden. Implementera klassen genom att använda en boolesk array av längd n där varje element är true
eller false
beroende på om talet motsvarande elementets index är medlem i delmängden eller inte.
Klassen ska heta FinSubset
ha en konstruktor med ett argument där användaren anger hur stor grundmängden ska vara, d.v.s. n.
Implementera följande metoder:
void add(int i)
, som lägger till element i
till delmängden om det inte redan fanns där.void remove(int i)
, som tar bort element i
från delmängden om det finns där.boolean isMember(int i)
, som talar om om element i
är medlem i delmängden.int size()
, som talar om hur stor delmängden är.int universeSize()
, som talar om hur stor grundmängden är (n).Utöka klassen i förra uppgiften genom att lägga till metoderna:
boolean isSubsetOf(FinSubset s)
, som avgör om aktuell är delmängd är delmängd till s
.FinSubset union(FinSubset s)
, som skapar en ny delmängd som motsvarar unionen mellan aktuell delmängd och s
.FinSubset intersection(FinSubset s)
, som skapar en ny delmängd som motsvarar snittet mellan aktuell delmängd och s
.Metoderna ska allihop kasta ett undantag av typen SetSizeMismatchException
som ska ärva RuntimeException
. Definiera denna undantagsklass. Den behöver inte innehålla några specifika instansvariabler.
Skriv ett program testar klassen i förra uppgiften. Det ska ta tre filnamn som programargument. De två första ska antas vara extisterande textfiler innehållande heltal. Varje fil motsvarar en delmängd. I varje fil är det första talet storleken på grundmängden (n i beskrivningen ovan). Sedan följer ett antal tal från 0 till n − 1. Dessa utgör elementen i delmängden. Programmet ska beräkna snittet av de två delmängderna och skriva detta till en fil med filnamn som motsvarar det tredje programargumentet. Filen ska skapas i samma format som de två infilerna.
Skriv en klass Point
som representerar punkter i planet. Koordinaterna representeras med double
. Det ska finnas en konstruktor som initierar till punkten i origo en som tar två koordinater som argument. Det ska också finnas en konstruktor som tar en Point
som argument och initieras aktuell punkt att vara densamma. Instansvariablerna ska vara private. Metoderna getX
, getY
, setX
och setY
ska finnas och dessa ska läsa av och ändra värdena på x- och y-koordinaten. Dessa metoder ska också implementeras:
void translate(double dx, double dy)
, som translaterar x- och y-koordinaterna så mycket som anges av dx
resp. dy
.void rotate(Point center, double angle)
, som roterar punkten kring punkten center
så många radianer som anges av angle
medurs.boolean equals(Point p)
, som avgör om punkten är likadan som p
.Skriv en klass Line
som representerar linjer i planet genom att använda en Point
(klassen i föregående uppgift) för varje ändpunkt. Det ska finnas en konstruktor och den ska två punkter som argument, de initiala ändpunkterna. Tänk på att kopiera dessa punkter, inte använda samma referenser i instansvariablerna. Instansvariablerna ska vara private. Dessa instansmetoder ska implementeras:
boolean equals(Line l)
, som avgör om punkten är likadan som l
. Två linjer anses lika även om dessa punkter är omkastade.double length()
, som returnerar linjens längd.Point[] getPoints()
, som returnerar en array med linjens ändpunkter. Observera att detta ska vara kopior av punkterna. Den som anropar metoden ska inte kunna ändra objektets tillstånd.