none
VBScript - If Than ... ElseIf RRS feed

  • Pergunta

  • Pessoal,

    Eu estou iniciando em VBScript e acompanhando a coluna Sesame Script. No tópico sobre If Then (Make a decision) eu tentei acompanhar os scripts de exemplo e me deparei com uma situação estranha, conforme abaixo.

    Quando eu executo o código abaixo ocorre um erro na comparação das varáveis A e B.

    wscript.stdout.writeblanklines 1
    
    wscript.stdout.write "Digite um número A: "
    A = wscript.stdin.readline
    
    wscript.stdout.write "Digite um número B: "
    B = wscript.stdin.readline
    
    wscript.stdout.writeblanklines 1
    wscript.echo A
    wscript.echo B
    wscript.stdout.writeblanklines 1
    
    If A > B Then
        Wscript.Echo "A is greater than B"
    ElseIf A = B Then
        Wscript.Echo "A is equal to B"
    Else
        Wscript.Echo "A is less than B"
    End If
    
    	
    wscript.stdout.writeblanklines 1

    ERRO:

    Digite um número A: 2
    Digite um número B: 10
    
    2
    10
    
    A is greater than B
    

    O resultado da comparação entre A e B está errado. Nesta comparação, é como se o If estivesse caindo somente na primeira declaração, quando, na verdade, ele deveria cair no Else.

    Eu percebi que esse erro ocorre em qualquer número B que comece com 1.

    O mesmo erro também ocorre quando eu inverto os números, ou seja, quando o número A começa com 1.

    Digite um número A: 17
    Digite um número B: 5
    
    17
    5
    
    A is less than B
    Ainda não consegui entender o porquê deste problema. Alguém pode me dar uma dica? Obrigado.
    quarta-feira, 20 de abril de 2016 14:07

Respostas

  • Pesquisando eu encontrei algumas referências às variáveis do VBScript e tirei algumas conclusões.

    O VBScript utiliza variáveis Variant, que basicamente recebem qualquer valor. Esses valores são interpretados de acordo com o contexto em que são utilizados.

    Eu atribui valores às variáveis a partir do Stdin.Readline, logo, a variável foi transformada em string, apesar dela ser numérica. Dessa maneira, na hora em que A e B são comparados, imagino que o WSH do Win transforma o primeiro caractere em ANSI e, então, compara qual o maior caractere. Como o valor foi convertido em ANSI o resultado sai errado.

    Para resolver este problema precisei transformar as variáveis em numéricas utilizando uma das formas abaixo.

    A = A + 0 : B = B + 0

    ou

    A = cint(A) : B = cint(B)

    No primeiro caso, ao realizar uma soma com o valor de A, ele é interpretado como numérico e transformado em Double (número fracionário).

    Já no segundo caso, achei esta função que converte o valor da variável em inteiro e ainda arredonda o valor.

     

    O novo código ficou assim:

    Option Explicit  ' Força a declaração de todas variáveis
    dim A,B
    
    wscript.stdout.writeblanklines 1
    
    wscript.stdout.write "Digite um número A: "
    A = wscript.stdin.readline
    
    wscript.stdout.write "Digite um número B: "
    B = wscript.stdin.readline
    
    'A = A + 0
    'B = B + 0
    A=cint(A)
    B=cint(B)
    
    ' Vizualização de valores
    wscript.stdout.writeblanklines 1  
    wscript.echo A & " - " & vartype(A)
    wscript.echo B & " - " & vartype(B)
    wscript.stdout.writeblanklines 1
    
    If A > B Then
        Wscript.Echo "A MAIOR que B"
    ElseIf A = B Then
        Wscript.Echo "A IGUAL a B"
    Else
        Wscript.Echo "A MENOR que B"
    End If
    
    wscript.stdout.writeblanklines 1

    Referências:

    • https://msdn.microsoft.com/en-us/subscriptions/9e7a57cf(v=vs.84).aspx
    • https://msdn.microsoft.com/en-us/subscriptions/3kfz157h(v=vs.84).aspx
    • https://msdn.microsoft.com/en-us/subscriptions/fctcwhw9(v=vs.84).aspx
    • https://msdn.microsoft.com/en-us/library/t7zd6etz(vs.85).aspx
    • Editado Diasdm terça-feira, 26 de abril de 2016 04:13
    • Marcado como Resposta Diasdm terça-feira, 26 de abril de 2016 04:15
    terça-feira, 26 de abril de 2016 04:10