# Terminkalender



## keineplan (6. Jul 2011)

Hey Leute,
ich soll da was programmieren hab aber keine Ahnung wie das gehen soll. Kann mir jemand helfen?

Termine haben haben einen Zeitpunkt, eine Beschreibung und nden an einem Ort statt.
Man unterscheidet Termine, die
 einmalig,
 wiederholt alle n Tage (endlos) sowie
 wiederholt alle n Tage innerhalb einer festen Zeitspanne
stattnden. Ziel dieser Aufgabe ist es, diese Hierarchie und die entsprechenden Gemeinsamkeiten
durch Vererbung moglichst gut umzusetzen.
Zur Vereinfachung gehen wir davon aus, dass alle Zeitangaben (also auch Beginn und Ende
von Zeitspannen) in Tagen nach Beginn Ihres Studiums (1. April) erfolgen. Der int-Wert 6
reprasentiert also den 7. April.
Programmieren Sie eine Klasse Termin sowie die davon abgeleitete Klassenhierarchie zur
Darstellung einmaliger, sich endlos wiederholender sowie sich nur innerhalb einer vorgegebenen
Zeitspanne wiederholender Termine.

Ausserdem soll die Klasse Termin eine Methode int diff(int tag) zur Verfugung stellen,
die bestimmt, in wievielen Tagen relativ zum Zeitpunkt tag der entsprechende Termin zum
nachsten Mal stattndet. Im Falle vergangener, einmaliger Termine wird entsprechend eine
negative Zahl zuruckgegeben. Fur sich wiederholende Termine betrachten Sie die folgenden
Beispiele:
 Ein sich endlos wiederholender Termin, der seit dem 25. Tag jede Woche wiederholt
stattndet, liefert fur t.diff(27) die Zahl 5 zuruck.
 Ein Termin, der sich in der Zeit vom 2. bis zum 32. Tag alle 3 Tage wiederholt
(2; 5; : : : ; 26; 29; 32), liefert fur t.diff(27) die Zahl 2 zuruck.
 Fur denselben Termin, der also vom 2. bis zum 32. Tag alle 3 Tage stattndet, liefert
t.diff(33) entsprechend die Zahl -1 zuruck.
Implementieren Sie anschliessend die Klasse Terminkalender, mit deren Hilfe
 Termine eingetragen (void fuegeTerminHinzu(Termin t)),
 Termine eines Tages abgefragt (Termin[] termineAm(int tag)) und
 der relativ zu einem Tag tag zukunftig als nachstes stattndende Termin bestimmt
(Termin naechsterTermin(int tag))
werden konnen. Hinweis: Zur Verwaltung der Liste der Termine konnen Sie die bekannten
Listenimplementierungen einfach anpassen.
Schreiben Sie eine Klasse TerminkalenderTest, in deren main-Methode Sie Ihre Klassen
und die erwarteten Ruckgabewerte testen.


----------



## Marcinek (6. Jul 2011)

Du solltest anfang eine Klasse Termin zu bauen und davon abgeleitet die drei Arten.-


----------



## maki (6. Jul 2011)

*verschoben*


----------



## keineplan (6. Jul 2011)

Ja mein Problem ist, dass ich nicht weiß, was ich in die Terminklasse schreiben soll


----------



## maki (6. Jul 2011)

Was hast du denn bereits?


----------



## keineplan (6. Jul 2011)

Eigentlich nichts.... nur die drei Klasse die von Termin erben, aber kein Code


----------



## Marcinek (6. Jul 2011)

Du hast mehrere Optionen.

1. Du schreibst mir eine PM und teilst mir mit, wieviel du bereit bist für die Aufgabe zu bezahlen, damit ich die die komplette Lösung schicke.

2. Du versuchst es selber und eignest dir dabei viel wissen an. Und Fragst hier nur die unlösbaren Fragen.

3. Du fragst dich um jedes Detail hier im Forum- Dies könnte aber Monate dauern, bis du dass dann fertig hast ;D


----------



## keineplan (6. Jul 2011)

mir wäre es schon hilfreich wenn man mir sagt wie man die int diff methode macht....


----------



## Marcinek (6. Jul 2011)

Das höngt davon ab, wie du Termin modelliert hast.

Im Prinzip ist das Beispiel in der Aufgabenstellung ja ok



> Ein sich endlos wiederholender Termin, der seit dem 25. Tag jede Woche wiederholt
> statt ndet, liefert fur t.diff(27) die Zahl 5 zuruck.



Man startet am 25. Tag jede Woche (= 7 Tage) einen Termin. Ergo findet der nächste 


Dann soll man hier wohl 27-25 ausgeben also in 5 Tagen haste das nächste Ereignis.

Aufpasssen muss man dann, wenn man ab dem 2. Tag jede Woche hat, dann diff(27) = 7 und nicht 25.

Gruß


----------



## keineplan (6. Jul 2011)

Ok das versteh ich, aber ich weiß dann immer noch nicht was ich dann schreiben muss.
Und muss die Klasse Termin abstract und damit int diff dort nur ohne Code ist?


----------



## Marcinek (6. Jul 2011)

Nur in abstrakten Klassen und Interfaces kannst du Methoden ohne Code ablegen.


----------



## keineplan (6. Jul 2011)

ok dann ist die Klasse auch nicht abstract.....
trotzdem weiß ich nicht wie der code für diff aussehen soll


----------



## mjdv (6. Jul 2011)

Streng dich dochmal ein wenig an, programieren lernen ist eben kein Ponyhof, ich hab die aufgabe auch geschafft


----------



## keineplan (6. Jul 2011)

Also dein Satz hättest dir wirklich sparen können. Dieses Forum ist glaub da um Leuten weiterzuhelfen, die ein Problem haben und sich lustig zu machen


----------



## Marcinek (6. Jul 2011)

Warum sollte jemand im Forum für dich das aufholen, was du die letzten Monate verschlafen hast?

Du hast meine PM erhalten. Und du kennst deine Alternativen  - Ohne uns hier etwas mehr zu Zeigen WO dein Problem ist, können wir nicht helfen.

Lies dir doch einfach die ersten paar Kapitel des Buches "Java ist auch eine Insel" durch.

Wenn du dann konkrete Fragen hast, kannst du sie stellen.

Doch beachte, dass Fragen, die man mit 2 Sekunden googeln beantworten kann, nicht unbedingt in das Forum gehören.


----------



## JohannisderKaeufer (7. Jul 2011)

>  einmalig,
>  wiederholt alle n Tage (endlos) sowie
>  wiederholt alle n Tage innerhalb einer festen Zeitspanne



einmalig kann man als spezialfall sehen von wiederholt alle n Tage innerhalb einer festen Zeitspanne.
Start und End-Datum sind gleich und man nimmt z.B. eine tägliche Wiederholung.


----------



## ARadauer (7. Jul 2011)

> Also dein Satz hättest dir wirklich sparen können. Dieses Forum ist glaub da um Leuten weiterzuhelfen, die ein Problem haben und sich lustig zu machen


Generell helfen wir gerne bei Probelmen und konkreten Fragen, machen aber keine ganzen Hausaufgaben.

Deine Frage sieht so aus: Ich kann das nicht: Aufgabenstellung

Was sollen wir jetzt machen? Dir von Grund auf erklären, was Schritt für Schritt zu tun ist? Ich denke du wirst selber einsehen, dass das keiner machen wird.
Also 2 Möglichkeiten: 
1. du bietest Geld
2. Poste mal was du hast und wir helfen gerne weiter oder stelle konkrete Fragen



> Man unterscheidet Termine, die
>  einmalig,
>  wiederholt alle n Tage (endlos) sowie
>  wiederholt alle n Tage innerhalb einer festen Zeitspanne
> ...


Tipp:
Also Termin hat warscheinlich den Zeitpunkt und Beschreibung usw...
WiederholenderTermin erbt von Termin und hat zusätzlich die n Tage
EndlicherTermin erbt von WiederholenderTermin und hat ein end Datum


----------



