C# Bankkonto, Hilfe?
Ich soll ein Programm erstellen, dass aus Nummer, Saldo und Passwort besteht. Einzahlung und Auszahlung sollten möglich sein, beim falschen Passwort oder zu hohem Betrag (überschreiten des Saldos) soll ebenso eine Fehlermeldung erscheinen.
Ich glaube, dass getter und setter benötigt werden, aber ich weiß gerade nicht weiter. Ich habe auch einige Fehler drin, weiß aber nicht genau, wie ich diese verbessern kann. Außerdem weiß ich leider nicht, wie ich in Main die Auszahlungen und Einzahlungen durchführen kann. Ich würde mich sehr freuen und wäre sehr dankbar, wenn mit jemand helfen könnte. Vielen dank!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Konto
{
class Konto
{
private int nummer;
private double saldo;
private string passwort;
//Customkonstruktor, der Klasse Konto enthält
private Konto (int nummer, double saldo, string passwort)
{
this.nummer = nummer;
this.saldo = saldo;
this.passwort = passwort;
}
//Customkonstruktor: Nummer = Wert zuweisen, Saldo = nullsetzen, Passwort = default
private Konto(int nummer, double saldo, string passwort)
{
nummer = 123456;
saldo = 0;
passwort = ();
}
//Methode "Einzahlen", hier wird der entsprechende Beitrag ausgegeben
private void einzahlen(int einzahlungsbetrag)
{
saldo = saldo + einzahlungsbetrag;
Console.WriteLine("Sie haben" + einzahlungsbetrag + "EUR eingezahlt");
}
//Methode "Auszahlen", ausgezahlt werden soll nur, wenn das Passwort richtig eingegeben wurde
//und wenn der gewünschte Betrag nicht höher ist als der aktuelle Kontostand, sonst ist die Auszahlung nicht möglich
// bei falschem Passwort soll ausgegeben werden = falsches Passwort
private void auszahlen(int auszahlungsbetrag, bool passwort)
{
if (passwort == false && auszahlungsbetrag > saldo)
{
Console.WriteLine("falsches Passwort");
}
else
{
Console.WriteLine("Ihr Auszahlungsbetrag" + saldo);
}
//Methode getInfo, die Kontonummer und Saldo ausgibt
private void getInfo(int nummer, double saldo)
{
Console.WriteLine("Ihre Kontonummer" + nummer + "und Ihr Saldo beträgt" + saldo);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Konto
{
class Program
{
static void Main(string[] args)
{
Konto einzahlen = new Konto(234);
Konto auszahlen = new Konto(234.00);
}
}
}
2 Antworten
1) Tipp: Vermeide Bezeichner mit gleichem Namen, um Verwechslungen zu vermeiden. Benenne deinen Namespace anders.
2) Dein erster Kommentar ist inhaltlich falsch. Ein Konstruktor erstellt eine Instanz einer Klasse. Er enthält sie nicht.
3) Wieso markierst du deine Konstruktoren mit private? Damit machst du sie für außen unsichtbar. Das heißt, du kannst keine Instanz von Konto erstellen. Setze beide Konstruktoren public.
public Konto(int nummer, double saldo, string passwort)
{
// ...
}
4) Dein zweiter Konstruktor hat genau die selbe Signatur, wie der erste Konstruktor. Das geht aber nicht. Wie soll das Programm denn bei einem Aufruf entscheiden können, welcher Konstruktor aufgerufen wird?
Da dein zweiter Konstruktor den Feldern Standardwerte zuordnen soll, braucht er auch keinen Parameter.
public Konto()
{
// ...
}
5) Die Variable passwort ist ein String. Sie erwartet bei einer Zuweisung also auch ein Stringliteral. Die beiden Klammern sind dies nicht.
passwort = (); // wrong
passwort = "()"; // correct
Da du dem Passwort aber einen Standardwert zuordnen möchtest, wäre wohl null oder ein leerer String passender:
passwort = null;
// or
passwort = "";
6) Dein zweiter Konstruktor lässt sich abkürzen, er kann den ersten Konstruktor aufrufen:
public Konto() : this(123456, 0, "")
{
}
Mit this() lässt sich der eigene Konstruktor aufrufen. Den Konstruktor, auf den die Signatur passt, wählt der Programmfluss bei Ausführung automatisch.
7) Halte dich an C#-Konventionen. Die Bezeichner für Methoden und Properties beginnen mit einem Großbuchstaben.
8) Du schließt die Klammer bei der Methode auszahlen nicht. Solche Fehler siehst du doch bereits in deinem Editor.
9) Auch deine Methoden sind allesamt mit private markiert, obwohl du sie außerhalb der Klasse ganz sicher einmal einsetzen möchtest. Oder nicht?
10) Wenn du eine Methode / einen Konstruktor aufrufst, dann muss die Signatur auch passen, die du angibst.
So gibt es keinen Konstruktor, der nur ein Argument entgegennimmt und dazu ein Objekt der Klasse Konto erzeugt.
Konto einzahlen = new Konto(234);
Möglich wären nach Korrektur der oberen Punkte nur diese Aufrufe:
Konto konto1 = new Konto();
Konto konto2 = new Konto(1, 2.0, "irgendein Passwort");
11) Setze hier:
Console.WriteLine("Sie haben" + einzahlungsbetrag + "EUR eingezahlt");
noch Leerzeichen, damit die Ausgabe später auch gut lesbar ist.
-------------------------------------------------------------------
Ich habe auch einige Fehler drin, weiß aber nicht genau, wie ich diese verbessern kann.
Schau dir doch einfach einmal die Fehler an, die dir Visual Studio so um die Ohren haut. Die Fehler werden rot unterstrichen und mit einem Fehlertext (Popup) beschrieben.
Ich glaube, dass getter und setter benötigt werden (...)
Wieso?
Außerdem weiß ich leider nicht, wie ich in Main die Auszahlungen und Einzahlungen durchführen kann.
Eine Instanz der Klasse Konto reicht für dein Programm aus. Den Rest erledigen die Methoden zum ein- und auszahlen, die du über die Instanz aufrufen kannst.
Die Logik bezüglich des Passworts solltest du natürlich noch ändern. Du musst ein Passwort festlegen, welches als valides Passwort gilt und dieses dann auch mit dem gegebenen Passwort vergleichen. Wenn die gegebenen Daten vom Nutzer während des Programmverlaufs eingegeben können sollen, musst du dein Programm noch etwas ergänzen. Mit einer Instanz der Console-Klasse kannst du Eingaben von der Konsole auslesen.
Hinzu kommt noch, dass sich in C# Strings und Zahlen nicht einfach so verketten lassen.
Entweder:
"string1" + zahl.ToString() + "string2"
oder
String.Format("zahl1 {0} zahl2", zahl)
Zuzüglich der inhaltlichen Fehler:
"bool passwort" tut geradezu weh; und
if (passwort == false && auszahlungsbetrag > saldo)
ist bestimmt ganz anders gedacht, zumindest ein || wäre sinnvoll, aber dann bleibt immer noch die missverständliche Fehlermeldung.
-----
P. S.: Ich hab's noch mal ausprobiert, string + double geht tatsächlich, zumindest in der neuesten Version von C#. Vor ein paar Versionen war das noch ein Fehler -- was ich auch für sinnvoller halte.
Ob man, da ist ziemlich viel Quatch im Code. Du solltest am besten Schritt für Schritt vorgehen und den Code immer neu compilieren lassen. Sonst sammeln sich die Fehler und du blickst nicht mehr durch.