PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB.NET Fehler


Gast
2009-10-11, 13:03:01
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

Gast
2009-10-11, 14:05:04
danke, die Fehlermeldung ist aber ziemlich irreführend.

Gast
2009-10-11, 14:35:03
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

Gast
2009-10-11, 15:11:29
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

Gast
2009-10-11, 18:31:39
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

Gast
2009-10-11, 19:02:55
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 <.<

Gast
2009-10-21, 22:56:50
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.