Archiv verlassen und diese Seite im Standarddesign anzeigen : VB.NET Fehler
Hallo,
wollte ein ganz einfaches Programm schreiben, mit der ich den Notendurchschnitt berechnen kann: Was habe ich falsch gemacht, bekomme immer den Fehl, dass eine "end of" Anweisung erwartet wird:
Public Class Form1
Dim Deutsch, Mathematik, Englisch As Single
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Deutsch = TextBox1.Text
Mathematik = TextBox2.Text
Englisch = TextBox3.Text
TextBox4.Text = Deutsch + Mathematik + Englisch / 3
If TextBox4.Text >= 4,5
MessageBox.Show("Versetzung gefährdet", "Achtung")
Else : MessageBox.Show("Das Klassenziel wurde erreicht","Glückwunsch")
End If
End Sub
End Class
Monger
2009-10-11, 13:49:16
Dir fehlt ein "then".
If TextBox4.Text >= 4,5 Then
danke, die Fehlermeldung ist aber ziemlich irreführend.
Public Class Form1
Dim Deutsch, Mathematik, Englisch As Single
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Deutsch = TextBox1.Text
Mathematik = TextBox2.Text
Englisch = TextBox3.Text
TextBox4.Text = Deutsch + Mathematik + Englisch / 3
If TextBox4.Text >= 4,5
MessageBox.Show("Versetzung gefährdet", "Achtung")
Else : MessageBox.Show("Das Klassenziel wurde erreicht","Glückwunsch")
End If
End Sub
End Class
1.)
Deutsch = TextBox1.Text
In deiner Textbox steht ein Text und keine Zahl. Die musst du zuerst umwandeln.
2.)
TextBox4.Text = Deutsch + Mathematik + Englisch / 3
Rückwärts kannst du es so lassen, da sich ein Single immer in einen String umwandeln lässt. Da jedoch wie in der Mathematik Punkt vor Strichrechnung gilt, musst du eine Klammer setzen.
3.)
Die Syntax für eine If Bedinung lautet z.B.
If Zahl1>4.5 Then
MessageBox.Show("Größer als 4.5")
Else
MessageBox.Show("Kleiner gleich 4.5")
EndIf
Du hast hier einen Doppelpunkt zu viel und ein Then zu wenig. Außerdem verwendet man bei allen Programmiersprachen, die ich kenne einen Punkt als Dezimaltrennzeichen (4.5 statt 4,5).
Ich gehen einmal davon aus, dass der Compiler gemeint hat, nach dem >4, dass die Bedingung ja schon aus ist und der Beistrich nicht mehr da sein sollte und man das End If vergessen hat.
Abgesehen davon vergleichst du hier wieder einen Text mit einer Zahl, was nicht gut gehen kann.
Die sauberste und auch schnellste Lösung ist immer das Prinzip von Eingabe, Berechnung, Ausgabe d.h. zuerst wandelst du alle Strings in Zahlen um. Dann rechnest du damit und zum Schluss gibst du die Variablen wieder aus.
4.) Variablen sollten immer so lokal wie möglich deklariert werden d.h. wenn möglich in der Funktion statt im ganzen Formular. Wenn du Deutsch, Englisch und Mathematik nachher noch von anderen Funktionen verwenden willst, dann kannst du es so lassen, ansonsten solltest du diese in der Methode Button1_Click deklarieren.
5.) Ein Single hat keine große Genauigkeit. Wenn es nicht besonders performancekritisch ist, dann würde ich stattdessen lieber einen Double verwenden. Dann hast du nicht so große Rundungsfehler z.b. tritt der Effekt bei einem Geldbetrag schon bei 160.000 Euro auf, dass Beträge nicht mehr auf den Cent genau dargestellt werden können. Wenn du noch damit herumrechnest, wird es noch viel schneller gehen.
Hier einmal ein Beispiel, wie ich es machen würde:
Hier einmal ein Beispiel, wie ich es machen würde:
[code]
Public Class Form1
Private _Deutsch,Mathematik,Englisch as Double
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Deutsch = Double.Parse(TXT_Deutsch.Text)
Mathematik = Double.Parse(TXT_Mathematik.Text)
Englisch = Double.Parse(TXT_Englisch.Text)
Dim Durchschnitt as Double = (Deutsch + Mathematik + Englisch)/3
If Durchschnitt > 4.5 Then
MessageBox.Show("Versetzung gefährdet", "Achtung")
Else
MessageBox.Show("Das Klassenziel wurde erreicht","Glückwunsch")
EndIf
Catch ex as Exception
MessageBox.Show("Ein Fehler ist aufgetreten. Bitte überprüfen Sie die Eingabe: " & vbCrLf & ex.ToString())
End Try
End Sub
End Class
Hallo :-)
Danke für deinen ausführlichen Beitrag.
Dass ich die Klammer vergessen habe, ist mir nach dem ersten Ausführen auch klargeworden, ebenso wie "4.5" nicht "4,5" :-)
Hilft mir aber sehr viel weiter! Danke
Monger
2009-10-11, 15:38:34
1.)
Deutsch = TextBox1.Text
In deiner Textbox steht ein Text und keine Zahl. Die musst du zuerst umwandeln.
VB.NET kennt eine Compiler Option namens "Strict", die standardmäßig ausgeschaltet ist. Wenn die aus ist, sind in VB.NET auch implizite Typkonvertierungen erlaubt, z.B. von Integer in String.
Was der TS geschrieben hat, ist also erlaubt, wenn auch ein wenig schmutzig.
Du hast hier einen Doppelpunkt zu viel und ein Then zu wenig.
Der Doppelpunkt ist vollkommen okay. Ein "If...Then" ist als Einzeiler auch ohne Doppelpunkt erlaubt, bei "Else" und "Select... Case" brauchst du einen Doppelpunkt, um noch in der selben Zeile schreiben zu dürfen.
Zum Beispiel:
Dim Text as String = ""
Dim ergebnis as Integer
Select Case Text
Case "X" : ergebnis = 42
Case "Y" : ergebnis = 23
Case Else : ergebnis = -1
End Select
If Text = "Z" Then ergebnis = 123
Versuche mich grad an RadioButtons, irgendwas läuft aber wieder schief :)
Public Class Form1
Dim Eingabe As Double
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = Eingabe
If RadioButton1.Checked = True Then
TextBox2.Text = Eingabe * 0.231
ElseIf RadioButton2.Checked = True Then
TextBox2.Text = Eingabe * 0.365
End If
End Sub
End Class
Geht um die Kfzsteuerberechnung.
Bei Klick auf meinen Berechen-Button werden beide Textboxen auf 0 gesetzt (?) allerdings keine Fehlermeldungen
robobimbo
2009-10-11, 18:47:31
Eingabe = TextBox1.Text
Ohne mich in VB auszukennen :)
Du weist den Wert der Variable Eingabe der TextBox zu. Eingabe wird von dem Dim standardmässig auf 0 gesetzt.
Ich hab jetzt mal angenommen, dass Du den Wert aus der TextBox1 auslesen willst, und nicht überschreiben
Hm.. Weiß ich nix von und hat eigentlich bis jetzt immer so geklappt. Nun wollte ich nen anderes Programm schreiben und da habe ich das gleiche Problem.
Glaube mir fehlen da noch Grundlagen, aber die machen wir in der Schule nicht. Lieber drauflos programmieren <.<
VB.NET kennt eine Compiler Option namens "Strict", die standardmäßig ausgeschaltet ist. Wenn die aus ist, sind in VB.NET auch implizite Typkonvertierungen erlaubt, z.B. von Integer in String.
Was der TS geschrieben hat, ist also erlaubt, wenn auch ein wenig schmutzig.
Man sollte es sich überhaupt gar nicht angewöhnen Zahlen als Strings zu speichern und umgekehrt, selbst wenn das eine Programmiersprache erlaubt. Da fällt man nämlich ziemlich bald auf die Nase, spätestens wenn man dann mit verschiedenen Formatierungen (3.14 vs. 3,14) zu kämpfen hat.
Das ist eine grundsätzliche Verständnisfrage und keine syntaktische. In vielen Fällen mag das ja auch sinnvoll sein, wenn man eine Zahl einfach so in einen String konvertieren kann, aber bitte nicht umgekehrt. Mit Zeichenketten rechnet man nicht.
Der Doppelpunkt ist vollkommen okay. Ein "If...Then" ist als Einzeiler auch ohne Doppelpunkt erlaubt, bei "Else" und "Select... Case" brauchst du einen Doppelpunkt, um noch in der selben Zeile schreiben zu dürfen.
Die Formulierung beim Else kannte ich noch gar nicht. Ich würde aber trotzdem in einer neuen Zeile schreiben. Das macht das alles übersichtlicher. Nur beim If Then kann man es eventuell in eine Zeile stopfen.
Bei Case ist es meiner Ansicht nach auch besser das alles zu trennen, aber über Geschmack lässt sich bekanntlich streiten.
Versuche mich grad an RadioButtons, irgendwas läuft aber wieder schief :)
Public Class Form1
Dim Eingabe As Double
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = Eingabe
If RadioButton1.Checked = True Then
TextBox2.Text = Eingabe * 0.231
ElseIf RadioButton2.Checked = True Then
TextBox2.Text = Eingabe * 0.365
End If
End Sub
End Class
Geht um die Kfzsteuerberechnung.
Bei Klick auf meinen Berechen-Button werden beide Textboxen auf 0 gesetzt (?) allerdings keine Fehlermeldungen
Geh es noch einmal Schritt für Schritt durch, dann wirst du selbst gleich feststellen, woran es liegt.
Du deklarierst eine Variable Eingabe. Den Wert von Eingabe schreibst du in ein Textfeld.
Danach rechnest du mit Eingabe weiter, obwohl du nie gesagt hast, was in Eingabe drin stehen soll. Da der VB.NET Compiler standardmäßig alle Variablen mit 0 initialisiert, steht dort auch 0 drin.
Weiter solltest du gerade bei Double Wert nie und auf keinen Fall einfach eine Zeichenkette nehmen und in einem Double speichern. Da wirst du arge Probleme bekommen. Beim Integer ist das nur unsauberer Stil, aber beim Double hast du noch mit verschiedenen Regionaleinstellungen zu kämpfen. Im englischsprachigen Raum wird der Punkt als Dezimaltrennzeichen verwendet, im deutschsprachigen Raum der Beistrich. Das vermischt sich dann meistens sehr schön und du wirst dich wundern, warum dein Programm auf machen Rechnern läuft, auf machen nicht.
Es hat schon seinen Grund gehabt, warum wir damals in der Schule gleich am Anfang 3 Monate nur Datentypen gelernt haben.
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.