## Andi_CH (7. Jul 2011)

Was verwendest du für eine Zeichencodierung? Ich sehe ganz viel Dinge wie 
(Quadrate mit 000F bzw 007F drin) und beim kopieren des Textes gingen wohl ganze Worteile verloren...

 --

Aber zurück zum Thema - ich sehe da nur eine Klasse mit Attributen
(Vererbung ist in diesem Fall höchstens übungshalber gut, aber in der Praxis schlecht - da liegt ein Terminobjekt rum und ich will den Termin von "einmalig" auf "Widerholend" ändern - hm - doof - es handelt sich um eine "Einmalig"-Objekt, ich müsste als  erst ein neues Objekt kreieren, Daten umkopieren ... kurz gesagt: nicht wirklich elegant)


Einiges wurde schon von anderen so ähnlich gesagt, aber ich fasse mal zusammen:


Klasse Termin

- Ein Attribut "Art" (ein Enum) 
- - einmalig (vielleicht unnötig, siehe unten)
- - endlos wiederholt
- - wiederholt mit Ende

- Ein Anfangsdatum (Das Datum an dem der Termin das erste oder einzige mal stattfindet)
- Ein Enddatum (Das Datum nach dem der Termin nicht mehr gültig ist)
- Ein Wiederholungsintervall (int) - nach wie vielen Tagen wird das Event wiederholt (Es kann sein, dass sich "einmalig" oben erledigt - Widerholungsintervall == 0 sagt dasselbe aus. Manchmal helfen redundante Informationen allerdings einen eleganteren Programmierstil zu pflegen)

Offentsichtlich geht es aber darum zu beweisen, dass man Vererbung einsetzen kann - also los, dann mach es halt so, aber nur für diese Übung


----------



## ARadauer (7. Jul 2011)

> Vererbung ist in diesem Fall höchstens übungshalber gut,


Das Vererbung in der Schule total überbewertet ist sind wir uns doch sowieso einig ;-)


----------



## Andi_CH (7. Jul 2011)

Für 100 Euro setz ich mich hin und schreib das Ding 
Da müsste noch die Abnutzung der Nerven verrechnet werden.


----------



## parabool (7. Jul 2011)

diff = intervall - ((tag-start) mod intervall)

in java dann:


```
int tag = 27,start = 2,intervall = 7;	
System.out.println("diff = "+(intervall-((tag-start)%intervall)));
```


----------



## will (7. Jul 2011)

hallo miteinander,

mich wuerde interessieren wie ich step by step den code aufbauen sollte. Das Buch "Java ist auch eine Insel" finde ich fuer Erklaerungen ganz gut, allerdings hilft es nicht eine Programm wie in der Aufgabenstellung verlangt aufzubauen.

Was mich also interessiert und wo ich nicht weiterkomme - trotz Buch ist - wie baue ich sowas auf 

Vielleicht kann ja da jemand Stichpunktartig helfen - wuerde mich sehr freuen, da ich mich mit dem coden schwertue.

Also vorab schonmal Danke :toll:

Und fuer alle die sagen wollen - wo liegt genau dein Problem ?

Als aller erstes: Wie gestalte ich eine Sinnvolle Klasse Termin ?
 packe ich fuer jeden umstand eine variable rein ?


----------



## Marcinek (7. Jul 2011)

will hat gesagt.:


> packe ich fuer jeden umstand eine variable rein ?



Nicht für jeden Umstand sondern jeden ZUSTAND.

Welche Information brauchst du den um die Methode diff zu implementieren?

Ich mein das steht schon oben.

Hast du dazu fragen?


----------



## will (7. Jul 2011)

hi,

geht ja super schnell hier 

das mit den tagen berechnen hab ich schon gesehen - dachte erst an modulo 7 aber intervalle koennen ja auch mehr als 7 tagen sein...soweit schon klar.

Also komme schon am Anfang ins stolpern....

Als aller erstes brauche ich eine Klasse Termin:

die muss folgendes koennen :

Konstruktor mit Terminen:


einmalig,
wiederholt alle n Tage (endlos) sowie
wiederholt alle n Tage innerhalb einer festen Zeitspanne


davon abgeleitete Klassenhierarchie zur
Darstellung einmaliger, sich endlos wiederholender sowie sich nur innerhalb einer vorgegebenen
Zeitspanne wiederholender Termine

und die erwaehnte diff-Methode

daraus ergibt sich fuer mich folgende Klasse:


```
package terminkalender;



public class Termin{

	public String text; // details for appointment
	public int tag ; // day of month
	public int repeat; // repeating every .... days
	public boolean endless; // if it repeat endlessly
	public int repTill; // repeat till specific day
	public String place ; // where is the appointment taking place
	public int actdate; // actual day for diff method
	
	public Termin(String text,int tag,int repeat, int repTill, boolean endless, String place){
	
	this.text = text;
	this.tag = tag;
	this.place = place;
	this.repeat = repeat;
	this.endless = endless;
	this.repTill = repTill;
	}

	public int diff(actdate){
		
		if( repeat != 0 && tag < actdate){
			if( tag > actdate){
				return repeat-(tag-actdate)%repeat;
			}
			else{
				System.out.println("Fehler");
			}
		else{
			System.out.println("Kein Termin vorhanden");

			}
		}
		
		
	}
	
}
```


Habe bei Eclipse einige rote Kreuzchen noch drin aber warum verstehe ich noch nicht so ganz....:rtfm:

Ist das ein richtiger Ansatz ?
Versteh das mit der Klassenhierachie nicht s ganz...kann ich Termine mit weniger Variablen gestallten und generisch aufbauen und speziellere Typen mit zusaetzlichen Variablen ausstatten ?


----------



## JohannisderKaeufer (7. Jul 2011)

Die roten Kreuzchen in Eclipse kommen daher, da in deiner Methode diff ein Ergebnis zurückliefern mußt.

Durch das if-else, kannst du zu einem else Teil kommen bei dem es kein return-Statement gibt, sondern nur eine Ausgabe auf der Konsole. Das reicht aber nicht.



> Termine haben haben einen Zeitpunkt, eine Beschreibung und finden an einem Ort statt.



D.h. das nur das in die Klasse Termin hineinkommt. Ausserdem bekommt die klasse die methode int diff(int tag)


```
package terminkalender;
 
public abstract class Termin{
 
    public String text; // details for appointment
    public String place ; // where is the appointment taking place
    
    public Termin(String text, String place){
        this.text = text;
        this.place = place;
    }

    public abstract String getZeitpunkt();
 
    public abstract int diff(int tag);
        
    
}
```

Mehr braucht die Klasse Termin nicht. Um nun einen einmaligen Termin zu erhalten kann man wie gefordert Vererbung nutzen. Hierbei ergänzt man die abstracten Methoden.


```
public class EinmaligerTermin extends Termin{
private int date;
public EinmaligerTermin(String text, String place, int date){
  super(text,place);
  this.date = date;
}
public String getZeitpunkt(){
  return "" + date;
}

public int diff(int tag){
  return date- tag;
}

}
```

Entsprechend kann man nun von Termin für die Klassen für sich WiederholendeTermine ableiten. Du brauchst also nicht alles in einer Klasse Termin abhandeln.


----------



## gogocho (8. Jul 2011)

Ich habe aenliche Aufgabe eigentlich. z.B. fuer einen Termin, der innerhalb einer fester Zeitspanne stattfindet, koennte die klasse etwas so aussehen?

```
public class TerminZeitspanne extends Termin {
    private int day;
    private int start;
    private int end;
    private int intervall;
    public TerminZeitspanne(String Beschreibung, String Ort, int day, int start, int end, int intervall){
        super(Beschreibung, Ort);
        this.day=day;
        this.start=start;
        this.end=end;
        this.intervall=intervall;
    }
    public String getZeitpunkt(){
        return ""+day;
    }
    public int diff (int tag){
        if (tag<start||tag>end)
            return -1;
        
        else 
            return (intervall-((tag-day)%intervall));
    }
}
```


----------

