Java Buchungsprogramm


#1
Hi liebe Programmierer Community,
ich habe folgendes Problem.
Von der Hochschule wurde mir eine Aufgabe gestellt für die ich entweder einfach zu doof oder zu kompliziert denke hier einmal die Aufgabenstellung:

Aufgabe 6.1
Optimieren Sie die in Aufgabe 5 angelegte Klasse Ferienwohnung, indem Sie
- Einen Konstruktor anlegen.
- Die Attribute private setzen und den Zugriff über getter/setter-Methoden regeln.
Aufgabe 6.2
Die Ferienwohnungen müssen gebucht werden können. Dazu sollen die Buchungen in einer
geordneten Liste an die jeweilige Wohnung angeheftet werden.
- Legen Sie hierzu eine neue Klasse „Buchung“ an, in der Anfangsdatum und
Endedatum gespeichert werden, sowie eine Buchungsnummer incl. der notwendigen
Methoden.
- Jede Ferienwohnung enthält ein Array oder einen Vector (Ihre Wahl) und kann dort
beliebig viele Buchungen speichern
Überschneidungen sind dabei auszuschließen und bedingen eine Fehlermeldung.
Erweitern Sie Buchen entsprechend und fügen Sie eine Funktion Stornieren und
showBuchungen hinzu (optional auch weitere zum Bearbeiten der Buchung).

Desweiteren Soll das ganze so Aufgebaut sein das das Hauptrogramm eine verbindung zu Ferienwohnung hat(nicht bidirektional), die Ferienwohnung über ein Array oder Vektor auf die Buchung zugreift und die Buchung auf die Datumsklasse.

Mein Problem ist das ich das ganze nicht richtig verstehe und wenn ich versuche eine Datumsüberprüfung zu machen dann geht wieder garnichts. Und die FUnktion für den Mengenrabatt scheint auch nicht mehr zu stimmen. Ich bin inzwischen total verwirrt und frage mich ob ich das ganze überhaupt richtig angegangen bin.

Im moment ist es mir wichtig das das letzte erzeugte Elemnt nich mehr auftaucht, da sich dort die Buchung überschneidet und an dieser Stelle verstehe ich nicht was falsch ist.....

Hier habe ich schonmal die geschriebenen Codes
Code:
public class Hauptprogramm {
	private static Ferienwohnung w1;
	private static String name;
	private static double basispreis;
	private static int bettenzahl;
	private static String adresse;
	private static int sterne;
	private static int mengengrundrabatt;
	
	
	public static void main (String[]args){
		w1 = new Ferienwohnung();
		w1.buchen(new Datum (1,1,2012),10);
		//wähleFerienwohnung(1);
		w1.buchen(new Datum (2,2,2012),3);
		//wähleFerienwohnung(3);
		w1.buchen(new Datum (6,1,2012),6);
		//wähleFerienwohnung(1);
	}
	public static void wähleFerienwohnung(int zahl){
		switch(zahl){
		case 1:
			name = "Abstellkammer";
			basispreis = 23.00;
			bettenzahl = 1;
			adresse= "Hinterhof 17";
			sterne =2;
			mengengrundrabatt = 40;
			break;
		case 2:
			name = "Abendruh";
			basispreis = 56.70;
			bettenzahl = 4;
			adresse= "Sonnenweg 3";
			sterne =4;
			mengengrundrabatt = 12;
			break;
		case 3:
			name = "Schwarzwaldpalast";
			basispreis = 79.90;
			bettenzahl = 3;
			adresse= "Baumallee 1";
			sterne =5;
			mengengrundrabatt = 10;
			break;
			
		default:
			System.out.println("Bitte eine Zahl zwischen 1 und 3 eingeben!");
			System.exit(0);
		}
	}
	

}
Code:
import java.util.Vector;


public class Ferienwohnung{
	private Buchung buchen;
	private Vector b=new Vector();
	private double bruttopreis;
	private double endpreis1;
	private double nettopreis;
	private double endpreis2;
	private double steuern=7;
	private double mengenrabatt;
	private int anzahl;
	private double basispreis=23.00;
	private double mengengrundrabatt=40;
	private String name="Abstellkammer";
	private int bettenzahl=1;
	private String adresse= "Hinterhof 17";
	private int sterne=2;
	
	public void buchen(Datum datum, int uebernacht) {
		buchen = new Buchung(datum,uebernacht);
		anzahl = uebernacht;
		
		int grösse=b.size();
		System.out.println(grösse);
		
		if(grösse!=0){
			for(int i=0;i<grösse;i++){
					Buchung buchen2=(Buchung) b.get(i);
					boolean gebucht = buchen.prüfeBuchung(buchen2);
					if (gebucht==true){
						b.addElement(buchen);
						brutto(basispreis);
						netto(basispreis);
						mengenrabatt(anzahl,mengengrundrabatt, basispreis);
						show(name,bettenzahl,adresse,sterne);
					}
					else{
						System.out.println("Buchungen überschneiden sich!");
					}
			}
		}
		else if (grösse == 0){
		b.addElement(buchen);
		brutto(basispreis);
		netto(basispreis);
		mengenrabatt(anzahl,mengengrundrabatt, basispreis);
		show(name,bettenzahl,adresse,sterne);
		}
	}
	
