proba

понедельник, 28 ноября 2011 г.

Программирование на языке Haskell, урок № 8

Сейчас наша задача будет состоять в написании программы, которая считывает два числа и возвращающает их сумму.


Итак, открываем знакомый нам notepad++ или обычный блокнот и пишем там такой код:
import IO
sumInt :: IO Integer
sumInt =
  let readNum :: IO Integer
      readNum = readLn
  in do putStr "Enter number Integer: "
        x1 <- readNum
        putStr "Enter 2 chislo: "
        x2 <- readNum
        putStr ("This summ = ")
        return (x1 + x2)
Разберём построчно, первая строка подключает библеотеку ввода/вывода (Input/Output); далее присваем тип переменной readNum целый(integer). Далее назначаем ей действие "считывание" (readLn); возвращаем сумму двух введённых переменных: x1 и x2. 


Следующий этап, это запуск:
Main> sumInt
Enter number Integer: 1
Enter 2 chislo: 23
This summ = 24 :: IO Integer

И напоследок:
Если вы забыли как запускать программу из файла, вам сюда: уроке № 2, п. 2

пятница, 2 сентября 2011 г.

Программирование на языке Haskell, урок № 7

Написать функцию, возвращающую список без элементов стоящих на чётных местах.

Решение: 
 f :: String -> String
 f [ ] = [ ]
 f [a] = [a]
 f (a:b:t) = a:f t

Запуск сделайте самостоятельно.  
Как запускать программу из файла записано в уроке № 2, п. 2

Программирование на языке Haskell, урок № 6

Определите следующие функции:

1) Функция removeOdd, которая удаляет из заданного списка целых чисел все нечётные числа. Например removeOdd [1,4,5,6,10] должен возвращать [4,10].

2) Функция substitute, которая заменяет в строке указанный символ на заданный. Пример: substitute ‘e’ ‘i’ “eigenvalue” возвращает “iiginvalui”.

Решение № 1:
 removeOdd :: [Integer] -> [Integer]
 removeOdd [] = []
 removeOdd (x:xs) = if odd x then removeOdd xs else x : removeOdd xs

Запуск:
 Main> :load "c:\\haskell\\laba22.hs"
 Reading file "c:\haskell\laba22.hs":
 Hugs session for:
 C:\Haskell\lib\Prelude.hs
 c:\haskell\laba22.hs

Конечный запуск и результат:
 Main> removeOdd [1,2,5,3,8,9,5]
 [2,8] :: [Integer]

Решение № 2:
 substitute :: Char -> Char -> String -> String
 substitute a b [] = []
 substitute a b (h:t) = if h == a then b : substitute a b t else h :   substitute a b t

Конечный запуск и результат:
 Main> substitute 'a' 'i' "papauif"
 "pipiuif" :: [Char]

понедельник, 29 августа 2011 г.

Программирование на языке Haskell урок № 5

Определите функцию, принимающую на вход целое n и возвращающую список, содержащий n элементов, упорядоченных по возрастанию.
1) Список факториалов
2) Список степеней двойки
3) Список треугольных чисел*.
4) Список пирамидальных чисел#.
* n-е треугольное число tn равно количеству одинаковых монет, из которых можно построить равносторонний треугольник, на каждой стороне которого укладывается n монет. Нетрудно убедится, что t1=1 и tn=n+tn-1
# n-е пирамидальное число pn равно количеству одинаковых шаров, из которых можно построить пирамиду с треугольным основанием, на каждой стороне которой укладывается n шаров. Нетрудно убедится, что p1=1 и pn=tn+pn-1

Решение № 1
 list5 :: Integer -> [Integer]
 factorial 0 = 1
 factorial x = x*factorial(x-1)
 list5 0 = [ ]
 list5 x = list5 (x-1)++[factorial(x)]

Запуск:
 Main> list5 5
 [1,2,6,24,120] :: [Integer] 

Решение № 2:
 list6 :: Integer -> [Integer]
 stepen 1 = 1
 stepen x = 2*stepen(x-1)
 list6 0 = [ ]
 list6 x = list6 (x-1)++[stepen(x+1)]
  
