BibVerwaltung

Underfaker

Bekanntes Mitglied
Morgen,

wir sind mittlerweile in Java etwas weiter gekommen und bisher lief alles rund, jetzt fängt es allerdings an zu happern, bei folgender Aufgabe:

Es soll ein Programm geschrieben werden, das Bücher und DVDs enthält, wichtig hierbei ist ob eine Strafgebühr für zu langes Ausleihen fällig ist oder nicht.

Gegeben war eine Datei -> Datum.java und ein UML Diagramm

Datum:
Java:
import java.util.*;
import java.io.*;


public class Datum 

{

	private int Jahr;
	private int Monat;
	private int Tag;
	private Calendar cal;
	
	public Datum() 

	{
	
		cal=Calendar.getInstance();
		
		Jahr=cal.get(1);
		
		Monat=cal.get(2)+1;
		
		Tag=cal.get(5);

	}	
	
	public Datum(int jahr, int monat, int tag)
	
	{
	
		cal=Calendar.getInstance();

		this.Jahr=jahr;

		this.Monat=monat;

		this.Tag=tag;

	}
	
	public int getJahr() 
	
	{
	
		return Jahr;
	
	}
	
	public int getMonat() 

	{
	
		return Monat;
    
	}
    
    	public int getTag() 

	{
	
		return Tag;
	
	}
	
	public int calcDiffDays(Datum ausleih) 

	{
	
		int daysDiff=0;
		
		//Ihre Loesung

		
		
		return daysDiff;

	}

}

Mittlerweile weiß ich, das aktuelle Datum (Jahr, Monat, Tag) wird direkt zu Beginn erfragt und gespeichert.

Ganz unten gibt es eine Methode "calcDiffDays", diese soll die Differenz des heutigen Datums und des Ausleihdatums errechnen und zurückgeben.
Diese Methode (so denke ich) muss ich aus der jeweiligen Datei (DVD oder Buch) heraus aufrufen, ich weiß jedoch nciht, wie ich an das Ausleihdatum ran komme, also wo das her kommt und somit natürlich auch, wie ich das an die Mathode übergeben soll, kann mir da vielleicht jemand etwas zu sagen?

Das ist bisher mein Stolperstein (auch wenn noch einige warten).

Die weiteren Dateien:

Medium.java :
Java:
abstract class Medium

{

	protected String Mediumstitel;

	protected Datum Ausleihdatum;

	Datum x;

	protected void Medium(String titel) 
	
	{ 

	}

	protected String getTitel()

	{

	return Mediumstitel;

	}

	protected abstract double berechneStrafgeld();

	protected Datum setAusleihdatum (int leihdatum)

	{

	return Ausleihdatum;

	}

}

Buch.java :
Java:
class Buch extends Medium

{

	private String Buch_Autor;

	private int Buch_Seiten;

	public void Buch(String titel, String autor, int seiten) 
	
	{ 

	}

	public double berechneStrafgeld ()

	{

	double strafgeld = 0;

	return strafgeld;

	}

	public String getAutor ()

	{

	return Buch_Autor;

	}

	public int getSeiten ()

	{

	return Buch_Seiten;

	}

}

DVD.java :
Java:
class DVD extends Medium

{

	private String DVD_Regisseur;

	private int DVD_Laenge;

	public void Datum() 
	
	{ 

	}

	public void DVD (String titel, String regisseur, int laenge)

	{

	}

	public double berechneStrafgeld ()

	{

	double strafgeld = 0;

	return strafgeld;

	}

	public String getRegisseur ()

	{

	return DVD_Regisseur;

	}

	public int getLaenge ()

	{

	return DVD_Laenge;

	}

}

Ein Testprogramm "BibVerwaltung.java" soll hinterher geschrieben werden werden, wenn alles implementiert ist und mit Objekten gefüllt werden.

Das UML Diagramm habe ich mal als JPG angehangen (sorry für die Auflösung aber mehr war wohl von Seiten des Übungsleiters nicht drinn...)

Beste Grüße
 

Anhänge

  • Bib.jpg
    Bib.jpg
    29,7 KB · Aufrufe: 65
Zuletzt bearbeitet von einem Moderator:

HimBromBeere

Top Contributor
Ganz unten gibt es eine Methode "calcDiffDays", diese soll die Differenz des heutigen Datums und des Ausleihdatums errechnen und zurückgeben.
Diese Methode (so denke ich) muss ich aus der jeweiligen Datei (DVD oder Buch) heraus aufrufen, ich weiß jedoch nciht, wie ich an das Ausleihdatum ran komme, also wo das her kommt und somit natürlich auch, wie ich das an die Mathode übergeben soll, kann mir da vielleicht jemand etwas zu sagen?
Ne, da haste irgenendwas durcheiandner gehaun, aus einer Datei (welche auch immer) heraus wird hier gar nichts aufgerufen. Die Methode
Code:
calcDifference
bezieht sich doch bereits auf eine Instanz der Klasse Datum, du brauchst also nichts weiter zu machen, als die Variablen tag, monat, jahr mit denen zu "verrechnen", die du als Parameter übergeben bekommst. Das Ausleihdatum bekommst du innerhalb dieser Funktion mit
Code:
this.tag
(wobei du das this auch weglassen kannst, sieht aber übersichtlichjer aus), das Ausleihdatum des anderen Datums mit
Code:
datum.tag
 

Plopo

Bekanntes Mitglied
In der Klasse "Medium" gibt es die Methode "setAusleihdatum"
Java:
protected Datum setAusleihdatum (int leihdatum)
    {
       return Ausleihdatum;
    }

Diese ist falsch, du willst es ja nicht auslesen sondern setzen!
Java:
protected void setAusleihdatum (int ausleihdatum)
    {
       this.Ausleihdatum = new Datum(ausleihdatum); //Die Variable muss noch gesplittet werden! auf Konstruktor achten!
    }

Nun kannst du mittels "Ausleihdatum.calcDiffDatum(Datum)" eine Differenz ausrechnen. Das übergebene Datum ist das aktuelle Datum. Dieses musst du dir noch holen.
Stichwort "Calender".

PS: Variablen schreibt man KLEIN und Klassen, zu Beginn, GROß.
 

HimBromBeere

Top Contributor
Aber wo kommt denn dann das Individuelle Ausleihdatum jedes Buches und jeder DVD her, wenn nicht aus einer anderen Datei?
Von
Code:
Medium#getAusleihdatum()
, welche aber komischerweise nicht im UML dargestellt ist. Es ist also fraglich, wie man an das Datum herankommen soll, wenn auf die entsprechende Variable kein Zugriff besteht, ich denke, das ist im Diagramm ein Schreibfehler...

Der Vorschlag von Plop nützt dir dafür natürlich herzlich wenig, denn du willst das Datum ja lesen... sollte dem wider Erwarten doch nicht so sein: eine setter-Methode besitzt keinen Rückgabetyp (also void), sollte also folgendermaßen aussehen:
Java:
public void setAusleihDatum(Datum newDate) {
    this.ausleihdatum = newDate;
}

[EDIT]OK, jetzt hab ich mir das Diagramm nochmal angesehn, du musst natürlich die calcDifference sowieso aus Medium (oder einer Unterklasse) heraus ausführen, von der hast du ja schließlich das Datum. Also etwas der Form
Java:
Medium medium = new Buch();
medium.setAusleihdatum(...);
if (medium.ausleihdatum.calcDifference(heutigesDatum) > 40) // habe mal 40Tage Ausleihdauer angenommen
{
    System.out.printf("Strafgebühr fällig");
}
[/EDIT]

[EDIT]Dass das Ausleihdatum protected ist, hab ich übersehen, was mich zur Verwendung eines Getters getrieben hat... ist damit natürlich obsolet geworden[/EDIT]
 
Zuletzt bearbeitet:

Plopo

Bekanntes Mitglied
Das Datum kann er doch auslesen.
Er hat doch die Variable "Ausleihdatum" vom Typ "Datum" in der Klasse "Medium".
Und die Klasse "Datum" liefert die Methoden "getTag(), getMonat() und getJahr()".

Wodurch es möglich ist über die Variable "Ausleihdatum" das Datum zu "bauen".
Schließlich ist die Variable "Ausleihdarum" auf "protected" und nicht "private".
Oder liege ich hier falsch?
 

Underfaker

Bekanntes Mitglied
Hm wenn im Diagramm Fehler sind, dann wird sich das natürlich positiv auf meine Fortschritte auswirken. :-D

