Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

C++ Помогите с заданиями...

25.11.09 00:12
Re: C++ Помогите с заданиями...
 
Tir na nOg прохожий
в ответ Tir na nOg 24.11.09 14:53, Последний раз изменено 25.11.09 00:13 (Tir na nOg)
Гы. Из лагеря функциональщиков решение на Хаскеле. Я тут изучаю, стало интересно как оно в сравнении с С++ будет выглядеть, начал у народа клянчить. Признаюсь, ожидал похожести на убойный квик сорт, но тоже ничё так, надо на С++ аналог сделать и сравнить трудозатраты:
http://rsdn.ru/forum/decl/3614528.1.aspx
import Text.Printf
-- Будем представлять календарь как таблицу (список списков)
-- Каждая клетка таблицы может включать дату, заголовок или быть пустой
data Cell = Day Int | Header String | Empty deriving Show
-- Формируем таблицу с календарем (отделили чистую функцию от IO)
-- Строим список, который соответствует таблице, если читать ее слева направо, сверху вниз.
-- Склеиваем: заголовки, начальные пустые клетки, даты, конечные пустые клетки
-- Разбиваем полученный список на блоки по 7 элементов. Получаем "таблицу" (список списков)
-- Например, для (calendar 15 5) функция возвращает:
-- [Header "mon",Header "tue",Header "wed",Header "thu",Header "fri",Header "sat",Header "sun"]
-- [Empty,Empty,Empty,Empty,Day 1,Day 2,Day 3]
-- [Day 4,Day 5,Day 6,Day 7,Day 8,Day 9,Day 10]
-- [Day 11,Day 12,Day 13,Day 14,Day 15,Empty,Empty]
calendar :: Int -> Int -> [[Cell]]
calendar days first = splitBy 7 $ headerLine ++ datesLines
where countStart = first-1 -- количество пустых клеток на первой неделе
countEnd = (8-days-first) `mod` 7 -- количество пустых клеток на последнкй неделе
datesLines = replicate countStart Empty ++ map Day [1..days] ++ replicate countEnd Empty
headerLine = map Header ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
-- Разбивает список xs на блоки по n элементов
splitBy :: Int -> [t] -> [[t]]
splitBy _ [] = []
splitBy n xs = start : splitBy n end
where (start, end) = splitAt n xs
-- Печатает календарь (вынесли форматирование календаря в отдельную функцию)
-- Для каждой строки вызываем showLine: преобразовываем значение клетки в строку (showElement),
-- форматируем (printf) и вставляем между ними пробелы (unwords). Получаем строку для вывода на экран.
-- Полученные строки выводим на экран (unlines превращает список строк в одну строку с символами '\n')
printCalendar :: [[Cell]] -> IO ()
printCalendar cells = putStr $ unlines $ map showLine $ cells
where showLine xs = unwords $ map (printf "%3s" . showElement) xs
showElement (Day d) = show d
showElement (Header h) = h
showElement Empty = ""
main = do
first <- do putStr "Enter start day of week (1..7): " ; readLn
days <- do putStr "Enter count days in month: " ; readLn
putStrLn ""
printCalendar $ calendar days first


 

Перейти на