Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

отчет флп 2

.docx
Скачиваний:
18
Добавлен:
31.03.2021
Размер:
65.25 Кб
Скачать

Министерство науки и высшего образования РФ

Федеральное государственное бюджетное образовательное

учреждение высшего образования

«Уфимский государственный авиационный технический университет»

Факультет информатики и робототехники

Кафедра вычислительной математики и кибернетики

Отчет по лабораторной работе №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"))

Соседние файлы в предмете Функциональное и логическое программирование