2016-04-14 10 views
1

Was mache ich falsch in diesem Skript?Probleme mit dem Fehler erwartet "Ende"

Randomize 
value=int((150 * Rnd + 1) * Rnd + lowerbound) 
guess+inputbox("guess the number","guess","guess here") 
if guess=value then 
    msgbox("correct"),0+64+4096,("guess") 
    wscript.quit 
else 
    if guess < value then 
    msgbox("too low"),0+32+4096,("guess") 
    once=1 
    end if 
else 
    msgbox("too high"),0+32+4096,("guess") 
end if 
once=1 
do 
    guess=inputbox("try again","guess","guess here") 
    if guess=value then 
    msgbox("correct"),0+64+4096,("guess") 
    else 
    if guess < value then 
     msgbox("too low"),0+32+4096,("guess") 
    end if 
    else 
    msgbox("too high"),0+32+4096,("guess") 
    end if 
loop 

Wenn Sie herausfinden können, was schief läuft, wäre das toll.

Es wird gesagt

expected "end"

und wenn ich das tun, was er sagt, ich werde es laufen und es wird funktionieren noch nicht.

+0

Meinst du, "else if" anstatt "else" oft zu verwenden. –

+0

Oder vielleicht sollte die Zeile unter dem "else" in der gleichen Zeile wie die "else" sein, um es in ein "else if" zu verwandeln. Auch 'lowbound' ist nicht definiert und wird als 0 behandelt. –

+0

Alternativ können Sie [' Select-Case'] (http://www.w3schools.com/asp/vbscript_conditionals.asp) verwenden, um schneller und besser lesbar zu sein Code. –

Antwort

2

Haben Sie den Code bearbeitet, um ihn richtig einzurücken, was das Problem hervorheben sollte. Der Fehler ist, weil eine If Anweisung nur eine Else Bedingung haben kann, die Grundstruktur einer If Anweisung ist;

If <boolean condition> Then 
    <true outcome> 
Else 
    <false outcome> 
End If 

Im Moment haben Sie mehrere Instanzen von

If <boolean condition> Then 
    <true outcome> 
Else 
    <false outcome> 
Else 
    <unknown condition> 
End If 

die ungültige Syntax ist nur, weil ein GrundIf Anweisung True oder False zurückkehren kann.

Allerdings gibt es auch ElseIf, die mehrere boolesche Bedingungen angeben und unterschiedliche Ergebnisse zurückgeben können.

Das sieht so aus;

If <boolean condition> Then 
    <true outcome> 
ElseIf <boolean condition> Then 
    <true outcome> 
ElseIf <boolean condition> Then 
    <true outcome> 
Else 
    <false outcome> 
End If 

Basierend auf, wie Sie die If Aussagen nisten der Code in Frage wie diese neu geschrieben werden könnte;

Randomize 
value = Int((150 * Rnd + 1) * Rnd + lowerbound) 
guess = InputBox("guess the number", "guess", "guess here") 

If guess = value Then 
    Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess") 
    WScript.Quit 
ElseIf guess < value Then 
    Call MsgBox("too low", vbOKOnly + vbQuestion + vbSystemModal, "guess") 
    once = 1 
Else 
    Call MsgBox("too high", vbOKOnly + vbQuestion + vbSystemModal, "guess") 
End if 
once = 1 
Do 
    guess = InputBox("try again", "guess", "guess here") 
    If guess = value Then 
    Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess") 
    ElseIf guess < value then 
    Call MsgBox("too low", vbOKOnly + vbQuestion + vbSystemModal, "guess") 
    Else 
    Call MsgBox("too high", vbOKOnly + vbQuestion + vbSystemModal, "guess") 
    End If 
Loop 

Paar Dinge über das Beispiel oben

  1. Ersetzt die + mit = in der Linie

    guess+inputbox("guess the number","guess","guess here") 
    

    zu beachten, da es nicht das Ergebnis der InputBox()-guess zuweisen Ich gehe davon aus, dass du es tust. Wenn Sie das Ergebnis von InputBox()-guess zu verketten versuchen, das würde immer noch nicht funktionieren werden Sie

    guess = guess + InputBox("guess the number", "guess", "guess here") 
    

    verwenden, wenn dies der Fall ist, obwohl ich persönlich bevorzuge & über + für String-Verkettung zu verwenden.

  2. Die Klammern in MsgBox() scheinen etwas seltsam zu sein, normalerweise würden Sie MsgBox() ohne Klammern aufrufen, wenn das Ergebnis nicht zu einer Variablen wie diesem zurückgibt;

    MsgBox "correct", vbOKOnly + vbInformation + vbSystemModal, "guess" 
    

    aber wenn man die Klammern enthalten wollte (wie ich tun bevorzugen) Sie nur Call wie diese

    Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess") 
    

    , die die gefürchtete

    Microsoft VBScript compilation error: Cannot use parentheses when calling a Sub

    vermeidet verwenden können Die Funktion kann jedoch immer noch mit Klammern umgeben werden, wenn kein Wert zurückgegeben wird.

  3. Sie haben vielleicht auch bemerkt, dass ich die hartcodierten numerischen Werte in MsgBox() durch die Named Constants ersetzt habe, die für andere leichter zu lesen und ihre Bedeutung zu interpretieren ist. Sie sind auch in VBScript hart gekocht, also gibt es keine Entschuldigung dafür, sie nicht zu benutzen.


Denken über das, was Sie zu tun, dachte ich versucht, konnte erneut Faktor der Code ein wenig zu hoffnungsvoll, wie Sie

Dim value, guess, msg, once 
Randomize 
value = Int((150 * Rnd + 1) * Rnd + lowerbound) 

Do 
    If once = 0 Then 
    msg = "guess the number" 
    Else 
    msg = "try again" 
    End If 
    guess = CInt(InputBox(msg, "guess", "guess here")) 
    If guess = value Then 
    Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess") 
    WScript.Quit 
    ElseIf guess < value then 
    Call MsgBox("too low", vbOKOnly + vbQuestion + vbSystemModal, "guess") 
    once = 1 
    Else 
    Call MsgBox("too high", vbOKOnly + vbQuestion + vbSystemModal, "guess") 
    once = 1 
    End If 
Loop 

Dinge von diesem nehmen erwartet funktioniert;

  1. Wir brauchen nur die eine InputBox() innerhalb der Schleife sowohl die erste anfängliche Schätzung und die nachfolgenden „versuchen Sie es erneut“ Versuche zu behandeln. Dies bedeutet, dass wir das gleiche Stück Code nicht erneut duplizieren, siehe DRY Principle.

  2. InputBox() gibt einen String zurück, also versuchte der Code zuerst, einen String-Wert mit einem Integer-Wert zu vergleichen, der alle möglichen seltsamen Ergebnisse liefert. Wenn der Vergleich mit CInt() in Ganzzahl erfolgt, beginnt der Vergleich wie erwartet zu funktionieren.

Verwandte Themen