VisualBasic Verschachtelte If-Anweisung (sehr einfach)

fox40phil

Rear Admiral
Registriert
Okt. 2008
Beiträge
6.120
Hallo!

Ich bin momentan dabei mir an der Arbeit VisualBasic an zueignen, dies muss ich alleine im "stillen Kämmerchen" machen^^. Dabei kann mir leider keiner helfen außer vllt ihr^^.

Ich mache das ganze mithilfe eines Tutorials von einem Dr. Horst Jaitner.

So folgendes Problem:

Ich will das man seine Größe eingibt und in einer entsprechenden Suboperation diese ausgewertet und eine Hinweis ausgibt.

Code:
Module Module1

    Sub Main()
        'Dekleration
        Dim größe As Double
        
        Write("Wie Groß sind Sie (in cm): ")
        größe = ReadLine()

        auswertung(größe)


        warten()

    End Sub

Sub auswertung(ByRef rGröße As Double)

        If rGröße >= 190 Then

            WriteLine("Sie sind Groß!")
            If rGröße > 175 Or rGröße < 190 Then

                WriteLine("Sie sind durchschnittlich Groß!")
                If rGröße > 165 Or rGröße < 175 Then
                    WriteLine("Sie sind normal Groß für eine Frau und klein für als Mann!^^")

                    If rGröße > 150 Or rGröße < 165 Then

                        WriteLine("Sie sind klein oder noch ein Kind!^^")


                    Else
                        WriteLine("Sie sind sehr klein oder noch ein Kind!^^")

                    End If




                End If



            End If


        End If


    End Sub

...


Wenn ich das ganze Compiliere kann ich eine Größe eingeben, aber es kommt keine Ausgabe.

Ich habe die Vermutung, dass es am Operator "Oder" liegt, ich weiß nämlich nicht so genau wie ich den schreibe... kenne ihn nur aus c++ und google konnte mir auch nicht so richtig helfen.

ich weiß es ist eine Kleinigkeit, bin noch ganz am Anfang :rolleyes:


Mfg

Phil
 
hm unsicher aber kann es sein dass du die größe ausgegeben wird aber dann schließt sich das fenster gleich, sodass du garnicht erst siehst ob was ausgegeben wurde
war glaub bei "pascal" und batch auch dass man am ende sowas wie stopp sagt oder eine eingabe noch abwarten lässt
 
Dieses Beispiel ist sehr unpassend für eine if-Abfrage. Nun kenne ich die Syntax von VB nicht genau, aber wenn du Zeilen einrückst gehe ich davon aus, dass sie den anderen untergeordnet sind.

If rGröße >= 190 Then
WriteLine("Sie sind Groß!")

müsste ja klappen, was passiert wenn du für rGröße 192 eingibst kommt da eine Ausgabe?


Vielleicht solltest du dir mal eine case of Schleife anschaun, das geht einfacher:
case of rGröße
1..150: WriteLine("Sie sind winzig!");
151..170: WriteLine("Sie sind klein!");
171..185: WriteLine("Sie sind durchschnittlich groß!");
186..200: WriteLine("Sie sind groß!");
201..300: WriteLine("Sie sind riesig!")

Edit: Und ich verstehe die Verschachtelung nicht, in einer Reihe hinterweg aufschreiben:

if x = y then
blabla1
end if
if x = z then
blabla2
end if
...
 
Zuletzt bearbeitet:
Mal von allem abgesehen solltest du als Variablennamen bzw für Funktion bzw allem was nicht in "" steht kein, ä,ö,ü,ß usw verweden. Diese gibt es nur in der deutschen Sprache, viele Compiler haben damit Probleme! In diesem Fall also aus "größe" "groesse" machen.
 
Was soll den z. B.
If rGröße > 175 Or rGröße < 190 Then
sein?

Wohl eher rGrosse>175 && rGrosse<190
Also sowohl größer als 175 und kleiner als 190.
usw. mit && statt || .

Das ist das 1.

Das zweite ist: Warum keine case Zweige? Ich kann (will nicht können) kein VB, aber ich denke ich habe trotzdem recht....

Gruß,