Also im UML Diagramm ist die Methode setAusleihdatum protected, deshalb habe ich die auch protected gemacht.

Was wäre denn naheliegend, wie ich die Differenz berechnen soll?
Ich benötige das Ausleihjahr, den Ausleihtag und den Ausleihmonat.

Dann kann ich schreiben (in der Methode):
daysdiff += Jahr - ausleihjahr * 365;
daysdiff += Monat - ausleihmonat * 30;
daysdiff += Tag - ausleihtag;

ps: Variablen und Klassennamen sollen so übernommen werden wie sie im Diagramm stehen, dort habe ich kein Einfluss drauf.
 

HimBromBeere

Top Contributor
Java:
daysdiff += Jahr - ausleihjahr * 365;
daysdiff += Monat - ausleihmonat * 30;
daysdiff += Tag - ausleihtag;
Schonmal brauchbar, aber noch nicht ausgebufft. Was passiert z.B. wenn das Rückgabedatum in einen neuen Monat fällt, da nützt dir die Differenz der Tage erstmal nix...

ps: Variablen und Klassennamen sollen so übernommen werden wie sie im Diagramm stehen, dort habe ich kein Einfluss drauf.
Kannst dem Lehrkörper mal ´nen netten Gruß vom Forum mitgeben, Konventionen sind dafür da, misachtet zu werden...

[EDIT]Selbe Frage wurde übrugens HIER schinmal thematisiert, kommt immer mal wieder vor...[/EDIT]
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
@ HimBromBeere

Zu deinem Edit, erster Code, muss ich nciht an die calcDifference Methode das Ausleihdatum, statt des heutigen Datums übergeben?, immerhin wird in der Klasse Datum ja bereits am Anfang das heutige Datum von selbst erzeugt, das muss ich ja nicht mehr dorthin übergeben oder?

@ Plopo

Ich überge also "Ausleihdatum" an die Methode Datum? Und der Bastelt mir über getJahr() usw. dann das Jahr Monat und Jahr?.

Wie unterscheide ich dann, ausleihJahr mit dem heutigen jahr, also die Methode in Datum, benutzt ja immer dieselben Variablen, muss ich da etwas ändern sodass der bspw. das Jahr in "ausleihjahr" speichert?

Ich frage deshalb, weil normalerweise ändert man nichts an dem Datumsgerüßt, solange es nicht ausdrücklich in der Aufgabe steht (Zitat Tutor) entsprechend sollte eigentlich nur "calcDiffDays" erweitert werden.

[edit]

Nehmen wir als Beispiel:

01.02.2012 -> Ausleihdatum
02.03.2012 -> heutiges Datum

Dann:
(2012-2012)*365+(3-2)*30+(2-1)= 31 und das passt, also weiß ich noch nicht was du minst?!

ps: Habe oben die Klammern vergessen, sorry
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Na dann eben andersherum, ist doch Wurscht :D

Innerhalb deiner Funktion calcDifference kannst du folgendes machen:
Java:
int diff_days = this.tage - datum.tage;
...
So unterscheidest du die Variablen von "heute" und "Ausleihdatum" (this -->heute), datum (aus dem Übergabeparameter) --> Ausleihdatum).
 

Plopo

Bekanntes Mitglied
Du hast doch in deinen Klassen "Buch" und "DvD" vollen Zugriff auf die Variable "Ausleihdatum" von der Klasse "Medium", da du diese ja über "extend" implementierst.

Deshalb kannst du z.B. in der Klasse "Buch" einfach die Variable "Ausleihdatum" verwenden, also wäre sie eine Instanzvariable der Klasse "Buch".

Du rufst also einfach die Methode "setAusleihdatum()" in deiner Klasse Buch/DvD auf indem du
Java:
setAusleihdatum();
verwendest.

Nun füllst du deine Variable "Ausleihdatum" mit dem Ausleihdaumt :)

Mittels
Java:
Ausleihdatum.calcDiffDays(heutigesDatum);
kannst du dann die Differenztage brechnen.

PS: die Variablen/Methoden der Klasse "Medium" sind "protected" NICHT "private", deshalb können diese von den abgeleiteten Klassen (Buch/DvD) verwendet werden!!!
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Ich verstehe nicht wieso ich dort "heutigesDatum" übergeben soll.

Machen wir es anders (auch wenn ich damit sicher blöd aussehe):

