отчет флп 4
.docxУФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ИНФОРМАТИКИ И РОБОТОТЕХНИКИ
КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
|
|
|
||
|
УТВЕРЖДАЮ Проректор университета по научной работе ФИО |
|||
|
|
|
||
|
"___" ______________ _______г. |
|||
|
|
|
||
ОТЧЕТ О ПРОВЕДЕНИИ ЛАБОРОТОРНОЙ РАБОТЫ № 4 ВАРИАНТ № 5 |
||||
|
||||
по предмету: ФУНКЦИОНАЛЬНО И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ |
||||
Преподаватель |
|
В.А. Котельников |
||
|
|
|
||
|
|
|
||
|
|
|
||
Исполнитель |
|
А.Р. Шакиров |
||
|
|
|
||
Уфа 2020 |
ВВЕДЕНИЕ
Цель работы – изучить бесконечные списки и функции работы с текстовыми файлами.
ХОД РАБОТЫ
В ходе лабораторной работы были выполнены следующие задания:
а) Числа торта – максимальное число областей, получаемое при делении куба n плоскостями - 1,2,4,8,15,26…;
б) количество чисел кратных 6, меньших 500;
Результат приведен ниже.
Main> take 10 tort
[1,2,4,8,15,26,42,64,93,130]
Main> tortVal
2
Написать функцию, которая читает входной текстовой файл и выводит в выходной файл указанную информацию.
Слова исходного файла, не начинающиеся с заглавной буквы и не повторяющиеся.
Содержимое «in.txt»: Ab ab ab cd Cd CDE cDE
Результат приведен ниже.
Main> task2 "in.txt"
ab cd cDE
Содержимое «out.txt»: ab cd cDE
Написать решение задачи:
(20). n! means n × (n − 1) × ... × 3 × 2 × 1
For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,
and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.
Найти сумму цифр факториала числа 100.
Результат работы приведен ниже.
Main> task3
648
Написать решение задачи:
Результат приведен ниже.
Main> task4 100
11363107
ЗАКЛЮЧЕНИЕ
В ходе лабораторной работы были получены навыки работы с бесконечными списками и функциями для работы с текстовыми файлами.
ПРИЛОЖЕНИЕ А. Листинг кода в файле «laba4.hs»
-- Вариант 5
import Data.Char
import Data.List
-- 1
-- Число торта
tort :: [Integer]
tort = [(n^3 + 5*n + 6) `div` 6 | n<-[0..]]
-- количество чисел кратных 6, меньших 500 среди чисел торта
tortVal :: Int
tortVal = length [x | x <- take 1000 tort, x < 500, x `mod` 6 == 0]
-- 2
-- Написать функцию, которая читает входной текстовой файл
-- и выводит в выходной файл указанную информацию
-- Слова исходного файла, не начинающиеся с заглавной буквы
-- и не повторяющиеся
task2 :: FilePath -> IO ()
task2 fileName = do
text <- readFile fileName
putStrLn (unwords (getMyWords text))
writeFile "out.txt" (unwords (getMyWords text))
where
getMyWords text = nub (filter isLowerFirst (words text))
isLowerFirst s = isLower (head s)
-- 3
-- Сумма цифр факториала 100
task3 :: Int
task3 =
sum (map digitToInt (strFac 100))
where
strFac n = show (fac n)
fac 1 = 1
fac n = n * fac (n-1)
-- 4
-- Для натуральных n
-- f(n) - наименьшее кратное n, которое записано цифрами <=2
task4 :: Integer -> Integer
task4 n =
foldl1 (\acc x -> f x `div` x + acc) [1..n]
where
f :: Integer -> Integer
f n =
head [intTo3 a | a<-[1..], intTo3 a `mod` n == 0]
-- генерируем из 10 чисел троичные и используем как 10
intTo3 n = to3system n 0
to3system 0 _ = 0
to3system n deep =
to3system (n `div` 3) (deep + 1) + (n `mod` 3) * (10^deep)