C# - Taschenrechner - Die Eingabezeichenfolge hat das falsche Format.

Palladin007

assimiliert
Guten Tag

Ich habe eine Frage zu meinem ersten C#-Programm.
Dazu erst mal die einzelnen Methoden:

verborgener Text:
Code:
static void Main()
        {
            int menü_punkt;
            while (true)
            {
                Menü();
                Console.WriteLine();
                menü_punkt = 0;
                menü_punkt = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine(Rechnen(menü_punkt));

                Console.Read();
                Console.Clear();

                System.Threading.Thread.Sleep(50);
            }
        }

verborgener Text:
Code:
static void Menü()
        {
            Console.Clear();
            Console.WriteLine("Oo......TASCHENRECHNER......oO");
            Console.WriteLine();
            Console.WriteLine("Gib das passende Kommando ein.");
            Console.WriteLine("     1   Addition");
            Console.WriteLine("     2   Subtraktion");
            Console.WriteLine("     3   Multiplikation");
            Console.WriteLine("     4   Division");
        }

verborgener Text:
Code:
static string Rechnen(int menü_punkt)
        {
            string ergebnis;

            switch (menü_punkt)
            {
                case 1:
                    #region Addition
                    Console.WriteLine("Geben sie zwei Zahlen ein, die addiert werden sollen:");
                    double summand1 = Convert.ToDouble(Console.ReadLine());
                    double summand2 = Convert.ToDouble(Console.ReadLine());
                    ergebnis = summand1 + " + " + summand2 + " ergibt " + (summand1 + summand2) + ".";
                    return ergebnis;
                    #endregion
                case 2:
                    #region Subtraktion
                    Console.WriteLine("Geben sie zwei Zahlen ein, die subtrahiert werden sollen:");
                    double Minuend = Convert.ToDouble(Console.ReadLine());
                    double Subtrahend = Convert.ToDouble(Console.ReadLine());
                    ergebnis = Minuend + " - " + Subtrahend + " ergibt " + (Minuend - Subtrahend) + ".";
                    return (ergebnis);
                    #endregion
                case 3:
                    #region Multiplikation
                    Console.WriteLine("Geben sie zwei Zahlen ein, die multipliziert werden sollen:");
                    double produkt1 = Convert.ToDouble(Console.ReadLine());
                    double produkt2 = Convert.ToDouble(Console.ReadLine());
                    ergebnis = produkt1 + " * " + produkt2 + " ergibt " + (produkt1 * produkt2) + ".";
                    return (ergebnis);
                    #endregion
                case 4:
                    #region Division
                    Console.WriteLine("Geben sie zwei Zahlen ein, die dividiert werden sollen:");
                    double divident = Convert.ToDouble(Console.ReadLine());
                    double divisor = Convert.ToDouble(Console.ReadLine());

                    if (divisor == 0)
                    {
                        ergebnis = "Es kann nicht durch 0 dividiert werden.";
                        return ergebnis;
                    }

                    ergebnis = divident + " / " + divisor + " ergibt " + (divident / divisor) + ".";
                    return (ergebnis);
                    #endregion
                default:
                    #region Falsche_eingabe
                    ergebnis = "Es muss eine Menü-Option ausgewählt werden.";
                    return ergebnis;
                    #endregion
            }
        }


Das ganze ist brav in einer Klasse zusammen gefasst und funktioniert soweit auch. Wenn ich es dann ausführe, eine Aufgabe rechne und wieder weiter zum Menü zurück gehe, dann wird das Menü mir kurz angezeigt und danach zeigt mir Microsoft Visual C# 2010 Express folgenden Fehler:

attachment.php


Weiß jemand etwas damit anzufangen?
Ich jedenfalls nicht. Ich weiß nicht, was ich falsch gemacht habe.

Kann mir da jemand helfen?
 

Anhänge

  • Fehler.jpg
    Fehler.jpg
    73,8 KB · Aufrufe: 2.683
Zuletzt bearbeitet:
Ich muss vorausschicken, dass ich kein c# kann...

Bei diesem Befehl ist eine Exception (Ausnahmesituation) aufgetreten, und du musst
sowas im Code abfangen.

Code:
Achtung: Pseudo-Code:

try {
  menü_punkt = Convert.ToInt32(Console.ReadLine());
} catch (FormatException fe) {
  println("geben sie eine gültige Ziffer ein!");
}

In Java geht sowas mit einer try - catch Konstruktion, falls du das kennst.

hth
 
Ausnahme-Situation -.-


Ich versuch das mal umzusetzen, weil das kenn ich noch nicht.
Mit ein bisschen Probieren gehts vielleicht.

Aber da musst du mir noch sagen, wozu 'fe' steht.
Oder was die Ganze Zeile in den Klammern bedeutet: FormatException fe
 
Das ist Pseudo-Code, funktioniert also auf keinen Fall.

In Java würde man auf diese Weise eine Methode wie Convert.ToInt32(),
die eine Exception werfen kann, entsprechend behandeln.

In meinem Beispiel hält die Variable fe die aufgetretene Exception falls man
sie im catch-Block noch weiter benutzen wollte.

Unter C# funktioniert das wahrscheinlich ganz anders, ich wollte dich nur
in die richtige Richtung schubsen...
 
Ich hab es jetzt ein bisschen anders gemacht, denn die Falsche Eingabe habe ich in der Methode Rechnen ja schon am Ende berücksichtigt.

Code:
try
{
     menü_punkt = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException fe)
{
     menü_punkt = Convert.ToInt32(Console.ReadLine());
}

So geht's dann^^


Aber eine Ausnahme fehlt noch

So kann man das jetzt normal nutzen, wie geplant, aber wenn man nichts eingibt und Enter drückt, gibts einen Fehler
 
Zuletzt bearbeitet:
Hmm... Darf ich was grundsätzliches anmerken? Ich würde das keinesfalls alles in eine Klasse packen, erst recht nicht in die Start-Klasse. Das sind ja sonst alles statische Methoden...
 
Zuletzt bearbeitet:
Hmm... Darf ich was grundsätzliches anmerken? Ich würde das keinesfalls alles in eine Klasse packen, erst recht nicht in die Start-Klasse. Das sind ja sonst alles statische Methoden...

Wieso nicht?

Also, wenn ich ehrlich bin, hab ich noch nicht kapiert, wann man static verwendet und wann nicht.
Eigentlich verwende ich das auch kaum. Nur dann, wenn es sonst einen Fehler ausgibt, ich also versuche, die Main-Klasse ohne static zu starten^^


Andere Klassen habe ich bisher dann geschrieben, wenn ich so Daten vor dem unberechtigten Ändern schützen wollte.

Also eine private Variable und dann in der selben Klasse ein Haufen Methoden zum ändern eingebaut, die dann aufgerufen werden können.
 
Willkommen in der Welt der Objektorientierung ;)

Die Main Methode muss static sein, da führt kein Weg dran vorbei.

static-Methoden sind für alle Objekte der Klasse aufrufbar, bzw. wenn sie public sind direkt auf die Klasse aufrufbar, auch dann, wenn es von der Klasse keine Objekte gibt.
static-Methoden auf die Klasse aufrufbar. Wenn die Methoden public sind, lassen sie sich auch von außerhalb der Klasse auf die Klasse aufrufbar. static-Methoden lassen sich auch dann aufrufen, wenn es keine Objekte der Klasse gibt.

Ich würde vorschlagen, eine Taschenrechner-Klasse zu erstellen und beim starten des Programms über die Main-Methode ein Taschenrechner-Objekt zu erzeugen.
 
Zuletzt bearbeitet:
Ja, das die Main-Methode static sein muss, hab ich schon bemerkt^^


Du meinst, den eigentlichen Rechner als extra Klasse zu schreiben und dann eine Start-Klasse, die z.B. die eingegebenen Werte an die TR-Klasse und der jeweiligen Methode übergibt?




Was public und private ist, weiß ich, das ist auch eine ganz praktische Angelegenheit^^
Aber static...

static-Methoden sind für alle Objekte der Klasse aufrufbar

Wenn ich das mal umdrehe, dann würde es heißen, die Methode, die nicht static ist, kann nicht von allen Objekten der Klasse aufgerufen werden?

Aber von welchen kann man sie aufrufen und von welchen nicht?
Habs noch nicht so ganz kapiert, vielleicht hilft das^^
 
Das heißt, dass non-static-Methoden nur auf Objekten der Klasse aufgerufen werden können, jedoch nicht auf die Klasse selbst. Du musst also zunächst ein Objekt erzeugen um diese aufzurufen.
M;ein Satz im vorherigen Post war nicht 100%ig richtig. Ich korrigiere das gleich mal.

Nehmen wir mal an, du hast eine Klasse Auto und erstellst zwei Objekte davon, z.B. autoA und autoB. Jetzt gibt es eine non-Static Methode beschleunige(). Diese wird auf ein konkretes Objekt der Klasse (also autoA oder autoB) aufgerufen, denn du möchtest ja das konkrete Auto beschleunigen.

Mit static-Methoden kannst du auch garnicht den Zustand eines Objekts verändern, also Variablen eines Objekts verändern.

Ich kann leider kein C#, daher eine Mischung aus Java und Pseudo-Code:
Code:
public class Auto{
  private int geschwindigkeit = 0;

  public beschleunige(){
    geschwindigkeit++;
  }
}

Auto autoA = new Auto();
Auto autoB = new Auto();

autoA.beschleunige(); //OK!
autoB.beschleunige(); //OK!
Auto.beschleunige();  //FEHLER!

Eigentlich benötigt man Hauptsächlich non-ststic-Methoden. ststic-Methoden/Variablen/Konstanten sind seltener.
 
Ich versuche mal, es so zu erklären, wie ich es verstanden habe^^


Das Schlüsselwort static verhindert, dass eine zweite Klasse direkt auf diese static-Methode zugreifen kann. Um sie zu verwenden, muss man in der selben Klasse eine non-static-Methode schreiben, die wiederum die static-Methode aufruft.
Und das:
Andere Objekte können die Variablen, die in einer static-Methode deklariert wurden, nicht ändern.

Stimmt das?
 
Andere Objekte können die Variablen, die in einer static-Methode deklariert wurden, nicht ändern
Variablen, die innerhalb einer Methode deklariert wurden, nennt man lokale variablen. Diese sind nur innerhalb dieser Methode verfügbar - egal ob die Methode static ist oder nicht.
Das Schlüsselwort static verhindert, dass eine zweite Klasse direkt auf diese static-Methode zugreifen kann. Um sie zu verwenden, muss man in der selben Klasse eine non-static-Methode schreiben, die wiederum die static-Methode aufruft.
static sagt nur, dass die aufgerufen werden kann, ohne das Objekte der Klasse existieren.
non-static-Methoden können static Methoden aufrufen und static variablen verändern.
static-Methoden können keine non-ststic-Methoden aufrufen und keine non-static variablen verändern.

msdn: static (C#-Referenz)
 
Ach jetzt verstehe ich es^^


Ok, dann ist static wirklich nur selten notwendig^^
Dann muss ich nix ändern, weil soweit ich weiß, ist das einzige mal static bei mir in der Main-Methode drin.
 
Naja, deine Methoden sind alle Static, das müssten Sie aber nicht, wenn es ein Taschenrechner Objekt gäbe, auf das du die Methoden aufrufst. Aber egal... Für eine Einführung in OOP ist das Forum nicht geeignet. Da musst du dir Fachliteratur besorgen...
 
Naja, deine Methoden sind alle Static, das müssten Sie aber nicht, wenn es ein Taschenrechner Objekt gäbe, auf das du die Methoden aufrufst. Aber egal... Für eine Einführung in OOP ist das Forum nicht geeignet. Da musst du dir Fachliteratur besorgen...

An dem Taschenrechner bastel ich grad auch gar nicht mehr rum^^

Ich schreibe an einem Bank-Programm und da habe ich im Moment 3 Klassen.

Die erste enthält die gespeicherten Informationen zu jedem Konto.
Die zweite ist das eigentliche Programm. dort wird die Methode aufgerufen, von der dritten Klasse aus, die eigentlich nur die Main-Methode mit der Funktion enthält, die die Klasse Bank aufruft.
 
Ich hoffe, du erstellst Konten Objekte und speicherst die Infos nicht in static-Variablen ;)

Ich weiß nicht, wie man das nennt, vielleicht ist es das, was du meinst, aber ich lass dazu jedes mal die Instanz des Kontos aufrufen, wenn ein Konto bearbeitet werden soll.

Und so werden die Konten erstellt:

Code:
private List<Konto> Konten = new List<Konto>();

        private void NeuesKonto(string Inhaber, int Kontonummer, int neuePIN, double Startkapital = 0)
        {
            Konto nK = new Konto(Inhaber, Kontonummer, neuePIN, Startkapital);
            this.NeuesKonto(nK);
        }
        private void NeuesKonto(Konto NeuesKonto)
        {
            Konten.Add(NeuesKonto);
        }

Und in der Klasse Konto werden die vererbten Informationen dann dort in private-Variablen gespeichert.
Funktioniert wunderbar^^
 
Ja, hab das Wort blöd verwendet^^

Weiß ja im Grunde, was das ist. Ist etwas, was wir sinnvolles im Info-Unterricht gemacht haben.^^


Aber du weißt, was ich meine^^

Ich habe die Konto-Informationen als Parameter übergeben.

Und wenn das auch falsch ist, dann hab ich sie einfach nur übergeben^^
 
Oben