2018, Funkcionális programozás

Hasonló dokumentumok
2018, Funkcionális programozás

2018, Funkcionális programozás

2016, Funkcionális programozás

2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

2018, Funkcionális programozás

2019, Funkcionális programozás. 4. el adás. MÁRTON Gyöngyvér

Funkcionális Nyelvek 2 (MSc)

2016, Funkcionális programozás

Programozás burritokkal

Tulajdonságalapú tesztelés

2018, Diszkrét matematika

2016, Diszkrét matematika

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

2018, Diszkrét matematika

Programozás alapjai. 5. előadás

2018, Diszkrét matematika

Megoldott feladatok. Informatika

2016, Diszkrét matematika

2015, Diszkrét matematika

Sztringkezelő függvények. A string típusú változók kezelése, használata és szerepük a feldolgozás során

2018, Funkcionális programozás

2018, Diszkrét matematika

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

2016, Diszkrét matematika

2018, Diszkrét matematika

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

2018, Diszkre t matematika. 8. elo ada s

Tisztán funkcionális adatszerkezetek

2017, Diszkrét matematika

INFORMATIKA javítókulcs 2016

2016, Diszkrét matematika

FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET

Tisztán funkcionális adatszerkezetek (folytatás)

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

Programozás I gyakorlat

C# feladatok gyűjteménye

Érdekes informatika feladatok

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Tuesday, March 6, 12. Hasító táblázatok

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Programozás II. 2. Dr. Iványi Péter

Algoritmizálás és adatmodellezés tanítása 1. előadás

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Imperatív programozás

6. A Pascal nyelv utasításai

Programozás alapjai 6. előadás. Wagner György Általános Informatikai Tanszék

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

2018, Diszkre t matematika. 10. elo ada s

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Egyszerű programok készítése Kifejezések Bitszintű műveletek Relációs műveletek... 58

INFORMATIKAI ALAPISMERETEK

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Felhasználó által definiált adattípus

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

LibreOffice Makró Basic

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

INFORMATIKAI ALAPISMERETEK

INFORMATIKA tétel 2019

length (s): Az s karaklerlánc hossza, substr(s,m,n): Az s mezőben levő karakterláncnak az m-edik karakterétől kezdődő, n darab karaktert vágja ki.

Programozás C nyelven (10. ELŐADÁS) Sapientia EMTE

Feldspar: Nyelv digitális jelfeldolgozáshoz

Szkriptnyelvek. 1. UNIX shell

1. Egészítsük ki az alábbi Python függvényt úgy, hogy a függvény meghatározza, egy listába, az első n szám faktoriális értékét:

Algoritmusok - pszeudókód... 1

1. Egyszerű (primitív) típusok. 2. Referencia típusok

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

Bevezetés a programozásba I.

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Funkcioná lis prográmozá s Start

BME MOGI Gépészeti informatika 5.

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

1. Alapok. Programozás II


Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Információs Technológia

Smalltalk 2. Készítette: Szabó Éva

Maximum kiválasztás tömbben

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

C programozási nyelv

Programozás alapjai II. (7. ea) C++

KIÍRÁS. - makestring("alma"^"korte\n"); > val it = "\"almakorte\\n\"" : string

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Adatbáziskezelés php-ben MySQL adatbáziskezelı rendszert használva

Funkcionális programozás

Delphi programozás IV.

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Átírás:

Funkcionális programozás 10. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév

Miről volt szó? a foldl és foldr függvények lista első, utolsó eleme lista hossza listaelemek összege egy eleme szerepel-e a listaelemek között kombinatorikai feladatok m elemű kombinációk meghatározása részhalmazok előálĺıtása N királynő feladat Pascal féle háromszög

Miről lesz szó? szekvenciális keresés: szövegállományban, bináris állományban bináris keresés, tömbök használata jelszavak hash értékének meghatározása

