Ecuaciones de 2º grado by Odraude

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Odraude
Mensajes: 6
Registrado: 04 Mar 2010, 17:44

Ecuaciones de 2º grado by Odraude

Mensaje por Odraude »

Programa para resolver ecuaciones de 2º grado

Simple programa creado por mi.
En futuras versiones lo que me gustaría hacer es que cuando se pasara el ratón sobre realizar, acerca de... se pusiera de otro color (si alguien sabe como se hace que lo diga).

Código: Seleccionar todo

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Comment=Programa para resolver ecuaciones de 2º grado
#AutoIt3Wrapper_Res_Description=Programa para resolver ecuaciones de 2º grado
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=© 2009-2010 Odraude
#AutoIt3Wrapper_Res_Language=1034
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;Sin icono en barra de tareas

;Incluyo el achivo GUIConstants.au3
#include <GUIConstants.au3>
;Incluyo el achivo EditConstants.au3
#include <EditConstants.au3>
;Incluyo el achivo StaticConstants.au3
#include <StaticConstants.au3>
;Incluyo el achivo WindowsConstants.au3
#include <WindowsConstants.au3>

;Formulario
$Form1 = GUICreate("Resolver ecuaciones de 2º grado", 298, 226, -1, -1, $WS_POPUP)
GUISetBkColor(0x000000)
;Cajas de texto
$Input1 = GUICtrlCreateInput("", 136, 32, 145, 21)
GUICtrlSetTip(-1, "Introduzca el valor de a")
$Input2 = GUICtrlCreateInput("", 136, 56, 145, 21)
GUICtrlSetTip(-1, "Introduzca el valor de b")
$Input3 = GUICtrlCreateInput("", 136, 80, 145, 21)
GUICtrlSetTip(-1, "Introduzca el valor de c")
GUICtrlCreateLabel("a:", 112, 32, 20, 17)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetTip(-1, "Valor de a")
GUICtrlCreateLabel("b:", 112, 56, 20, 17)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetTip(-1, "Valor de b")
GUICtrlCreateLabel("c:", 112, 80, 20, 17)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetTip(-1, "Valor de c")
$Label1 = GUICtrlCreateLabel("Resolver ecuaciones de 2º grado por Odraude", 4, 194, 290, 17, $ss_center)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
$Realizar = GUICtrlCreateLabel("Realizar", 8, 32, 77, 20)
GUICtrlSetFont(-1, 12, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetCursor(-1, 0)
$Borrar_todo = GUICtrlCreateLabel("Borrar todo", 8, 64, 69, 33)
GUICtrlSetFont(-1, 12, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetCursor(-1, 0)
$Acerca_de = GUICtrlCreateLabel("Acerca de", 8, 112, 69, 33)
GUICtrlSetFont(-1, 12, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetCursor(-1, 0)
$Salir = GUICtrlCreateLabel("Salir", 8, 160, 45, 20)
GUICtrlSetFont(-1, 12, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetCursor(-1, 0)
$Input4 = GUICtrlCreateInput("", 136, 136, 145, 21)
GUICtrlSetTip(-1, "Solución de x1")
$Input5 = GUICtrlCreateInput("", 136, 160, 145, 21)
GUICtrlSetTip(-1, "Solución de x2")
GUICtrlCreateLabel("x1:", 112, 136, 20, 17)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetTip(-1, "Solución de x1")
GUICtrlCreateLabel("x2:", 112, 160, 20, 17)
GUICtrlSetFont(-1, 8, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetTip(-1, "Solución de x2")
$Label6 = GUICtrlCreateLabel("Soluciones", 168, 112, 75, 20)
GUICtrlSetFont(-1, 10, 800, 2, "Verdana")
GUICtrlSetColor(-1, 0xFFFFFF)
$X_icon = GUICtrlCreateIcon("Shell32.dll", -132, 277, 4, 16, 16)
GUICtrlSetTip(-1, "Salir")
GUICtrlSetCursor(-1, 0)
$minimize_icon = GUICtrlCreateLabel("_", 257, -3, 16, 32)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xB00000)
GUICtrlSetTip(-1, "Minimizar")
GUICtrlSetCursor(-1, 0)
;$Mover = GUICtrlCreateLabel("", 0, 0, 252, 25)
$Mover = GUICtrlCreateLabel("", 0, 0, 298, 226)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

_WinAnimate($Form1, 0x00040010)

;Estado del formulario = Mostrar
GUISetState(@SW_SHOW)

;Comienzan las acciones de selección por caso
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		;Caso si el formulario se cierra, salir
		Case $GUI_EVENT_CLOSE, $Salir, $X_icon
			_WinAnimate($Form1, 0x00050010)
			Exit
		Case $minimize_icon
			GUISetState(@SW_MINIMIZE, $Form1)
		Case $Mover
			DllCall("user32.dll", "int", "SendMessage", "hWnd", $Form1, "int", 0xA1, "int", 2, "int", 0)			
		Case $Realizar
			If GUICtrlRead($Input1) = "" Then
				_Mensaje("Error", "Primero introduzca el valor de a.")
			ElseIf GUICtrlRead($Input2) = "" Then
				_Mensaje("Error", "Primero introduzca el valor de b.")
			ElseIf GUICtrlRead($Input3) = "" Then
				_Mensaje("Error", "Primero introduzca el valor de c.")
			ElseIf  GUICtrlRead($Input2) * GUICtrlRead($Input2) - 4 * GUICtrlRead($Input1) * GUICtrlRead($Input3) < 0 Then
				_Mensaje("Error", "La ecuación no tiene solución.")
			Else
				GUICtrlSetData($Input4, (-GUICtrlRead($Input2) + Sqrt(GUICtrlRead($Input2) * GUICtrlRead($Input2) - 4 * GUICtrlRead($Input1) * GUICtrlRead($Input3))) / 2 * GUICtrlRead($Input1))
				GUICtrlSetData($Input5, (-GUICtrlRead($Input2) - Sqrt(GUICtrlRead($Input2) * GUICtrlRead($Input2) - 4 * GUICtrlRead($Input1) * GUICtrlRead($Input3))) / 2 * GUICtrlRead($Input1))
			EndIf
			
		Case $Borrar_todo
			If GUICtrlRead($Input1) = "" And GUICtrlRead($Input2) = "" And GUICtrlRead($Input3) = "" And GUICtrlRead($Input4) = "" And GUICtrlRead($Input5) = "" Then
				_Mensaje("Atención", "Las cajas se encuentran vacías.")
			Else
				GUICtrlSetData($Input1, "")
				GUICtrlSetData($Input2, "")
				GUICtrlSetData($Input3, "")
				GUICtrlSetData($Input4, "")
				GUICtrlSetData($Input5, "")
			EndIf
			
		Case $Acerca_de
			GUISetState(@SW_DISABLE, $Form1)
			$Form3 = GUICreate("Resolver ecuaciones de 2º grado", 408, 160, -1, -1, $WS_POPUP)
			GUISetBkColor(0x000000)
			$Salir2 = GUICtrlCreateLabel("Salir", 181, 128, 45, 25, $ss_center)
			GUICtrlSetFont(-1, 12, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFF0000)
			GUICtrlSetCursor(-1, 0)
			$Label6 = GUICtrlCreateLabel("© Copyright 2009-2010. Todos los derechos reservados.", 54, 96, 299, 20, $ss_center)
			GUICtrlSetFont(-1, 7, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFFFFFF)
			$Label1 = GUICtrlCreateLabel("Nombre:", 8, 16, 67, 20)
			GUICtrlSetFont(-1, 10, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFFFFFF)
			$Label2 = GUICtrlCreateLabel("Autor:", 8, 40, 67, 20)
			GUICtrlSetFont(-1, 10, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFFFFFF)
			$Label3 = GUICtrlCreateLabel("Versión:", 8, 64, 67, 20)
			GUICtrlSetFont(-1, 10, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFFFFFF)
			$Label4 = GUICtrlCreateLabel("Programa para resolver ecuaciones de 2ª grado", 80, 18, 323, 20)
			GUICtrlSetFont(-1, 9, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFFFFFF)
			$Label5 = GUICtrlCreateLabel("Odraude", 80, 42, 67, 20)
			GUICtrlSetFont(-1, 9, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFFFFFF)
			$Label7 = GUICtrlCreateLabel("1.0", 80, 67, 43, 20)
			GUICtrlSetFont(-1, 9, 800, 2, "Verdana")
			GUICtrlSetColor(-1, 0xFFFFFF)
			$Mover2 = GUICtrlCreateLabel("", 0, 0, 408, 160)
			GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
			GUISetState(@SW_SHOW, $Form3)
			Do
				$nMsg = GUIGetMsg()
				If $Mover2 Then
					DllCall("user32.dll", "int", "SendMessage", "hWnd", $Form3, "int", 0xA1, "int", 2, "int", 0)
				EndIf
			Until $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $Salir2
			GUISetState(@SW_ENABLE, $Form1)
			GUIDelete($Form3)
	EndSwitch
WEnd


Func _Mensaje($titulo, $texto)
	GUISetState(@SW_DISABLE, $Form1)
	$Form2 = GUICreate($titulo, 255, 81, -1, -1, $WS_POPUP)
	GUISetBkColor(0x000000)
	$Salir1 = GUICtrlCreateLabel("Salir", 102, 48, 45, 25, $ss_center)
	GUICtrlSetFont(-1, 12, 800, 2, "Verdana")
	GUICtrlSetColor(-1, 0xFF0000)
	GUICtrlSetCursor(-1, 0)
	$Label6 = GUICtrlCreateLabel($texto, 6, 16, 243, 20, $ss_center)
	GUICtrlSetFont(-1, 10, 800, 2, "Verdana")
	GUICtrlSetColor(-1, 0xFFFFFF)
	$Mover2 = GUICtrlCreateLabel("", 0, 0, 280, 139)
	GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
	GUISetState(@SW_SHOW, $Form2)
	Do
		$nMsg = GUIGetMsg()
		If $Mover2 Then
			DllCall("user32.dll", "int", "SendMessage", "hWnd", $Form2, "int", 0xA1, "int", 2, "int", 0)
		EndIf
		;if $nMsg = $Mover2 Then dllcall("user32.dll","int","SendMessage","hWnd", $Form1,"int",0xA1,"int", 2,"int", 0)
	Until $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $Salir1
	GUISetState(@SW_ENABLE, $Form1)
	GUIDelete($Form2)
EndFunc   ;==>_Mensaje

Func _WinAnimate($h_gui, $i_mode, $i_duration = 1000)
	If @OSVersion = "WIN_XP" Or @OSVersion = "WIN_2000" Or @OSVersion = "WIN_VISTA" Then
		DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_gui, "int", $i_duration, "long", $i_mode)
		Local $ai_gle = DllCall('kernel32.dll', 'int', 'GetLastError')
		If $ai_gle[0] <> 0 Then
			Return SetError(1, 0, 0)
		EndIf
		Return 1
	Else
		Return SetError(2, 0, 0)
	EndIf
EndFunc   ;==>_WinAnimate
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ecuaciones de 2º grado by Odraude

Mensaje por Ximorro »

¡Buen trabajo!

Sólo una tontería: está muy bien lo de documentar el código, pero eso de "Incluyo el achivo xxx.au3" te lo puedes ahorrar, hombre, creo que está bastante claro y no es necesario el comentario ;-)

Lo de mirar el control bajo el ratón lo puedes hacer mirando el evento $GUI_EVENT_MOUSEMOVE y ver qué control hay bajo el ratón con GUIGetCursorInfo. Esto devuelve un array de 5 elementos, el último (índice 4) te da el ID del control sobre el que está el ratón.

Eso va bien con ventanas hechas en AutoIT, por ampliar información hay otro método, que también funcionan con ventanas "de otros". Es con la función
_WinAPI_WindowFromPoint

Tal como trabaja esta función hay que tomar las coordenadas del ratón en una estructura, eso se hace con _WinAPI_GetMousePos
Así que se puede obtener el handle del control con:
$pos = _WinAPI_GetMousePos()
$hCtrl = _WinAPI_WindowFromPoint($pos)

Ambas están en la UDF "WinAPI.au3"
Es un poco engañoso porque lo de WindowFromPoint parece que sólo devuelva ventanas, pero no, es más genérico, devuelve controles.

Además de esas mejoras gráficas que estás pensando te propongo una funcional: devolver también las raíces complejas, en vez de dar el mensaje de que no hay soluciones.
Supongo que lo sabes, pero para ello si la ecuación es y = ax^2 + bx +c, cuando el b^2-4ac de la fórmula de resolución sea negativo, tienes las soluciones:
(-b/2a) + (sqrt(-b^2+4ac)/2a)i
(-b/2a) - (sqrt(-b^2+4ac)/2a)i
Siendo i = sqrt(-1) (sqrt es la raíz cuadrada)
Las formulitas son un churro al ponerlas en una línea, pero si las escribes en notación matemática verás que son bastante simlples, sencillamente el signo negativo de b^2-4ac se saca como el complejo i y se sigue calculando. Arriba uso -b^2+4ac porque eso es realmente b^2-4ac cambiado de signo.
Sería calcular -b/2a y sqrt(-b^2+4ac)/2a por separado
$real = -b/2a
$img = sqrt(-b^2+4ac)/2a

Y dar la solución como texto, en vez de número:
$sol1 = $real & "+" & $img & "i"
$sol2 = $real & "-" & $img & "i"


Bueno, si a es negativo creo que tendrás que hacer algo con los signos ;-)


Bueno, ya casi te lo he hecho ;-) Eso si no me he equivocado de hacerlo así en un txt, si se escribe en un papel se ve más claro...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder