Microsoft Small Basic

Program Listing: SZM205-1
'======================================================================================='
' 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

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