Moduł to zbiór powiązanych ze sobą funkcji, typów i klas typu. Język Haskell stanowi zbiór modułów, gdzie moduł główny załącza pozostałe moduły w

Wielkość: px
Rozpocząć pokaz od strony:

Download "Moduł to zbiór powiązanych ze sobą funkcji, typów i klas typu. Język Haskell stanowi zbiór modułów, gdzie moduł główny załącza pozostałe moduły w"

Transkrypt

1 Haskell Moduły

2 Moduł to zbiór powiązanych ze sobą funkcji, typów i klas typu. Język Haskell stanowi zbiór modułów, gdzie moduł główny załącza pozostałe moduły w celu użycia zawartych w nich funkcji dla określonego celu. Taki stan rzeczy nie pozbawiony jest zalet. Jeśli moduł jest stosunkowo uniwersalny, to funkcje w nim zawarte można zastosować do wielu różnych programów. Jeśli kod jest podzielony na samodzielne moduły, które nie polegają na sobie zbyt dużo (luźno powiązane), można ponownie wykorzystać je później. To sprawia, że zajmowanie się pisaniem kodu jest bardziej wykonalne poprzez podzielenie go na kilka części, z których każda ma pewnego rodzaju cel.

3 Ładowanie Modułów Standardowa biblioteka Haskell jest podzielona na moduły, każdy z nich zawiera funkcje i typy, które są w jakiś sposób powiązane i służą pospolitym celom. Znaleźć tu możemy moduł do manipulowania listami, moduł do programowania równoległego, moduł do operacji na liczbach zespolonych, itp.. Wszystkie funkcje, rodzaje i klasy typu, z poprzednich rozdziałów były częścią Prelude module (Modułu Preludyjnego?). Funkcje te są importowane domyślnie.

4 Składnie dla importowanego modułu w skrypcie Haskell a wygląda następująco import <module name>. Import modułu musi być wykonany przed zdefiniowaniem funkcji, z tego powodu umieszczamy go na szczycie pliku. Dla jednego skryptu można pobrać wiele modułów. Wystarczy umieścić każdy z importowanych komunikatów w osobnym wierszu. Po imporcie modułu, wszystkie zawarte w nim funkcje stają się dostępne w globalnej przestrzeni nazw, co oznacza, że można je wywołać z dowolnego miejsca w skrypcie. Funkcja nub określa w zimportowanym module listę i odsiewa zduplikowane elementy. Kompozycja length i nub wykonana w formie length. nub wytwarza funkcje będącą ekwiwalentem \xs -> lenght (nub xs).

5 Istnieje również możliwość umieszczenia funkcji z modułów w globalnej przestrzeni nazw poprzez zastosowanie GHCI. Na przykład : ghci > :m + Name. List Jeżeli potrzebujemy wczytać nazwy z kilku modułów wewnątrz GHCI, nie musimy użyć poniższej składni :m + kilkakrotnie Możemy nieco ułatwić sobie życie ghci > :m + Data. List Data. Map Data. Set Jednakże, jeśli masz załadowany skrypt, który już zaimportował moduł, nie trzeba używać M +, aby uzyskać do niego dostęp. Jeżeli potrzebujemy dwóch funkcji z danego modułu to możemy selektywnie importować tylko te funkcje, np. funkcje nub i sort z Data.List import Data. List (nub, sort )

6 Możemy również wykonać import wszystkich funkcji ze spodziewanego modułu za wyjątkiem kilku z nich. To często przydatne, gdy kilka modułów eksportuje (dostarcza, wypluwa) funkcje o tej samej nazwie i chcesz się pozbyć tych niepotrzebnych. Powiedzmy że już mamy własną funkcje nazwaną nub i chcemy zaimportować wszystkie funkcje z Data.List szczególnie funkcje nub : import Data. List hiding ( nub ) Innym sposobem radzenia sobie z nazwami klas jest wykfalifikowany import (qualified imports). Moduł Data.Map oferuje strukturę danych do przeszukiwania wartości według klucza, eksportuje kilka funkcji o tej samej nazwie jak funkcje Prelude, filtrując lub nie. Więc kiedy importujemy Data.Map i wtedy wywołujemy filtr, Haskell nie wie której funkcji użyć. Oto w jaki sposób rozwiązać ten problem: import qualified Data. Map

7 To sprawia, że jeśli chcemy odwołać funkcję filtra Data.Map 's, mamy do czynienia z Data.Map.filter, natomiast filter wciąż odnosi się do normalnego filtra. Ale wpisywania Data.Map z przodu każdej funkcji z tego modułu jest trochę uciążliwe. Dlatego możemy zmienić nazwę importu wykfalifikowanego na coś krótszego: import qualified Data. Map as M Teraz aby, odnieść się do funkcji Data.Map s filter, musimy po prostu użyć M.filter. Używamy tych poręcznych odniesień aby sprawdzić które moduły są w bibliotece standardowej. Świetnym sposobem aby pozyskać nową wiedzę z Haskell a jest po prostu klikniecie standardowej biblioteki odniesień (Reference Library) i otrzymanie modułów i ich funkcji. Aby sprawdzić funkcje albo znaleźć ich lokalizacje, używamy Hoogle. Hoogle to Haskell owy silnik przeszukiwania przy pomocy nazwy, nazwy modułu a nawet typu sygnatury.

8 Data.List Rzućmy okiem na nieużywane do tej pory funkcje. Intersperse bierze element i listę, a następnie umieszcza ten element pomiędzy każdą parą elementów na liście. Oto demonstracja: ghci > intersperse. " MONKEY " "M.O.N.K.E.Y" ghci > intersperse 0 [1,2,3,4,5,6] [1,0,2,0,3,0,4,0,5,0,6] Intercalate pobiera listę list i listy. Następnie umieszcza tę listę między wszystkimi listami, a następnie wyrównuje wynik. ghci > intercalate " " [" hey "," there "," guys "] " hey there guys " ghci > intercalate [0,0,0] [[1,2,3],[4,5,6],[7,8,9]] [1,2,3,0,0,0,4,5,6,0,0,0,7,8,9]

9 Transpose transponuje listę list. Jeśli spojrzeć na listę list jako na dwuwymiarową (2D) macierz, kolumny stały się wierszami i odwrotnie. ghci > transpose [[1,2,3],[4,5,6],[7,8,9]] [[1,4,7],[2,5,8],[3,6,9]] ghci > transpose [" hey "," there "," guys "] [" htg "," ehu "," yey ","rs","e"] Gdy poddamy transpozycji te trzy listy, trzecie uprawnienia znajdują się w pierwszym wierszu, drugie uprawnienia w drugim i tak dalej. Mapowanie sum do tego produkuje pożądany rezultat.

10 foldl, foldl1, foldr i foldr1 to ścisłe wersje swoich odpowiednich leniwych wcieleń. Podczas korzystania z leniwych fałd dla bardzo dużych list, możemy często dostać błąd przepełnienia stosu. Sprawcą jest to, że ze względu na leniwy charakter fałd, wartość akumulatora nie jest właściwie aktualizowana gdy fałdowanie ma miejsce. To co wówczas zachodzi w akumulatorze zwiastuje pozytywną obietnice że obliczy wartość gdy skieruje pytanie do aktualnie wyprodukowanego rezultatu. To się dzieje dla każdego pośredniego akumulatora, a wszystkie te obietnice przepełniają stos. Surowe fałdy obliczają pośrednie wyniki zamiast zapełniać stos obietnicami. Więc jeśli kiedykolwiek otrzymasz stos przepełniony błędami robiąc leniwe fałdy, spróbuj przejścia na ich surowych wersjach.

11 Concat spłaszcza listę list do listy elementów. ghci > concat [" foo "," bar "," car "] " foobarcar " ghci > concat [[3,4,5],[2,3,4],[2,1,1]] [3,4,5,2,3,4,2,1,1] To po prostu usunie jeden poziom zagnieżdżenia. Więc jeśli chcesz całkowicie spłaszczyć [[[2,3], [3,4,5], [2]], [[2,3], [3,4]]], co jest listą list z, list trzeba złączyć je dwukrotnie. Wykonywany concatmap jest taki sam jak pierwsze mapowanie funkcji na liście, a następnie złączenie listy concat (złączem?). ghci > concatmap ( replicate 4) [1..3] [1,1,1,1,2,2,2,2,3,3,3,3]

12 and przyjmuje listę wartości logicznych i zwraca true tylko wtedy, gdy wszystkie wartości w liście są prawdziwe. ghci > and $ map ( >4) [5,6,7,8] True ghci > and $ map (==4) [4,4,4,3,4] False or jest jak and zwraca true wtedy, gdy choć jedna wartości z listy jest prawdziwa. ghci > or $ map (==4) [2,3,4,5,6,1] True ghci > or $ map ( >4) [1,2,3] False

13 any i all biorą orzecznik, a następnie sprawdzają, czy którekolwiek lub wszystkie elementy listy spełniają predykat odpowiednio. Zazwyczaj używamy tych dwóch funkcji zamiast mapowania na liście, a następnie robi and lub or. ghci > any (==4) [2,3,5,6,1,4] True ghci > all ( >4) [6,9,10] True ghci > all ( elem [ A.. Z ]) " HEYGUYSwhatsup " False ghci > any ( elem [ A.. Z ]) " HEYGUYSwhatsup " True iterate wykonuje funkcję i wartość początkową. To odnosi funkcje do wartości początkowej, wówczas to dotyczy tego rezultatu funkcji, wówczas to dotyczy wyniku funkcji ponownie, itp. zwraca wszystkie wyniki w postaci nieskończonej listy. ghci > take 10 $ iterate (*2) 1 [1,2,4,8,16,32,64,128,256,512] ghci > take 3 $ iterate (++ " haha ") " haha " [" haha "," hahahaha "," hahahahahaha "]

14 splitat podejmuje numer oraz listę. Następnie dzieli listę na wiele elementów, wracający wyniki to dwie listy w krotce. ghci > splitat 3 " heyman " (" hey "," man ") ghci > splitat 100 " heyman " (" heyman ","") ghci > splitat ( -3) " heyman " (""," heyman ") ghci > let (a,b) = splitat 3 " foobar " in b ++ a " barfoo takewhile jest to bardzo przydatna funkcja. Pobiera elementy z listy podczas gdy orzecznik trzyma i wtedy kiedy element jest napotkany w taki sposób że nie spełnia predykatu, jest ona przerwana. Okazuje się że jest to bardzo przydatne. ghci > takewhile ( >3) [6,5,4,3,2,1,2,3,4,5,4,3,2,1] [6,5,4] ghci > takewhile (/= ) " This is a sentence " " This "

15 Powiedzmy że chcemy znać sumę wszystkich trzech wartości, które znajdują się poniżej Nie możemy na mapie(^ 3) [1..], zastosować filtr, a następnie spróbować podsumować, ponieważ filtrowanie nieskończonej listy nigdy nie dobiegnie końca. Wszystkie elementy tutaj są rosnąco, ale Haskell tego nie robi. Dlatego możemy to zrobić: ghci > sum $ takewhile ( <10000) $ map (^3) [1..] Stosujemy (^ 3) do listy nieskończonej a następnie raz na element, który znajduje się ponad , lista jest przerwana. Teraz możemy podsumować to łatwiej.

16 dropwhile jest podobny, tylko gdy spadnie/upuszczania wszystkich elementów, podczas gdy orzecznik jest prawdziwy (true) funkcja ta upuszcza wszystkie elementy. Jeden orzecznik równy False, zwraca resztę listy. ghci > dropwhile (/= ) " This is a sentence " " is a sentence " ghci > dropwhile ( <3) [1,2,2,2,3,4,5,4,3,2,1] [3,4,5,4,3,2,1] Możemy podać listę, która reprezentuje wartość zbioru według daty. Lista jest wykonane z krotek, których pierwszym elementem jest zbiór wartość, drugi to rok, trzeci miesiąc, a czwarty jest (date) liczba porządkowa (o ile prawidłowo rozumiem). Chcemy wiedzieć gdy zbiór wartości pierwszy raz przekroczył tysiąc dolarów! ghci > let stock = [(994.4,2008,9,1),(995.2,2008,9,2),(999.2,2008,9,3),(1001.4,2008,9,4),(998.3, 2008,9,5)] ghci > head ( dropwhile (\( val,y,m,d) -> val < 1000) stock ) (1001.4,2008,9,4)

17 span to trochę jak takewhile tylko zwraca parę list. Pierwsza lista zawiera wszystko z otrzymanej list od takewhile, zawierałaby gdyby była wywoływana z tego samego predykatu i tej samej listy. Druga lista zawiera część listy, której elementy zostały pożucone. ghci > let (fw, rest ) = span (/= ) " This is a sentence " in " First word :" ++ fw ++ ", the rest :" ++ rest " First word : This, the rest : is a sentence Natomiast span obejmuje listę gdy orzecznik jest prawdą, łamie i przerywa go gdy orzeczenie jest pierwszym prawdziwym. Robiąc break p jest równoważne robieniu span (not. p). ghci > break (==4) [1,2,3,4,5,6,7] ([1,2,3],[4,5,6,7]) ghci > span (/=4) [1,2,3,4,5,6,7] ([1,2,3],[4,5,6,7] Podczas korzystania z break, druga lista w wyniku wystartuje z pierwszym elementem, który spełnia predykat.

18 sort po prostu sortuje listę. Rodzaj elementów na liście ma być częścią klas typu Ord (typeclass), ponieważ jeżeli elementów listy nie można umieścić w jakimś porządku, to lista nie może być sortowana. ghci > sort [8,5,3,2,1,6,4,2] [1,2,2,3,4,5,6,8] ghci > sort " This will be sorted soon " " Tbdeehiillnooorssstw group pobiera listę i grupy sąsiadujących elementów z podlist jeśli są one równe. ghci > group [1,1,1,1,2,2,2,2,3,3,2,2,2,5,6,7] [[1,1,1,1],[2,2,2,2],[3,3],[2,2,2],[5],[6],[7]] Jeśli posortować listę przed pogrupowaniem jej, możemy dowiedzieć się, ile razy każdy element pojawi się na liście. ghci > map (\ l@(x:xs) -> (x, length l)). group. sort $ [1,1,1,1,2,2,2,2,3,3,2,2,2,5,6,7] [(1,4),(2,7),(3,2),(5,1),(6,1),(7,1)]

19 inits i tails są jak (początek i koniec?), tylko one rekurencyjnie wspierają listę, dopóki nic nie zostanie. ghci > inits " w00t " ["","w","w0"," w00 "," w00t "] ghci > tails " w00t " [" w00t ","00t","0t","t",""] ghci > let w = " w00t " in zip ( inits w) ( tails w) [(""," w00t "),("w","00t"),("w0","0t"),(" w00 ","t"),(" w00t ","")] Użyjmy fałd do zaimplementowania przeszukiwania listy dla podlisty. search :: (Eq a) => [a] -> [a] -> Bool search needle haystack = let nlen = length needle in foldl (\ acc x -> if take nlen x == needle then True else acc ) False ( tails haystack )

20 Najpierw wywołujemy tails z przeszukiwanej list. Potem przeglądamy każdy ogon i sprawdzamy, czy zaczyna się od tego, czego szukamy. Z tym tworzymy funkcje która zachowuje się jak isinfixof. isinfixof wyszukuje podmenu w obrębie listy i zwraca True jeśli podlista której szukamy zawiera się w liście docelowej. ghci > " cat " isinfixof "im a cat burglar " True ghci > " Cat " isinfixof "im a cat burglar False ghci > " cats " isinfixof "im a cat burglar " False

21 isprefixof i issuffixof przeszukują listę od początku i od tyłu, odpowiednio. ghci > " hey " isprefixof " hey there!" True ghci > " hey " isprefixof "oh hey there!" False ghci > " there!" issuffixof "oh hey there!" True ghci > " there!" issuffixof "oh hey there " False elem i notelem sprawdzają czy element znajduje się lub nie znajduje się w liście. partition pobiera listę i predykat i zwraca parę list. Pierwsza lista w rezultacie zawiera wszystkie elementy, które spełniają predykat, druga zawiera wszystkie te, które tego nie robią. ghci > partition ( elem [ A.. Z ]) " BOBsidneyMORGANeddy " (" BOBMORGAN "," sidneyeddy ") ghci > partition ( >3) [1,3,5,6,3,2,1,0,3,7] ([5,6,7],[1,3,3,2,1,0,3])

22 Ważnym jest zrozumienie jak to się różni od span i break : ghci > span ( elem [ A.. Z ]) " BOBsidneyMORGANeddy " (" BOB "," sidneymorganeddy ") Podczas gdy span i break zostały raz wykonane, wówczas gdy napotykają pierwszy element który nie spełnia i spełnia predykat, partition (partycja) przechodzi całą listę i dzieli ją według orzecznika. find pobiera listę i predykat i zwraca pierwszy element, który spełnia orzecznik (predykat). Ale zwraca ten element owinięty w Maybe wartości. Będziemy algebraicznie obejmować typy danych dogłębnie w następnym rozdziale ale teraz, ważne jest abyśmy wiedzieli że : Wartości Maybe mogą być zarówno czymś lub niczym. Podobnie jak lista może być zarówno pustą listą lub listą zawierającą jakieś elementy, wartość Maybe może być zarówno bez elementowa lub jednoelementowa. I podobnie jak w rodzaju listy, powiedzmy, całkowitymi są [Int], dla typu Maybe całkowite jest Maybe Int. Tak czy inaczej, weźmy naszą funkcji find (wyszukiwania) dla spin. ghci > find ( >4) [1,2,3,4,5,6] Just 5 ghci > find ( >9) [1,2,3,4,5,6] Nothing ghci > :t find find :: (a -> Bool ) -> [a] -> Maybe a

23 Zwróćmy uwagę na rodzaj find. Jego wynikiem jest Maybe a. To trochę tak, jakby dla rodzaju [a] wyłącznie rodzaj Maybe mógł zawierać zarówno brak elementów jak i jeden element, natomiast lista może być bez elementowa, jedno elementowa lub wieloelementowa. Pamiętaj, kiedy szukaliśmy po raz pierwszy nasz zbiór przeszedł na 1000 $. Zrobiliśmy head (dropwhile (\ (val, y, m, d) -> Val <1.000) stock). Pamiętaj, że head nie jest naprawdę bezpieczny. Co by się stało, gdyby nasz zbiór nigdy nie poszedł ponad 1000 $? Podany przez nas dropwhile zwróci pustą listę i otrzymamy head z pustej listy spowoduje wystąpienie błędu. Jeśli jednak przepiszemy to jako find (\(val,y,m,d) -> val > 1000) stock będziemy bezpieczniejsi. Jeśli nasze zbiory niepodeszły do $ 1000 (więc jeśli żaden element nie spełnia predykatu), zwróci nam Nothing. Ale była tam ważna odpowiedź w liście, chcielibyśmy uzyskać, powiedzmy, po prostu Just (1001.4,2008,9,4).

24 elemindex jest trochę jak elem tylko nie zwraca wartość logicznej. Może zwracać indeks elementu którego poszukujemy. Jeśli element ten nie jest na naszej liście, to zwraca Nothing. ghci > :t elemindex elemindex :: (Eq a) => a -> [a] -> Maybe Int ghci > 4 elemindex [1,2,3,4,5,6] Just 3 ghci > 10 elemindex [1,2,3,4,5,6] Nothing elemindices jest jak elemindex, zwraca tylko listę indeksów, w przypadku elementu szukanego, rośnie w górę na naszej liście kilka razy. Ponieważ używamy listę do reprezentowania indeksów, nie potrzebujemy Maybe typu, ponieważ niepowodzenie może być reprezentowane jako pusta lista, która jest synonimem Nothing. ghci > elemindices " Where are the spaces?" [5,9,13]

25 findindex jest jak find, ale Maybe zwraca indeks pierwszego elementu który spełnia predykat. findindex zwraca indeksy wszystkich elementów orzeczenia, które spełniają w formie listy. ghci > findindex (==4) [5,3,2,1,6,4] Just 5 ghci > findindex (==7) [5,3,2,1,6,4] Nothing ghci > findindices ( elem [ A.. Z ]) " Where Are The Caps?" [0,6,10,14] W poprzednich rozdziałach omawialiśmy zip i zipwith. Zauważyliśmy, że zip łączy razem dwie listy, zarówno w postaci krotki lub binarnej funkcji (co oznacza że taka funkcja, potrzebuje dwóch parametrów). Ale co, jeśli chcemy zip em połączyć razem trzy listy? Lub zip em połączyć trzy listy z funkcją, która przyjmuje trzy parametry? Cóż, do tego mamy zip3, zip4, itd., oraz zipwith3, zipwith4 itp.. Warianty te wzrastają aż do 7. Choć może to wyglądać jak hack, to działa całkiem dobrze, ponieważ nie ma wiele razy, gdy chcesz zip połączyć 8 list razem (podobno). Istnieje również bardzo sprytny sposób na skompresowanie nieskończonej liczby list, ale książka przynajmniej w rozdziale 7 go nie podaje. ghci > zipwith3 (\x y z -> x + y + z) [1,2,3] [4,5,2,2] [2,2,3] [7,9,8] ghci > zip4 [2,3,3] [2,2,2] [5,5,3] [2,2,2] [(2,2,5,2),(3,2,5,2),(3,2,3,2)] Podobnie jak w przypadku normalnego skompresowania, listy, które są dłuższe niż najkrótsza listy, które są spakowane (zipped) są cięte na wymiar.

26 lines to przydatna funkcja, gdy ma do czynienia z plikami lub wejściem z kądś. To bierze string i zwraca każdą linijkę tego string u w oddzielnej liście. ghci > lines " first line \ nsecond line \ nthird line " [" first line "," second line "," third line "] n jest postacią dla nowej linii unix. Backslashe mają szczególne znaczenie w ciągach (stringach) języka Haskell i jego postaciach, znakach. unlines jest odwrotnością funkcji lines. Bierze listę stringów (łańcuchów) i łączy je ze sobą za pomocą 'n'. ghci > unlines [" first line ", " second line ", " third line "] " first line \ nsecond line \ nthird line \n"

27 words i unwords służą do podziału wiersza tekstu słowami lub łączenia list słów w tekście. Bardzo przydatne. ghci > words " hey these are the words in this sentence " [" hey "," these "," are "," the "," words ","in"," this "," sentence "] ghci > words " hey these are the words in this \ nsentence " [" hey "," these "," are "," the "," words ","in"," this "," sentence "] ghci > unwords [" hey "," there "," mate "] " hey there mate Już omówiliśmy nub. Bierze on listę i odsiewa zduplikowane elementy, zwracając listę, której każdy element jest unikalny niczym płatek śniegu! ghci > nub [1,2,3,4,3,2,1,2,3,4,3,2,1] [1,2,3,4] ghci > nub " Lots of words and stuff " " Lots fwrdanu "

28 delete bierze element z listy i usuwa pierwsze wystąpienie tego elementu na liście. ghci > delete h " hey there ghang!" "ey there ghang!" ghci > delete h. delete h $ " hey there ghang!" "ey tere ghang!" ghci > delete h. delete h. delete h $ " hey there ghang!" "ey tere gang! \ jest funkcją różnicy list. Działa w sposób następujący, dla każdego elementu na liście po prawej stronie, usuwa element pasujący w lewym. ghci > [1..10] \\ [2,5,9] [1,3,4,6,7,8,10] ghci > "Im a big baby " \\ " big " "Im a baby Zapis [1..10] \ [2,5,9] zastępuje delete 2. delete 5. delete 9 $ [1..10].

29 union działa również jak funkcja na zestawach. Zwraca union (związek) dwóch list. Idzie przez każdy element w drugiej liście i dołącza go do pierwszego, jeśli nie jest już dodany. Uważaj jednak, kopie zostały usunięte z drugiej listy! ghci > " hey man " union " man what s up" " hey manwt sup " ghci > [1..7] union [5..10] [1,2,3,4,5,6,7,8,9,10] intersect działa jak ustawione skrzyżowanie. Zwraca jedynie elementy, które znajdują się na obu listach. ghci > [1..7] intersect [5..10] [5,6,7] insert bierze element i listę elementów, które mogą być sortowane i wstawia go do listy. Będzie to wkładane w taki sposób że, wszystkie elementy, po jego prawej stronie jest większa niż lub równe. Jeśli używamy wstawienia insert do posortowanej listy wynikowej, lista będzie przechowywana w formie posortowanej. ghci > insert 4 [1,2,3,5,6,7] [1,2,3,4,5,6,7] ghci > insert g $ [ a.. f ] ++ [ h.. z ] " abcdefghijklmnopqrstuvwxyz " ghci > insert 3 [1,2,4,3,2,1] [1,2,3,4,3,2,1]

30 length, take, drop, splitat,!! i replicate wszystkie one biorą Int jako jeden ze swych parametrów, choć mogą one być bardziej ogólne i użyteczne, jeśli wezmą dowolny typ, który jest częścią Integral lub typu klasy Num (w zależności od funkcji). Dlatego Data.List ma swoje bardziej ogólne odpowiedniki, o nazwiach genericlength, generictake, genericdrop, genericsplitat, genericindex i genericreplicate. Na przykład, length ma zapis typu length :: [a] -> Int. Jeśli staramy się uzyskać średnią z listy numerów wykonując let xs = [1..6] in sum xs / length xs, otrzymujemy błąd typu, ponieważ nie można używać / z Int. genericlength, z drugiej strony, ma podpis typu genericlength :: (Num a) =>[b] -> a. Ponieważ Num może zachowywać się jak liczba zmiennoprzecinkowa, uzyskanie średniej wykonując let xs = [1..6] in sum xs / genericlength xs działa dobrze.

31 nub, delete, union, intersect i group funkcje te posiadają swoje bardziej ogólne odpowiedniki zwane nubby, deleteby, unionby, intersectby i groupby. Różnica między nimi jest taka, że pierwszy zestaw funkcji używa == do testowania równości, podczas gdy te z drugiego zestawu z końcówką By, również podejmują funkcje równości, a następnie porównują je za pomocą tej funkcji równości. group jest taka sama jak groupby (==). Załóżmy, że mamy listę, która opisuje wartości funkcji dla każdej sekundy. Chcemy posegmentować go na podlisty na podstawie wartość poniżej zera i kiedy to zrobił. Jeśli nie weźmiemy normalnej grupy, to wówczas weźmiemy po prostu grupę o równych wartościach sąsiadujących ze sobą. Ale to, co chcemy to pogrupowanie ich według tego, czy są one negatywne, czy też nie. To miejsce, gdzie groupby przychodzi! Funkcja równości wspomagana przez funkcje z By powinna przyjmować dwa elementy tego samego typu i zwracać True, jeśli uzna je za równe według standardów funkcji. ghci > let values = [ -4.3, -2.4, -1.2, 0.4, 2.3, 5.9, 10.5, 29.1, 5.3, -2.4, -14.5, 2.9, 2.3] ghci > groupby (\x y -> (x > 0) == (y > 0)) values [[ -4.3, -2.4, -1.2],[0.4,2.3,5.9,10.5,29.1,5.3],[ -2.4, -14.5],[2.9,2.3]]

32 Widzimy wyraźnie, które odcinki są pozytywne, a które negatywne. Funkcja równości pobiera dwa elementy, a następnie zwraca True tylko wtedy, gdy oba są ujemne (negatywne) lub jeśli oba są pozytywne. Ta funkcja równości można również zapisać jako xy -> (x > 0) && (y > 0) (x <= 0) && (y <= 0), chociaż możliwe, że pierwszy sposób jest bardziej czytelny. Jeszcze wyraźniejszym sposobem pisania funkcji równości dla funkcji z By jest, jeśli by zaimportować funkcję on z Data.Function. on tak jak poniżej: on :: (b -> b -> c) -> (a -> b) -> a -> a -> c f on g = \x y -> f (g x) (g y) Wykonując (==) 'on' (> 0) zwraca funkcję równości, który wygląda jak xy -> (x> 0) == (y> 0). on używany często z funkcjami By ponieważ z tym, możemy to zrobić: ghci > groupby ((==) on (> 0)) values [[ -4.3, -2.4, -1.2],[0.4,2.3,5.9,10.5,29.1,5.3],[ -2.4, -14.5],[2.9,2.3]]

33 Podobnie sort, insert, maximum i minimum również mają swoje bardziej ogólne odpowiedniki. Funkcje takie jak groupby biorą funkcję, która określa, kiedy dwa elementy są równe. sortby, insertby, maximumby i minimumby biorą określoną funkcję jeżeli jeden element jest większy, mniejszy lub równy drugiemu. Rodzaj zapisu sortby to sortby :: (a -> a -> Ordering) -> [a] -> [a]. Typ Ordering może mieć wartości LT, EQ lub GT. sort jest odpowiednikiem sortby compare ponieważ porównanie zajmuje tylko dwa elementy, których typ jest w typie klasy Ord i zwraca ich związek zamawiania. Listy mogą być porównywane, wówczas listy są porównywane leksykograficznie. Co zrobić, jeśli mamy listę list i chcemy posortować, nie opierając się na innej liście? Rozwiązać tą kwestie może funkcja sortby. ghci > let xs = [[5,4,5,4,4],[1,2,3],[3,5,4,3],[],[2],[2,2]] ghci > sortby ( compare on length ) xs [[],[2],[2,2],[1,2,3],[3,5,4,3],[5,4,5,4,4]]

34 Data.Char Moduł Data.Char eksportuje funkcje, które zajmują się znakami. Jest to również pomocne podczas filtrowania i mapowania string ów, ponieważ są tylko listami znaków. Data.Char eksportuje kilka orzeczników ponad znakami. Oznacza to, że funkcje, które mają postać i mówią nam, czy niektóre założenia odnośnie tego są prawdziwe czy fałszywe. Oto takie funkcje: iscontrol sprawdza czy znak jest znakiem kontrolnym. isspace sprawdza czy znak należy do białych znaków. Czyli spacje, znaki tabulacji, znaki nowej linii, itp. islower sprawdza czy znak jest małą literą. isupper sprawdza czy znak jest dużą literą.

35 isalpha sprawdza czy znak jest literą. isalphanum sprawdza czy znak jest literą lub liczbą. isprint sprawdza czy znak jest do druku. Znaki sterujące, na przykład, nie można wydrukować. isdigit sprawdza czy znak jest cyfrą. isoctdigit sprawdza czy znak jest cyfrą ośmiocyfrową(?). ishexdigit sprawdza czy znak jest cyfrą sześciocyfrową(?). isletter sprawdza czy znak jest literą. ismark sprawdza dla Unicode charakter znaków. Są to znaki, które łączą się z poprzednich listów kształt liter z akcentami(? Litery różnych czcionek). isnumber sprawdza czy znak jest numeryczny.

36 ispunctuation sprawdza czy znak jest interpunkcyjny. issymbol sprawdza czy znak jest fantazyjny, matematyczny lub jest symbolem waluty isseparator sprawdza przestrzenie Unicode i separatory. isascii sprawdza czy postać wpada do pierwszych 128 znaków z zestawu znaków Unicode. islatin1 sprawdza czy postać wpada w pierwszych 256 znaków Unicode. isasciiupper sprawdza czy znak jest ASCII i dużymi literami. isasciilower sprawdza czy znak jest ASCII i małymi literami.

37 Wszystkie te predykaty mają podpis typu Char -> Bool. Większość czasu będziemy używać tego aby odfiltrować string i lub coś podobnego. Na przykład, powiedzmy, że robimy program, który pobiera nazwę użytkownika i nazwę użytkownika może składać się wyłącznie ze znaków alfanumerycznych. Możemy użyć Data.List funkcji all w połączeniu z Data.Char predykatów celem ustalenia, czy podana nazwa jest w porządku. ghci > all isalphanum " bobby283 " True ghci > all isalphanum " eddy the fish!" False W przypadku, gdy nie pamiętają, all zajmuje predykat (orzecznik) oraz listę i zwraca True tylko wtedy, gdy predykat (orzecznik) odnosi się do każdego elementu na liście. Możemy również użyć isspace aby zasymulować Data.List funkcyjne words. ghci > words " hey guys its me" [" hey "," guys "," its ","me"] ghci > groupby ((==) on isspace ) " hey guys its me" [" hey "," "," guys "," "," its "," ","me"] ghci >

38 Data.Char również eksportuje typy danych takie jak Ordering. Typ Ordering może mieć wartość LT, EQ lub GT. Jest to rodzaj wyliczenia. Opisano kilka możliwych wyników, które mogą powstać w wyniku porównania dwóch elementów. Rodzaj GeneralCategory jest również wyliczeniem. Przedstawia nam kilku możliwych kategorii, które postać może wpaść. Główną funkcją uzyskania ogólnej kategorii znaku jest generalcategory. To typ generalcategory :: Char -> GeneralCategory. Istnieje około 31 kategorii, więc nie będzie wymienić ich wszystkich tutaj. ghci > generalcategory Space ghci > generalcategory A UppercaseLetter ghci > generalcategory a LowercaseLetter ghci > generalcategory. OtherPunctuation ghci > generalcategory 9 DecimalNumber ghci > map generalcategory " \t\ na9? " [ Space, Control, Control, UppercaseLetter, DecimalNumber, OtherPunctuation, MathSym bol ] Ponieważ typ GeneralCategory jest częścią klasy typu Eq, możemy również testować rzeczy jak generalcategory c == Space.

39 toupper zamienia znak na wielkie litery. Przestrzenie, cyfry i tym podobne pozostają niezmienione. tolower zamienia znak na małe litery. totitle zamienia znak na przypadek tytułowy. Dla większości znaków, sprawa jest taka sama, jak przy wielkich literach. digittoint zamienia znak na typ Int. Aby odnieść sukces, postać musi być w zakresach '0'.. '9', 'a'.. 'f' lub 'A'.. 'f'. ghci > map digittoint " " [3,4,5,3,8] ghci > map digittoint " FF85AB " [15,15,8,5,10,11] inttodigit jest to funkcja odwrotna do digittoint. Przyjmuje Int w zakresie i konwertuje go do niższego liter. ghci > inttodigit 15 f ghci > inttodigit 5 5 Funkcje ord i chr poddaje konwersji znaki i odpowiadające im numery i odwrotnie: ghci > ord a 97 ghci > chr 97 a ghci > map ord " abcdefgh " [97,98,99,100,101,102,103,104]

40 Różnica między wartościami ord dwóch znaków są równe, temu jak daleko od siebie, są w tabeli Unicode. Szyfr Cezara to prymitywna metoda kodowania wiadomości poprzez przesunięcie każdego znaku w nich o stałą liczbę pozycji w alfabecie. Możemy łatwo stworzyć coś w rodzaju naszego własnego szyfru Cezara, tylko nie będziemy (zawężać się) ograniczać się do alfabetu. encode :: Int -> String -> String encode shift msg = let ords = map ord msg shifted = map (+ shift ) ords in map chr shifted Najpierw przekonwertujemy string do listy numerów. Następnie dodajemy wartość przesunięcia do każdego numeru przed konwersją listy numerów z powrotem do znaku. Istnieje możliwość aby napisać ciało tej funkcji w formie map (chr. (+ shift). ord) msg. Spróbujmy kodowania kilku wiadomości. ghci > encode 3 " Heeeeey " " Khhhhh " ghci > encode 4 " Heeeeey " " Liiiii }" ghci > encode 1 " abcd " " bcde " ghci > encode 5 " Marry Christmas! Ho ho ho!" " Rfww ~% Hmwnxyrfx &% Mt%mt%mt&"

41 To jest zakodowane w porządku. Dekodowana wiadomość jest w zasadzie tylko przeniesieniem jej przez liczbę miejsc, został przesunięty w pierwszym miejscu. decode :: Int -> String -> String decode shift msg = encode ( negate shift ) msg ghci > encode 3 "Im a little teapot " "Lp#d# olwwoh # whdsrw " ghci > decode 3 "Lp#d# olwwoh # whdsrw " "Im a little teapot " ghci > decode 5. encode 5 $ " This is a sentence " " This is a sentence "

42 Data.Map Listy Association (zwane również słownikami, lub listą stowarzyszenia ) są to listy, które są używane do przechowywania par wartości klucza, gdzie kolejność nie ma znaczenia. Na przykład, możemy użyć listy asocjacji do numerów magazynów, gdzie numery telefonów byłyby wartościami i nazwiska ludzi byłoby kluczami. Nie dbamy o to, w jakiej kolejności są one przechowywane, chcemy tylko, aby uzyskać odpowiedni numer telefonu do właściwej osoby. Najbardziej oczywistym sposobem reprezentowania list stowarzyszonych w Haskell u byłoby poprzez użycie listy par. Pierwszy człon pary będzie kluczem, drugi składnik wartością. Oto przykład z listy stowarzyszeniowej z numerami telefonów: phonebook = [(" betty "," "),(" bonnie "," "),(" patsy "," "),(" lucille "," "),(" wendy "," "),(" penny "," ") ]

43 Pomimo tych pozornych wcięć, to tylko lista par łańcuchów (string ów). Najczęstszym zadaniem, gdy mamy do czynienia z listą stowarzyszenia jest szukanie wartość jakiegoś klucza. Zróbmy funkcję, która szuka wartości dając klucz. findkey :: (Eq k) => k -> [(k,v)] -> v findkey key xs = snd. head. filter (\(k,v) -> key == k) $ xs Dość proste. Funkcja, która pobiera klucz i listy, filtruje listę tak, że tylko pasujące klucze pozostają, funkcja dostaje pierwszą wartość klucza, która odpowiada i zwraca wartość. Ale co się stanie, jeżeli szukany klucz nie jest na liście stowarzyszenia?. Jeśli klucz nie znajduje się na liście stowarzyszenia, skończymy próbując dostać głowę pustej listy, która generuje błąd wykonania. Jednakże powinniśmy unikać czynienia naszych programów tak łatwo zawodzących, więc użyjmy typ danych Maybe. Jeśli nie znajdzie klucza, to zwróci Nothing. Jeśli go znajdziemy, coś nam rzuci, a tym czyms będzie wartość odpowiadająca temu kluczowi. findkey :: (Eq k) => k -> [(k,v)] -> Maybe v findkey key [] = Nothing findkey key ((k,v): xs) = if key == k then Just v else findkey key xs

44 Spójrz na deklaracje typu. Wymaga klucza, który można postawić na równi, z lista skojarzeń/stowarzyszeń, a potem może wytworzyć wartość. Jest to rekurencyjny podręcznik funkcji, operującej na liście. Przypadek krawędziowy, dzieli listę na głowe i ogon, wywołania rekurencyjne, wszystkie one się tam znajdują. Jest to klasyczny wzór (fałdu?), więc zobaczymy, jak miałoby to być realizowane jako fałd (krotnie?). findkey :: (Eq k) => k -> [(k,v)] -> Maybe v findkey key = foldr (\(k,v) acc -> if key == k then Just v else acc ) Nothing Zazwyczaj lepiej jest użyć fałd do listy standardowego wzoru rekursji zamiast posłużyć się rekursją, ponieważ są one łatwiejsze do odczytania i identyfikacji. Fałdy kiedy wywołują foldr (widzą połączenia folderu), ale to wymaga wyraźniejszej rekursji(?). ghci > findkey " penny " phonebook Just " " ghci > findkey " betty " phonebook Just " " ghci > findkey " wilma " phonebook Nothing

45 Jeśli mamy numer telefonu, po prostu uzyskujemy numer, w przeciwnym razie otrzymujemy Nothing. Właśnie wdrożyliśmy funkcje lookup (wyszukiwania) z Data.List. Jeśli chcemy znaleźć odpowiednią wartość do klucza, musimy przeszukać wszystkie elementy z listy, aż ją znajdzie. Moduł Data.Map oferuje listy stowarzyszenia, które są znacznie szybsze (ponieważ są one wewnętrznie realizowane z drzew), a także zapewnia wiele funkcji użytkowych. Od teraz będziemy pracować z mapami zamiast z listami stowarzyszenia. Ponieważ Data.Map eksportuje funkcje, które kolidują z Prelude i Data.List, zrobimy wykwalifikowany import. import qualified Data. Map as Map

46 Funkcja fromlist pobiera listę skojarzeń (Association list, lista stowarzyszenia or słownik) w postaci listy i zwraca mapę z tych samych skojarzeń. ghci > Map. fromlist [(" betty "," "),(" bonnie "," "),(" lucille "," ")] fromlist [(" betty "," "),(" bonnie "," "),(" lucille "," ")] ghci > Map. fromlist [(1,2),(3,4),(3,2),(5,5)] fromlist [(1,2),(3,2),(5,5)] Jeśli istnieją duplikaty kluczy na pierwotnej liście skojarzeń, duplikaty są po prostu usuwane. To jest podpis typu fromlist. Map. fromlist :: ( Ord k) => [(k, v)] -> Map. Map k v Bierze listę par typu k i v oraz zwraca mapę, która mapuje z kluczy typu k do typu v. Zauważmy, że gdy robiliśmy listy skojarzeń ze zwykłymi listami, tylko klucze musiały być właściwie utożsamiane (ich rodzaj należący do klasy typu Eq), ale teraz mają być zamawiane. To istotne ograniczenie w module Data.Map. Pojawia się konieczność aby zamawiać klucze więc może je zorganizować w drzewie. Zawsze należy używac Data.Map lub klucz-wartość stowarzyszeń, chyba że masz klucze, które nie są częścią klasy Ord.

47 empty reprezentuje pustą mapę. Nie pobiera żadnych argumentów, on po prostu zwraca pustą mapę. ghci > Map. empty fromlist [] insert bierze klucz, wartość oraz mapy i zwraca nową mapę, która jest taka sama jak stara, tylko z włożonymi do niej kluczami i wartościami. ghci > Map. empty fromlist [] ghci > Map. insert Map. empty fromlist [(3,100)] ghci > Map. insert ( Map. insert ( Map. insert Map. empty )) fromlist [(3,100),(4,200),(5,600)] ghci > Map. insert Map. insert Map. insert $ Map. empty fromlist [(3,100),(4,200),(5,600)] Możemy realizować nasz fromlist za pomocą pustej mapy, poprzez wkładanie i fałdy (insert and a fold). fromlist :: ( Ord k) => [(k,v)] -> Map. Map k v fromlist = foldr (\(k,v) acc -> Map. insert k v acc ) Map. empty

48 null sprawdza czy mapa jest pusta. ghci > Map. null Map. empty True ghci > Map. null $ Map. fromlist [(2,3),(5,5)] False size informuje o rozmiarze mapy. ghci > Map. size Map. empty 0 ghci > Map. size $ Map. fromlist [(2,4),(3,3),(4,2),(5,4),(6,4)] 5 singleton bierze klucz i wartość i tworzy mapę, która ma dokładnie jedno odwzorowanie. ghci > Map. singleton 3 9 fromlist [(3,9)] ghci > Map. insert 5 9 $ Map. singleton 3 9 fromlist [(3,9),(5,9)] lookup działa jak Data.List lookup, działa tylko na mapach. Zwraca Just something jeżeli znajdzie coś dla klucza i Nothing, jeśli tak nie jest.

49 member jest predykatem bierze klucz, mapę i raporty, nieważne czy klucz jest na mapie, czy też nie. ghci > Map. member 3 $ Map. fromlist [(3,6),(4,3),(6,9)] True ghci > Map. member 3 $ Map. fromlist [(2,5),(4,5)] False map i filter działają podobnie jak ich lista odpowiedników. ghci > Map. map (*100) $ Map. fromlist [(1,1),(2,4),(3,9)] fromlist [(1,100),(2,400),(3,900)] ghci > Map. filter isupper $ Map. fromlist [(1, a ),(2, A ),(3, b ),(4, B )] fromlist [(2, A ),(4, B )] tolist jest odwrotnością fromlist. ghci > Map. tolist. Map. insert 9 2 $ Map. singleton 4 3 [(4,3),(9,2)] keys i elems zwracają listy kluczy i odpowiednie wartości. keys jest równoznaczny do map fst. Map.toList i elems jest równoznaczny do map snd. Map.toList.

50 fromlistwith działa jak fromlist, tylko nie wyrzuca zduplikowanych kluczów ale używa funkcji dołączonej do niego, aby zdecydować, co z nimi zrobić. Powiedzmy, że dana osoba może mieć kilka numerów i mamy listę stowarzyszenia utworzoną w ten sposób. phonebook = [(" betty "," "),(" betty "," "),(" bonnie "," "),(" patsy "," "),(" patsy "," "),(" patsy "," "),(" lucille "," "),(" wendy "," "),(" penny "," "),(" penny "," ") ] Jeśli po prostu skorzystamy z fromlist, aby umieścić to na mapie, stracimy kilka numerów! Dlatego: phonebooktomap :: ( Ord k) => [(k, String )] -> Map. Map k String phonebooktomap xs = Map. fromlistwith (\ number1 number2 -> number1 ++ ", " ++ number2 ) xs

51 insertwith wstawia parę wartości kluczy do mapy, ale jeśli mapa zawiera już klucz, wykorzystuje funkcję przekazaną do niej, aby ustalić, co zrobić. ghci > Map. insertwith (+) $ Map. fromlist [(3,4),(5,103),(6,339)] fromlist [(3,104),(5,103),(6,339)]

52 Data.Set Moduł Data.Set oferuje nam dobre, zestawy. Podobnie jak zestawy z matematyki. Zestawy są trochę jak skrzyżowanie list i map. Wszystkie elementy zestawu są unikatowe. A ponieważ są one wewnętrznie realizowane z drzewa (podobnie jak mapy w Data.Map), są one uporządkowane. Sprawdzanie członkostwa, wstawianie, usuwanie, itp jest znacznie szybciej niż robi to samo z list. Najczęstszymi operacjami gdy mamy do czynienia z zestawami to wstawianie do zestawu, sprawdzanie członkostwa i konwersja zestawu do listy. Ponieważ nazwy w Data.Set kolidują z wieloma nazwami Data.List i Prelude, dlatego robimy wykwalifikowany import.

53 Umieszczając podaną niżej instrukcję import w skrypcie: import qualified Data. Set as Set A następnie załadowójąc skrypt poprzez GHCI. Załóżmy, że mamy dwa fragmenty tekstu. Chcemy dowiedzieć się, jakie znaki zostały użyte w obu z nich. text1 = "I just had an anime dream. Anime... Reality... Are they so different?" text2 = " The old man left his garbage can out and now his trash is all over my lawn! Funkcja fromlist działa tak jak można by oczekiwać. Bierze listy i konwertuje je do zestawu. ghci > let set1 = Set. fromlist text1 ghci > let set2 = Set. fromlist text2 ghci > set1 fromlist ".? AIRadefhijlmnorstuy " ghci > set2 fromlist "! Tabcdefghilmnorstuvwy "

54 Jak widać, elementy są sortowane, a każdy element jest wyjątkowy. Teraz użyjmy funkcji intersection (przecięcia), aby zobaczyć, które elementy dzielą wspólnie. ghci > Set. intersection set1 set2 fromlist " adefhilmnorstuy Możemy użyć funkcji difference (różnicy), aby zobaczyć, które litery są w pierwszym zestawie (secie), ale nie są w drugim i na odwrót. ghci > Set. difference set1 set2 fromlist ".? AIRj " ghci > Set. difference set2 set1 fromlist "! Tbcgvw Albo możemy zobaczyć wszystkie unikalne liter użyte w obu sentencjach za pomocą użycia union. ghci > Set. union set1 set2 fromlist "!.? AIRTabcdefghijlmnorstuvwy "

55 Funkcje null, size, member, empty, singleton, insert i delete działają tak jak się tego od nich wymaga. ghci > Set. null Set. empty True ghci > Set. null $ Set. fromlist [3,4,5,5,4,3] False ghci > Set. size $ Set. fromlist [3,4,5,3,4,5] 3 ghci > Set. singleton 9 fromlist [9] ghci > Set. insert 4 $ Set. fromlist [9,3,8,1] fromlist [1,3,4,8,9] ghci > Set. insert 8 $ Set. fromlist [5..10] fromlist [5,6,7,8,9,10] ghci > Set. delete 4 $ Set. fromlist [3,4,5,4,3,4,5] fromlist [3,5]

56 Możemy również sprawdzić podzbiory lub właściwy podzbiór. Zbiór A jest podzbiorem zbioru B, o ile zawiera on wszystkie elementy, które zawiera A. Zbiór A jest podzbiorem zbioru B, jeśli B zawiera wszystkie elementy, które A posiada, ale A ma jeszcze inne elementy. ghci > Set. fromlist [2,3,4] Set. issubsetof Set. fromlist [1,2,3,4,5] True ghci > Set. fromlist [1,2,3,4,5] Set. issubsetof Set. fromlist [1,2,3,4,5] True ghci > Set. fromlist [1,2,3,4,5] Set. ispropersubsetof Set. fromlist [1,2,3,4,5] False ghci > Set. fromlist [2,3,4,8] Set. issubsetof Set. fromlist [1,2,3,4,5] False

57 Możemy również mapować map zestawy i filtrować je filter. ghci > Set. filter odd $ Set. fromlist [3,4,5,6,7,2,3,4] fromlist [3,5,7] ghci > Set. map (+1) $ Set. fromlist [3,4,5,6,7,2,3,4] fromlist [3,4,5,6,7,8] Zestawy są często wykorzystywane do wyeliminowania list duplikatów z listy, najpierw czynią to w zestawie za pomocą fromlist, a następnie przekształcają go z powrotem do listy z tolist. Funkcja nub z Data.List już to robi, ale wyeliminowanie duplikatów dla dużych list jest o wiele szybsze, jeśli dopchać je do zestawu, a następnie konwertować je do listy, niż stosując nub. Ale używając nub wymagany jest jedynie rodzaj elementów z listy, aby być częścią klasy typu Eq, natomiast jeżeli chcesz dopchać elementy do zestawu, typ listy musi być w Ord. ghci > let setnub xs = Set. tolist $ Set. fromlist xs ghci > setnub " HEY WHATS CRACKALACKIN " " ACEHIKLNRSTWY " ghci > nub " HEY WHATS CRACKALACKIN " " HEY WATSCRKLIN setnub jest na ogół szybszy niż nub na dużych listach, ale jak widać, nub zachowuje kolejność elementów na liście, podczas gdy setnub nie robi tego.

58 Making our own modules Zbadaliśmy kilka fajnych modułów do tej pory, ale w jaki sposób stworzyć swój własny moduł? Prawie każdy język programowania pozwala rozdzielić swój kod na kilka plików i z Haskell em nie jest inaczej. Tworząc programy, dobrą praktyką jest, aby podawać funkcje i rodzaje, które działają w kierunku osiągnięcia podobnego celu i umieścić je w module. W ten sposób można łatwo ponownie używać tych funkcji w innych programach po prostu importując moduł. Tworzyenie naszych własnych modułów rozpoczyna się od stworzenia małego moduł, który zawiera pewne funkcje do obliczania objętości i powierzchni kilku obiektów geometrycznych. Zaczniemy od utworzenia pliku o nazwie Geometry.hs.

59 Moduł eksportuje funkcje. Co to znaczy, że kiedy zaimportuje moduł, to mogę korzystać z funkcji, które zawiera (eksportuje). Można zdefiniować funkcje w taki sposób że funkcje wywoływane są wewnątrz, ale możemy tylko zobaczyć i korzystać z tych, za eksportowanych. Na początku modułu, podajemy nazwę modułu. Jeśli mamy plik o nazwie Geometry.hs, to powinniśmy wymienić nasz moduł Geometry. Następnie określamy funkcje jako eksportująca i po tym, możemy rozpocząć pisanie funkcji. Więc zaczniemy z tym. module Geometry ( spherevolume, spherearea, cubevolume, cubearea, cuboidarea, cuboidvolume ) where

60 Tworzymy powierzchnie i objętości dla sfer, sześcianów i prostopadłościanów. Następnie definiujemy naszą funkcję, wówczas: module Geometry ( spherevolume, spherearea, cubevolume, cubearea, cuboidarea, cuboidvolume ) where

61 spherevolume :: Float -> Float spherevolume radius = (4.0 / 3.0) * pi * ( radius ^ 3) spherearea :: Float -> Float spherearea radius = 4 * pi * ( radius ^ 2) cubevolume :: Float -> Float cubevolume side = cuboidvolume side side side cubearea :: Float -> Float cubearea side = cuboidarea side side side cuboidvolume :: Float -> Float -> Float -> Float cuboidvolume a b c = rectanglearea a b * c cuboidarea :: Float -> Float -> Float -> Float cuboidarea a b c = rectanglearea a b * 2 + rectanglearea a c * 2 + rectanglearea c b * 2 rectanglearea :: Float -> Float -> Float rectanglearea a b = a * b

62 Jest to dość standardowa geometria. Jest kilka rzeczy na które dobrze zwrócić uwagę. Ponieważ sześcian jest tylko szczególnym przypadkiem prostopadłościanu, określiliśmy jego powierzchnie i objętość, traktując go jako prostopadłościan, którego boki są tej samej długości. Definiujemy również funkcję pomocniczą o nazwie rectanglearea, która oblicza obszar prostokąta na podstawie długości jego boków. Tworząc moduł, zwykle eksportujemy tylko te funkcje, które działają jako rodzaj interfejsu do naszego modułu, tak aby realizacja była ukryta. Jeśli ktoś korzysta z naszego modułu Geometry, to nie musi on zajmować się funkcjami, których nie eksportujemy.

63 Możemy całkowicie zmienić lub usunąć funkcje w nowszej wersji (możemy usuwać rectanglearea i zamiast tego po prostu użyć * ) i nikomu to nie bedzie przeszkadzać, bo nie eksportowaliśmy ich w pierwszej kolejności. Aby użyć modułu, wystarczy zrobić: import Geometry Geometry.hs musi być w tym samym folderze, co program importowany. Moduły mogą być również podane w hierarchicznej strukturze. Każdy moduł może mieć szereg podmodułów a one z kolei mogą mieć własne podmoduły. Przechodzimy przez sekcje tych funkcji po to aby Geometry stała się modułem mającym trzy podmoduły, po jednym dla każdego typu obiektu.

64 Najpierw tworzymy folder o nazwie Geometry. W nim będziemy umieszczać trzy pliki: sphere.hs, cuboid.hs, i cube.hs. Oto co pliki będą zawierać: sphere.hs module Geometry. Sphere ( volume, area ) where volume :: Float -> Float volume radius = (4.0 / 3.0) * pi * ( radius ^ 3) area :: Float -> Float area radius = 4 * pi * ( radius ^ 2)

65 cuboid.hs module Geometry. Cuboid ( volume, area ) where volume :: Float -> Float -> Float -> Float volume a b c = rectanglearea a b * c area :: Float -> Float -> Float -> Float area a b c = rectanglearea a b * 2 + rectanglearea a c * 2 + rectanglearea c b * 2 rectanglearea :: Float -> Float -> Float rectanglearea a b = a * b

66 cube.hs module Geometry. Cube ( volume, area ) where import qualified Geometry. Cuboid as Cuboid volume :: Float -> Float volume side = Cuboid. volume side side side area :: Float -> Float area side = Cuboid. area side side side

67 Dla wszystkich trzech podmodułów, definiujemy funkcje o tych samych nazwach. Możemy to zrobić, ponieważ są one oddzielnymi modułami. Aby muc użyć funkcji z Geometry.Cuboid w Geometry.Cube nie możemy po prostu zaimportować Geometry.Cuboid ponieważ to by za eksportowało funkcje z taka samą nazwą jak Geometry.Cube. Dlatego stosujemy kwalifikowany import. Więc teraz, gdy jesteśmy w pliku, który znajduje się na tym samym poziomie co folder Geometry, to możemy : import Geometry. Sphere Możemy wówczas wywołać area i volume dadzą nam one powierzchnię i objętość dla kuli. A jeśli chcemy pogodzić dwa lub więcej z tych modułów, to musimy zrobić wykwalifikowanych import, ponieważ one (area i volume ) eksportują funkcje o tych samych nazwach. Dlatego:

68 import qualified Geometry. Sphere as Sphere import qualified Geometry. Cuboid as Cuboid import qualified Geometry. Cube as Cube A potem możemy wywołac Sphere.area, Sphere.volume, Cuboid.area, itd, a każdy będzie obliczać powierzchnie lub objętości dla ich odpowiedniego obiektu. Dziękuje za uwagę i cierpliwość.

Haskell Moduły Ładowanie

Haskell Moduły Ładowanie Haskell Moduły Moduł zestaw powiązanych funkcji, typów, typeclass. Program w Haskellu często jest modułem, który ładuje inne moduły a następnie wykorzystuje zdefiniowane w nich funkcje w celu realizacji

Bardziej szczegółowo

Moduły. Źródło: a) Wczytywanie modułów. interparse rozdziela każdy element listy wcześniej podanym znakiem

Moduły. Źródło:  a) Wczytywanie modułów. interparse rozdziela każdy element listy wcześniej podanym znakiem Autor: Roman Gęsiarz Moduły Źródło: http://learnyouahaskell.com/modules a) Wczytywanie modułów b) Data.List c) Data.Char d) Data.Map e) Data.Set f) Tworzenie własnych modułów Łódź, dnia 25.03.2017 r. Ad.

Bardziej szczegółowo

HASKELL. Higher order functions, Modules. Janusz Bugajny Piotr Rogulski Łukasz Antoszkiewicz

HASKELL. Higher order functions, Modules. Janusz Bugajny Piotr Rogulski Łukasz Antoszkiewicz HASKELL Higher order functions, Modules Janusz Bugajny Piotr Rogulski Łukasz Antoszkiewicz Higher order functions Funkcje wyższego rzędu Funkcja wyższego rzędu funkcja, która spełnia przynajmniej jeden

Bardziej szczegółowo

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał REKURENCJA W JĘZYKU HASKELL Autor: Walczak Michał CZYM JEST REKURENCJA? Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie. Algorytmy rekurencyjne zastępują w pewnym sensie iteracje.

Bardziej szczegółowo

- nawiasy kwadratowe oznaczają, że to lista

- nawiasy kwadratowe oznaczają, że to lista Haskell jest statycznym typem języka: - wszystkie typy i wyrażenia są znane w czasie kompilacji ( zwiększa to bezpieczeństwo kodu). Podawanie typów zmiennych i argumentów funkcji jest zbędne, gdyż Haskel

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz

Bardziej szczegółowo

Definicje wyższego poziomu

Definicje wyższego poziomu Definicje wyższego poziomu Interpreter Scheme-a nie będzie narzekad w przypadku wystąpienia niezdefionowanej zmiennej w ciele wyrażenia lambda dopóki nie będzie zastosowana Przykład braku informacji o

Bardziej szczegółowo

Podstawy Programowania C++

Podstawy Programowania C++ Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:

Bardziej szczegółowo

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Podstawy programowania. Podstawy C# Tablice

Podstawy programowania. Podstawy C# Tablice Podstawy programowania Podstawy C# Tablice Tablica to indeksowany zbiór elementów Tablica jest typem referencyjnym (deklaracja tworzy tylko referencję, sama tablica musi być utworzona oddzielnie, najprościej

Bardziej szczegółowo

Składnia funkcji i Rekurencja w języku Haskell

Składnia funkcji i Rekurencja w języku Haskell Składnia funkcji i w języku Haskell Tomasz Ostrowski, Adrian Niechciał, Michał Workiewicz, Marcin Wilk 26 marca 2015 Składnia funkcji i w języku Haskell Spis treści Składnia funkcji Tomasz Ostrowski Adrian

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

4. Funkcje. Przykłady

4. Funkcje. Przykłady 4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni

Bardziej szczegółowo

SQL (ang. Structured Query Language)

SQL (ang. Structured Query Language) SQL (ang. Structured Query Language) SELECT pobranie danych z bazy, INSERT umieszczenie danych w bazie, UPDATE zmiana danych, DELETE usunięcie danych z bazy. Rozkaz INSERT Rozkaz insert dodaje nowe wiersze

Bardziej szczegółowo

Zasady programowania Dokumentacja

Zasady programowania Dokumentacja Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika

Bardziej szczegółowo

Typy, klasy typów, składnie w funkcji

Typy, klasy typów, składnie w funkcji Typy, klasy typów, składnie w funkcji Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas

Bardziej szczegółowo

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek]. ABAP/4 Instrukcja IF Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek]. [ELSEIF warunek. ] [ELSE. ] ENDIF. gdzie: warunek dowolne wyrażenie logiczne o wartości

Bardziej szczegółowo

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011 Outline Procedury wyższych rzędów 1 Procedury wyższych rzędów jako abstrakcje konstrukcji programistycznych Intuicje Procedury wyższych rzędów

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe Oprócz zmiennych w programie mamy też stałe, które jak sama nazwa mówi, zachowują swoją wartość przez cały czas działania programu. Można

Bardziej szczegółowo

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Bash - wprowadzenie. Bash - wprowadzenie 1/39 Bash - wprowadzenie Bash - wprowadzenie 1/39 Bash - wprowadzenie 2/39 Czym jest bash? Rysunek : Zadanie powłoki to ukrycie wywołań systemowych Bash - wprowadzenie 3/39 Czym jest bash? Przykład polecenia:

Bardziej szczegółowo

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK W Haskellu funkcje nie mogą zmieniać stanów (w tym np. zmieniać wartości zmiennej). Funkcja wywołana z pewnymi ustalonymi argumentami musi zwracać

Bardziej szczegółowo

Przykłady zastosowań funkcji tekstowych w arkuszu kalkulacyjnym

Przykłady zastosowań funkcji tekstowych w arkuszu kalkulacyjnym S t r o n a 1 Bożena Ignatowska Przykłady zastosowań funkcji tekstowych w arkuszu kalkulacyjnym Wprowadzenie W artykule zostaną omówione zagadnienia związane z wykorzystaniem funkcji tekstowych w arkuszu

