Datum
Datum
Sestavi razred Datum, ki predstavlja datum (dan, mesec in leto). Definiraj ustrezne komponente in konstruktorje.
Definiraj metodo override public string ToString(), ki vrne datum predstavljen z nizom znakov.
Definiraj metodo public bool Equals(Datum d), ki vrne True, če je datum this enak datumu d.
Datum 2
Razredu Datum dodaj metodo public int CompareTo(Datum d), ki primerja this in d ter vrne celo število:
< 0, če je this pred d
0, če je this enak d
> 0, če je this za d
Datum 3
Razredu datum dodaj metodi
metoda bool PrestopnoLeto() - vrne true, če je leto prestopno.
metoda bool Veljaven() - vrne true, če je datum veljaven.
Rešitev (Java)
public class Datum_2 {
// komponente
private int dan;
private int mesec;
private int leto;
//prazen konstruktor, nastavi datum na 1. 1. 1950
public Datum_2 () {
this.dan = 1;
this.mesec = 1;
this.leto = 1950;
}
// konstruktor, ki preveri smiselnost všenenih podatkov
public Datum_2 (int d, int m, int l) {
if ((d <= 0) || (d > 31)) {
this.dan = d;
System.err.println ("Dan postavljen na 1 zaradi napačnega vnosa.");
} else this.dan = d;
if ((m <= 0) || (m > 12)) {
this.mesec = m;
System.err.println ("Mesec postavljen na 1 zaradi napačnega vnosa.");
} else this.mesec = m;
if ((l > 2008)) {
this.leto = m;
System.err.println ("Leto postavljeno na 1950 zaradi napačnega vnosa.");
} else this.leto = 1950;
}
// objektna metoda public String toString(), ki vrne datum predstavljen z nizom znakov
public String toString() {
String datum;
datum = this.dan + "." + this.mesec + "." + this.leto;
return datum;
}
// objektna metoda public boolean equals(Datum dat),
//ki vrne true, če je datum this enak datumu dat,
//drugače vrne false
public boolean equals (Datum_2 dat) {
if ((this.dan == dat.dan) && (this.mesec == dat.mesec) && (this.leto == dat.leto))
return true;
else return false;
}
//objektna metoda public int compareTo(Datum dat), ki primerja this in dat ter
// vrne < 0, če je this pred dat; vrne 0, če je this enak dat; vrne > 0, če je this za dat
public int compareTo(Datum_2 dat) {
if ((this.leto == dat.leto) && (this.mesec == dat.mesec) && (this.dan == dat.dan)) return 0;
if ((this.leto > dat.leto) || ((this.leto == dat.leto) && (this.mesec > dat.mesec)) ||
((this.leto == dat.leto) && (this.mesec == dat.mesec)) && (this.dan > dat.dan)) return 1;
else return -1;
}
}
Rešitev (C#)
using System;
using SplosnaKnjiznica;
class Program {
public static void Main(string[] args) { //preizkus razreda Datum
Datum d1 = new Datum();
Datum d2 = new Datum(2004);
Datum d3 = new Datum(29, 2, 2000);
// uporaba metode ToString
Console.WriteLine("Datum d1 je: " + d1.ToString());
Console.WriteLine("Datum d2 je: " + d2.ToString());
Console.WriteLine("Datum d3 je: " + d3.ToString());
// uporaba metode Equals
if (d1.Equals(d2)) Console.WriteLine("Datuma d1 in d2 sta enaka!");
else Console.WriteLine("Datuma d1 in d2 nista enaka!");
// preizkus metode CompareTo
int primerjava2 = d1.CompareTo(d3);
if (primerjava2 < 0) Console.WriteLine("Datum d1 je pred d3. ");
else
if (primerjava2 > 0) Console.WriteLine("Datum d1 je za d3. ");
else Console.WriteLine("Datuma sta enaka. ");
// preizkus ali gre za prestopno leto
if (d2.PrestopnoLeto()) Console.WriteLine("Leto " + d2.KateroLeto() + " je prestopno.");
else Console.WriteLine("Leto " + d2.KateroLeto() + " ni prestopno.");
// preizkus ali gre za veljaven datum
if (d3.Veljaven()) Console.WriteLine("Datum " + d3.ToString() + " je veljaven.");
else Console.WriteLine("Datum " + d3.ToString() + " ni veljaven.");
Console.WriteLine();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}</csharp>
Razred sem pripravil tako:
<csharp>public class Datum {
private int dan;
private int mesec;
private int leto;
// konstruktorji
public Datum() {
this.dan = 1;
this.mesec = 1;
this.leto = 2000;
}
public Datum(int leto) :this() {
this.NastaviLeto(leto);
}
public Datum(int d, int m, int l) :this(l) {
this.NastaviDan(d);
this.NastaviMesec(m);
}
// set metode
public bool NastaviDan(int d) {
if (1 <= d && d <= 31) {
this.dan = d; // naredimo spremembo
return true; // javimo spremembo
}
return false; // javimo, da ni spremembe
}
public bool NastaviMesec(int m) {
if (1 <= m && m <= 12) {
this.mesec = m; // sprememnimo mesec
return true; // javimo spremembo
}
return false; // javimo, da ni spremembe
}
public void NastaviLeto(int l) {
this.leto = l;
}
// get metode
public int KateriDan() {
return this.dan;
}
public int KateriMesec() {
return this.mesec;
}
public int KateroLeto() {
return this.leto;
}
override public string ToString() {
return "" + this.dan + "." + this.mesec + "." + this.leto;
}
public bool PrestopnoLeto() { //vrne true, če je leto prestopno
int leto = this.leto;
if (leto % 4 != 0) return false;
if (leto % 400 == 0) return true;
if (leto % 100 == 0) return false;
return true;
}
public bool Veljaven() {
int[] meseci30 = {4, 6, 9, 11}; // meseci po 30 dni
if (!(1 <= this.mesec && this.mesec <= 12)) return false; // izločimo nepravilne mesece
if (this.dan < 1 && this.dan > 31) return false; // izločimo dneve pod 1. in nad 31.
if (this.dan == 31) {
for (int i = 0; i < meseci30.Length; i++) {
if (this.mesec == meseci30[i]) return false; // izločimo 31. dan v mesecih po 30 dni
}
}
if (this.dan > 29 && this.mesec == 2) return false; // izločimo 30. in 31. februar
if (this.dan == 29 && this.mesec == 2 && !this.PrestopnoLeto()) return false; // izločimo 29. februar, če ni prestopno leto
return true;
}
public bool Equals(Datum d) {
if (this.dan.Equals(d.dan) && this.mesec.Equals(d.mesec) && this.leto.Equals(d.leto)) return true; // true, če sta datuma enaka
return false;
}
public int CompareTo(Datum d) { // vrne celo št.
if (this.leto.CompareTo(d.leto) != 0) return this.leto.CompareTo(d.leto); // vrne +/- celo št., če je leto različno
if (this.mesec.CompareTo(d.mesec) != 0) return this.mesec.CompareTo(d.mesec); // leto je enako, mesec pa večji ali manjši
return this.dan.CompareTo(d.dan); // leto in mesec sta že enaka, zanima nas le še ali je dan enak
}