Szekvenciális keresés 1. feladat Olvassunk be egy szót a billentyűzetről és vizsgáljuk meg, hogy az szerepel-e egy adott szövegállományban. mainf1 :: IO() mainf1 = do putstr "szo = " szo <- getline inf <- openfile "szavak.txt" ReadMode feldolgoz1 inf szo 1 hclose inf keresf1 :: (Num a, Eq a1) => [a1] -> a1 -> a -> a keresf1 [] szo ind = 0 keresf1 (k: ve) szo ind k == szo = ind otherwise = keresf1 ve szo (ind + 1)

Szekvenciális keresés Az alkalmazott segédfüggvények: feldolgoz1 :: (Show a, Num a) => Handle -> String -> a -> IO () feldolgoz1 inf szo ind = do feof <- hiseof inf if feof then return () else do lista <- hgetline inf let res = keresf1 (words lista) szo 1 if res /= 0 then do putstr "sorszam: " print ind putstr "oszlopszam: " print res return () else feldolgoz1 inf szo (ind + 1)

Szekvenciális keresés, bináris állományban 2. feladat Vizsgáljuk meg, hogy egy adott bájtszekvencia benne van-e egy bináris állományban. A bájtszekvencia beolvasása hexa stringként történik, pl: 6F 9A 44 BD E7 mainf2 :: IO () mainf2 = do putstr "all nev: " nev <- getline putstr "Hexa bajt str: " temp <- getline let bmit = map alakith_b (words temp) inf <- openbinaryfile nev ReadMode bmiben <- hgetcontents inf let res = keresf2 bmiben bmit putstr "eredmeny: " putstrln $ show res hclose inf

Szekvenciális keresés, bináris állományban A alakith_b az egy vagy két szimbólumból álló hexa értékből előálĺıtja a megfelelő bájtot. alakith_b :: [Char] -> Char alakith_b [c] = chr (hexkar c) alakith_b [c1, c2] = chr ((hexkar c1) * 16 + (hexkar c2)) alakith_b _ = error "Hiba" import Data.Char alakith_b1 :: [Char] -> Char alakith_b1 [c] = chr (digittoint c) alakith_b1 [c1, c2] = chr ((digittoint c1) * 16 + (digittoint c2)) alakith_b1 _ = error "Hiba"

Szekvenciális keresés, bináris állományban A hexkar függvény egy hexa ( 0, 1... F ) szimbólumnak meghatározza a megfelelő int típusú értékét. hexkar :: Char -> Int hexkar c c <= 9 && c >= 0 = (ord c) - 48 c == a c == A = 10 c == b c == B = 11 c == c c == C = 12 c == d c == D = 13 c == e c == E = 14 c == f c == F = 15 otherwise = error "Hiba"

Szekvenciális keresés, bináris állományban A keresf2 megkeresi hogy az ls bájtszekvenciában megtalálható-e a bs szekvencia. keresf2 :: [Char] -> [Char] -> Bool keresf2 [] bs = False keresf2 ls bs skeres ls bs = True otherwise = keresf2 (tail ls) bs where skeres [] ue = False skeres _ [] = True skeres (k: ve) (l: ue) k /= l = False otherwise = skeres ve ue

Szekvenciális keresés, struct típusú adathalmazban 3. feladat Egy szövegállományban egy adott személyről a következő adatok vannak eltárolva: vezetéknév, keresztnév, születési dátum. Hozzuk létre a következő típusú adatszerkezeteket, majd olvassuk ki az adatokat az állományból és határozzuk meg, egy adott dátumon született személyek listáját. A keresett születési dátumot a billentyűzetről olvassuk be. data Datum = Datum{ nap :: Int, honap:: Int, ev :: Int } deriving (Show) data Szemely = Szemely { vnev :: [Char], knev :: [Char], szdatum :: Datum } deriving (Show)

