Página 1 de 1

AUTODIVISOR...

Publicado: 28 Feb 2010, 01:58
por Charlie19
Hola a todos hoy les traigo un "comienzo" de un pequeño program para autodividir una cantidad. Pero me he quedado estancado y necesito ayuda!
Aqui les dejare el code:

Código: Seleccionar todo

$Input2 = GUICtrlCreateInput("", 208, 32, 121, 21)
$Button2 = GUICtrlCreateButton("CALCULA", 232, 64, 75, 25, $WS_GROUP)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button2
			_dec()
			GUICtrlDelete($Input2)
			Sleep(100)
			$Input2 = GUICtrlCreateInput("", 208, 32, 121, 21)
	EndSwitch
WEnd
Func _dec()
	$datos2 = GUICtrlRead($Input2)
		
	Select
		Case 
			If $datos2 = '2' Then
				$r0 = '0'
				$r1 = '1'
			ElseIf $datos2 = '3' Then
				$r0 = '1'
				$r1 = '1'
			ElseIf $datos2 = '1' Then
				$r0 = '1'
				$r1 = '0'
			Else
				$datos2 = $datos2 / 2
				StringSplit($datos2, ".")
				If @error Then
				$r[aqui el nº correspondiente] = '1'	
				Else

     $r[aqui el nº correspondiente] = '0'				
EndIf
			EndIf
; Pero todo esto lo ha de repetir hasta llegar a que $datos 2 sea o 1 o 2 o 3!! y podra finalizar
	EndSelect 
EndFunc
Mi problema esta en que no se como decirle si $datos2 contiene un "." ( es decimal la cifra) pon que el $r100 = 1 y si no ponme que $b100 = 0. Pero no solo una vez sino que si por ejemplo tengo el numero 15 haga...
15 / 2 = 7.5 ----> Aqui pondre un 1 porque hay un "."
Despues coja solo el 7 !! y haga
7 / 2 = 3,5 ----> Aqui pondre un 1 porque hay un "."
Despues coja solo el 3 !! y haga
3 / 2 = 1.5 ----> Aqui pondre un 1 porque hay un "."
Ahora lo que quedaria serie 1, que en el code ya especifico que ponerle...
En realidad como ya han visto es un conversor de dec - bin pero lo quiero hacer de este modo, y me parece que no hay "formula" para esto. Porque yo no hablo del binario del autoit ( de la funcion Binary...que te da e.j :0x576875) sino del numero con base 2 ( o 1 o 0)
Nose si me explico pero la cosa estaria en que me automizara eso de dividir ( parte ya tengo hecha) y que lo hiciera seguido osea que mirara y digera 15 "es 2, 1 o 3" [NO] entonces -----> / 2 = el resultado contiene ". " , entonces -----> dile $r100 = 1.
I asi despues con el 7 y ... infinidad de veces ( como un While). I claro que lo ahga con numeros grandes tipo 867.
I despues esta decirle que el 1 que le ha salido de la division de 15 /2 le llame $r100, el 1 que le ha salido de la division de 7 / 2 le diga $r99...y asi! para que despues pudiera poner [MsgBox(1, "BIEN", $0 & $1 & $... & $99 & $100)] como resultado.
Nose si me explico pero sino diganmelo y intento resumirlo todo.
GRACIAS A TODOS!! MUY BUEN TRABAJO :smt002

Re: AUTODIVISOR...

Publicado: 28 Feb 2010, 02:41
por BasicOs
Creo que debes resumirlo indicando que partes del código quieres rectificar.
Puede que lo que quieres hacer esté con _iif(si es con ., "1","0")
También 7,5/int(7,5) puede ser 1 o no depende de los decimales,
Si hay más puedes explicarlo por trozos,
Salu2:)

Re: AUTODIVISOR...

Publicado: 28 Feb 2010, 12:42
por Charlie19
Intentare explicarme:
Yo quiero que el programa primero divida el numero que le de en una input entre 2, hasta que el numero que le quede sea 3,2 o 1 ( ya que asi ya sabe que hacer).
I que mientras vaya dividiendo mire si la division da un resutlado decimal, si es decimal simpre quiero que le corrsponda el numero 1 y si es exacta el numero 0.
Ej.
Pongo en Input el numero 15. Este lo divide entre 2 = (7.5)----> mira y ve que hay decimal (".") y en este caso el $r100 = 1,
asi que vaya dividiendo pero sin cojer decimales solo con el numero entero.
Si tenemos 7.5 coja el 7 y lo divida...y asi hasta que el resultado de la division sea 3,2 o 1.
Pero el problema esque no se como hacer para que repita la accion de dividir hasta que le quede 1,2 o 3! I que nose como decirle que vaya poniendo $r = [1 o 0], en casa division. Claro yo creo que lo de decir si es decimal lo se hacer lo de cojer solo el 7 envez del 7.5 tambien! Pero nose hacer que repita la accion hasta que le queden los numeros 3,2 o 1 !!
Me explico? Solo quiero sber la funcion de repeticion y otra pa que ponga es cada caso una $r[..].

