-
Notifications
You must be signed in to change notification settings - Fork 23
/
lab9.hs
105 lines (87 loc) · 2.77 KB
/
lab9.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
-- Laboratorul 9: funcțiile de input și output --
import Control.Monad (forM, forM_)
import Data.List.Split (splitOn)
---- Exercițiul 1 ----
type Nume = String
type Varsta = Int
-- Tip de date pentru reținerea unei persoane
data Persoana = Pers Nume Varsta
deriving Eq
instance Ord Persoana where
-- Compar persoanele prin vârsta lor
(Pers _ varsta1) <= (Pers _ varsta2) = varsta1 <= varsta2
-- Citește datele unei persoane de la tastatură
citestePersoana :: IO Persoana
citestePersoana = do
-- Citesc numele persoanei
putStr "Nume: "
nume <- getLine
-- Citesc vârsta persoanei
putStr "Vârsta: "
varsta <- readLn :: IO Int
-- Construiesc obiectul de tip Persoană
return $ Pers nume varsta
-- Citește datele a N persoane de la tastatură
citesteNPersoane :: IO [Persoana]
citesteNPersoane = do
-- Citesc N-ul
putStr "N = "
nr <- readLn :: IO Int
-- Pentru fiecare i de la 0 la N, citesc câte o persoană
forM [1..nr] $ \_ -> do
citestePersoana
-- Afișează cea mai bătrână persoană dintr-o listă de persoane
afiseazaCeaMaiBatranaPersoana :: [Persoana] -> IO ()
afiseazaCeaMaiBatranaPersoana persoane = do
-- Găsesc cea mai bătrână persoană din listă
let ceaMaiBatrana = maximum persoane
-- Extrag numele și vârsta
let (Pers nume varsta) = ceaMaiBatrana
-- Afișare
putStr $ "Cel mai în vârstă este " ++ nume
putStrLn $ " (" ++ show varsta ++ " de ani)"
rezolvaEx1 :: IO ()
rezolvaEx1 = do
-- Citesc lista de persoane
persoane <- citesteNPersoane
-- Rezolv cerința
afiseazaCeaMaiBatranaPersoana persoane
---- Exercițiul 2 ----
citestePersoaneDinFisier :: IO [Persoana]
citestePersoaneDinFisier = do
input <- readFile "lab9-ex2.in"
-- Parcurg linie cu linie datele de intrare
let linii = lines input
forM linii $ \linie -> do
-- Descompun linia după virgulă
let [nume, varsta] = splitOn "," linie
-- Contruiesc un nou obiect de tip persoană
return $ Pers nume (read varsta)
rezolvaEx2 :: IO ()
rezolvaEx2 = do
-- Citesc persoanele din fișier
persoane <- citestePersoaneDinFisier
-- Rezolv cerința
afiseazaCeaMaiBatranaPersoana persoane
---- Exercițiul 3 ----
estePalindrom :: Int -> Bool
estePalindrom n =
let
sir = show n
in
sir == reverse sir
citesteVerifPalindrom :: IO ()
citesteVerifPalindrom = do
-- Citesc
nr <- readLn
-- Afișez
if estePalindrom nr then
putStrLn $ show nr ++ " este palindrom"
else
putStrLn $ show nr ++ " nu este palindrom"
suntPalindroame :: Int -> IO ()
suntPalindroame n =
-- Pentru i de la 1 la N
forM_ [1..n] $ \_ -> do
-- Citesc și verific că numărul este palindrom
citesteVerifPalindrom