Bardziej szczegółowo

Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie)

Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie) Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie) Wprowadzenie Haszowanie jest to pewna technika rozwiązywania ogólnego problemu słownika. Przez problem słownika rozumiemy tutaj takie

Bardziej szczegółowo

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nazwa implementacji: Nauka języka Python wyrażenia warunkowe Autor: Piotr Fiorek Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nasz kalkulator umie już liczyć, ale potrafi przeprowadzać

Bardziej szczegółowo

Algorytmy sortujące i wyszukujące

Algorytmy sortujące i wyszukujące Algorytmy sortujące i wyszukujące Zadaniem algorytmów sortujących jest ułożenie elementów danego zbioru w ściśle określonej kolejności. Najczęściej wykorzystywany jest porządek numeryczny lub leksykograficzny.

Bardziej szczegółowo

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Podstawy programowania Wykład: 9 Łańcuchy znaków 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Tablica znaków w językach C i C++ (oraz pochodnych) łańcuch znaków przechowywany jest jako

Bardziej szczegółowo

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego Arytmetyka cyfrowa Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego (binarnego). Zapis binarny - to system liczenia

Bardziej szczegółowo

Backend Administratora

Backend Administratora Backend Administratora mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 W tym celu korzystając z konsoli wydajemy polecenie: symfony generate:app backend Wówczas zostanie stworzona

Bardziej szczegółowo

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak: Ćwiczenie nr 6 Temat: Operacje na łańcuchach znaków. Zagadnienia: Zasady pracy z łańcuchami tekstowymi (tablice wartości typu char). funkcje standardowe operacji na łańcuchach, funkcje I/O dla operacji

Bardziej szczegółowo

Systemy operacyjne. Laboratorium 8. Perl find

Systemy operacyjne. Laboratorium 8. Perl find Systemy operacyjne Laboratorium 8 Perl find Temat obejmuje przeszukiwanie drzew katalogowych z użyciem perla oraz podstawowe zdolności w używaniu referencji, tablic asocjacyjnych i mechanizmów typu stat.

Bardziej szczegółowo

Wykład 3 Składnia języka C# (cz. 2)

Wykład 3 Składnia języka C# (cz. 2) Wizualne systemy programowania Wykład 3 Składnia języka C# (cz. 2) 1 dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD Wizualne systemy programowania Metody 2 Metody W C# nie jest

Bardziej szczegółowo

Wykresy i interfejsy użytkownika

Wykresy i interfejsy użytkownika Wrocław, 07.11.2017 Wstęp do informatyki i programowania: Wykresy i interfejsy użytkownika Wydział Matematyki Politechniki Wrocławskiej Andrzej Giniewicz Dzisiaj na zajęciach... Instrukcje sterujące Biblioteka

Bardziej szczegółowo

Typy danych, cd. Łańcuchy znaków

Typy danych, cd. Łańcuchy znaków Typy danych, cd. Łańcuchy znaków Typ danych string, jest rozumiany jako łańcuch znaków - liter, cyfr i symboli. Stringi definiuje się w podwójnych lub pojedyńczych cudzysłowach. typ_ kawy = " latte " typ_herbaty

Bardziej szczegółowo

Języki programowania Haskell

Języki programowania Haskell Języki programowania Haskell zadanie projektowe nr. 4 2014/15 K. Turowski, T. Goluch 1. Kompilacja, uruchamianie i Hello world Kompilacja i uruchamianie: ghc --make hello.hs./hello Interaktywny interpreter:

Bardziej szczegółowo

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10. ZAMIANA LICZB MIĘDZY SYSTEMAMI DWÓJKOWYM I DZIESIĘTNYM Aby zamienić liczbę z systemu dwójkowego (binarnego) na dziesiętny (decymalny) należy najpierw przypomnieć sobie jak są tworzone liczby w ww systemach

Bardziej szczegółowo

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze... Tekst na niebiesko jest komentarzem lub treścią zadania. Zadanie. Dane są macierze: A D 0 ; E 0 0 0 ; B 0 5 ; C Wykonaj poniższe obliczenia: 0 4 5 Mnożenia, transpozycje etc wykonuję programem i przepisuję

Bardziej szczegółowo

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009 Informatyka 1 zajęcia nr 11 Elektrotechnika, semestr II rok akademicki 2008/2009 mgr inż.. Paweł Myszkowski Plan dzisiejszych zajęć 1. Łańcuchy znaków 2. Wprowadzanie i wyprowadzanie znaków w i łańcuchów

Bardziej szczegółowo

Pomorski Czarodziej 2016 Zadania. Kategoria C

Pomorski Czarodziej 2016 Zadania. Kategoria C Pomorski Czarodziej 2016 Zadania. Kategoria C Poniżej znajduje się 5 zadań. Za poprawne rozwiązanie każdego z nich możesz otrzymać 10 punktów. Jeżeli otrzymasz za zadanie maksymalną liczbę punktów, możesz

Bardziej szczegółowo

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych Języki programowania wysokiego poziomu PHP cz.4. Bazy danych PHP i bazy danych PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych: MySQL moduł mysql albo jego nowsza wersja mysqli (moduł

Bardziej szczegółowo

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. 8. Wektory Przykłady 8.1. Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. Uwaga! Kod poniżej. To zadanie można rozwiązać przy użyciu wiedzy

Bardziej szczegółowo

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA Python wprowadzenie Warszawa, 24 marca 2017 Python to język: nowoczesny łatwy w użyciu silny można pisać aplikacje Obiektowy klejący może być zintegrowany z innymi językami np. C, C++, Java działający

Bardziej szczegółowo

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: Operatory logiczne Komputery i ich logika AND - && Podstawy programowania w C++ Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com

Bardziej szczegółowo

Rekurencja (rekursja)

Rekurencja (rekursja) Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)

Bardziej szczegółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

C++ Przeładowanie operatorów i wzorce w klasach

C++ Przeładowanie operatorów i wzorce w klasach C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje

Bardziej szczegółowo

INŻYNIERIA BEZPIECZEŃSTWA LABORATORIUM NR 2 ALGORYTM XOR ŁAMANIE ALGORYTMU XOR

INŻYNIERIA BEZPIECZEŃSTWA LABORATORIUM NR 2 ALGORYTM XOR ŁAMANIE ALGORYTMU XOR INŻYNIERIA BEZPIECZEŃSTWA LABORATORIUM NR 2 ALGORYTM XOR ŁAMANIE ALGORYTMU XOR 1. Algorytm XOR Operacja XOR to inaczej alternatywa wykluczająca, oznaczona symbolem ^ w języku C i symbolem w matematyce.

Bardziej szczegółowo

Przekształcanie wykresów.

Przekształcanie wykresów. Sławomir Jemielity Przekształcanie wykresów. Pokażemy tu, jak zmiana we wzorze funkcji wpływa na wygląd jej wykresu. A. Mamy wykres funkcji f(). Jak będzie wyglądał wykres f ( ) + a, a stała? ( ) f ( )

Bardziej szczegółowo

Podstawy i języki programowania

Podstawy i języki programowania Podstawy i języki programowania Laboratorium 2 - wprowadzenie do zmiennych mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 23 października 2017 1 / 26 mgr inż. Krzysztof Szwarc Podstawy i

Bardziej szczegółowo

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL Wprowadzenie do SQL SQL - Structured Query Language -strukturalny język zapytań Światowy standard przeznaczony do definiowania, operowania i sterowania danymi w relacyjnych bazach danych Powstał w firmie

Bardziej szczegółowo

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal

Bardziej szczegółowo

Podstawy programowania skrót z wykładów:

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

Bardziej szczegółowo

Informatyka II. Laboratorium Aplikacja okienkowa

Informatyka II. Laboratorium Aplikacja okienkowa Informatyka II Laboratorium Aplikacja okienkowa Założenia Program będzie obliczał obwód oraz pole trójkąta na podstawie podanych zmiennych. Użytkownik będzie poproszony o podanie długości boków trójkąta.

Bardziej szczegółowo

Tablice. Jones Stygar na tropie zmiennych

Tablice. Jones Stygar na tropie zmiennych Tablice Jones Stygar na tropie zmiennych Czym jest tablica? Obecnie praktycznie wszystkie języki programowania obsługują tablice. W matematyce odpowiednikiem tablicy jednowymiarowej jest ciąg (lub wektor),

Bardziej szczegółowo

lekcja 8a Gry komputerowe MasterMind

lekcja 8a Gry komputerowe MasterMind lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych

Bardziej szczegółowo

dr inż. Jarosław Forenc

dr inż. Jarosław Forenc Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2010/2011 Wykład nr 7 (24.01.2011) dr inż. Jarosław Forenc Rok akademicki

Bardziej szczegółowo

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których

Bardziej szczegółowo

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Publikacja jest dystrybuowana bezpłatnie Program Operacyjny Kapitał Ludzki Priorytet 9 Działanie 9.1 Poddziałanie

Bardziej szczegółowo

Serwer WWW Apache. http://httpd.apache.org/ Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, 2.2.25, 2.0.65 zakończony projekt

Serwer WWW Apache. http://httpd.apache.org/ Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, 2.2.25, 2.0.65 zakończony projekt Serwer WWW Apache http://httpd.apache.org/ Plik konfiguracyjny httpd.conf Definiujemy m.in.: Katalog który ma być serwowany Moduły, które mają zostać uruchomione na serwerze m.in. PHP, mod_rewrite Wirtualne

Bardziej szczegółowo

2. Zmienne i stałe. Przykłady Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117).

2. Zmienne i stałe. Przykłady Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117). 2. Zmienne i stałe Przykłady 2.1. Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117). 5 int a = 281; int b = 117; 7 8 cout

Bardziej szczegółowo

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane Algorytmy i struktury danych Wykład 4 Tablice nieporządkowane i uporządkowane Tablice uporządkowane Szukanie binarne Szukanie interpolacyjne Tablice uporządkowane Szukanie binarne O(log N) Szukanie interpolacyjne

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 2

Języki i techniki programowania Ćwiczenia 2 Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...

Bardziej szczegółowo

Tabela wewnętrzna - definicja

Tabela wewnętrzna - definicja ABAP/4 Tabela wewnętrzna - definicja Temporalna tabela przechowywana w pamięci operacyjnej serwera aplikacji Tworzona, wypełniana i modyfikowana jest przez program podczas jego wykonywania i usuwana, gdy

Bardziej szczegółowo

Funkcje wyszukiwania i adresu PODAJ.POZYCJĘ

Funkcje wyszukiwania i adresu PODAJ.POZYCJĘ Funkcje wyszukiwania i adresu PODAJ.POZYCJĘ Mariusz Jankowski autor strony internetowej poświęconej Excelowi i programowaniu w VBA; Bogdan Gilarski właściciel firmy szkoleniowej Perfect And Practical;

Bardziej szczegółowo

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Konwersje liczba napis Ćwiczenia 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12,

Bardziej szczegółowo

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu. Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą

Bardziej szczegółowo

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych 1. Wstawianie skryptu na stroną: Laboratorium 1 Do umieszczenia skryptów na stronie służy znacznik: //dla HTML5 ...instrukcje skryptu //dla HTML4 ...instrukcje

Bardziej szczegółowo

Algorytmika i Programowanie VBA 1 - podstawy

Algorytmika i Programowanie VBA 1 - podstawy Algorytmika i Programowanie VBA 1 - podstawy Tomasz Sokół ZZI, IL, PW Czas START uruchamianie środowiska VBA w Excelu Alt-F11 lub Narzędzia / Makra / Edytor Visual Basic konfiguracja środowiska VBA przy

Bardziej szczegółowo

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists() Paweł Gmys PHP strona 1 Lekcja 10 Uprawnienia Aby skrypt PHP mógł odwołać się do pliku, musi mieć odpowiednie uprawnienia. Szczegóły są zależne od serwera. Najczęściej chyba skrypt ma uprawnienia takie,

Bardziej szczegółowo

System imed24 Instrukcja Moduł Analizy i raporty

System imed24 Instrukcja Moduł Analizy i raporty System imed24 Instrukcja Moduł Analizy i raporty Instrukcja obowiązująca do wersji 1.8.0 Spis treści 1. Moduł Analizy i Raporty... 3 1.1. Okno główne modułu Analizy i raporty... 3 1.1.1. Lista szablonów

Bardziej szczegółowo

Indeksowanie w bazach danych

Indeksowanie w bazach danych w bazach Katedra Informatyki Stosowanej AGH 5grudnia2013 Outline 1 2 3 4 Czym jest indeks? Indeks to struktura, która ma przyspieszyć wyszukiwanie. Indeks definiowany jest dla atrybutów, które nazywamy

Bardziej szczegółowo

Jak wykonać inwentaryzację (spis z natury) w rc sklep lub rc sklep mini.

Jak wykonać inwentaryzację (spis z natury) w rc sklep lub rc sklep mini. Jak wykonać inwentaryzację (spis z natury) w rc sklep lub rc sklep mini. Inwentaryzację wykonujemy wtedy, kiedy chcemy dokładnie poznać fizyczny stan towarów na sklepie. Najczęściej jest to spowodowane

Bardziej szczegółowo

Lekcja : Tablice + pętle

Lekcja : Tablice + pętle Lekcja : Tablice + pętle Wprowadzenie Oczywiście wiesz już jak dużo można osiągnąć za pomocą tablic oraz jak dużo można osiągnąć za pomocą pętli, jednak tak naprawdę prawdziwe możliwości daje połączenie

Bardziej szczegółowo

Ile waży arbuz? Copyright Łukasz Sławiński

Ile waży arbuz? Copyright Łukasz Sławiński Ile waży arbuz? Arbuz ważył7kg z czego 99 % stanowiła woda. Po tygodniu wysechł i woda stanowi 98 %. Nieważne jak zmierzono te %% oblicz ile waży arbuz teraz? Zanim zaczniemy, spróbuj ocenić to na wyczucie...

Bardziej szczegółowo

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel SQL, LIKE, IN, CASE, EXISTS Marcin Orchel Spis treści 1 LIKE 2 2 BETWEEN 4 3 IN 5 4 EXISTS 6 5 WYRAŻENIA CASE 7 6 Zadania 9 1 Rozdział 1 LIKE Predykat LIKE jest testem dopasowującym wzorzec łańcucha. Składnia

Bardziej szczegółowo

Wstęp do informatyki- wykład 2

Wstęp do informatyki- wykład 2 MATEMATYKA 1 Wstęp do informatyki- wykład 2 Systemy liczbowe Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy

Bardziej szczegółowo

Algorytmy i struktury danych

Algorytmy i struktury danych Algorytmy i struktury danych Proste algorytmy sortowania Witold Marańda maranda@dmcs.p.lodz.pl 1 Pojęcie sortowania Sortowaniem nazywa się proces ustawiania zbioru obiektów w określonym porządku Sortowanie

Bardziej szczegółowo

Podstawy programowania w C++

Podstawy programowania w C++ Podstawy programowania w C++ Liczby w jaki sposób komputery je widzą? Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com Czy wiesz, jak komputery wykonują

Bardziej szczegółowo

0 + 0 = 0, = 1, = 1, = 0.

0 + 0 = 0, = 1, = 1, = 0. 5 Kody liniowe Jak już wiemy, w celu przesłania zakodowanego tekstu dzielimy go na bloki i do każdego z bloków dodajemy tak zwane bity sprawdzające. Bity te są w ścisłej zależności z bitami informacyjnymi,

Bardziej szczegółowo

Opis klawiatury komputerowej

Opis klawiatury komputerowej Spis treści utworzony przez NN Opis klawiatury komputerowej...1 1.1.Esc...1 1.2.F1 F12...1 1.3.Backspace...1 1.4.Tab...1 1.5.Caps Lock...2 1.6.Enter...2 1.7.Shift...2 1.8.Ctrl...2 1.9.Alt...2 1.10.Caps

Bardziej szczegółowo

1. Operacje logiczne A B A OR B

1. Operacje logiczne A B A OR B 1. Operacje logiczne OR Operacje logiczne są operacjami działającymi na poszczególnych bitach, dzięki czemu można je całkowicie opisać przedstawiając jak oddziałują ze sobą dwa bity. Takie operacje logiczne

Bardziej szczegółowo

Struktury, unie, formatowanie, wskaźniki

Struktury, unie, formatowanie, wskaźniki Struktury, unie, formatowanie, wskaźniki 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12, na rzecz swoich 143209 poddanych uchwalił dekret o 20 procentowej

Bardziej szczegółowo

ZMIENNE. Podstawy PHP

ZMIENNE. Podstawy PHP ZMIENNE Podstawy PHP zmienna - to obiekt w programowaniu, który przechowuje różnego rodzaju dane niezbędne do działania programu. Zmienna podczas działania programu może zmieniad swoje wartości (jak wskazuje

Bardziej szczegółowo

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0 Słowem wstępu Część rodziny języków XSL Standard: W3C XSLT 1.0-1999 razem XPath 1.0 XSLT 2.0-2007 Trwają prace nad XSLT 3.0 Problem Zakładane przez XML usunięcie danych dotyczących prezentacji pociąga

Bardziej szczegółowo

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost; Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze

Bardziej szczegółowo

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl Bazy danych Podstawy języka SQL Dr inż. Paweł Kasprowski pawel@kasprowski.pl Plan wykładu Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność danych Współbieżność

Bardziej szczegółowo

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2 Algorytmy i struktury danych Wykład 6 Tablice rozproszone cz. 2 Na poprzednim wykładzie Wiele problemów wymaga dynamicznych zbiorów danych, na których można wykonywać operacje: wstawiania (Insert) szukania

Bardziej szczegółowo

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python Język PYTHON Podstawowe informacje Python to język skryptowy, interpretowany - co oznacza, że piszemy skrypt, a następnie wykonujemy go za

Bardziej szczegółowo

I. Podstawy języka C powtórka

I. Podstawy języka C powtórka I. Podstawy języka C powtórka Zadanie 1. Utwórz zmienne a = 730 (typu int), b = 106 (typu long long), c = 123.45 (typu double) Wypisz następujące komunikaty: Dane sa liczby: a = 730, b = 106 i c = 123.45.

Bardziej szczegółowo

Inicjacja tablicy jednowymiarowej

Inicjacja tablicy jednowymiarowej TABLICE C++ Inicjacja tablicy jednowymiarowej typ_komórek_tablicy nazwa_tablicy [ ilość elementów tablicy ] ; np.: int tablica[1000]; czyli tablica, która może przechowywać tysiąc elementów typu całkowitego,

Bardziej szczegółowo

WYRAŻENIA ALGEBRAICZNE

WYRAŻENIA ALGEBRAICZNE WYRAŻENIA ALGEBRAICZNE Wyrażeniem algebraicznym nazywamy wyrażenie zbudowane z liczb, liter, nawiasów oraz znaków działań, na przykład: Symbole literowe występujące w wyrażeniu algebraicznym nazywamy zmiennymi.

Bardziej szczegółowo

KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ

KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ Wykład 3 Katedra Inżynierii Komputerowej Jakub Romanowski jakub.romanowski@kik.pcz.pl POBIERANIE DANYCH C/AL Poniższe funkcje używane są do operacji pobierania

Bardziej szczegółowo

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch. Instrukcje warunkowe i skoku. Spotkanie 2 Dr inż. Dariusz JĘDRZEJCZYK Wyrażenia i operatory logiczne Instrukcje warunkowe: if else, switch Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania

Bardziej szczegółowo

Elementy języka Haskell

Elementy języka Haskell Elementy języka Haskell Cechy języka Historia języka Proste przykłady Środowisko interakcyjne Typy i klasy Definiowanie funkcji Wyrażenia listowe Deklarowanie typów, danych i klas Monady Cechy języka zwięzłe

Bardziej szczegółowo

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 7 kwietnia 2014 1. Wprowadzenie Pierwsza część instrukcji zawiera informacje

Bardziej szczegółowo

Sortowanie. Bartman Jacek Algorytmy i struktury

Sortowanie. Bartman Jacek Algorytmy i struktury Sortowanie Bartman Jacek jbartman@univ.rzeszow.pl Algorytmy i struktury danych Sortowanie przez proste wstawianie przykład 41 56 17 39 88 24 03 72 41 56 17 39 88 24 03 72 17 41 56 39 88 24 03 72 17 39

Bardziej szczegółowo

3. Instrukcje warunkowe

3. Instrukcje warunkowe . Instrukcje warunkowe Przykłady.1. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo ujemna lub nieujemna, w zależności od tego czy dana liczba jest ujemna czy nie. 1 #include

Bardziej szczegółowo

Strategia "dziel i zwyciężaj"

Strategia dziel i zwyciężaj Strategia "dziel i zwyciężaj" W tej metodzie problem dzielony jest na kilka mniejszych podproblemów podobnych do początkowego problemu. Problemy te rozwiązywane są rekurencyjnie, a następnie rozwiązania

Bardziej szczegółowo