badday
 
also ich denk mal bei "oder" is java und visual basic gleich? deswegen:
was du geschrieben hast

If rGröße > 150 Or rGröße < 165 Then

WriteLine("Sie sind klein oder noch ein Kind!^^")


denn bei or (in java ||) ist nur ein "true" notwendig also wenn größe 180 ist dann stimmt die erste bedingung aber die zweite bedingung nicht es wird aber trotzdem:
Sie sind klein oder noch ein Kind ausgegeben

deswegen solltest du mal alles auf ein logisches und setzten (in java && keine ahnung wie das in visual basic geht)


wieso gar nichts ausgegeben wird weiß ich auch nicht
ich hoff halt dass bei die logischen operatoren genauso in java wie in visual basic sind sonst is mein beitrag unnötig!


mfg Dorian


edit: badday war schneller :)
Ergänzung ()

genau mit switch and case (so heißts in java :)) ist es 100-mal einfacher als lauter if... (viel zu umständlich)
 
nach dem ersten If solltest du denke ich Elseif verwenden und dann mit Endif abschließen
 
@Dorian94: Logische Verknüpungen und switch-/case-Konstrukte gibt es wohl fast überall, von VB über Java bis C++ (wo ich her komm). Stimme dir aber zu.

Gruß,

badday
 
@badday
ja weiß ich schon dass es das überall gibt nur wusst ich nicht ob das oder in VB genau das oder in java ist oder ob es doch das und in java ist ;)

jetzt wo ichs sag kommts mir auch irgendwie komisch vor xD

naja ok

mfg Dorian
 
So wie ich das sehe, machst du eine erste If - Bedingung > 190 was dazu führt das alle Angaben < 190 nicht angezeigt werden, da sie innerhalb des ersten Bedingungs-Rumpfes sind. Somit sollte dein Programm nur bei > 190 die Anzeige bringen. Desweiteren würde ich in der 2. Bedingung statt dem Or ein And verwenden, da hier scheinbar nur ein Bereich geprüft werden soll ala "175 < rGröße < 190". Die Bedingung müsste dann "If 175 < rGröße And rGröße < 190 Then" lauten.

Im übrigen hast du 4 mögliche logische Verknüpfungen im VB.Net:
And - Alle Bedingungen werden geprüft und danach entschieden ob der gesamte Ausdruck Wahr oder Falsch ist
Or - Alle Bedingungen werden geprüft und danach entschieden ob der gesamte Ausdruck Wahr oder Falsch ist
AndAlso - ähnlich dem "And" nur das sobald eine Bedingung False ergibt, werden alle weiteren Bedingungen nicht mehr geprüft, dürfte dem "&&" in C/C++ entsprechen
OrElse - ähnlich dem "Or" nur das sobald eine Bedingung True ergibt, werden alle weiteren Bedingungen nicht mehr geprüft, dürfte dem "||" in C/C++ entsprechen

Um die Umlaute im Quellcode würde ich mir keine Sorgen machen, weil VB.Net Unicode verwendet und die Umlaute genauso gut wie die "normalen" Buchstaben verwendet werden können. Im übrigen habe ich schon VB Code gehabt, der diverse kyrillische Zeichen in Variablen-/ Funktionen-/ Eigenschaften- und Event-Namen verwendete und der auch fehlerfrei auf einem deutschen Visual Studio kompilierte. Die Bezeichnung ist der Common Intermediate Language ebenso egal, Obfuscatoren ersetzen unter anderem die Namen durch mehrere zufällig gewählte Whitespaces und der gleichen...

http://openbook.galileocomputing.de/vb_net/msvb010003.htm#Rxxmsvb010003272RegelnfurNamen
 
Zuletzt bearbeitet:
venc schrieb:
Dieses Beispiel ist sehr unpassend für eine if-Abfrage. Nun kenne ich die Syntax von VB nicht genau, aber wenn du Zeilen einrückst gehe ich davon aus, dass sie den anderen untergeordnet sind.

If rGröße >= 190 Then
WriteLine("Sie sind Groß!")

müsste ja klappen, was passiert wenn du für rGröße 192 eingibst kommt da eine Ausgabe?