Re: AUTODIVISOR...

Publicado: 28 Feb 2010, 13:55
por Chefito
Alguna razón en especial por la que lo quieres hacer así???? :smt017 . Creo que te estás complicando muchísimo la vida para algo tan sencillo. Te dejo una pequeña función que acabo de hacer que pasa un número de decimal a binario.

Código: Seleccionar todo

;conversor de decimal a binario por chefito

Func DecAbin($numero)
	Local $numBinario="", $resto
	If $numero<0 Then 
		SetError(1)
		Return -1
	EndIf
	While 1
		Switch $numero
			Case 0
				ExitLoop
			Case 1
				$numBinario="1" & $numBinario
				ExitLoop
			Case Else
				$resto=Mod($numero,2)	;resto del número dividido entre 2 (o 1 o 0)
				$numBinario=$resto & $numBinario
		EndSwitch
		$numero=int($numero/2)	;división del número a convertir hasta que se quede en 1 o 0
	WEnd	
	Return $numBinario
EndFunc
MsgBox(0,"",decabin(-43543))
Esta función solo acepta números decimales positivos. Si le pasas un número decimal negativo te devuelve -1 y @error=1.
Hacerlo para números negativos sería bastante facil. Es simplemente igual que esto, aplicar la fórmula y ya está. Mira números binarios con signo, en complemento a 1 y en complemento a 2. Estas son las reprentaciones más famosas.

Saludos.

Re: AUTODIVISOR...

Publicado: 01 Mar 2010, 12:15
por Ximorro
Hombre, un poco extensa la función, yo la haría así.
Y el mío también va con negativos, es tan sencillo como hacer el proceso para el número en positivo y al final añadir el signo.
Otra cosa son codificaciones tipo complemento a dos y tal.

Código: Seleccionar todo

Func _DecABin($n)
	Local $binText="", $negText=""
	If $n < 0 Then
		$n = -$n
		$negText = "-"
	EndIf
	Do
		$binText = Mod($n, 2) & $binText
		$n = Floor($n / 2) ;División entera
	Until $n = 0
	Return $negText & $binText
EndFunc
En esta caso da igual usar Floor o Int, estoy acostumbrad a usar Floor cuando quiero división entera, por evitar redondeos, así que uso esto. En este caso nunca habrá redondeo pues los decimales siempre son .5, así que aquí da igual.

Re: AUTODIVISOR...

Publicado: 01 Mar 2010, 12:23
por Ximorro
Y ya que estamos ¿qué tal una que pase de binario a decimal? :smt003

Código: Seleccionar todo

Func _BinADec($txtBin)
	Local $aTxt, $res = 0
	$aTxt = StringSplit($txtBin, "", 2)
	For $n In $aTxt
		$res = $res * 2 + $n
	Next
	Return $res
EndFunc
Devuelvo un número, no un String, aunque lógicamente eso es fácil de cambiar.
Lo del StringSplit es por hacer cómodamente el recorrido por los numeritos con un For-In, pero vaya, también se puede hacer fácil con un StringMid.

La versión para binarios con signo la dejo como ejercício :smt002

Re: AUTODIVISOR...

Publicado: 01 Mar 2010, 15:34
por Chefito
Ximorro escribió:Hombre, un poco extensa la función, yo la haría así.
Jejejeje, si la verdad es que puse lo primero que me vino a la cabeza. No pensé mucho en la condición :smt005 .
Ximorro escribió:Y el mío también va con negativos, es tan sencillo como hacer el proceso para el número en positivo y al final añadir el signo.
Sí, no lo hice pero es muy sencillo. Pero no es como tu dices :smt016 . La representación de números binarios con signo se hace añadiendo un 1 a la izquierda si es negativo y un 0 si es positivo. No pongas un - que el ordenador solo entiende de unos y ceros!!! :smt005 .
Ximorro escribió:En esta caso da igual usar Floor o Int, estoy acostumbrad a usar Floor cuando quiero división entera, por evitar redondeos, así que uso esto. En este caso nunca habrá redondeo pues los decimales siempre son .5, así que aquí da igual.
Otra corrección :smt005 :smt005 . Floor sí redondea....a la baja. Int no redondea nunca. Coje la parte entera e ignora la parte decimal :smt002 .

Saludos.

Re: AUTODIVISOR...

Publicado: 02 Mar 2010, 10:25
por Ximorro
Chefito eso del negativo binario no estoy del todo de acuerdo.
La forma normal de poner un negativo en cualquier base es ponerle el signo "-" como yo he hecho.

Lo del 1 a la izda es para representaciones en ordenadores, lo hacen para que no haya dos ceros (0 y -0), y así aprovechan mejor el código.
En realidad no es sólo "poner un 1 a la izda", más bien es hacer el complemento (un NOT bit a bit) de todo el número y sumarle uno, así se calcula el negativo pero como digo es una cuestión de representaciones en ordenadores, más que de matemáticas...
Justamente esto es lo que quería decir con el "complemento a dos", si queréis implementarlo también se queda de ejercício ;-) (ojo, el complemento a dos sólo se hace con los negativos, los positivos se quedan igual)

Aunque por lo que he visto que sabes de informática me da la impresión que esto lo sabes de sobra..., creo que me estás tomando el pelo ;-)

Round es el redondeador por excelencia, el que te pasa 3.56 a 4. Con Floor intentaba un truncaje, es decir, que te quite la parte decimal (vaya, para hacer la división entera). Pero ciertamente eso sólo sería válido para números positivos, pues en negativos Floor(-3.4) = -4. Ahí habría que usar Ceiling. En este caso da igual porque no va a tener negativos pero ciertamente lo mejor es usar Int, eso sí que trunca y es lo que hay que usar para división entera en general tanto positivos como negativos.

Hala, ya hemos usado todos los redondeadores/truncadores de AutoIt ;-)

Re: AUTODIVISOR...

Publicado: 02 Mar 2010, 20:00
por Chefito
Ximorro escribió:Chefito eso del negativo binario no estoy del todo de acuerdo.
La forma normal de poner un negativo en cualquier base es ponerle el signo "-" como yo he hecho.
Mmmmm....no se no se. Este tema lo tengo algo olvidado :smt017 . Hace tiempo que ya dejé Estructura y Tecnología de computadores que explicaba todo esto :smt001 . Puede que me esté equivocando y en matemáticas, en la representación en base 2 de un número, si utilicen los signos + y -. Me suena algo de esto pero no lo recuerdo :smt017 .
Lo que pasa que yo siempre he enfocado todo esto a los métodos computacionales. Por eso puede que me haya canteado algo :smt003 .
Quizá debería haber especificado más y haber dicho el método de representación binaria signo y magnitud para computadoras :smt002 .
Ximorro escribió:Lo del 1 a la izda es para representaciones en ordenadores, lo hacen para que no haya dos ceros (0 y -0), y así aprovechan mejor el código.
En signo y magnitud hay dos 0. Como bien dices, uno positivo y otro negativo. Ejemplo:
1 bit de signo y 7 bits de magnitud. 0-> 00000000 y -0-> 10000000.
Esto ocurre también con el complemento a 1, que para subsanar restas y demás tenías que interactuar con el acarreo sumandolo al resultado o algo así (no recuerdo bien como, tendría que mirarlo.....no tengo ganas :smt005 ).
Pero te digo una cosa. Estos métodos se pueden implementar computacionalmente. Son más complicados pero se puede perfectamente (yo lo he hecho). Creo que las primeras máquinas lo hacían así.
Lo que pasa que como bien intuyes, al ser más complicado implementar una circuitería que reconozca y trate estos dos ceros, pues lo dejaron aparcado.
También decirte que hay otras representaciones no tan famosas las cuales los números negativos no tienen un 1 a la izquierda, y tampoco tienen dos ceros :smt002 .
Ximorro escribió:En realidad no es sólo "poner un 1 a la izda", más bien es hacer el complemento (un NOT bit a bit) de todo el número y sumarle uno, así se calcula el negativo pero como digo es una cuestión de representaciones en ordenadores, más que de matemáticas...
No mezclemos representaciones. El poner un 1 a la izquierda para números negativos y un 0 para positivos (bit de signo. El bit más significativo) pertenece a la representación signo y magnitud.
Como bien dices en el siguiente punto eso es el complemento a 2, el que se implementa para las computadoras por su más facil implementación con circuitos que las otras.
Ximorro escribió:Aunque por lo que he visto que sabes de informática me da la impresión que esto lo sabes de sobra..., creo que me estás tomando el pelo ;-)
:smt005 , que va Ximorro. Soy humano y me equivoco como todos (y mucho). En muchas ocasiones lo he demostrado :smt005 . Hay cosas que sabía pero que se me han olvidado y tengo un leve recuerdo :smt003 .
Para eso estaís. Si me equivoco yo o cualquiera, pues lo corregís y no pasa nada :smt023 .
Y respecto a que se de informática....no te creas que se tanto. Aunque te digo que he practicado con circuitos y he implementado sumadores binarios en distintas reprentaciones, multiplicadores, comparadores, sumadores bcd, displays de 7 segmentos, etc etc etc.....pero como es una cosa que hice hace tiempo, que no practico y no me emociona mucho, pues se me olvida.

Saludos.

Re: AUTODIVISOR...

Publicado: 03 Mar 2010, 09:35
por Ximorro
Bueno, aquí hay dos temas (ay Charlie la que has montado :smt002 ) por una lado matemáticamente, ahí se pone signo, da igual la base que se use...

Por otro lado en informática están todos esos métodos de almacenar y manejar números binarios negativos en ordenadores.

Yo creo que todo lo que manejamos usa complemento a 2, seguro con enteros, para los reales de coma flotante sí me suena que podía haber un -0, pero no lo recuerdo bien.
(Confirmado, he mirado la norma IEEE 754 y usan directamente bit de signo, no complemento a 2. No es directo, por ejemplo al exponente le suman 127 antes de almacenarlo, pero vaya, no es complemento a 2. En reales hay dos ceros, dos infinitos y dos NaN ;-) )


De todas maneras lo del bit de signo piensa que también ocurre en complemento a 2, no sólo con la representación de signo y magnitud. En complemento a dos también ocurre que todos los negativos tienen ese bit a 1 y los positivos a cero, por la manera en que está construido.
Piensa que en un byte con signo por ejemplo se usan 7 bits para los positivos, del 0 al 127. El "11111111", que sería el -0 del complemento a 1 es en complemento a dos el -1. Así en negativos tienes de -1 a -128.
Bueno pero creo que me estoy enrollando, vaya, que en complemento a dos también puedes hablar de bit de signo, no es que se ponga por el signo, pero al calcular el complemento a dos ahí siempre va a haber un 1...

Yo de HW no sé tanto, soy más de soft, es evidente que has trabajado más que yo con esas cosas a bajo nivel. Me has causado curiosidad con eso de los otros sistemas sin dos ceros, tengo que buscarlo...
Lo bueno del complemento a 2 es que las sumas las haces directamente, da igual que tengas negativos o positivos, por ejemplo -1 + 2 es 11111111 + 00000010 = 00000001 y te queda un acarreo que se ignora, en realidad da "overflow" pero el resultado da lo que toca, no sé si es suerte o lo pensaron mucho. :smt005
Encima para pasar un negativo a positivo la operación es la misma (NOT lógico MÁS uno, vaya que no se suma en un caso y se resta en otro). Las operaciones se simplifican, parece magia, ya digo, para mí que fue suerte :smt016

Por cierto, muy buena la firma que tienes, me hizo mucha gracia.
Claro que siguiendo con esta entrada... ¿en cuántos bits está? a ver si has puesto un número negativo, ja, ja.

Re: AUTODIVISOR...

Publicado: 09 Mar 2010, 20:13
por Chefito
Jajajaja. Yo con este post paro, que nos hemos salido un poco del tema :smt005 .
Ximorro escribió:Me has causado curiosidad con eso de los otros sistemas sin dos ceros, tengo que buscarlo...
Creo recordar algún tipo de BCD (exceso 3 o exceso 7)....no lo recuerdo bien. Alguno de esos sistemas, si no son los dos, creo recordar que representaba los números negativos sin el 1 delante. Te lo dejo para que lo investiges tu si tanto te interesa :smt005 .
Ximorro escribió:Por cierto, muy buena la firma que tienes, me hizo mucha gracia.
Claro que siguiendo con esta entrada... ¿en cuántos bits está? a ver si has puesto un número negativo, ja, ja.
Jajajaja. :smt002 .
Por lo demás todo muy interesante :smt023 .

Saludos.