Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Funktsionalnoe_i_logicheskoe_programmirovanie.doc
Скачиваний:
17
Добавлен:
19.01.2023
Размер:
1.75 Mб
Скачать

Лабораторная работа 4. Текстовые файлы. Факторизация, простые числа, разные задачи.

4. 1 Работа с текстовыми файлами в Haskell

Haskell по определению является чистым языком программирования, то есть любая функция должна всегда возвращать один и тот же результат при одинаковых аргументах. В идеале программа не должна содержать ввода-вывода и других действий, которые могут «испортить» чистоту. Но мы понимаем, что практически любая программа нуждается в определенном взаимодействии с пользователем. Для реализации ввода-вывода и вообще действий в Haskell используется довольно сложная концепция монад, подробное изучение которых выходит за рамки нашего курса. В рамках данной лабораторной работы мы изучим только довольно простой шаблон работы с текстовыми файлами. Вот этот шаблон:

main :: IO ()

main = do

contents <- readFile "input.txt"

writeFile "output.txt" (process contents)

Здесь содержимое текстового файла считывается в строку contetnts, подвергается обработке какой-то функцией process и записывается в выходной файл. Например, преобразование всех символов к верхнему регистру:

Результат после запуска (запускаем функцию main без аргументов), можно увидеть, конечно, если в блокноте открыть выходной файл.

4.2

С помощью языка Haskell можно писать компактные и изящные решения довольно сложных задач. В данной лабораторной работе в заданиях 2 и 3 предлагается решить задачи с сайта http://projecteuler.net/problems, посвященному различным интересным задачам программирования. Разберем несколько подзадач, которые могут вам пригодиться при выполнении работы.

В работах [1,3] приводятся следующие функции для получения бесконечного списка чисел Фибоначчи:

1) fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

2) fibbs = 1 : 1 : next fibbs where

next (x:y:xs) = x + y : next (y:xs)

3) fibbbs = next 0 1 where

next x y = y : next y (x+y)

Там же приведены следующие способы получения списка простых чисел:

1) primes = map head $ iterate sieve [2..] where

sieve (x:xs) = [y | y <-xs, y `mod` x /= 0]

2) primes = 2 :

filter (\x -> all (\p -> x `mod` p /= 0) $

takeWhile (\p -> p^2 <= x) primes) [3..]

Существуют и достаточно сложные, но эффективные алгоритмы, например в [4] приведена реализация решета Аткина получения простых чисел:

Задание на лабораторную работу 4.

1. Написать функцию, которая читает входной текстовой файл и выводит в выходной файл указанную информацию.

2. 3. Перевести текст задачи и написать решение. При желании любую задачу своего варианта можно заменить двумя другими задачами с сайта http://projecteuler.net/problems, не встречающимися в других вариантах и имеющими номер >50. Проверить полученные ответы на указанном сайте. В скобках указан номер задачи на сайте.

Вариант 1.

1. Строки исходного файла, отсортированные по возрастанию длины.

2. (34) 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145.

Find the sum of all numbers which are equal to the sum of the factorial of their digits.

Note: as 1! = 1 and 2! = 2 are not sums they are not included.

3.(250) Find the number of non-empty subsets of {11, 22, 33,..., 250250250250}, the sum of whose elements is divisible by 250. Enter the rightmost 16 digits as your answer.