Obejekt orienetiertes Programmieren... wäre das so richtig?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Die Dinge, die mir auffallen: 

1. Die Variablen guthaben, besitzer und gesperrt sind nicht als static deklariert. Heißt: Es muss eine Variable von der Klasse "Mensakarte" instanziert werden, um auf die Variablen zuzugreifen. z.B.

Mensakarte mensakarte = new Mensakarte();

Das würde dann aber auch bedeuten, dass du allen Methoden außerhalb von main auch den Parameter mensakarte übergeben müsstest, damit das Guthaben berechnet werden kann oder überall this.guthaben einsetzt, wo das Guthaben der aktuellen Mensakarte bearbeitet wird. Andere Möglichkeit ist, wenn du die Variablen halt als static deklarierst.

2. In der Methode guthaben() deklarierst du eine Variable namens guthaben. Das heißt, der Befehl double guthaben = guthaben würde versuchen, die frisch gebaute guthaben-Variable mit sich selbst zu befüllen. Da die Variable aber noch keinen Wert hat, wird ein Fehler erzeugt. Es würde reichen, wenn du an der Stelle nur return this.guthaben machst (oder return Mensakarte.guthaben, je nachdem welche Variante du bei Punkt 1 nimmst.

3. Beim Punkt 4 im Menü fragst du nach dem Preis, aber übergibst der Methode das Guthaben. Ich glaub, das war nicht so gedacht, oder? Damit stellst du das Konto quasi immer auf 0, egal wie teuer das Essen war.

4. Das "return" muss immer die letzte Anweisung der Methode sein, also noch nach der schließenden Klammer eines If.

5. Auch wenn es dem Compiler nichts ausmacht, aber die Methode "kaffe_abbuchen()" sollte trotzdem mit zwei "e" geschrieben werden ;-)

daCypher  20.12.2016, 13:36

6. Wenn du bei Punkt 1 die Variable "mensakarte" instanzierst, musst du die Funktionen auch als Methode der Variable aufrufen (also z.B. mit mensakarte.aufladen(betrag)

7. Bei der Funktion "anzahl()" kannst du einer int Variable keinen double Wert zuweisen. Du musst es erst umwandeln

Ich hab dir mal den Code so zusammengebastelt, dass er sich compilieren lässt. Hab leider grad kein Eclipse hier, um auszuprobieren, ob der Code auch läuft.

import java.io.*;
public class Mensakarte {
double guthaben; String besitzer; boolean gesperrt;
public Mensakarte(){ guthaben = 0.0; besitzer = "Helene"; gesperrt = true; }

public static void main(String args[]) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int choice = 0;
boolean erfolg;
Mensakarte mensakarte = new Mensakarte();

do {

System.out.println();
System.out.println("Bitte waehlen:");
System.out.println("(1) Karte aufladen");
System.out.println("(2) Guthaben anzeigen");
System.out.println("(3) Kaffee abbuchen");
System.out.println("(4) Essen abbuchen");
System.out.println("(5) Verbleibende Kaffees anzeigen");
System.out.println("(6) Sperre toggeln");
System.out.println("(0) Ende");
choice = Integer.parseInt(in.readLine());
System.out.println();

switch (choice) {

case 1:
System.out.print("Aufladebetrag? ");
double betrag = Double.parseDouble(in.readLine());
mensakarte.aufladen(betrag);
break;

case 2:
mensakarte.guthaben();
break;

case 3:
mensakarte.kaffe_abbuchen();
break;

case 4:
System.out.print("Essenspreis? ");
double preis = Double.parseDouble(in.readLine());
mensakarte.essen_abbuchen(preis);
break;

case 5:
mensakarte.anzahl();
break;

case 6:
mensakarte.toggeln();
break;

}

} while (choice!=0);

}

public double aufladen(double plus){
if (plus >=0) {
this.guthaben = this.guthaben + plus;
}
return guthaben;
}

public double guthaben(){
return this.guthaben;
}

public boolean kaffe_abbuchen(){
if (guthaben>= 1.20) {
guthaben = guthaben - 1.20;
return true;
}
else {
return false;
}
}

public boolean essen_abbuchen(double preis){
if (guthaben>=preis) {
guthaben = guthaben - preis;
return true;
}
else {
return false;
}
}

public int anzahl(){
double zahl = guthaben/1.20;
return (int) zahl;
}

public boolean toggeln(){ boolean gesperrt;
if (gesperrt=true) {
return false;

}
else {
return true;
}
}
}

Noch ein Tipp: Programmiere das ganze in kleinen Schritten, damit du immer wieder testen kannst, ob der Code noch läuft und du nicht haufenweise Fehler auf einmal hast. Dann ist es auch einfacher, die Fehler zu beheben.

0

Zunächst mal der Tipp: Solltest du dich mit der Codefunktion von GuteFrage unwohl fühlen, so verwende bitte einen anderen Codehoster wie Hastebin oder Pastebin oder Pastie.

 aber ich weiss nur nicht was die fehler sind

In den meisten Fällen teilt dir die IDE das mit.

 nur weiss ich nicht wie ich diese beheben soll

Das kommt mit der Zeit:

case 2:
    guthaben();
    break;

guthaben() wird dir rot angestrichen, weil du aus einem statischen Kontext eine nicht statische Methode ausführen möchtest. - Was das 'beheben' betrifft, dazu komme ich noch.

public static double aufladen(double plus) {
if (plus >= 0) {
guthaben = guthaben + plus;
return guthaben; } }

Hier letztendlich dasselbe: Deine Methode ist statisch, du versuchst auf eine nicht statische Variable zuzugreifen.

Eigentlich zieht genau dieses Problem quer durch deinen ganzen Programm-Code. - Denn zum beheben benötigst du das Grundverständnis von Instanzen und statischen Elementen.

Das Thema kommt häufiger, daher referenziere ich mal auf bereits beantwortete Fragen:

https://www.gutefrage.net/frage/java-static-erklaeren-sowohl-vor-variablen-als-auch-bei-methoden

https://www.gutefrage.net/frage/java-was-bedeutet-static-und-void

Kannst du einen Screenshot o.ä. von den Fehlermeldungen zusammen mit den markierten Zeilen hinzufügen?

Ganz einfach: Compilerfehler immer von oben nach unten beheben. Grund: oft hat man es mit Folgefehlern zu tun.