Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2011, 03:38   #1
headoff
Новичок
Джуниор
 
Регистрация: 12.12.2011
Сообщений: 2
Злость работа с базой данных(список) - Haskell(а именно реализовать счётчик на Haskell)

В библиотеке хранятся книги, газеты, журналы. Книга характеризуется именем автора и названием; журнал – названием, месяцем, годом выпуска; газета – названием и датой выпуска. База данных представляет собой список этих объектов. Разработайте тип данных, представляющий объекты библиотечного хранения. Нужно определить следующую функцию:
- выводит все названия именно только газет(без повторений), встречающиеся в базе данных(входной параметр функции), и сколько раз встречается каждое название в БД. формат [name]-[count].

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

isPeriodic, проверяющую, что её аргумент является периодическим изданием.
getByTytle, выбирающая их списка объектов хранения (базы данных) объекты с указанным названием.
getByMonth, выбирающая из базы данных периодические издания, выпущенные в указанный месяц и указанный год.
getByMonths, действующая так же, как и предыдущая, но принимающая список месяцев.
getAuthors, возвращающая список авторов изданий, хранящихся в БД.

Код:
-- book(автор, название книги)
-- Journal(название журнала, месяц, год)
-- Newspaper(название газеты, дата выпуска)
data Library = Book String String 
			  | Newspaper String Int Int Int 
			  | Journal String Int Int deriving (Show, Eq)
			  
--isPeriodic
isPeriodic :: Library -> Bool
isPeriodic (Book _ _) = False
isPeriodic (Newspaper _ _ _ _) = True
isPeriodic (Journal _ _ _) = True

--getByTytle    getByTytle [(Book "VargVikerness" "Vargsmal"),(Newspaper "Varg" 05 12 11),(Journal "Varg" 08 98)] "Varg"
getByTytle :: [Library] -> String -> [Library]
getByTytle [] _ = []
getByTytle ((Book a x):xs) y = if a==y then (Book a x):getByTytle xs y else getByTytle xs y 
getByTytle ((Newspaper x a b c):xs) y = if x==y then (Newspaper x a b c):getByTytle xs y else getByTytle xs y 
getByTytle ((Journal x a b):xs) y = if x==y then (Journal x a b):getByTytle xs y else getByTytle xs y 

--getByMonth    getByMonth [(Book "VargVikerness" "Vargsmal"),(Newspaper "Varg" 05 12 11),(Journal "Varg" 08 98)] 12 11
getByMonth :: [Library] -> Int -> Int -> [Library]
getByMonth [] _ _ = []
getByMonth ((Book _ _):xs) x1 y1 = getByMonth xs x1 y1
getByMonth ((Newspaper a b x y):xs) x1 y1 = if x1==x && y1==y then (Newspaper a b x y):getByMonth xs x1 y1 else getByMonth xs x1 y1 
getByMonth ((Journal a x y):xs) x1 y1 = if x==x1 && y==y1 then (Journal a x y):getByMonth xs x1 y1 else getByMonth xs x1 y1 

--getByMonths    getByMonths [(Book "VargVikerness" "Vargsmal"),(Newspaper "Varg" 10 05 12),(Journal "Varg" 11 12)] [11,05] 12
getByMonths :: [Library] -> [Int] -> Int -> [Library]
getByMonths _ [] _ = []
getByMonths a (x:xs) b = getByMonth a x b++getByMonths a xs b

--getAuthors getAuthors [(Book "VargVikerness" "Vargsmal"),(Newspaper "12dasd" 10 05 12),(Journal "Varg" 11 12)]
getAuthors :: [Library] -> [String]
findEq :: [String] -> String -> [String]
findEq [] x = [x]
findEq (x:xs) y = if x/=y then x:findEq xs y else x:xs
getAuthors [] = []
getAuthors ((Book x _):xs) = findEq (getAuthors xs) x 
getAuthors ((Newspaper x _ _ _):xs) = findEq (getAuthors xs) x
getAuthors ((Journal x _ _):xs) = findEq (getAuthors xs) x

Последний раз редактировалось headoff; 13.12.2011 в 00:25.
headoff вне форума Ответить с цитированием
Старый 13.12.2011, 21:54   #2
headoff
Новичок
Джуниор
 
Регистрация: 12.12.2011
Сообщений: 2
По умолчанию решение

Код:
data Library = Book String String 
	       | Newspaper String Int Int Int 
	       | Journal String Int Int deriving (Show, Eq)

advanced :: [Library] -> [(String,Int)]
findCnt :: [(String,Int)] -> String -> [(String,Int)]
findCnt [] x = [(x,1)]
findCnt ((x,y):xs) z = if x/=z then (x,y+0):findCnt xs z else ((x,y+1):xs)
advanced [] = []
advanced ((Book x _):xs) = advanced xs
advanced ((Journal x _ _):xs) = advanced xs
advanced ((Newspaper x _ _ _):xs) = findCnt (advanced xs) x
headoff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
РАБОТА С БАЗОЙ ДАННЫХ emsisem Фриланс 4 30.04.2011 19:08
Работа с базой данных Dizark Помощь студентам 1 01.03.2008 20:30