Запуск:
 Prelude> :load "c:\\haskell\\Laba21.hs"
 Main> list6 7
 [2,4,8,16,32,64,128] :: [Integer]

Решение № 3:
 list7 :: Integer -> [Integer]
 piram 1 = 1
 piram(x) = x+piram(x-1)
 list7 0 = [ ]
 list7 x = list7 (x-1)++[piram(x)]

 Запуск:
 Main> list7 4
 Reading file "c:\haskell\Laba21.hs":
 [1,3,6,10] :: [Integer]

Решение № 4:
 list8 :: Integer -> [Integer]
 pir 1 = 1
 pir(x) = x+pir(x-1)
 p 1 = 1
 p x = pir(x) + p(x-1)
 list8 0 = [ ]
 list8 x = list8 (x-1)++[p(x)]

 Запуск:
 Main> list8 4
 [1,4,10,20] :: [Integer]
 
Если вы забыли как запускать, то вам сюда: урок № 2 п. 2

Программирование на языке Haskell, урок № 4

В этом уроке изучать будем список, или по-другому массив. [тип переменной] - эта конструкция с квадратными скобками обозначает, что внутри может быть помещено несколько значений сразу. И прибавление :[] означает множественность значений входящих в список.
Определить функцию, принимающую на вход целое n и возвращающую список, содержащий n элементов, упорядоченных по возрастанию.
1) Список натуральных чисел.
2) Список нечётных натуральных чисел.
3) Список чётных натуральных чисел.
4) Список квадратов натуральных чисел.

Решение №1:
 Набираем в блокноте: 
 list2 :: Integer -> [Integer]
 list2 0 = [ ]
 list2 x = list2 (x-1)++(x:[])

 Запуск:
 Main> :load "c:\\haskell\\laba21.hs"
 Main> list2 5
 [1,2,3,4,5] :: [Integer]

Решение № 2:
 Набираем в блокноте:
 list1 :: Integer -> [Integer]
 list1 0 = [ ]
 list1 x = list1 (x-1)++(2*x-1:[])

 Запуск:
 Prelude> :load "c:\\haskell\\laba21.hs"
 Main> list1 5
 [1,3,5,7,9] :: [Integer]

Решение № 3:
 list3 :: Integer -> [Integer]
 list3 0 = [ ]
 list3 x = list3 (x-1)++(2*x:[])

 Запуск:
 Main> list3 8 
 Reading file "c:\haskell\Laba21.hs":
 [2,4,6,8,10,12,14,16] :: [Integer] 

Решение № 4:
 list4 :: Integer -> [Integer]
 list4 0 = [ ]
 list4 x = list4 (x-1)++(x*x:[])

 Запуск:
 Main> list4 8
 Reading file "c:\haskell\Laba21.hs":
 [1,4,9,16,25,36,49,64] :: [Integer] 

воскресенье, 28 августа 2011 г.

Программирование на языке Haskell, урок № 3

Функция, определяющая максимум их 3х чисел.
В блокноте набираем:
maxChislo :: Integer -> Integer -> Integer -> Integer

maxChislo x1 x2 x3 = if ((x1>x2)&&(x1>x3)) then x1
                                    else if ((x2>x1)&&(x2>x3)) then x2  else x3
Итак,
(в первой строке) переменной maxChislo  присвоили тип Integer(целочисленный) и аналогичный тип трём другим переменным;
(во второй строке) переменные и обычный порядок нахождения максимума из трех чисел.

