Projekt in Visual Studio C# wie mache ich z.b. 100*5 hoch 2? Fragen zur Zinsrechnung in C#?
In der Schule haben wir das Thema Zinsen in Mathe, ich möchte nun eine Anwendung erstellen, welche mir z.b. bei der Suche der Zinsen nur durch das eingeben von dem Kapital, Zinssatz und der Laufzeit in Jahren das Ergebnis + Rechenweg gibt.
- Frage
Ich habe es schon geschafft, dass mir bei einer Laufzeit von einem Jahr das Richtige angezeigt wird, aber bei z.b. 2 Jahren wird der Wert einfach verdoppelt. Das ist natürlich nicht falsch, da ich * diesen Wert (Wert3) geschrieben habe. Aber es soll so sein, dass die Zinsen nach dem ersten Jahr auch mitgerechnet werden. So wie beim Taschenrechner bei der Hochrechentaste: ("X" und oben rechts ein "y").
Wie mache ich es, dass das mitgerechnet wird?
zweite Frage:
Wenn die Jahre/Laufzeit nur 1 ist, soll automatisch "1" bei Wert3 stehen, ohne es bei der TextBox einzugeben (Wert3 ist der Wert für die Jahre/Laufzeit). Wie mache ich das?
dritte Frage:
Ist es möglich Rechenwege mit Klammern zu schreiben? (Z.B. (Wert1 * Wert2 / 100) * Wert3. Ja bei dieser Rechnung wären Klammern unnötig, aber ihr wisst was ich meine.)^^
Vierte Frage:
Kann ich irgendwie z.b. der Variable "wert1" zu der Variable "Kapital" zuweisen bei einer if-Abfrage? Also dass ich beim If-Teil "Wert1 = Kapital" und bei der Rechnung "Kapital * …." eingeben kann? Wenn ich das so mache, kommt immer 0 raus, egal was ich in die TextBox eingebe.
Und letzte Frage:
Kann man irgendwie in die TextBoxen mit Kommata (,) schreiben? (Z.B. das Kapital ist 100,75€ groß), bei der Eingabe eines Kommas kommt immer der Fehler, dass die Zeicheneingabefolge falsch sei (oder so ähnlich).
Ich hoffe ihr könnt mir helfen. Ich mache dies hier: 1. um C# weiterzulernen und 2. Falls ich den Rechenweg mal vergesse, ich trotzdem diese Anwendung hier habe.^^
So sieht der Code aus (bin C# Anfänger):
1 Antwort
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
}
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);
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...
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.
}
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 …"?
Und wie verwende ich die 1. Antwort zu dem Hochrechnen in meinen Rechnungen? (Bin, wie gesagt, noch ein Anfänger)^^
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".
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);
Okay, und wieso wurden X und Y Zahlen zugewiesen? Bedeuten diese Zahlen irgendwas oder kann ich auch einfach "X = wert2" nehmen oder so?
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).
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;
}
"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. ^^
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";
}
}
}
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. ^^
Könntest du mir die Antworten zu 1, 3 und 4 erklären? Also wieso das so ist usw. damit ich es verstehe.^^