Microsoft Small Basic

Program Listing:
Embed this in your website
'======================================================================================='
' Programmer: GoToLoop '
' Software: Equação do 2º Grau '
' Version: 2.4 '
' Import: SZM205-1 '
' Date: 2012/Jun/12 (2011/Oct/05) '
' Variables: coefs[], a, b, c, Δ, ΔRaiz, x, x[], ι, índice, tecla, equação, Valor, Dec '
'======================================================================================='

' Depende do objeto LDGraph da extensão do LitDev
' Baixar em -> http://litdev.hostoi.com/

'---------------------------------------------------------------------------------------------------------------------'
' Inicialização das constantes pra caracteres especiais de controle em código ASCII: '
'---------------------------------------------------------------------------------------------------------------------'

BEL= Text.GetCharacter (7) ' Produz um beep pelo PC-Speaker interno
BS= Text.GetCharacter  (8) ' Backspace (Volta 1 posição prá esquerda)
TAB= Text.GetCharacter (9) ' Tabulação Horizontal (HT)
LF= Text.GetCharacter  (10) ' Line-Feed (Pula-Linha)
CR= Text.GetCharacter  (13) ' Retorno de Carro (Volta ao início da linha)
ESC= Text.GetCharacter (27) ' Tecla "Esc"
TRI= Text.GetCharacter (30) ' Triângulo
SETA= Text.GetCharacter (187) ' Flecha prá direita
SPC= " "    ' Espaço em Branco (SPaCe)

'---------------------------------------------------------------------------------------------------------------------'
' Outros procedimentos de inicialização: '
'---------------------------------------------------------------------------------------------------------------------'

TextWindow.Title= "Cálculo de Função Quadrática
TextWindow.Left= 0
TextWindow.Top=  250
CorFundo= "Black
TextWindow.BackgroundColor= CorFundo

Dec= 4                              ' Máx. de casas decimais pros resultados
Plotar= "True"                      ' Ativa a exibição gráfica da equação

If Program.ArgumentCount > 0 Then ' Checa se algum argumento foi passado pela Interface de Comando de Linha (CLI)
  Argumentos()    ' Inicializa a variável coeficientes[] com o conteúdo dos argumentos
  Goto Pula_ABC   ' Pula a 1ª subrotina ABC(), já q serão usados os argumentos provindos da CLI
EndIf

'---------------------------------------------------------------------------------------------------------------------'
' Ponto de partida do laço do programa: '
'---------------------------------------------------------------------------------------------------------------------'

Laço:
TextWindow.Clear()   ' Limpa a janela de textos
ABC()     ' Requisita q/ o usuário digite 3 valores pra atribuir-lhes os coeficientes a, b & c

Pula_ABC:
Espelhar_Coeficientes()  ' Transfere os 3 elementos do conjunto coeficientes[] prás variáveis a, b & c
Criar_Equação()   ' Cria a expressão pra exibição q/ representa os coeficientes a, b & c
Exibir_Equação()   ' Exibe em forma de equação quadrática os valores obtidos dos coeficientes

If a = 0 And b = 0 Then  ' Equação sem raízes!
  Resultado_Ø()
  Goto Fim
EndIf

If a = 0 Then    ' Equação de 1º grau!
  Calcular_Linear()
  Resultado_Linear()
  Goto Fim
EndIf

' Se o programa chegou até aqui, temos certeza q a ≠ 0, e a função é de 2º grau >;-)

Calcular_Δ()    ' Obter a discriminante delta e também a sua raiz quadrada
Resultado_Δ()

If Δ < 0 Then    ' Equação com raízes complexas!
  Calcular_Complexo()
  Resultado_Complexo()
Else     ' Equação com raízes reais!
  Calcular_Quadrático()
  Resultado_Quadrático()
EndIf

Fim:
If Plotar Then
  Fazer_Gráfico()                   ' Cria e exibe o gráfico da equação com os valores dos coeficientes
EndIf

Encerrar()    ' Perguntar se o usuário deseja calcular outra raiz de 2º grau :-D
Goto Laço    ' Volta ao início do laço, caso positivo ^_^


'==================================================================================================='
' Subrotinas Compartimentalizadas do Programa '
'==================================================================================================='


Sub Encerrar
  ' Encerrar o programa se a tecla 'Q' ou 'Esc' for pressionada:

  TextWindow.ForegroundColor= "DarkMagenta
  TextWindow.WriteLine (LF + "Pressione 'Q' ou 'Esc' pra encerrar ou qualquer outra pra reiniciar...")

  tecla= Text.ConvertToUpperCase ( TextWindow.ReadKey() )
  If tecla = "Q" Or tecla = ESC Then
    Program.End()
  EndIf

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Arredondar
  ' Arredonda Valor pra Dec casas decimais:

  Valor= Math.Round( Valor * Math.Power(10, Dec) ) / Math.Power(10, Dec)

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Argumentos
  ' Obtem os 3 primeiros argumentos usados ao rodar o programa
  ' e armazena-os na variável conjunto coefs[], representando os valores de a, b & c :

  For índice= 1 To 3
    coefs[índice]= Math.Power( Program.GetArgument(índice), 1 ) ' Eleva-se a 1 pra sanitizar os valores!
  EndFor

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub ABC
  ' Requisitar os valores de a, b & c do usuário:

  TextWindow.ForegroundColor= "Red
  TextWindow.WriteLine ("Digite os valores de A, B & C prá equação do 2º grau:")
  TextWindow.ForegroundColor= "Magenta
  TextWindow.WriteLine ("Modelo -> ax² + bx + c = 0" + LF)

  For índice= 97 To 99     ' Seqüência em ASCII correspondentes às letras "a", "b" e "c"
    TextWindow.ForegroundColor= "Yellow
    TextWindow.Write ( "Valor de " + Text.GetCharacter(índice) + ": " )
    TextWindow.ForegroundColor= "White
    TextWindow.BackgroundColor= "DarkYellow
    coefs[índice - 96]= Math.Power( TextWindow.ReadNumber(), 1 ) ' Sanitiza e armazena o № digitado em coefs[]
    TextWindow.BackgroundColor= CorFundo
  EndFor

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Espelhar_Coeficientes
  ' Espelha os 3 valores armazenados em coeficientes[] prás variáveis a, b & c
  ' por motivos de estética e clareza de código, nas partes q calculam as raízes da equação:

  a= coefs[1]  ' Coeficiente Quadrático "a"
  b= coefs[2]  ' Coeficiente Linear "b"
  c= coefs[3]  ' Termo Constante "c"

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Criar_Equação
  ' Cria um cordão alfanumérico representando a equação com os respectivos valores de a, b & c:

  equação= "f(x) " + "-> "     ' Início da formação da variável alfanumérica "equação"

  ' Coeficiente Quadrático "a":
  ' ======================
  If a <> 0 Then   ' Somente os termos com coeficientes ≠ 0 serão exibidos!

    If a <> 1 And a <> -1 Then ' Condição impede de imprimir os №s 1 e -1 na frente da variável x²!
      equação= equação + a
    ElseIf a = -1 Then  ' No caso do -1, apenas o sinal negativo é acrescentado
      equação= equação + "-
    EndIf

    equação= equação + "x² "

  EndIf
  '-------------------------------------------------

  ' Coeficiente Linear "b":
  '======================
  If b <> 0 Then   ' Somente os termos com coeficientes ≠ 0 serão exibidos!

    If b < 0 Then
      equação= equação + "- "
      If a = 0 Then
        equação= equação + BS  ' Se o coeficiente quadrático for nulo, faz com q o sinal negativo fique
      EndIf    'colado à variável linear x, ao acrescentar um deslocamento prá esquerda

    ElseIf a <> 0 Then  ' ( a ≠ 0 & b > 0 )
      equação= equação + "+ "
    EndIf

    If b <> 1 And b <> -1 Then ' Condição impede de imprimir os №s 1 e -1 na frente da variável x!
      equação= equação + Math.Abs(b)
    EndIf

    equação= equação + "x "

  EndIf
  '--------------------------------------------------

  ' Termo Constante "c":
  '======================
  If a = 0 And b = 0 Then  ' Se ambos os x da equação forem nulos,
    equação= equação + c + SPC 'imprima o termo constante "c" sem qualquer alteração

  ElseIf c <> 0 Then   ' Caso contrário, adiciona um sinal antes de imprimi-lo se c ñ for nulo

    If c < 0 Then   ' ( a ≠ 0 | b ≠ 0 ) & c < 0 c é negativo
      equação= equação + "- "
    Else    ' ( a ≠ 0 | b ≠ 0 ) & c > 0 c é positivo
      equação= equação + "+ "
    EndIf

    equação= equação + Math.Abs(c) + SPC

  EndIf
  '--------------------------------------------------

  equação= equação + "= 0"          ' Fechamento da "equação"

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Exibir_Equação
  ' Exibir a equação pronta:

  TextWindow.ForegroundColor= "White
  TextWindow.BackgroundColor= "DarkGray
  TextWindow.WriteLine( LF + equação + LF )
  TextWindow.BackgroundColor= CorFundo

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Resultado_Ø
  ' As 2 variáveis x possuem coeficientes nulos:

  TextWindow.ForegroundColor= "DarkRed
  TextWindow.WriteLine ("Tanto os coeficientes quadrático 'a' e linear 'b' são = 0" + BEL)
  TextWindow.WriteLine ("Portanto, as variáveis x são nulas, ñ existindo raiz alguma pra calcular!")

  x[1]= 0
  x[2]= 0

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Calcular_Linear
  ' Raiz x de Equação Linear, pois o termo quadrático a = 0:

  Valor= -c/b
  Arredondar()
  x[1]= Valor
  x[2]= x[1]

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Resultado_Linear
  ' Exibir a raiz da equação linear:

  TextWindow.ForegroundColor= "Green
  TextWindow.WriteLine ("Esta equação é linear com raiz |R x = " + x[1])

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Calcular_Δ
  ' Calcular o valor da discriminante Δ e também o resultado da sua √ :

  Δ= b*b - 4*a*c    ' Expressão Discriminante "Δ"
  ΔRaiz= Math.SquareRoot ( Math.Abs(Δ) ) ' √ |Δ|

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Resultado_Δ
  ' Exibir o valor de Δ:

  TextWindow.ForegroundColor= "White
  TextWindow.BackgroundColor= "Blue
  TextWindow.WriteLine (TRI + " = " + Δ + LF)
  TextWindow.BackgroundColor= CorFundo

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Calcular_Quadrático
  ' Calcular as raízes reais X1 & X2 pela fórmula de Bhaskara Akaria:

  Valor= ( -b + ΔRaiz ) / (2*a)
  Arredondar()
  x[1]=  Valor

  Valor= ( -b - ΔRaiz ) / (2*a)
  Arredondar()
  x[2]=  Valor

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Resultado_Quadrático
  ' Exibir o resultado das raízes da equação quadrática:

  TextWindow.ForegroundColor= "Green

  If Δ = 0 Then

    TextWindow.WriteLine ("Esta equação possui 1 única raiz |R sendo que x = " + x[1])

  Else  ' ( Δ > 0 )

    TextWindow.WriteLine ("Esta equação possui 2 raízes |R e distintas:" + LF)
    TextWindow.ForegroundColor= "Cyan

    For índice= 1 To 2
      TextWindow.Write( TAB + "x" + índice + " = " )

      If x[índice] > 0 Then
        TextWindow.Write("+")
      EndIf

      TextWindow.WriteLine( x[índice] )
    EndFor

  EndIf

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Calcular_Complexo
  ' Calcular o conjugado |C com a parte |R em x e a parte |I em ι (iota):

  Valor= -b / (2*a)
  Arredondar()
  x[1]=  Valor
  x[2]=  x[1]

  Valor= ΔRaiz / (2*a)
  Arredondar()
  ι= Valor

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Resultado_Complexo
  ' Exibir o conjugado complexo no modelo z = x ± ι, sendo ι = √ -1 :

  TextWindow.ForegroundColor= "Green
  TextWindow.WriteLine ("Esta equação possui 2 raízes complexas conjugadas")
  TextWindow.WriteLine ("sendo 1 parte em real e 2 imaginárias:" + LF)

  TextWindow.ForegroundColor= "Cyan
  TextWindow.WriteLine ( " x = " + x[1] + " ± i( " + ι + " )" )

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'

Sub Fazer_Gráfico
  ' Cria e exibe gráfico da equação:
  ' Dependência: LDGraph da extensão do LitDev

  gw= 500
  gh= 500
  GraphicsWindow.Width=  gw
  GraphicsWindow.Height= gh
  GraphicsWindow.Left=   700
  GraphicsWindow.Top=    50

  GraphicsWindow.BackgroundColor= "Khaki
  GraphicsWindow.Title= equação + " " + SETA + " " + x[1] + " , " + x[2]
  GraphicsWindow.Clear()

  xMin= -100
  xMax=  100
  Δx= 1

  For x= xMin To xMax Step Δx
    f[x]= a*x*x + b*x + c
  EndFor

  gráfico= LDGraph.AddGraph( 0,0  gw,gh  "Quadrático", "x", "f(x)" )

  LDGraph.AddSeriesLine( gráfico, equação, f, "Red" )

EndSub

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------'
Copyright (c) Microsoft Corporation. All rights reserved.