"Ausleihdatum.calcDiffDays(heutigesDatum);"

-> Wofür steht "Ausleihdatum. " also was bewirkt das Am Anfang dieser Anweisung?
-> calcDiffDays() ruft die Funktion in der Klasse Datum auf?!
-> (heutigesDatum" bedeutet, dass "heutigesDatum" (was auch immer das sein soll) übergeben wird?!

Wieso heißt das hier "heutigesDatum" hast du dir das selbst überlegt?
Und eben wieso dieses undnicht das Ausleihdtaum übergeben.

Ich hatte jetzt folgendes geschrieben:

Java:
	public int calcDiffDays(Datum ausleih) 

	{
	
		int daysDiff=0;
		
		daysDiff += (Jahr - ausleih.getJahr())*365;

		daysDiff += (Monat - ausleih.getMonat())*30;

		daysDiff += Tag - ausleih.getJahr();
		
		return daysDiff;

	}
 

HimBromBeere

Top Contributor
Wofür steht "Ausleihdatum. " also was bewirkt das Am Anfang dieser Anweisung?
Dass die Methode
Code:
calcDifference()
sich auf eben dieses Datum bezieht (this zeigt in der Klasse Datum demnach auf Ausleihdatum). In welcher Reihenfolge du die beiden Daten jetzt verwendest, ist dir überlassen, also entweder
Java:
ausleihdatum.calcDifference(heute);
oder
Java:
heute.calcDifference(ausleihdatum)

Deine Variablen
Code:
tag
,
Code:
monat
und
Code:
jahr
in der Klasse
Code:
Datum
beziehen sich dann auf die aktuelle Instanz der Klasse Datum (bei 1. also
Code:
ausleihdatum
, bei 2.
Code:
heute
).
An deiner Methode calcDifference gibt´s nichts auszusetzen, musst sie halt nur noch aufrufen.

Wieso heißt das hier "heutigesDatum" hast du dir das selbst überlegt?
Wir gehen davon aus, dass du dein Medium "heute" zurückgibst, du kannst aber natürlich jedes x-beliebe Datum verwenden.
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Also ich dachte mir folgendes:

Es gibt verschiedene Bücher und Dvds mit entsprechenden Werten, wenn man das Programm aufruft bekommt man angegeben, wo eine Strafgebühr fällig geworden ist und in welcher Höhe und wo nicht.

Aber das war offenbar ein Fehler, scheinbar sollte man es so Programmieren, dass wenn jemand die DVD "Du und die Sandbänke" zurückgibt, dass er dann sagt wie hoch die Strafgebühr ist.

Das erfordert dann am Ende eine kleine Änderung, was mir aber nicht einleuchten will:

Am Anfang der Klasse Datum wird "Jahr", "Monat", "Tag" bereits auf das heutige Datum festgelegt, diese kann ich doch dann bereits unten benutzen, wieso wollt ihr dann nochmal das heutige Datum rausfinden (oder eben ein x beliebiges wobei das ein anderer Fall wäre)

Müsste ich nicht einfach:

calcDifference(ausleihdatum);

und das reicht? Falls nein ok, dann habe ich etwas nicht verstanden.

Wie rufe ich denn die Methode für ein bestimmtes Buch / eine bestimmte DVD auf?

Also was muss da noch vorher gemacht werden, damit das Programm weiß, aha in diesem fall ist "ausleihDatum" eben das Ausleihdatum von der DVD "Du und die Sandbänke" und nicht von einer anderen DVD.


Sorry für die viele Arbeit hier aber man merkt sicher, dass diese Art der Programmierung bisher Neuland für mich ist, ich habe nur die Befürchtung, wenn ich jetzt nicht hier durchkomme dann werde ich in Zukunft garnicht mehr weiter kommen.
 

HimBromBeere

Top Contributor
Am Anfang der Klasse Datum wird "Jahr", "Monat", "Tag" bereits auf das heutige Datum festgelegt, diese kann ich doch dann bereits unten benutzen, wieso wollt ihr dann nochmal das heutige Datum rausfinden (oder eben ein x beliebiges wobei das ein anderer Fall wäre)
Aaaaah, OK... jetzt weiß ich, was du meinst. Du hast Recht, in dem Fall brauchst du das heutige Datum natürlich nicht mehr herausfinden. Aber eine Klasse Datum, die nur das heutige Datum repräsentiert, ist halt ein wenig sinnfrei weil unflexibel. Am besten du baust dir einen Konstruktor, in welchem du ein beliebiges Datum angibst (z.B. heute, oder den 30.4.1871 oder was auch immer) und rechnest von diesem dann weiter.
Java:
class Datum {
    Datum(int jahr, int monat, int tag) {
        this.jahr = jahr;
        this.monat = monat;
        this.tag = tag;
    }
}
Nun kannst du deine Variablen tag, monat und jahr trotzdem genauso weiternutzen, wie du es bisher getan hast.
Somit ist deine Klasse besser einsetzbar und nicht auf den Anwendungsfall "heute" beschränkt. Also geht dann auch folgendes in deinem Programm:
Java:
Datum heute = new Datum(2012, 5, 6);
Datum ausleihdatum = new Datum(2012, 5, 6)
System.out.println("Die Differenz beträgt " + heute.calcDifference(ausleihdatum) + " Tage");
 
Zuletzt bearbeitet:

Plopo

Bekanntes Mitglied
"Ausleihdatum.calcDiffDays(heutigesDatum);"

-> Wofür steht "Ausleihdatum. " also was bewirkt das Am Anfang dieser Anweisung?
--> "Ausleihdatum" ist der Name der Variable, in der Klasse "Medium", vom Typ "Datum".
-> calcDiffDays() ruft die Funktion in der Klasse Datum auf?!
-->Genau, da "Ausleihdatum" ja eine Instanz der Klasse "Datum" ist kannst du auch die Methoden der Klasse "Datum", über die Variable, aufrufen.
-> (heutigesDatum" bedeutet, dass "heutigesDatum" (was auch immer das sein soll) übergeben wird?!
-->Naja "calcDiffDays()" hat ja nur Zugriff auf die eigenen Daten (Tag,Monat,Jahr), da diese in der Klasse als Instanzvariable gespeichert werde. Deshalb musst du ihr ein 2. Datum übergeben, mit welchem Sie ihre Datum abgleicht.

Wieso heißt das hier "heutigesDatum" hast du dir das selbst überlegt?
Und eben wieso dieses undnicht das Ausleihdtaum übergeben.
Ich habe einfach so "heutigesDatum" gesagt, du kannst jedes X-Beliebige Datum nehmen.

Text für die Minmallänge.

PS: Da war ich wohl zu langsam ;)
 

Underfaker

Bekanntes Mitglied
Du bist natürlich erfahrener, deshalb weiß ich jetzt nicht, was es mir bringt von einem festen Datum an zu rechnen, anstatt einfach immer die Differenz des Ausleihdatums und des heutigen Datums zu ermitteln, falls das reicht ist es denke ich besser wenn ich es dabei belasse, sonst tun sich bei mir sicher noch viel mehr Fragen auf :-D

Wie sieht es mit der zweiten Frage aus?

Und mir ist eben noch eingefallen, es stand die Frage im Raum wie die Mathode setAusleihdatum auszusehen hat.

soll die nun void werden da eine set Methode im Allgemeinen nichts zurück gibt sondern eben "nur" setzt?
 

Underfaker

Bekanntes Mitglied
@ HimBromBeere

Wieos sollte das mit meiner Variante nicht möglich sein?
Oder meinst du es ist möglich allgemeine Differenzen zu berechnen?

Das was du geschrieben hast, sthet ja bereits in der Klasse nur weiter unten, der Unterschied bringt was, also das es eben direkt am Anfang steht?

Das problem ist, wir dürfen eben die Klasse Datum außer in der letzten methode nicht ändern, das klingt doof aber so lauten die Spielregeln ich kann da leider nichts machen.
 

HimBromBeere

Top Contributor
Das problem ist, wir dürfen eben die Klasse Datum außer in der letzten methode nicht ändern, das klingt doof aber so lauten die Spielregeln ich kann da leider nichts machen.
Ist schon in Ordnund so, du hast in der Klasse ja sogar einen Konstruktor für die Angabe eines beliebigen Datums, wie ich grade gesehen hab.
Also kannst du das heutige Datum entweder so verwenden:
Java:
Datum heute = new Datum();
oder explizit (was natürlich nich so super flexibel wäre)
Java:
Datum heute = new Datum(2012, 5, 6);
Aber stell dir vor, du möchtest irgendwann mal nicht immer nur das heutige Datum zur Berechnung heranziehen, sondern auch mal wissen, wie viele Tage zwischen dem Bau der Mauer am 13.August 1961 bis zum Fall derselben am 9.November 1989 vergangen sind, dann brauchst du da schon die etwas flexiblere Variante...
Welches auch immer du verwendest, die Differenz machst du über:
Java:
heute.calcDifference(anderesDatum);
, anders geht´s nicht (abgesehen von der Möglichkeit, beide Daten zu vertauschen).
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Oo

Ich dachte es geht doch anders?!

In dem ich es so mache wie ich es machen wollte.

Einfach Tag, Monat, Jahr aus der Klasse verwende und nur ausleihdatum übergebe....

Wenn das dann doch nciht so geht dann weiß ich nciht wo ich was hinschreiben muss damit es so geht, also wo kommt "Datum heute = new Datum();"

ich habe jetzt die Klasse Methode und DVD angpasst, jetzt besteht eben (abgesehen von oben) noch das Problem, wie sag ich ihm welches ausleihdatum er benötigt?

Medium:
Java:
abstract class Medium

{

	protected String Mediumstitel;

	protected Datum Ausleihdatum;

	protected void Medium(String titel) 
	
	{ 

		this.Mediumstitel = titel;

	}

	protected String getTitel()

	{

		return Mediumstitel;

	}

	protected abstract double berechneStrafgeld();

	protected void setAusleihdatum (Datum leihdatum)

	{

		Ausleihdatum = leihdatum;

	}

}

DVD:
Java:
class DVD extends Medium

{

	private String DVD_Regisseur;

	private int DVD_Laenge;

	public void DVD (String titel, String regisseur, int laenge)

	{

		super(titel);

		this.DVD_Regisseur = regisseur;

		this.DVD_Laenge = laenge; 

	}

	public double berechneStrafgeld ()

	{

		double strafgeld = 0;

		if (calcDifference(ausleihdatum) > 7)

		strafgeld = calcDifference(ausleihdatum)*2;

		return strafgeld;

	}

	public String getRegisseur ()

	{

		return DVD_Regisseur;

	}

	public int getLaenge ()

	{

		return DVD_Laenge;

	}

}

Wie setze ich um, dass er eine bestimmte Dvd nimmt, also es gibt bei 5 DVDs 5 Ausleihdaten, wie sage ich ihm, nimm die von DVD 2?

Java:
        if (calcDifference(ausleihdatum) > 7)
 
        strafgeld = calcDifference(ausleihdatum)*2;

Ich denke die Klasse Buch funktioniert analog, deshalb brauche ich die hier nicht weiter zu erfragen.
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Wie setze ich um, dass er eine bestimmte Dvd nimmt, also es gibt bei 5 DVDs 5 Ausleihdaten, wie sage ich ihm, nimm die von DVD 2?
Brauchst du gar nicht mehr, da du in deiner Methode berechneStrafGeld doch bereits die zu den jweiligen Instanzen gehörenden Variablen verwendest (zu jeder Instanz der Klasse Medium gehört genau 1 Ausliehdatum). Du brauchst nur in deiner main-Funktion versch. Medien mit versch. Ausleihdaten zu erstellen, diese verwenden dann automatisch ihre jeweiligen Daten.

Java:
public static void main(String[] args) {
    Medium dvd = new DVD();
    Medium buch = new Buch();
    dvd.setAusleihdatum(2012, 5, 1); 
    buch.setAusleihdatum(2012, 5, 1);
    dvd.berechneStrafGeld();
    buch.berechneStrafGeld();
}

[EDIT]Sofern es die Aufgabenstellung erlaubt, würde ich das Ausliehdatum gleich in den Konstruktionsprozess eines Mediums integrieren, da in der Anwendung ein medium ihne dieses Datum keinen Sinn ergibt.[/EDIT]
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Haha das macht natürlich Sinn, ist doof wenn man erst am Schluss die main Methode machen sol.

Wie sieht es mit der Differenzgeschichte aus?

Ich müsste jetzt eigentlich alles fertig haben.

Er schmeißt mir eben bei "ausleihdatum" einen fehler, weil er das nicht kennt, ich hoffe das geht damit dann weg aber er schmeißt mir zusätzlich auch noch einen Fehler bei "super(titel)"

Ich dachte, da ich den Konstruktor aus Medium aufrufe müsste ich das so verwenden, offenbar ist das aber falsch, wie kann ich den Fehler umgehen?

Er lautet btw: "call to super must be first staement in constructor"
 

Anhänge

  • Buch.java
    576 Bytes · Aufrufe: 50
  • Datum.java
    893 Bytes · Aufrufe: 52
  • DVD.java
    591 Bytes · Aufrufe: 43
  • Medium.java
    404 Bytes · Aufrufe: 43

HimBromBeere

Top Contributor
Ein Konstruktor hat keinen Rückgabetypen (nicht einmal void).
Es muss also heißen:
Java:
public class Buch {
    public Buch(String titel, String autor, int seiten) { 
		super(titel);
		this.Buch_Autor = autor;
		this.Buch_Seiten = seiten;
	}
}
(Äquivalent für DVD und Medium)
Dann geht auch dein Fehler weg.
Warum der Compiler ausleihdatum nicht kennt? Ganz einfach, weil du sie ja Ausleihdatum genannt hast (mir diese Schreibweise aber zuwider war, weswegen ich konsequent klein geschreiben hab:D)
 
Zuletzt bearbeitet:

Plopo

Bekanntes Mitglied
Java:
protected Datum Ausleihdatum;
//wird zu
protected Datum ausleihdatum;

Die Exception bei "suber(title)" gibt er aus, da du keine Konstruktoren definiert hast.

Java:
protected void Medium(String titel)
//wird zu
protected Medium(String titel)

Das gleiche musst du bei den Klassen "Buch" und "DvD" machen.

Java:
public void DVD (String titel, String regisseur, int laenge)
//wird zu
public DVD (String titel, String regisseur, int laenge)

Java:
public void Buch(String titel, String autor, int seiten)
//wird zu
public Buch(String titel, String autor, int seiten)

Du solltest dir die Grundlagen von Java nochmal genauer anschauen, sonst wird das in Arbeiten nichts ;)

Die Methode "calcDifference(ausleihdatum)" musst du auf die Variable "ausleihdatum" beziehen, da diese NUR IN DER KLASSE "DATUM" EXISTIERT.
Java:
ausleihdatum.calcDiffDays(ausleihdatum); //Es heist "calcDiffDays()" nicht "calcDifference()"
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Ok Fehler ist weg, dafür sind neue Fehler da.

Insgesamt 8, wobei 4 weggehen werden, also die anderen.

BibVerwaltung.java:12: cannot find symbol
symbol : constructor DVD()
location: class DVD
Medium dvd = new DVD();

für Buch analog

Und:

BibVerwaltung.java:16: setAusleihdatum(Datum) in Me
t,int,int)
dvd.setAusleihdatum(2012, 5, 1);

Also nimmt er offenkundig das Datum nicht als Typ Datum sondern als drei Integerwerte, wie kann man das umgehen?
 

HimBromBeere

Top Contributor
Java:
Medium dvd = new DVD();
In deiner Klasse DVD gibt´s keinen Konstrukor mit leerer Parameterliste. Du hast nur den:
Code:
public DVD (String, String, int)

Der Fehler mit dem
Code:
Ausleihdatum
resultiert daraus, dass diese Methode ja ein
Code:
Datum
erwartet. Das, was ich dir geschrieben hab, war nur der Verständlichkeit wegen so aufgedröselt, zum Ausführen war das nicht gedacht. Bau dir einfach eine neue Instanz von
Code:
Datum
und übergieb die an die Methode:
Java:
Datum newDate = new Date(...);
dvd.setAusleidatum(newDate);

