Программа на haskell: ввод функции с консоли

 
0
 
Functional languages
ava
Bukas | 18.12.2009, 20:49
Задание: Формирование файла с символьным графиком по введенной тригоном. функции (sin, cos, tg, но аргументы могут быть разные, например, 2x+3).

Я написала программу, которая выводит в файл графики sin, cos, tg с разными аргументами, но необходимо, чтобы ввод самой функции осуществлялся с консоли.
Вот код моей программы:

readNum :: IO Double
readNum = readLn

arg :: Double -> Double
func1 :: Double -> Double -> Double -> Double
func2 :: Double -> Double -> Double -> Double
func3 :: Double -> Double -> Double -> Double
arg x =  x
func1 a b x = sin(a*x+b)
func2 c d x = cos(c*x+d)
func3 t n x = tan(t*x+n)
s= ( "<html> <body> ")
rb=("<div style='position: absolute;  height: 263; width:500;border-bottom: 1px solid #000000; border-right: 1px solid #000000'></div>")
loc1(x1,x2) = ("<div style='position: absolute; color:#FF0000; top:"++show(263-x2)++"; left: "++show(500+x1)++"; height:5%; width:50%'>+</div>")
loc2(x3,x4) = ("<div style='position: absolute; color:#00FF00; top:"++show(263-x4)++"; left: "++show(500+x3)++"; height:5%; width:50%'>+</div>")
loc3(x5,x6) = ("<div style='position: absolute; color:#0000FF; top:"++show(263-x6)++"; left: "++show(500+x5)++"; height:5%; width:50%'>+</div>")
tl=("<div style='position: absolute; top:277; left: 509;  height: 263; width:500;border-top: 1px solid #000000; border-left: 1px solid #000000'></div>")
f= ("</body> </html> ")
main = do
      putStr   "Enter parameters for sin "
          putStr   "a=: "          
      a <- readNum
      putStr   "b=: "          
      b <- readNum
      putStr   "Enter parameters for cos " 
      putStr   "c=: "          
      c <- readNum
      putStr   "d=: "          
      d <- readNum
      putStr   "Enter parameters for tg "
      putStr   "t=: "          
      t <- readNum
      putStr   "n=: "          
      n <- readNum
      (writeFile "result.html") (s++rb++tl++unwords( map loc1 (zip (map (*50 ) (map (arg) [(-7),(-6.9)..7])) (map (*50 )(map (func1 a b)[(-7),(-6.9)..7]))))++unwords( map loc2 (zip (map (*50 ) (map arg [(-7),(-6.9)..7])) (map (*50 )(map (func2 c d)[(-7),(-6.9)..7]))))++unwords( map loc3 (zip (map (*50 ) (map (arg) [(-7),(-6.9)..7])) (map (*50 )(map (func3 t n)[(-7),(-6.9)..7]))))++f);

Не могу написать парсер для ввода функции с консоли.
Comments (3)
ava
kemiisto | 16.01.2010, 00:01 #

M
kemiisto
Для языков функционального программирования существует отдельный подраздел.    Тема перенесена.
ava
nwalker | 20.01.2010, 14:55 #
два вопроса. 
  • Это обязательно выводить в HTML?
  • Кто ж тебя учил такой нечитаемый код писать?..
ava
nwalker | 20.01.2010, 16:17 #
делать один фиг нечего, хоть синтаксис в памяти утрамбую...

module Main
    where

import IO

readNum :: IO Double
readNum = readLn

s= ( "<html> <body> ")

-- верстку сам поправишь
rb=("<div style='position: absolute;  height: 263; width:500;border-bottom: 1px solid #000000; border-right: 1px solid #000000'></div>")

loc (x, y) = ("<div style='position: absolute; color:#FF0000; top: \  
               \" ++show(263-y)++ "; left: \ 
               \" ++show(500+x)++ "; height:5%; width:50%'>+</div>")
                
-- чтобы оси пересекались                
tl=("<div style='position: absolute; top:277; left: 509;  height: 263; width:500;border-top: 1px solid #000000; border-left: 1px solid #000000'></div>")
f= ("</body> </html> ")

func f a b x = f ( a*x+b )

changeFunction = do
    name <- getLine
    let fun = case name of
                "sin" -> sin
                "cos" -> cos
                "tan" -> tan
    return (name, fun)
    
main = do
    hSetBuffering stdin LineBuffering -- это можно попробовать убрать. если заработает без этого
                                        -- можно нижеследующие putStrLn заменить на putStr по вкусу
                                        -- и выкинуть строчку "import IO" в начале
    putStrLn "enter function name[sin, cos or tan]: "
    (name, fun) <- changeFunction
    putStrLn ("enter arguments for " ++ name)
    putStrLn "a = "
    a <- readNum
    putStrLn "b = "
    b <- readNum
    let ready = func fun a b
    let arglist = [-7, -6.9 .. 7]
    let mul50 = map (* 50)
    let points = zip (mul50 arglist) (mul50 (map ready arglist))
    let graph = map loc points
    (writeFile "result.html") ( s ++ rb ++ tl ++ (unwords graph) ++ f )
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit