Programación Funcional - Práctica de Haskell

 
Vista:

Práctica de Haskell

Publicado por thecrow_94 (1 intervención) el 18/04/2007 00:30:06
Hola tengo q realizar una practica en haskell y la verdad estoy muy perdido, a ver si algun alma caritativa podria ayudarme, el enunciado de la misma es el siguiente: Escribir un programa q lea dos numeros naturales en notacion decimal, los transforme a notacion binaria y realice la suma y la resta de los mismo, bajo este mismo formato (binario). El resultado de la operacion se mostrara en binario y posteriormente será transformado a notacin decimal, mostrandose de igual manera. Para encontrar la solucion a este problema se pido como estrategia obligatoria la utilizacion de listas para el manejo de los numeros binarios.

Muchas gracias!, un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Práctica de Haskell

Publicado por Francis (4 intervenciones) el 19/04/2007 16:57:55
Hay te va mi solución (un poco larga, ya lo se), te he dejado el main vacio para que te curres la entrada y salida, te he puesto metodos de suma, resta, paso a binario y paso a decimal.

-- pasa un decimal a binario
aBinario 0 = [0]
aBinario 1 = [1]
aBinario x |mod x 2 == 0 = f++[0]
|otherwise = f++[1]
where f = aBinario (div x 2)

aDecimal [x] 0 = x;
aDecimal ls@(x:xs) n = x*2^n + (aDecimal xs (n-1))

-- pasa un binario a decimal
aDecimal2 ls = aDecimal ls (length (ls) - 1)

sumaBinaria [] [] n = [n]
sumaBinaria [] x n |n == 0 = x
|otherwise = (sumaBinaria [n] (x) 0)
sumaBinaria x [] n |n ==0 = x
|otherwise = (sumaBinaria [n] (x) 0)
sumaBinaria xs ys n | valor == 0 = ( siguiente 0 )++[0]
| valor == 1 = ( siguiente 0 )++[1]
| valor == 2 = ( siguiente 1 )++[0]
| valor == 3 = ( siguiente 1 )++[1]
where valor = (last xs) + (last ys) + n
siguiente = sumaBinaria (init xs) (init ys)

-- suma dos listas que representan binarios
sumaBinaria2 xs ys = sumaBinaria xs ys 0

complemento1 [] = []
complemento1 (x:xs) | x == 1 = 0: complemento1 xs
|otherwise = 1 : complemento1 xs

complemento2 xs = sumaBinaria2 [1] (complemento1 xs)

-- realiza la resta, solo considera los casos en que el primer número sea mayor que el segundo
resta x y = recortar resultado ((length resultado)- long)
where long = length x
resultado = sumaBinaria2 x (complemento2 (rellenar y (long - (length y))))

recortar xs 0 = xs;
recortar xs n = recortar (tail xs) (n-1)

rellenar xs 0 = xs
rellenar xs n = rellenar (0:xs) (n-1)


main = do x<- getLine
return x

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Práctica de Haskell

Publicado por robinson rincon (1 intervención) el 23/08/2009 01:58:46
hola! deseo tener informacion para hacer unas buenas bases en la programacion de plc ya que estoy iniciando el curso en mi universidad. gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar