Ir para conteúdo

Resolutor De Equações


Oneshot

Posts Recomendados


 

 

Me pediram por mensagem pessoal, uma talkaction que resolvesse strings de equações de primeiro grau. Fiz um pog interessante e ela está funcionando bem legal.

 


10:28 1x+3x+4x+88 = 0
10:28 8x = -88
10:28 x = -11

 


 

1. Crie um arquivo de nome calc.lua em talkactions/scripts, cole o conteúdo abaixo:

 

 


local delay = 500

function onSay(cid, words, param, channel)
local a = 0
local b = 0
local c = 0

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, param .." = 0")

for s, x2 in string.gmatch(param, "([-+]*)%s*(%d+)x²") do
	param = string.gsub(param, "[-+]*%s*%d+x²", "")
	a = a + tonumber(s .. x2)
end

for s, x in string.gmatch(param, "([-+]*)%s*(%d+)x") do
	param = string.gsub(param, "[-+]*%s*%d+x", "")
	b = b + tonumber(s .. x)
end

for s, n in string.gmatch(param, "([-+]*)%s*(%d+)") do
	c = c + tonumber(s .. n)
end

if param == "" then
	return doPlayerSendCancel(cid, "O comando precisa de uma equação válida.")
end

addEvent(doPlayerSendTextMessage, delay, cid, MESSAGE_STATUS_CONSOLE_RED, "1. Detectar o grau da equação.")
if a > 0 then
	local delta = (math.pow(b, 2) - (4 * a * c))
	local x1, x2
	if delta >= 0 then
		x1 = ((-b - math.sqrt(delta)) / 2 * a)
		x2 = ((-b + math.sqrt(delta)) / 2 * a)
	end

	addEvent(doPlayerSendTextMessage, 2 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "Essa é uma equação de segundo grau.")
	addEvent(doPlayerSendTextMessage, 3 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "2. Organizar a equação.")
	addEvent(doPlayerSendTextMessage, 4 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "".. a .."x²".. (b < 0 and (" - ".. (b * -1)) or (" + ".. b)) .."x".. (c < 0 and (" - ".. (c * -1)) or (" + ".. c)) .." = 0")
	addEvent(doPlayerSendTextMessage, 5 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "2. Calcular o discriminante da equação.")
	addEvent(doPlayerSendTextMessage, 6 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "D = b² - 4ac = ".. delta .."")
	if delta < 0 then
		addEvent(doPlayerSendTextMessage, 7 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "O discriminante é menor que 0, a equação não possui raízes reais.")
		return true
	elseif delta == 0 then
		addEvent(doPlayerSendTextMessage, 7 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "O discriminante é igual a 0, a equação possui duas raízes iguais.")
		addEvent(doPlayerSendTextMessage, 8 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "X¹ = X² = -b / 2 * a = ".. x1 .."")
		return true
	else
		addEvent(doPlayerSendTextMessage, 7 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "O discriminante é maior que 0, a equação possui duas raízes diferentes.")
		addEvent(doPlayerSendTextMessage, 8 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "X = (-b - ²D) / 2 * a = ".. x1 .."")
		addEvent(doPlayerSendTextMessage, 9 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "X² = (-b + ²D) / 2 * a = ".. x2 .."")
		return true
	end
	addEvent(doPlayerSendTextMessage, 10 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "Fácil, né?")
elseif b > 0 then
	local x = -c/b
	addEvent(doPlayerSendTextMessage, 2 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "Essa é uma equação de primeiro grau.")
	addEvent(doPlayerSendTextMessage, 3 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "2. Organizar a equação.")
	addEvent(doPlayerSendTextMessage, 4 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "".. b .."x".. (c < 0 and (" - ".. (c * -1)) or (" + ".. c)) .." = 0")
	addEvent(doPlayerSendTextMessage, 5 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "3. Passe o que não está multiplicando x para o outro lado.")
	addEvent(doPlayerSendTextMessage, 6 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "".. b .."x = ".. -c .."")
	addEvent(doPlayerSendTextMessage, 7 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "4. Passe o que está multiplicando x para outro lado, dividindo.")
	addEvent(doPlayerSendTextMessage, 8 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "x = ".. x .."")
	addEvent(doPlayerSendTextMessage, 9 * delay, cid, MESSAGE_STATUS_CONSOLE_RED, "Facil, né?")
else
	addEvent(doPlayerSendTextMessage, 2 * delay, cid, MESSAGE_STATUS_CONSOLE_BLUE, "Essa não é uma equação válida.")
end
return true
end

 

2. Adicione a seguinte linha no seu talkactions.xml

 

<talkaction words="/calc" event="script" value="calc.lua"/>

 

Bugs conhecidos

 

- Você precisa colocar todos os coeficientes, mesmo que seja 1, do contrário o burro sistema não consegue resolver.

- Se você embaralhar muito a equação, talvez ocorra algum erro, por exemplo:

 

1x + 44 + 32 - 1x + 2x + 44 - 2x + 3x - 32 + 1x

 


 

Abraços.

Editado por Oneshot
Link para o comentário
Compartilhar em outros sites

Criei um novo resolutor de equações, agora ele detecta o grau da equação e ensina a resolver por passos.

 

Para resolver equações do segundo grau:

 

/calc 3x²-27

 

Lembrando que tudo é muito robótico, então, ele vai calcular até o fim, e se a raiz do discriminante for quebrada, ele dará raízes do tipo:

 

-5.23123451241290439214
+3.21312309129492149

 

Abraços.

Editado por Oneshot
Link para o comentário
Compartilhar em outros sites

Ficou bem interessante, acho que o dalvo tava fazendo algo assim tempos atras, mas acho que ele não terminou. Realmente bem feito, eu deveria ter pensado nisso e criado um aplicativo para o celular quando eu estava na escola...

 

Eu realmente odeio patterns, de todo o meu coração.

Link para o comentário
Compartilhar em outros sites

Bugs conhecidos

 

- Você precisa colocar todos os coeficientes, mesmo que seja 1, do contrário o burro sistema não consegue resolver.

 

quem cria o sistema que tem que tirar a burrice dele não? happy.png

Editado por milbradt
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...