отчет флп 2
.docxМинистерство науки и высшего образования РФ
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Уфимский государственный авиационный технический университет»
Факультет информатики и робототехники
Кафедра вычислительной математики и кибернетики
Отчет по лабораторной работе №2
По дисциплине «Функциональное и логическое программирование»
Вариант 5
Выполнил:
студент группы МО-317
Шакиров А.Р.
Проверил:
Котельников В.А.
Уфа 2020
Цель работы:
Целью работы является изучение возможностей языка программирования Haskell и получение навыков работы с интерпретатором WinHugs.
Ход работы:
1) Напишем функцию, проверяющую удовлетворяет ли заданная строка данным правилам:
а) содержит только двоичные цифры
б) заканчивается заглавной буквой.
Рис. 1. Результат выполнения функций проверки строк
2) Зашифруем текст с помощью шифра Цезаря с ключом 5. Напишем функцию для расшифровки.
Рис. 2. Результат кодирования и декодирования строки
3) Далее напишем функцию, вычисляющую разность восьмеричного и римского чисел и выводящую ответ в десятичном представлении.
Рис. 3. Результат работы функции нахождения разности восьмеричного и римского чисел
4) Дано универсальное множество U={1,2,…,10} и некоторые его подмножества A,B,C. Найдем множество .
Рис. 4. Результат работы функции нахождения множества D
5) Используя функции show, read, error, undefined напишем функцию, которая по введенной дате в формате «dd.mm» выводит сообщение о номере учебной четверти или о виде каникул для школьников. Выводит соответствующие сообщения об ошибках в данных.
Рис. 5. Результат работы функции информации о заданной неделе
6) Подключим модуль Debug.Trace.
Функция trace принимает 2 аргумента: первый – строка, которая будет выведена на экран; второй – значение, которое будет возвращено. Для остальной программы данная функция будет считаться «чистой».
Рис. 6. Тип функции trace
Проверим работу функции trace.
Рис. 7. Работа функции trace
Заключение
В ходе лабораторной работы были изучены возможности языка программирования Haskell и получены навыки работы с интерпретатором WinHugs.
Приложение А
Листинг кода:
import Data.Char
import Data.List
import Debug.Trace
-- 1а)Пароль содержит только двоичные цифры
checkPass1 :: [Char] -> Bool
checkPass1 [] = True
checkPass1 (x:xs)
| notElem x "01" = False
| otherwise = checkPass1 xs
-- 1б)Пароль заканчивается заглавной буквой
checkPass2 :: [Char] -> Bool
checkPass2 [x] = isUpper x
checkPass2 (_:xs) = checkPass2 xs
-- 2) Шифр цезаря
-- Кодирование
caesarEncode :: [Char] -> Int -> [Char]
caesarEncode [] _ = []
caesarEncode (x:xs) n
| isAlpha x = -- Если буква
if isLower x
then
chr (ord 'a' + mod (ord x - ord 'a' + n) 26) : caesarEncode xs n -- строчная
else
chr (ord 'A' + mod (ord x - ord 'A' + n) 26) : caesarEncode xs n -- заглавная
| otherwise = x : caesarEncode xs n
-- Декодирование
caesarDecode :: [Char] -> Int -> [Char]
caesarDecode x n = caesarEncode x (-n)
-- 3)
-- Римские цифры
romeDig :: Char -> Int
romeDig 'I' = 1
romeDig 'V' = 5
romeDig 'X' = 10
romeDig 'L' = 50
romeDig 'C' = 100
romeDig 'D' = 500
romeDig 'M' = 1000
romeToInt :: [Char] -> Int
romeToInt [x] = romeDig x
romeToInt (x:y:xs)
| romeDig x < romeDig y = romeToInt (y:xs) - romeDig x
| otherwise = romeToInt (y:xs) + romeDig x
-- 8 -> 10
octToDec [] = 0
octToDec (x:xs) = (digitToInt x) * (8^(length xs)) + (octToDec xs)
octMinusRome :: [Char] -> [Char] -> Int
octMinusRome a b =
octToDec a - romeToInt b
-- (trace ("octToDec: "++show (octToDec a)) (octToDec a)) - (trace ("RomeToDec: "++show (romeToInt b)) (romeToInt b))
-- 4)
-- D=(A\B)?(B\C)
getD :: [Integer] -> [Integer] -> [Integer] -> [Integer]
getD a b c =
(union (a \\ b) (b \\ c)) \\ (intersect (a \\ b) (b \\ c))
-- 5)
-- dd.mm -> информация об учебной неделе
weekInfo :: [Char] -> [Char]
weekInfo s
| m > 12 = error "Too big month's num"
| d > 31 = error "Too big day's num"
| (monthLens !! (m-1) < d) = error "There is no such day of the month"
-- формат МесяцДень (21.12 -> 1221, 02.09 -> 902)
| value >= 902 && value <= 1025 = "1 quarter"
| value >= 1026 && value <= 1104 = "autumn holidays"
| value >= 1105 && value <= 1227 = "2 quarter"
| value >= 1228 || value <= 111 = "winter holidays"
| value >= 112 && value <= 320 = "3 quarter"
| value >= 321 && value <= 329 = "spring holidays"
| value >= 330 && value <= 522 = "4 quarter"
| otherwise = "summer holidays"
where
d = read (take 2 s) :: Int
m = read (drop 3 s) :: Int
monthLens = [31,28,31,30,31,30,31,31,30,31,30,31]
value = m * 100 + d :: Int
main :: IO ()
main = do
putStrLn ("1a) 01110 is bin? = " ++ show (checkPass1 "01110"))
putStrLn (" 120000 is bin? = " ++ show (checkPass1 "120000"))
putStrLn ("1b) abcdE has last big char? = " ++ show (checkPass2 "abcdE"))
putStrLn (" AbCdeeeeRock has last big char? = " ++ show (checkPass2 "AbCdeeeeRock"))
putStrLn ("2)AbbA --5-> "
++ show(caesarEncode "AbbA" 5)
++ " --back-> "
++ show(caesarDecode (caesarEncode "AbbA" 5) 5))
putStrLn ("3) 2403(8) - MXLIII(Rome) = "
++ show(octMinusRome "2403" "MXLIII"))
putStrLn ("4) D = " ++ show (getD [3,5] [1,2,3,5] [1,2,4]))
putStrLn ("5) 29.12 = " ++ (weekInfo "29.12"))
putStrLn (" 09.07 = " ++ (weekInfo "09.07"))
putStrLn (" 11.11 = " ++ (weekInfo "11.11"))