Projekt in Visual Studio C# wie mache ich z.b. 100*5 hoch 2? Fragen zur Zinsrechnung in C#?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet
Antwort 1:
double x = 123.45;
double y = 2.0;
double x_hoch_y = System.Math.Pow(x, y);
Antwort 2:

Du könntest z.B. der Textbox den Default-Text "1" zuweisen.

Alternativ:

if(TextboxFürLaufzeit.Text.Length == 0){
  Wert3 = 1;
}
else if(!double.TryParse(TextboxFürLaufzeit.Text, out Wert3)){
    //TODO: Fehlermeldung ausgeben, da ein ungültiger Wert eingegeben wurde.
}
Antwort 3:

Ja.

Du könntest auch sowas machen wie

((((Wert1) * (Wert2)) / (100)) * (Wert3))

wenns dir Spaß macht. ^^

Antwort 4:

Da gäbs zwei Möglichkeiten:

Nummer 1 (die alte, unsaubere):

string foo = "123,45";
double bar;
if(!double.TryParse(foo.Replace(",","."), out bar)){
    //TODO: Fehlermeldung, ungültiger Wert
}

Nummer 2 (die .NETigere):

System.Globalization.CultureInfo foo = new System.Globalization.CultureInfo("de");
string bar = "123,45";
double baz;
if(!double.TryParse(bar, foo, System.Globaization.NumberStyles.Any, out baz)){
    //TODO: Fehlermeldung, ungültiger Wert
}

CGCofficial 
Beitragsersteller
 22.11.2019, 17:18

Könntest du mir die Antworten zu 1, 3 und 4 erklären? Also wieso das so ist usw. damit ich es verstehe.^^

0
CGCofficial 
Beitragsersteller
 22.11.2019, 17:24
@CGCofficial

Bei der TextBox hab ich es so gemacht, das klappt so auch ohne Probleme oder?:

if (Txt3.TextLength == 0)
                wert3 = 1;
            else
                wert3 = Convert.ToInt32(Txt3.Text);
0
Isendrak  22.11.2019, 17:29
@CGCofficial Erklärung 1:

System.Math ist eine Standard-.NET-Klasse mit diversen statischen Methoden für mathematische Funktionen.

Die Methode Pow nimmt dabei zwei Wert vom Typ double als Parameter und gibt als Rückgabewert Parameter1 hoch Parameter2.

Anmerkung 1: Wenn du using System; verwendest, kannst du auch Math.Pow anstelle von System.Math.Pow verwenden.

Anmerkung 2: Es gibt zwar in C# auch den Operator ^, allerdings bedeutet dieser "Exklusiv Oder (XOR)" und nicht (wie man evtl. denken könnte "hoch".

Erklärung 3:

Solange die Klammern nicht die Bedeutung des Ausdrucks verändern kannst du so viele benutzen, wie du willst.

So wäre z.B. (((((Wert1))))) exakt das gleiche wie Wert1.

Aber aufpassen: (1+2)*3 ist nicht das gleiche wie 1+(2*3).

Erklärung 4:

In Variante Nummer 1 wird einfach nur das Komma (bzw. jedes Komma) durch einen Punkt ersetzt und der String danach ganz normal geparset.

In Variante Nummer 2 dagegen wird mit "Kulturabhängigen Vorgaben" gearbeitet. Ein Objekt des Typs CultureInfo enthält z.B. für "Deutsch" neben der Information, dass das Komma den Ganzzahlteil vom Bruchteil trennt auch noch informationen wie "Das Währungssymbol ist€", "Der Punkt ist das Trennzeichen für Tausenderpakete", usw...

1
Isendrak  22.11.2019, 17:33
@CGCofficial
Convert.ToInt32(Txt3.Text);

Klappt schon, nur wenn der eingegebene Text z.B. "1a" lautet, schmiert dir das Programm mit einer System.FormatException ab.

Also: Entweder nen Try-Catch-Block drumpacken oder aber mit int.TryParse arbeiten:

if (Txt3.TextLength == 0)
    wert3 = 1;
else if(!int.TryParse(Txt3.Text, out wert3)){
    //TODO: Fehlermeldung aufgrund einer ungültigen Eingabe ausgeben (z.B. mittels System.Windows.Forms.MessageBox) und die Berechnung abbrechen.
}
1
CGCofficial 
Beitragsersteller
 22.11.2019, 17:39
@Isendrak

Ich kann in die TextBox aber auch kein Komma schreiben, da schmiert's auch ab.

Und weiß ist gemeint bei diesem If-Teil mit dem "Todo: Fehlermeldung …"?

0
CGCofficial 
Beitragsersteller
 22.11.2019, 17:44
@Isendrak

Und wie verwende ich die 1. Antwort zu dem Hochrechnen in meinen Rechnungen? (Bin, wie gesagt, noch ein Anfänger)^^

0
Isendrak  22.11.2019, 17:45
@CGCofficial

Meinst du die TextBox Txt3?

Falls ja: Das liegt wohl daran, dass Convert.ToInt32 nur für Integer-Wert ist.

Damits mit Komma funktioniert, müsstest du dafür sorgen, dass das Ergebnis ein Wert vom Typ double (oder auch float) ist und eine Methode verwenden, bei der du die "Kulturspezifischen Vorgaben" mit übergeben kannst.

Zum "TODO-Gedöns":

Kommentarzeilen, die mit //TODO: beginnen sind eine übliche Konvention um eine "Noch zu erledigen"-Sache zu kennzeichnen.

In diesem Fall wäre die "Noch zu erledigen"-Sache "Lass dein Programm eine Fehlermeldung ausgeben um den Benutzer auf den Fehler hinzuweisen und brich die Berechnung an dieser Stelle ab".

1
Isendrak  22.11.2019, 17:49
@CGCofficial

Naja, wie gesagt:

Du hast zwei Werte, nennen wir sie x und y.

Du willst nun der Variable z den Wert x hoch y zuweisen.

In dem Fall verwendest du das ganze so: z = Math.Pow(x, y);

Achte aber dabei darauf, dass mindestens z als double deklariert sein muss oder verwende stattdessen einen expliziten Cast: z = (int)Math.Pow(x,y);

1
CGCofficial 
Beitragsersteller
 22.11.2019, 18:01
@Isendrak

Okay, und wieso wurden X und Y Zahlen zugewiesen? Bedeuten diese Zahlen irgendwas oder kann ich auch einfach "X = wert2" nehmen oder so?

0
Isendrak  22.11.2019, 18:06
@CGCofficial

X und Y sind nur beispielhafte Platzhalter.

Da könnte genauso gut foo und bar, Hans und Peter oder auch 3 und 2 stehen (nur dass letzteres keine Variablen sondern Werte sind und damit Z oder nennen wir ihn Willhelm ^^ den Wert 9 hätte).

1
CGCofficial 
Beitragsersteller
 22.11.2019, 18:13
@Isendrak

Bevor es doch falsch ist, frag ich besser. Ist der Weg so richtig?^^

if (Chk1.Checked == true)
            {
                double x = wert2;
                double y = wert3;
                double wert4 = System.Math.Pow(x, y);
                summe = wert1 / wert4 * 100;
                LblAnzeige.Text = "Das Ergebnis ist: " + summe;
            }
0
Isendrak  22.11.2019, 18:22
@CGCofficial

"Nicht falsch" wäre treffender. ^^

Das ganze sollte so durchaus funktionieren, aber du könntest es etwas abkürzen:

if (Chk1.Checked == true) LblAnzeige.Text = "Das Ergebnis ist: " + (wert1 / System.Math.Pow(wert2, wert3) * 100);

Oder aber, falls du den Wert von summe noch an anderer Stelle benötigst:

if (Chk1.Checked == true){
    summe = wert1 / System.Math.Pow(wert2, wert3) * 100;
    LblAnzeige.Text = "Das Ergebnis ist: " + summe;
}

P.S.: Etwas aussagekräftigere Variablennamen wie "kapital", "zinssatz" und "laufzeit" wären etwas besser als "wert1", "wert2" und "wert3". Ganz besonders dann, wenn du ggf. mal an nem etwas größeren Projekt arbeitest wirds bei "wert372" etwas unübersichtlich. ^^

1
CGCofficial 
Beitragsersteller
 22.11.2019, 18:50
@Isendrak

Danke, du hast mir sehr geholfen.

Es ist nun, denke ich, fertig. Ich bin mir nur etwas unsicher ob der Code "logisch" ist.^^

Sind die Rechenwege so richtig?

      {
            double summe;
            double Laufzeit;
            double Kapital1, Kapital2, Kapital3;
            double Zinsen1, Zinsen2, Zinsen3;
            double Zinssatz1, Zinssatz2, Zinssatz3;

            // Hr (1, 2) = Hochrechnung. 

            if (Txt3.TextLength == 0)
                Laufzeit = 1;
            else
                Laufzeit = Convert.ToInt32(Txt3.Text);

            if (Chk1.Checked == true)
            {
                Zinsen1 = Convert.ToDouble(TxtEingabe1.Text);
                Zinssatz1 = Convert.ToDouble(TxtEingabe2.Text);

                double x = Zinssatz1;
                double y = Laufzeit;
                double Hr = System.Math.Pow(x, y);

                summe = Zinsen1 / Hr * 100;
                LblAnzeige.Text = "Das Ergebnis ist: " + summe;
            }
            else if (Chk2.Checked == true)
            {
                Kapital2 = Convert.ToDouble(TxtEingabe1.Text);
                Zinssatz2 = Convert.ToDouble(TxtEingabe2.Text);

                double x = Zinssatz2;
                double y = Laufzeit;
                double Hr1 = System.Math.Pow(x, y);

                summe = Kapital2 * Hr1 / 100;
                LblAnzeige.Text = "Das Ergebnis ist: " + summe;
            }
            else if (Chk3.Checked == true)
            {
                Zinsen3 = Convert.ToDouble(TxtEingabe1.Text);
                Kapital3 = Convert.ToDouble(TxtEingabe2.Text);

                double x = Kapital3;
                double y = Laufzeit;
                double Hr2 = System.Math.Pow(x, y);

                summe = Zinsen3 / Hr2 * 100;
                LblAnzeige.Text = "Das Ergebnis ist: " + summe;
            }

        }
        
        private void Chk1_CheckedChanged(object sender, EventArgs e)
        {
            if (Chk1.Checked == true)
            {
                LblWert1.Text = "Bitte Zinsen eingeben:";
                LblWert2.Text = "Bitte Zinssatz eingeben";
                Lblwert3.Text = "Bitte Anzahl der Jahre eingeben";
            }
        }
        private void Chk2_CheckedChanged(object sender, EventArgs e)
        {
            LblWert1.Text = "Bitte Kapital eingeben";
            LblWert2.Text = "Bitte Zinssatz eingeben";
            Lblwert3.Text = "Bitte Anzahl der Jahre eingeben";
        }
        private void Chk3_CheckedChanged(object sender, EventArgs e)
        {
            LblWert1.Text = "Bitte Zinsen eingeben";
            LblWert2.Text = "Bitte Kapital eingeben";
            Lblwert3.Text = "Bitte Anzahl der Jahre eingeben";
        }
    }
}
0
Isendrak  22.11.2019, 23:04
@CGCofficial

Die CheckChanged-Handler sollten soweit OK sein.

Die Berechnungsfunktion wäre an sich auch soweit lauffähig, aber durch nen ganzen Haufen Redundanzen unnötig "massig".

Z.B. hier:

double x = Kapital3;
double y = Laufzeit;
double Hr2 = System.Math.Pow(x, y);

Die Variablen x und y sind in diesem Kontext vollständig überflüssig.

Auch dass du jeweils drei Variablen für Kapital, Zinsen und Zinssatz anlegst ist zwar "technisch betrachtet" kein Fehler, aber ebenso wenig ist es notwendig.

Etwas aufgeräumter könnte das z.B. so aussehen:

double Laufzeit, Kapital, Zinsen, Zinssatz;

if(Txt3.TextLength == 0) Laufzeit = 1;
else Laufzeit = Convert.ToInt32(Txt3.Text);

if(Chk1.Checked){
    Zinsen = Convert.ToDouble(TxtEingabe1.Text);
    Zinssatz = Convert.ToDouble(TxtEingabe2.Text);
    Kapital = Zinsen / System.Math.Pow(Zinssatz, Laufzeit) * 100;
    LblAnzeige.Text = "Das Ergebnis ist: " + Kapital;
}
else if(Chk2.Checked){
    Kapital = Convert.ToDouble(TxtEingabe1.Text);
    Zinssatz = Convert.ToDouble(TxtEingabe2.Text);
    Zinsen = Kapital * System.Math.Pow(Zinssatz, Laufzeit) / 100;
    LblAnzeige.Text = "Das Ergebnis ist: " + Zinsen;
}
else if(Chk3.Checked){
    Zinsen = Convert.ToDouble(TxtEingabe1.Text);
    Kapital = Convert.ToDouble(TxtEingabe2.Text);
    Zinssatz = Zinsen / System.Math.Pow(Kapital, Laufzeit) * 100;
    LblAnzeige.Text = "Das Ergebnis ist: " + Zinssatz;
}

Und dann wäre da immer noch das "kleine" Problem, dass Convert.ToDouble bei einer ungültigen Eingabe das Programm abschmieren lässt, sofern es nicht in einem Try-Catch-Block verwendet wird.

Alternativ geht aber auch double.TryParse, z.B. so:

double Laufzeit, Kapital, Zinsen, Zinssatz;

if(Txt3.TextLength == 0){
    Laufzeit = 1;
}
else if(!int.TryParse(Txt3.Text, out Laufzeit)){
    System.Windows.Forms.MessageBox.Show("Ungültige Eingabe.");
    return;
}

if(Chk1.Checked){
    if(!double.TryParse(TxtEingabe1.Text, out Zinsen)){
        System.Windows.Forms.MessageBox.Show("Ungültige Eingabe.");
        return;
    }
    if(!double.TryParse(TxtEingabe2.Text, out Zinssatz)){
        System.Windows.Forms.MessageBox.Show("Ungültige Eingabe.");
        return;
    }
    Kapital = Zinsen / System.Math.Pow(Zinssatz, Laufzeit) * 100;
    LblAnzeige.Text = "Das Ergebnis ist: " + Kapital;
}
else if(Chk2.Checked){
    if(!double.TryParse(TxtEingabe1.Text, out Kapital)){
        System.Windows.Forms.MessageBox.Show("Ungültige Eingabe.");
        return;
    }
    if(!double.TryParse(TxtEingabe2.Text, out Zinssatz)){
        System.Windows.Forms.MessageBox.Show("Ungültige Eingabe.");
        return;
    }
    Zinsen = Kapital * System.Math.Pow(Zinssatz, Laufzeit) / 100;
    LblAnzeige.Text = "Das Ergebnis ist: " + Zinsen;
}
else if(Chk3.Checked){
    if(!double.TryParse(TxtEingabe1.Text, out Zinsen)){
        System.Windows.Forms.MessageBox.Show("Ungültige Eingabe.");
        return;
    }
    if(!double.TryParse(TxtEingabe2.Text, out Kapital)){
        System.Windows.Forms.MessageBox.Show("Ungültige Eingabe.");
        return;
    }
    Zinssatz = Zinsen / System.Math.Pow(Kapital, Laufzeit) * 100;
    LblAnzeige.Text = "Das Ergebnis ist: " + Zinssatz;
}

P.S.: Ob die Rechenwege mathematisch korrekt sind hab ich jetzt nicht überprüft, n bisschen musst also noch selber machen. ^^

1