Den Rest solltest du jetzt aber wirklich mal selbst erledigen, der Compiler redet schließlich mit dir...
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Das Problem war nicht, dass ich den Fehler nicht erkannt ahbe, viel mehr wie er zu beheben ist. :)

Tatsächlich habe ich alle Fehler rausbekommen (teilweise durch raten).

Jetzt habe ich eine allgemeinere Frage.

Das Programm hat zwei Objekte bei denen (vielleicht) alles läuft aber es wird nichts ein oder ausgegeben, das sieht doch schon dämlich aus, weil so bringt das Programm ja nichts aber in der Aufgabenstellung steht einfach ncihts davon, findet ihr das nciht auch merkwürdig?
 

Underfaker

Bekanntes Mitglied
Ich frage mich ob die Aufgabenstellung nicht anders interpretiert werden kann/soll.

Aufgabe:

a) Laden Sie sich die Klasse Datum (Datum.java) herunter. Machen Sie sich mit den Eigenschaften der Klasse vertraut, in dem Sie sich den Quelltext anschauen. Schauen Sie sich die Eigenschaften der Klasse Calendar in der Java-API an.

b) Setzen Sie nun das oben stehende UML-Klassendiagramm in Java um, unter der Verwendung der Klasse Datum. Implementieren Sie auch die Methoden der Klassen Medium, Buch und DVD. Für die Berechnung des Strafgeldes bei Überziehung der Leihfristen gelten folgende Bestimmungen:
- Bücher können 4 Wochen ausgeliehen werden, bei Überziehung 1 EUR Strafgeld pro angefangenen Überziehungstag.
- DVDs können 1 Woche ausgeliehen werden, bei Überziehung 2 EUR Strafgeld pro angefangenen Überziehungstag

Für die Berechnung der Differenztage zwischen dem Ausleihdatum und Heute, implementieren Sie bitte die Methode calcDiffDays der Klasse Datum. Nehmen Sie dazu an, dass jeder Monat 30 Tage hat und das Jahr 365 Tage.

c) Schreiben Sie ein kleines Testprogramm (BibVerwaltung.java), das Objekte von den beiden Medien Buch und DVD erzeugt.

Das das Programm das alles macht ok aber was bringt das mit einer so formulierten Aufgabenstellung? :-D


Im Übrigen habe ich ein Problem:

Java:
	public int calcDiffDays(Datum ausleih) 

	{

		int a = ausleih.getJahr();
       		int b = ausleih.getMonat();
        	int c = ausleih.getTag();

		System.out.println(a+" monat "+b+" Tag " + c);

		Jahr = cal.get(Calendar.YEAR);
       	 	Monat = cal.get(Calendar.MONTH)+1;
        	Tag = cal.get(Calendar.DAY_OF_MONTH);
	
		int daysDiff=0;

		
		daysDiff += (Jahr - a)*365;

		daysDiff += (Monat - b)*30;

		daysDiff += Tag - c;
		
		System.out.println(daysDiff);

		return daysDiff;

	}

Der printbefehl diente mir dazu zu überprüfen ob er das richtige Datum annimt.

Das Problem ist, er gibt das Datum des ersten Objektes aus.
Dann gibt er das heutige Datum aus, wieso? Ich rufe die Funktion ja garnicht mit dem heutigen datum auf oder?

Dann gibt er das Datum des zweiten Objektes aus und dann wieder das von heute.

Woran könnte das liegen?

[EDIT] Ich muss korrigieren.
Er benötigt ja vier durchläufe auf jeden Fall nach meiner Implementierung.
Zweimal bei der DVD sofern die Differenz größer als 7 ist (das ist der Fall) und auch zweimal bei dem Objekt der Klasse Buch, insgesamt durchläuft er diese Funktion also viermal und müsste viermel ein Datum ausgeben, das tut er auch, allerdings müsste er zweimal das Datum der DVD und dann zweimal das Datum des Buches ausgegeben werden, dem ist allerdings nicht so, an welcher Stelle weißt das Programm denn den Variablen a,b und c die Daten des heutigen Datums zu? Oo[/EDIT]

Und dann diese Methode:

Java:
	public double berechneStrafgeld ()

	{

		double strafgeld = 0;

		if (Ausleihdatum.calcDiffDays(Ausleihdatum) > 7)

		strafgeld = (Ausleihdatum.calcDiffDays(Ausleihdatum)-7)*2;

		return strafgeld;

	}

Kann es sein, dass das Programm in der Zeile: strafgeld = (Ausleihdatum.calcDiffDays(Ausleihdatum)-7)*2;
das "(Ausleihdatum.calcDiffDays(Ausleihdatum)" nicht als Zahl verrechnen kann?

Als Ergebnis wird mir -14 geliefert, also wahrscheinlich (0-7)*2 = -14

Wie ich aber ausgelesen habe ist die Differenz nicht 0 sondern 64 so wie es sein soll.
Hat hier jemand eine Idee?
 
Zuletzt bearbeitet:

Neue Themen


Oben