Если по-русски, написанное во второй и третьей строке можно перевести так: maxChislo из трех x1, x2, x3 (Это) Если ((x1 (больше) х2) И (х1 (больше) х3)), то (х1(максимальное число)), иначе {Если ((х2 (больше) х1)И(х2 (больше) х3)), то (x2(максимальное число)), иначе (х3(максимальное число)}

Как запускать программу из файла записано в уроке № 2, п. 2

пятница, 5 августа 2011 г.

Программирование на языке Haskell, урок № 2

В лабораторной работе № 1 задание № 2 такое:

 Функция isParallel, возвращающая True(истину), если два отрезка, концы которых задаются в аргументах функции, параллельны (или лежат на одной прямой). Например, значение выражения isParallel (1,1) (2,2) (2,0) (4,2) должно быть равно True, поскольку отрезки (1,1) – (2,2) и (2,0) – (4,2) параллельны.
1) Решение состоит из двух этапов - первое решение самой задачи сначала на бумаге, а потом набираем её в виде программы в блокноте и сохраняем её в формате .hs 
На бумаге думаю вы решите сами, т.к. математические формулы общедоступны; если непонятно что-то, то спросите в комментариях. 
isParallel :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Bool

isParallel x1 y1 x2 y2 x3 y3 x4 y4 = if (((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4)) == 0) then True else False
 Вверху вы видите код, который вам нужно набрать в блокноте.

2) Следующий этап запуск,  вписываем как на картинке выражение ":load laba1.hs", оно означает загрузить для исполнения файл laba1.hs.
Далее выскакивает после исполенения команды слово "Main>", это означает, что мы вошли в файл и можем проверить правильно ли мы его составили.

Теперь мы, как показано на картинке внизу, введём название функции и коэффициенты через пробел, и нажмём Enter. Если в результате стоит значение True, значит на параллельных линиях, если - False, то не на параллельных. 
Итак лабораторная работа № 1 рассмотрена, в следующей статье посмотрим другие примеры функций, и поучимся ещё решать. Спасибо за прочтение, хорошего дня. 



среда, 3 августа 2011 г.

Программирование на языке Haskell, урок № 1

   Итак, сейчас начинается ряд статей, посвящёный "чисто функциональному" языку программирования под названием Haskell. Если хотите почитать, откуда он появился, то прошу пройти в интернет-энциклопедию, которая называется WikiPedia, перейдя по ссылочке: "Общая информация о языке Haskell"
   Моя цель ознакомить вас на примерах с этим языком. Очень часто программа ВУЗа включает в себя тот материал, который мы рассмотрим. Сразу скажу, что всё, что касается решений, я выставил их не для списывания, а для разбора, если что не понятно спрашивайте.
   Итак, первая лабораторная работа, рассмотрим задание № 1 в этой статье, а в слудующей № 2 и плавно перейдём к следующему примеру. 

 Цель работы: приобрести навыки работы с интерпретатором Haskell. Получить представление об основных типах языка Haskell. Научится определять простейшие функции.

 Задание № 1:
Приведите пример нетривиальных отношений, принадлежащих следующему типу. 
(требование нетривиальности в данном случае означает, что встречающиеся в выражениях списки должны содержать больше одного элемента)
Рассмотрим вариант № 6:
(([Double],[Bool]),[Integer])
Первое действие запустить интерпретатор Hugs 98 из каталога, в котором он установлен.

Далее, в открывшемся окне интерпретатора, мы заметим в белой рабочей части окна слово Prelude>. После этого слова мерцает курсор, для написания программы. Там мы пишем 
":set +t" (без ковычек) и нажимаем Enter. После этого вписываем такое выражение, например: (([1.2,5.3],[True,False]),[12,18]) и нажимаем Enter, итак мы получили тоже, что и на скриншоте внизу:
 

четверг, 30 июня 2011 г.

Добро пожаловать

    Сразу скажу вести его буду я, зовут меня, как вы наверное уже поняли Илья; в настоящее время у блога начинается период интенсивного наполнения статьями. 
    Что хочется ещё добавить, блог посвящён программированию(исходники алгоритмов, программ, различные наработки).
     В основном будет полезен студентам, которые учатся на специальностях, связанных с программированием, и начинающим программистам(т.н. самоучкам), планируется рассмотрение примеров решения различных типовых задач на языках программирования Haskell, Prolog, конечно же C/C++, а также C#. Расскажем как адаптировать простые программы из TurboC 6.0 в Visual C++ Express или Visual Studio. Официальное открытие блога состоится буквально на днях.
    С уважением Илья.