...

ja da kommt eine Ausgabe. Nur bei kleineren Werten nicht.

habs jetzt mal so gemacht:


Code:
Sub auswertung(ByRef rGröße As Double)

        If rGröße >= 190 Then

            WriteLine("Sie sind Groß!")

        [B]ElseIf [/B]rGröße > 175 [B]And [/B]rGröße < 190 Then

            WriteLine("Sie sind durchschnittlich Groß!")

            If rGröße > 165 [B]And [/B]rGröße < 175 Then

                WriteLine("Sie sind normal Groß für eine Frau und klein für als Mann!^^")

                If rGröße > 150 [B]And [/B]rGröße < 165 Then

                    WriteLine("Sie sind klein oder noch ein Kind!^^")

                Else
                    WriteLine("Sie sind sehr klein oder noch ein Kind!^^")

                End If
            End If
        End If
    End Sub

die fett Markierten habe ich verändert! Aber leider gabs keine Veränderung des Ergebnis


Rossibaer schrieb:
So wie ich das sehe, machst du eine erste If - Bedingung > 190 was dazu führt das alle Angaben < 190 nicht angezeigt werden, da sie innerhalb des ersten Bedingungs-Rumpfes sind. Somit sollte dein Programm nur bei > 190 die Anzeige bringen.

okay soll ich jetzt die 1. Bedingung als letzte nehmen? oder als Else? wurde mir jetzt nicht so deutlich :rolleyes:
 
Mein VB ist zwar eingerostest, aber so ungefähr sollte es gehen

If r >=190 Then
Write.....
' Alle >= 190 ausgeben, geht zum ende von if
ElseIf r > 175 Then
Writ....
' alle > 175 ausgeben, geht zum ende von if, And < 190 nicht erforderlich siehe oben
ElseIf r > 165 Then
' s.o.
ElseIf r > 150 ...
....
else
Write....
'Hier wird ausgegeben was von keine If Anweisung behandelt wurde.
EndIf
 
Wenn ich bei deinem Code bleibe dann sieht das ganze wohl eher so aus:

Code:
Sub auswertung(ByRef rGröße As Double)
  If rGröße >= 190 Then
    WriteLine("Sie sind Groß!")
  ElseIf rGröße >= 175 And rGröße < 190 Then
    WriteLine("Sie sind durchschnittlich Groß!")
  ElseIf rGröße >= 165 And rGröße < 175 Then
    WriteLine("Sie sind normal Groß für eine Frau und klein für als Mann!^^")
  ElseIf rGröße >= 150 And rGröße < 165 Then
    WriteLine("Sie sind klein oder noch ein Kind!^^")
  Else
    WriteLine("Sie sind sehr klein oder noch ein Kind!^^")
  End If
End Sub

Schau mal das:
1. die untere oder die obere Grenze mit >= oder <= berücksichtigt werden sollte, weil sonst die Logik bei der exakten Eingabe einer solchen Grenze nicht korrekt funktioniert und somit stets in den letzten Else Zweig laufen würde
2. Nach dem du den ersten "If" - Rumpf korrigiert hattest, hast du die restlichen "If" weiterhin verschachtelt gelassen, somit gilt meine Aussage vom ersten Rumpf dann auch weiterhin für den 2. Rumpf usw.

PS: das war hoffentlich nicht deine Hausaufgabe ;)

Edit

Wenn ich es mir recht überlege, dann:

Code:
Sub auswertung(ByRef rGröße As Double)
  If rGröße >= 190 Then
    WriteLine("Sie sind Groß!")
  ElseIf rGröße >= 175 Then
    WriteLine("Sie sind durchschnittlich Groß!")
  ElseIf rGröße >= 165 Then
    WriteLine("Sie sind normal Groß für eine Frau und klein für als Mann!^^")
  ElseIf rGröße >= 150 Then
    WriteLine("Sie sind klein oder noch ein Kind!^^")
  Else
    WriteLine("Sie sind sehr klein oder noch ein Kind!^^")
  End If
End Sub
 
Zuletzt bearbeitet:
Zurück
Oben