Szekvenciális keresés, struct típusú adathalmazban mainf3 :: IO () mainf3 = do putstr "keresett datum: " dat <- getline let datum = formaz dat inf <- openfile "szemely.txt" ReadMode lista <- feldolgoz3 inf let res = keresf3 datum lista putstr (show res) hclose inf > mainf3 keresett datum: 13 6 1972 [Szemely {vnev = "Szep", knev = "Sandor", szdatum = Datum {nap = 13, honap = 6, ev = 1972}}, Szemely {vnev = "Balogh", knev = "Andras", szdatum = Datum {nap = 13, honap = 6, ev = 1972}}]

Szekvenciális keresés, struct típusú adathalmazban A szemely.txt szerkezete a következő: Nagy Ferenc 5 10 1989 Bandi Zoltan 6 9 1972 Joo Erika 30 5 1976 Szep Sandor 13 6 1972 Kiss Malvin 25 12 1973... formaz :: String -> Datum formaz str = elem where lstr = words str nap = read (lstr!! 0) :: Int honap = read (lstr!! 1) :: Int ev = read (lstr!! 2) :: Int elem = Datum nap honap ev

Szekvenciális keresés, struct típusú adathalmazban feldolgoz3 :: Handle -> IO [Szemely] feldolgoz3 inf = do eof <- hiseof inf if eof then return [] else do sor <- hgetline inf let lsor = words sor let vnev = lsor!! 0 let knev = lsor!! 1 let nap = (read (lsor!! 2) :: Int) let honap = (read (lsor!! 3) :: Int) let ev = (read (lsor!! 4) :: Int) let elemd = Datum nap honap ev let eleml = Szemely vnev knev elemd lista <- feldolgoz3 inf return (eleml : lista)

Szekvenciális keresés, struct típusú adathalmazban keresf3 :: Datum -> [Szemely] -> [Szemely] keresf3 _ [] = [] keresf3 datum (k: ve) vizsgal datum (szdatum k) = (k: keresf3 datum ve) otherwise = keresf3 datum ve vizsgal :: Datum -> Datum -> Bool vizsgal d1 d2 nap d1 == nap d2 && honap d1 == honap d2 && ev d1 == ev d2 = True otherwise = False

Bináris keresés lista adatszerkezettel, I. módszer 4. feladat Alkalmazzuk a bináris keresés algoritmusát egy lista típusú adatszerkezeten. mainf4 :: Int mainf4 = bkeres1 lista 21 0 (length lista) where lista = [1,5,7,9,10,11,21,21,22,27,34,55,67,90] bkeres1 :: Ord a => [a] -> a -> Int -> Int -> Int bkeres1 ls k l h h < l = -1 p > k = bkeres1 ls k l (i-1) p < k = bkeres1 ls k (i+1) h otherwise = i where i = l + ((h - l) div 2) p = ls!! i

Bináris keresés lista adatszerkezettel, II módszer mainf4_2 :: Maybe Int mainf4_2 = bkeres2 lista 100 where lista = [1,5,7,9,10,11,21,34,55,67,90] bkeres2 :: Ord a => [a] -> a -> Maybe a bkeres2 [] _ = Nothing bkeres2 ls k k < p = bkeres2 (take (i-1) ls) k k > p = bkeres2 (drop (i+1) ls) k otherwise = Just k where i = ((length ls) - 1) div 2 p = ls!! i

Bináris keresés tömb adatszerkezettel 5. feladat Alkalmazzuk a bináris keresés algoritmusát egy tömb típusú adatszerkezeten. import Data.Array mainf5 :: Maybe Integer mainf5 = bkerestomb tomb 21 where tomb = listarray (0, 10) [1,5,7,9,10,11,21,34,55,67,90] > mainf5 Just 6

Bináris keresés tömb adatszerkezettel bkerestomb :: (Ix i, Integral i, Ord e) => Array i e -> e -> Maybe i bkerestomb a x = bkerest a x (bounds a) bkerest :: (Ix a, Ord a1, Integral a) => Array a a1 -> a1 -> (a, a) -> Maybe a bkerest a x (l, h) h < l = Nothing x < aelem = bkerest a x (l, i - 1) x > aelem = bkerest a x (i + 1, h) otherwise = Just i where i = (l + h) div 2 aelem = a! i

Feladatok 6. feladat Írjunk egy alkalmazást, amely a lenti leírás alapján meghatározza a jelszavak hash-értékét. További útmutatás: Diviánszky Péter - Jelszavak Jelszavak hash-értékének a meghatározása két lépésben történik Első lépésben egy kulcsképző függvény segítségével meghatározunk egy kulcsértéket, ami tulajdonképpen a jelszó normalizálását jelenti, Második lépésben ennek a kulcsértéknek határozzuk meg a tulajdonképpeni hash-értéket. A gyakorlatban alkalmazott hash függvények: az SHA-függvénycsalád stb, A kulcsképző függvény lehet többféle, a feladatban két kulcsképző függvény kerül alkalmazásra, mindkét esetben egy toldalék, a salt alapján történik a kulcsérték meghatározása A hash-érték meghatározását is többféleképpen végezhetjük, a feladatban a következő egyszerű képlet kerül alkalmazásra: hash[c 1, c 2,..., c n] = n i=1 i 2ord(c i ), ahol a c 1, c 2,... c n értékek a kódolandó jelszó karakterei.

Feladatok 1. kulcsképző függvény: a jelszóból a kulcsot úgy képezzük, hogy a jelszót összefűzzük a toldalékkal, majd a saját megfordítottjával. 2. kulcsképző függvény: a függvénynek három paramétere van: a salt és a jelszó mellett meg kell adni az elérni kívánt hosszúság értékét a jelszó után fűzzük a toldalékot addig, amíg az elérni kívánt hosszúságot el nem értük. Ha a jelszó eleve hosszabb a kívánt hosszúságnál, akkor levágunk belőle. Ha nincs megadva toldalék, akkor magát a jelszót fűzzük egymásután többször, a kívánt hossz eléréséig.

Feladatok A kulcsképző függvények type Salt = String type KDF = Salt -> String -> String kdf1 :: KDF kdf1 salt list = list ++ salt ++ (reverse list) kdf2 :: Int -> KDF...

Feladatok A kulcsképző függvények > kdf1 "" "password" "passworddrowssap" > kdf1 "salt" "password" "passwordsaltdrowssap" > kdf2 16 "" "mypass" "mypassmypassmypa" > kdf2 10 "salt" "mylongpassword" "mylongpass" > kdf2 30 "salt" "mylongpassword" "mylongpasswordsaltsaltsaltsalt"

Feladatok A hash-érték meghatározása a kulcsérték alapján import Data.Char import Data.Bits type Hash = Integer hash :: String -> Hash...

Feladatok A hash-érték meghatározása > hash "passworddrowssap" 13196246709783993782797560045161676800 > hash "passwordsaltdrowssap" 17675583594922209204904521203219169280 > hash "mypassmypassmypa" 65369075091321280138698505461394571264 > hash "mylongpass" 6123727222422612671967307593924214784 > hash "mylongpasswordsaltsaltsaltsalt" 25230113278881150343787438878951997440

Feladatok A jelszó végső hash-értékének létrehozásához a következő adatszerkezettel dolgozunk, el kell tárolni a hash és salt értéket is data Password = Passw Hash Salt deriving (Show) vagy definiálhatjuk a következőképpen is: data Password = P { h :: Hash, s :: Salt } deriving (Show) Jelszó hash-értékének a létrehozása: mkpassword :: KDF -> Salt -> String -> Password mkpassword fugv salt list = Passw (hash $ fugv salt list) salt

Feladatok > mkpassword kdf1 "" "password" Passw 13196246709783993782797560045161676800 "" > mkpassword kdf1 "salt" "password" Passw 17675583594922209204904521203219169280 "salt" > mkpassword (kdf2 16) "" "mypass" Passw 65369075091321280138698505461394571264 "" > mkpassword (kdf2 10) "salt" "mylongpassword" Passw 6123727222422612671967307593924214784 "salt" > mkpassword (kdf2 30) "salt" "mylongpassword" Passw 25230113278881150343787438878951997440 "salt"