	public double brutto(double basispreis){
		bruttopreis = anzahl*basispreis;
		endpreis1 = this.runden(bruttopreis);
		return(endpreis1);
	}
	
	
	public double netto (double basispreis){
		nettopreis = ((endpreis1/100)*steuern)+endpreis1;
		endpreis2 = this.runden(nettopreis);
		return(endpreis2);
	}	
	
	public double runden(double preis){
		double endpreis=Math.rint(preis*100)/100;
		return(endpreis);
	}
	public int getUebernachtung(){
		int n = anzahl;
		return(n);
	}
	
	public double mengenrabatt(int n, double rabatt, double basispreis){
		switch(n){
		
		case 0:
			System.out.println("Sie müssen mindestens 1 Übernachtung angeben");
			break;
		case 1:
			break;
		default:
				n=n-1;
				mengenrabatt =((1.00-((rabatt/n)/100))*basispreis)+(mengenrabatt(n,rabatt,basispreis));
				brutto(basispreis);
			break;
		}
		mengenrabatt =runden(mengenrabatt);
		return (mengenrabatt);
	}
	
	public void show(String name, int bettenzahl, String adresse,int sterne){
		System.out.println("Anreisedatum: "+buchen.getAnLong());
		System.out.println("Abreisedatum: "+buchen.getAbLong());
		System.out.println("Ferienwohnung: "+name+", "+bettenzahl+" Betten, "+sterne+" Sterne");
		System.out.println("Adresse: "+adresse);
		System.out.println("Bruttopreis: "+endpreis1);
		System.out.println("Nettopreis: "+endpreis2);
		System.out.println("Endpreis: "+mengenrabatt);
		
	}
}
Code:
public class Buchung {
	private Datum aktuell;
	private Datum anreise;;
	private Datum abreise;

	public Buchung(Datum datum, int uebernachtungen) {
		aktuell = new Datum(15,12,2011);
		anreise = datum;
		abreise = berechenAbreise(uebernachtungen);
	}

	public Datum berechenAbreise(int uebernachtungen) {
		int btag = anreise.getTag();
		int bmonat = anreise.getMonat();
		int bjahr = anreise.getJahr();
		Datum date = new Datum(btag,bmonat,bjahr);
		for (int i=1;i<=uebernachtungen;i++){
			date = date.getNextTag();
		}
		return (date);
	}
	public boolean prüfeBuchung (Buchung buchen){
		int pTag;
		int pMonat;
		int pJahr;
		boolean gebucht =true;
		int altAn =buchen.getAnLong();
		int altAb =buchen.getAbLong();
		int dif = altAb-altAn;
		int angesamtzahl = anreise.getLong();
		int abgesamtzahl = abreise.getLong();
		
		if(altAn ==angesamtzahl||altAb==abgesamtzahl){
			gebucht=false;
		}
		
		for (int i=1;i<=dif;i++){
			altAn = ++altAn;
			if(angesamtzahl ==altAn){
				gebucht =false;
			}
		}
		
		return (gebucht);
		
	}

	public boolean getIsSchaltjahr(int pJahr) {
		boolean isSchaltjahr=abreise.isSchaltjahr(pJahr);
		return (isSchaltjahr);
	}

	public int getMaxTage(int pMonat, int pJahr) {
		int maxTage = abreise.getMaxTage(pMonat, pJahr);
		return (maxTage);
	}

	public int getAnLong() {
		int angesamtzahl=anreise.getLong();
		return (angesamtzahl);
	}

	public int getAbLong() {
		int abgesamtzahl = abreise.getLong();
		return (abgesamtzahl);
	}
	

}
Code:
public class Datum {
	private int tag;
	private int monat;
	private int jahr;

	public Datum(int pTag, int pMonat, int pJahr) {
		tag =pTag;
		monat = pMonat;
		jahr = pJahr;
		
		boolean pruefung=pruefeDatum();
		if (pruefung ==false){
			tag=15;
			monat=12;
			jahr=2012;
		}
	}
	
	public int getTag(){
		int gTag=tag;
		return(gTag);
	}
	public int getMonat(){
		int gMonat=monat;
		return(gMonat);
	}
	public int getJahr(){
		int gJahr=jahr;
		return(gJahr);
	}
	public int getLong (){
		int gesamtzahl = tag + monat*100 +jahr*10000;
		return(gesamtzahl);
	}	
	
	public static boolean isSchaltjahr(int einJahr){
		 int jahr1=einJahr%4;
		 int jahr2 = einJahr%100;
		 if(jahr1!=0||jahr2==0){
			 boolean schaltjahr=false;
			 return(schaltjahr);
		 }
		 else{
			 boolean schaltjahr=true;
			 return(schaltjahr);
		 }
		
	}
	public static int getMaxTage(int einMonat, int einJahr){
		int maxTage=0;
		
		switch(einMonat){
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			maxTage =31;
			break;
		case 4:
		case 6:
		case 9:
		case 11: 
				maxTage =30;
			break;
		case 2:
			  boolean schaltjahr= isSchaltjahr(einJahr);
			   if(schaltjahr==false){
				 maxTage=28;
			   }
			 else{
				maxTage=29;
			 } 
		   break;
		default:   
			System.out.println("Bitte machen Sie korrekte Angaben");
	}
		return (maxTage);
		
	}
	public Datum getNextTag(){
		switch (monat){
		
		   case 1:
		   case 3:
		   case 5:
		   case 7:
		   case 8:
		   case 10:
		   case 12:
			   if(tag<=30){
				   tag++;
			   }
			   else{
				   tag = 1;
				   if(monat<=11){
					   monat++;
				   }
				   else{
					   monat = 1;
					   jahr++;
				   }
			   }
			   break;
		   case 4:
		   case 6:
		   case 9:
		   case 11: 
			   if(tag<=29){
			   tag++;
			   }
			   else{
			   tag = 1;
			   		if(monat<=11){
				   monat++;
			   		}
			   		else{
				   monat = 1;
				   jahr++;
			   		}
			   }
		       break;
		   case 2:
			   int schaltjahr=jahr%4;
			   int jahr2 = jahr%100;
			   if(schaltjahr!=0||jahr2==0){
				   if(tag<=27){
					   tag++;
					   }
					   else{
					   tag = 1;
					   		if(monat<=11){
					   			monat++;
					   		} 
					   		else{
								monat = 1;
								jahr++;
							}
					   }
			 }
			 else{
				 if(tag<=28){
					   tag++;
				 }
				 else{
					 tag = 1;
					 if(monat<=11){
					   	monat++;
					  } 
					  else{
						monat = 1;
						jahr++;
					}
				   
			   }
			 }	 
		   break;
		   default:   
			   System.out.println("Bitte machen Sie korrekte Angaben");
		}
		return (new Datum(tag,monat,jahr));
	}
	public boolean pruefeDatum(){
		boolean b;
	switch (monat){
	
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		if(tag>=1&&tag<=31){
			b=true;
		}
		else{
			System.out.println("Bitte machen Sie korrekte Angaben!");
			b=false;
			System.exit(0);
		}
		break;
	case 4:
	case 6:
	case 9:
	case 11: 
			if(tag>=1&&tag<=30){
				b=true;
			}
			else{
				System.out.println("Bitte machen Sie korrekte Angaben!");
				b=false;
				System.exit(0);
			}
		break;
	case 2:
		  boolean schaltjahr= isSchaltjahr(jahr);
		   if(schaltjahr==false){
			   if(tag>=1&&tag<=28){		
				   b=true;
			   }
			   else{
				   System.out.println("Bitte machen Sie korrekte Angaben!");
				   b=false;
				   System.exit(0);
			   }
		 }
		 else{
			 if(tag>=1&&tag<=29){
				 b=true;
			 }
			 	else{
				 System.out.println("Bitte machen Sie korrekte Angaben!");
			   	b=false;
			   	System.exit(0);
			 	}
		 	} 
		   break;
		default:   
			System.out.println("Bitte machen Sie korrekte Angaben!");
			b=false;
			System.exit(0);
		}
		return(b);
	}

}
 
Zuletzt bearbeitet:
#2
Okay das mit dem Datum überprüfen habe ich jetzt doch hinbekommen da war ein kleiner Fehler bei der If abfrage.

Aber Mir fehlt noch der Mengenrabatt und die möglichkeit hardcodiert eine der Ferienwohnungen auszuwählen wenn mir da jemand helfen könnte wäre super

Dankeschön
 
#3
Hi

zuerst mal Aufgabe 6.1:
Private hast du ja gemacht, aber die Getter/Setter?
Zu
Java:
private double bruttopreis;
das:
Java:
public double getBruttopreis() {
    return bruttopreis;
}
public void setBruttopreis(double newPreis) {
    bruttopreis = newPreis;
}
Sowas in der Art.
Und zwar für jede Variable in der Ferienwohnung.
 

j2se

Erfahrenes Mitglied
#4
Ebenfalls zu 6.1: Der Konstruktor fehlt. Sowas in der Art

Code:
public Ferienwohnung(double basispreis, double mengenrabatt, String name, int bettenzahl, String adresse, int sterne) {
    	b =new Vector();
    	this.basispreis = basispreis;
    	this.mengengrundrabatt = mengenrabatt;
    	this.name = name;
    	this.bettenzahl = bettenzahl;
    	this.adresse = adresse;
    	this.sterne = sterne;
    }
erlaubt, Ferienwohnungen mit verschiedenen Basispreisen, Bettenzahlen etc. zu instantieren.

Zur Buchung: Sollen nur ganze Tage buchbar sein? Theoretisch könnte ein Kunde am Mittag auschecken und ein neuer am gleichen Tag am Nachmittag einchecken.
 
Zuletzt bearbeitet: