Tworzenie własnych typów. danych oraz klas typów
|
|
- Natalia Żurawska
- 7 lat temu
- Przeglądów:
Transkrypt
1 Justyna Łowicka
2 Tworzenie własnych typów danych oraz klas typów
3 Algebraiczne typy danych
4 konstruktorów umieszczonych w deklaracji data. Zobaczmy, jak typ Bool jest zdefiniowany w bibliotece standardowej. data Bool = False True Data oznacza, że mamy do zdefiniowania nowy typ danych. Przed znakiem równania oznaczono typ, którym jest Bool,zaś po znaku - wartości, jakie może mieć dany typ, oddzielone odczytywanym jako lub. Czyli rozumiemy to jako: Typ Bool może mieć wartość True lub False. Na przykład typ Int jest zdefiniowany w następujący sposób: data Int =
5 Aby utworzyć kształt w Haskell możemy posłużyć się jednym ze sposobów jakim jest krotka. Koło może być oznaczone jako (43.1, 55.0, 10.4), gdzie dwa pierwsze parametry oznaczają współrzędne środka okręgu, zaś trzeci promień koła. Nie jest to dobre rozwiązanie, gdyż mogą one stanowić wektor 3D lub coś innego. Lepszym sposobem jest reprezentacja kształtu za pomocą typów. Dla koła czy prostokąta mamy: data Shape = Circle Float Float Float Rectangle Float Float Float Float Koło zawiera trzy parametry określające tak jak powyżej dwa współrzędne środka okręgu oraz promień, określające typy wartości jakie będą zdefiniowane. Jeśli chodzi o prostokąt, to mamy dwa pierwsze współrzędne odnoszące się do lewego górnego rogu i dwa kolejne określające położenie dolnego prawego rogu.
6 powierzchnię: surface :: Shape -> Float surface ( Circle r) = pi * r ^ 2 surface ( Rectangle x1 y1 x2 y2 ) = ( abs $ x2 - x1 ) * ( abs $ y2 - y1 ) W wierszu polecenia wygląda to tak: ghci > surface $ Circle ghci > surface $ Rectangle
7 5 w wierszu, otrzymamy błąd. To dlatego, że Haskell nie wie, w jaki sposób wyświetlać nasz typ danych jako ciąg znaków. Aby się dowiedział, wystarczy dodać na końcu deklaracji deriving ( Show ). data Shape = Circle Float Float Float Rectangle Float Float Float Float deriving ( Show ) ghci > Circle Circle ghci > Rectangle Rectangle
8 data Point = Point Float Float deriving ( Show ) data Shape = Circle Point Float Rectangle Point Point deriving ( Show ) Więc teraz Circle ma dwa pola, z czego jeden jest typu Point a drugi jest typu Float. To sprawia, że łatwiej jest zrozumieć co jest czym. Podobnie jest w przypadku prostokąta. surface :: Shape -> Float surface ( Circle _ r) = pi * r ^ 2 surface ( Rectangle ( Point x1 y1 ) ( Point x2 y2 )) = ( abs $ x2 - x1 ) * ( abs $ y2 - y1 )
9 ghci > surface ( Circle ( Point 0 0) 24) Możemy utworzyć funkcję, która przesuwa kształt. Przenosi ona obiekty na osi x i y, a następnie zwraca nowy kształt, który ma te same wymiary, tyle że znajduje się gdzieś indziej. nudge :: Shape -> Float -> Float -> Shape nudge ( Circle ( Point x y) r) a b = Circle ( Point ( x + a) (y + b )) r nudge ( Rectangle ( Point x1 y1 ) ( Point x2 y2 )) a b = Rectangle ( Point ( x1 +a) ( y1 +b )) ( Point ( x2 + a) ( y2 + b ))
10 Jeśli nie chcemy przesuwać bezpośrednio z punktów, możemy dodać funkcję pomocniczą, która tworzy kształty danej wielkości zaczynając od współrzędnych zera, a następnie się nimi sugerować. basecircle :: Float -> Shape basecircle r = Circle ( Point 0 0) r baserect :: Float -> Float -> Shape baserect width height = Rectangle ( Point 0 0) ( Point width height ) ghci > nudge ( baserect ) 60 23
11 nawiasy z określonymi konstruktorami wartości, rozdzielając je przecinkami. Jeśli chcesz wyeksportować wszystkie konstruktory dla danego rodzaju, wystarczy wpisać w nawiasie... module Shapes ( Point (..), Shape (..), surface, nudne, basecircle, baserect ) where Możemy również nie eksportować żadnych konstruktorów
12 Składnia record
13 nazwisko, wiek, wzrost, numer telefonu i ulubiony smak lodów. data Person = Person String String Int Float String String deriving ( Show ) ghci > let guy = Person " Buddy " " Finklestein " " " " Chocolate " ghci > guy Person " Buddy " " Finklestein " " " " Chocolate " Zapis ten jest dość nieczytelny. Jak stworzyć funkcję, aby otrzymać oddzielne informacje od osoby? Funkcja,
14 Zamiast nazywania rodzajów pól jeden po drugim i oddzielania je spacjami, używamy nawiasów klamrowych. data Person = Person { firstname :: String lastname :: String age :: Int height :: Float phonenumber :: String flavor :: String deriving ( Show ),,,,, }
15 Za pomocą składni recordu do stworzenia tego typu danych, Haskell automatycznie wykonuje funkcje: firstname, lastname, age, height, phonenumber, flavor. ghci > :t flavor flavor :: Person -> String ghci > :t firstname firstname :: Person -> String Zaletą korzystania ze składni rekord jest to, że nie trzeba koniecznie umieszczać pola w odpowiedniej kolejności, dopóki mamy listę wszystkich danych. Ale jeśli nie używamy składni rekord, musimy określić je w kolejności.
16 Rodzaje parametrów
17 Konstruktor może podjąć pewne parametry wartości, a następnie stworzyć nową wartość. Na przykład, konstruktor Samochód przyjmuje trzy wartości i tworzy wartość samochodu. W podobny sposób konstruktorzy mogą wziąć typ jako parametr do produkcji nowych typów. data Maybe a = Nothing Just a Parametrem typu jest tutaj a. W zależności od tego, co chcemy w tym typie przechowywać, jeżeli nie jest to Nothing, ten konstruktor może stworzyć rodzaj Maybe Int, Maybe Car, Maybe String itd. Bez wartości może mieć typ po prostu Meybe.
18 Typ Nothing jest typem polimorficznym. Jeśli funkcja wymaga Meybe Int jako parametru, możemy mu przypisać Nothing, gdyż Nothing nie zawiera wartości. Typ Meybe może działać jak Meybe Int, podobie jak 5 może działać jak Int lub Double. Podobnie dzieje się w pustej liście []. Może ona działać jak lista niczego. Dlatego możemy zrobić [1,2,3] ++ [] i [ ha, ha, ha ] ++ [].
19 korzystamy z nich, gdy nasz typ danych będzie działał niezależnie od rodzaju wartości przechowywanych, tak jak Maybe. Jeśli typ może służyć jak pewnego rodzaju pudełko, warto z niego skorzystać. Na przykład, możemy zmienić typ danych z tego: data Car = Car { company :: String, model :: String, year :: Int } deriving ( Show ) Na ten: data Car a b c = Car { company :: a, model :: b
20 Biorąc pod uwagę naszą pierwszą definicję Car, możemy zrobić funkcję która wyświetla właściwości samochodu. tellcar :: Car -> String tellcar ( Car { company = c, model = m, year = y }) = " This " ++ c ++ " " ++ m ++ " was made in " ++ show y ghci > let stang = Car { company =" Ford ", model =" Mustang ", year =1967} ghci > tellcar stang " This Ford Mustang was made in 1967 "
21 data Vector a = Vector a a a deriving ( Show ) vplus :: ( Num t ) = > Vector t -> Vector t -> Vector t ( Vector i j k ) vplus ( Vector l m n) = Vector ( i+l) (j+ m) (k+n) vectmult :: ( Num t) => Vector t -> t -> Vector t ( Vector i j k ) vectmult m = Vector ( i*m) (j* m) ( k*m) scalarmult :: ( Num t) = > Vector t -> Vector t -> t ( Vector i j k ) scalarmult ( Vector l m n) = i*l + j*m + k *n Funkcja vplus pozwala dodać dwa wektory, ale tylko gdy zostaną wstawione ich odpowiednie komponenty, zaś ScalarMult służy do iloczynu skalarnego dwóch wektorów, a vectmult do pomnożenia wektora z skalarem (element ustalonego ciała nad którym zbudowany jest dowolny moduł). Funkcje te mogą działać z Vector Int,
22 Vector ghci > Vector vplus Vector vplus Vector Vector ghci > Vector vectmult 10 Vector ghci > Vector scalarmult Vector ghci > Vector vectmult ( Vector scalarmult Vector 9 2 4) Vector Bardzo ważne jest odróżnianie konstruktora typu od konstruktora wartości. Deklarując typ danych, część przed = jest konstruktorem typu, zaś po wskazuje na konstruktor wartości (ewentualnie oddzielone znakiem ). Nadanie funkcji typu Vector ttt -> Vector ttt -> t byłoby błędem, ponieważ musimy
23 Bartłomiej Zieliński YesNo typeclass (klasa typu YesNo) Functor typeclass (klasa typu Functor) Kinds (rodzaje) Input and Output (wejście i wyjście)
24 Klasa typu YesNo Klasa typu (ang. typeclass) YesNo pozwala na skonstruowanie klasy, której obiekty można stosować w wyrażeniach warunkowych w taki sposób, jakby były one typu Bool. Sama klasa typu jest ekwiwalentem interfejsów znanych z obiektowych języków programowania, takich jak C# czy Java.
25 Klasa typu YesNo Klasa implementująca YesNo może wyglądać następująco: class YesNo param where yesno :: param -> Bool yesnolist :: [param] -> Bool
26 Klasa typu YesNo Teraz możemy utworzyć konkretne instancje tej klasy. Dla przykładu, utwórzmy instancję, która jako parametr przyjmie liczbę i zwróci True, jeśli będzie ona różna od 0, lub False, jeśli będzie równa 0.
27 Klasa typu YesNo instance YesNo Int where yesnolist = undefined yesno 0 = False yesno _ = True Zastosowaliśmy tu słowo kluczowe undefined, ponieważ nie ma potrzeby na implementację metody yesnolist dla wartości typu Int, która nie jest listą.
28 Klasa typu YesNo Przykład: *Main> yesno (1 :: Int) True *Main> yesno (0 :: Int) False *Main> yesno ( :: Int) True
29 Klasa typu YesNo Tak naprawdę nie ma ograniczeń w kwestii tego, do czego możemy odnieść naszą klasę YesNo. Możemy np. sprawdzić poprawność wprowadzonego imienia na podstawie listy dostępnych imion.
30 Klasa typu YesNo instance YesNo Char where yesno = undefined yesnolist [] = False yesnolist str = (str `elem` ["Jan", "Waldemar", "Marianna", "Abdul"]) Znowu zastosowaliśmy słowo kluczowe undefined. Bez niego otrzymywalibyśmy w trakcie kompilacji ostrzeżenie, że metoda yesno nie została zaimplementowana, co wprawdzie nie uniemożliwiłoby uruchomienia programu, ale wprowadzałoby niepotrzebny stres.
31 Klasa typu YesNo Przykład: *Main> yesnolist "Jan" True *Main> yesnolist "abdul" False *Main> yesnolist "Abdul" True *Main> yesnolist "Konrad" False
32 Klasa typu YesNo Możemy oczywiście powstałe w ten sposób instacje stosować później w funkcjach, chociażby w instrukcjach warunkowych if. checkname :: [Char] -> [Char] checkname str = if (yesnolist str) then "Ok :)" else "Not ok :("
33 Klasa typu YesNo Przykład: *Main> map (checkname) ["Jan", "Waldemar", "Janina", "Karol", "Abdul"] ["Ok :)","Ok :)","Not ok :(", "Not ok :(","Ok :)"]
34 Klasa typu Functor Klasa typu Functor pozwala na określenie, w jaki sposób można wykonać mapowanie jednego elementu na drugi, na podstawie pewnej danej (np. funkcji lub liczby). Definicja: class Functor f where fmap :: (a -> b) -> f a -> f b (a->b) oznacza funkcję przyjmującą jako parametr a i zwracającą b.
35 Klasa typu Functor Przykładowo, znana nam dobrze funkcja map implementuje interfejs typu klasowego Functor w taki sposób, by działał on tylko na listach: map :: (a -> b) -> [a] -> [b] instance Functor [] where fmap = map Co wynika już z samej definicji, zarówno fmap, jak i map, zadziałają w identyczny sposób dla parametrów jako list.
36 Klasa typu Functor Przykład: *Main> map (length) ["Haskell", "Dwa Haskelle", "Pincet Haskelli"] [7,12,15] *Main> fmap (length) ["Haskell", "Dwa Haskelle", "Pincet Haskelli"] [7,12,15]
37 Klasa typu Functor Nasuwa się pytanie kiedy zaimplementowanie klasy typu Functor faktycznie ma sens? Odpowiedź brzmi: ma ono sens dla każdego typu, który może zachowywać się jak pudełko, tj. może być puste, pełne lub po prostu zawierać pewną ilość elementów wewnątrz siebie.
38 Klasa typu Functor Klasa typu Maybe jest funktorem i przyjmuje formę: instance Functor Maybe where fmap f (Just x) = Just (f x) fmap f Nothing = Nothing W tym momencie warto zauważyć, że jako parametr instancji podajemy tylko typ piszemy Maybe, a nie np. Maybe m. Ma to sens o tyle, iż klasa fmap oczekuje jako parametru typu, a nie konkretnej danej.
39 Klasa typu Functor Maybe pozwala nam na niepodejmowanie radykalnych kroków w stylu wyrzucenia błędu, gdy coś pójdzie nie tak w trakcie wykonywania pewnych obliczeń. Zamiast tego zwrócona zostanie nieco bardziej przyjazna wartość Nothing. Dobrym przykładem będzie tu próba dzielenia przez 0 domyślnie działanie zostanie wykonane i zwróci nieskończoność (Infinity), co nie zawsze jest pożądane istnieje możliwość, że w naszym programie nieskończoność to przyjmowalny wynik, jednak tutaj powstałaby ona wskutek błędu.
40 Klasa typu Functor divide :: Float -> Float -> Maybe Float divide x y y /= 0 = Just (x / y) otherwise = Nothing Przykład: *Main> divide 5 4 Just 1.25 *Main> divide 5 0 Nothing
41 Klasa typu Functor Inne użycie Maybe: Prelude> fmap (++ [1,2,3]) (Just [4,5,6]) Just [4,5,6,1,2,3] Prelude> fmap (++ [1,2,3]) Nothing Nothing
42 Rodzaje Rodzaj w teorii typów, jest to typ konstruktora typu ( typ typu ). - zgodnie z angielską Wikipedią, czyli jedynym słusznym źródłem informacji. Definicja, choć krótka, na pierwszy rzut oka jest dość zawiła. Mając daną klasę A, rodzajem w Haskellu nazwiemy konstruktor jej typu, a więc nie konstruktor obiektu typu A, tylko konstruktor samego typu A.
43 Rodzaje By sprawdzić rodzaj w Haskellu, możemy skorzystać z komendy :k (analogicznie jak :t, gdy chcemy sprawdzić typ), która jako parametr przyjmuje nazwę typu, np.: Prelude> :k Int Int :: * Prelude> :k [] [] :: * -> * Prelude> :k Char Char :: *
44 Rodzaje Gwiazdka w rodzaju oznacza, że określa on konkretny typ, nie wymagający już żadnego dodatkowego uszczegóławiania. Można ją odczytać po prostu jako typ.
45 Rodzaje Przypomnijmy, jak wyglądał rodzaj listy: [] :: * -> * Jak należy to odczytać? Otóż, lista ma rodzaj przyjmujący typ jako parametr i zwracający na podstawie owego parametru inny, konkretny typ. Np. dla Int otrzymamy: Prelude> :k [] Int [] Int :: * czyli już konkretny typ.
46 Rodzaje A co, jeśli rodzaj wymaga podania więcej, niż jednego typu? Prelude> :k Either Either :: * -> * -> * Jeśli podamy tylko jeden typ jako parametr, powinniśmy otrzymać już coś konkretniejszego, ale wciąż wymagającego dodatkowego skonkretyzowania. Rzeczywiście: Prelude> :k Either Int Either Int :: * -> *
47 Rodzaje Dopiero po podaniu dwóch typów jako parametrów otrzymamy pełnoprawny, konkretny typ: Prelude> :k Either Int Double Either Int Double :: *
48 Wejście i wyjście Zdefiniujmy prostą funkcję wypisującą pewien tekst do konsoli: let printhaskell = putstrln "Haskell" Nasuwa się pytanie co zwróci nam funkcja putstrln? Możemy to sprawdzić za pomocą komendy :t.
49 Wejście i wyjście Prelude> :t printhaskell printhaskell :: IO () printhaskell jest zatem funkcją, która nie przyjmuje żadnych parametrów i wykonuje akcję IO (skrót od angielskiego Input-Output), która w trakcie działania utworzy krotkę (ang. tuple) (). W krotce oczywiście mogą znaleźć się pewne dane, jednak w przypadku wypisania listy znaków do konsoli nie bardzo jest co w niej umieścić, dlatego też jest przedstawiona jako pusta.
50 Wejście i wyjście Napiszmy teraz pełnoprawny program (tj. poza GHCI), który połączy ze sobą kilka akcji IO, by zobaczyć, o co tu właściwie chodzi. Umieszczamy zatem w pliku o nazwie program.hs następującą funkcję: main = do putstrln "Podaj liczbę: " x <- getline putstrln ("cos(" ++ x ++ ") = " ++ show (cos (read x)))
51 Wejście i wyjście Wyniki akcji możemy przypisywać do nazw, z wyjątkiem akcji wykonanej na końcu bloku do. Plik umieszczamy w folderze C:\Haskell i kompilujemy go poleceniem: ghc C:\Haskell\program.hs Jako wynik dostajemy plik wykonywalny, a także plik interfejsu (.hi) oraz plik obiektowy (.o). Uruchamiamy program.exe.
52 Wejście i wyjście C:\Haskell\Program.exe Podaj liczbę: 5.1 cos(5.1) = Wykonane zostały tutaj trzy akcje IO, jedno wczytanie (getline) oraz dwa wypisania (putstrln). Sprawdziliśmy już typ putstrln, jednak co dostaniemy w przypadku getline, które teoretycznie zwraca coś konkretnego?
53 Wejście i wyjście Prelude> :t getline getline :: IO String String jest synonimem dla listy znaków postaci [Char]. Funkcja getline wykona zatem pewną akcję IO, w trakcie której utworzy wartość będącą Stringiem. By wydostać tę wartość z wnętrza getline już po wykonaniu akcji, stosujemy konstrukcję <-.
54 Wejście i wyjście Uzyskaną i przypisaną na poprzednim slajdzie do x listę możemy później dowolnie wykorzystywać w programie. Jest to uwaga o tyle istotna (szczególnie jeśli chodzi o przypisanie do x), że nie możemy zapisać tego programu w krótszej postaci, która wydawałaby się mieć sens: putstrln ("cos(" ++ x ++ ") = " ++ show (cos (read getline)))
55 Wejście i wyjście Dzieje się tak, ponieważ getline jako funkcja nie zwraca listy znaków. Jej typ (IO String) mówi nam jedynie, że dopiero po wykonaniu akcji IO (w tym wypadku przyjęciu danych z klawiatury) będzie można wydobyć z niej Stringa, tak więc musimy mieć tu pewną pośredniość, którą uzyskaliśmy dzięki wykorzystaniu x. Warto zauważyć, że w programie w miejscu wykonania getline nie zastosowaliśmy =, a <-, co daje nam do zrozumienia, iż nie jest to zwykłe przypisanie wyniku.
56 Wejście i wyjście A co, gdybyśmy spróbowali zastosować = zamiast <-? Wówczas nadalibyśmy tylko getline inną nazwę, którą można by stosować zamiennie. Akcje IO mogą być wykonywane tylko wtedy, gdy są przypisane do main, lub gdy kolejne, zagnieżdżone bloki do, w których się znajdują, ostatecznie wpadną do main.
57 Wejście i wyjście main = do putstrln "Podaj liczbę: " x <- getline do putstrln "Akcja IO w zagnieżdżonym bloku do" putstrln ("cos(" ++ x ++ ") = " ++ show (cos (read x)))
58 Wejście i wyjście Podaj liczbę: 10 Akcja IO w zagnieżdżonym bloku do cos(10) =
59 Wejście i wyjście Korzystanie z akcji IO jest też możliwe z poziomu GHCI, jednak nawet wtedy przed wypisaniem do konsoli poddane zostaną obróbce, m.in. w postaci konwersji na listę znaków funkcją show.
60 Wejście i wyjście Przeciwieństwem do <- jest return. Zastosowanie tego słowa może być niezwykle mylące, jeśli wcześniej programowało się w językach imperatywnych, tutaj bowiem nie służy ono do zwrócenia wartości, a do jej opakowania, tak jak robi to akcja IO.
61 Wejście i wyjście main = do x <- return "Something" putstrln (x ++ " in the way") Wynik: Something in the way
62 Wejście i wyjście Mogłoby się wydawać, że return to jedyna opcja, jeśli chcemy w bloku z akcjami IO przypisać pewnej konkretnej liście znaków nazwę. Okazuje się jednak, iż wciąż możemy stosować let: main = do let x = "Something" putstrln (x ++ " in the way")
63 Wejście i wyjście Poznaliśmy już dwie funkcje będące akcjami IO putstrln oraz getline. Teraz przedstawimy kilka dodatkowych, które mogą okazać się przydatne przy korzystaniu z wejścia/wyjścia.
64 Wejście i wyjście putstr działa dokładnie tak, jak putstrln, z tą różnicą, że nie przechodzi automatycznie do kolejnej linii. Prelude> putstr "Test" TestPrelude>
65 Wejście i wyjście putchar działa jak putstr, jednak pobiera jeden znak, a nie całą ich listę. TestPrelude> putchar 'x' xprelude>
66 Wejście i wyjście print wypisuje za pomocą funkcji show dowolną wartość, oczywiście o ile owa wartość jest instancją Show. Prelude> print Prelude> print ["A", "B"] ["A","B"]
67 Wejście i wyjście getchar działa jak getline, jednak zamiast całej listy pobiera tylko jeden znak. import Data.Char main = do currentchar <- getchar if (isupper currentchar) then do putchar currentchar main else return ()
68 Wejście i wyjście when pozwala na skrócenie instrukcji warunkowej przy korzystaniu z akcji IO jeśli warunek jest spełniony, zwróci wynik akcji przekazanej jako drugi parametr, a w przeciwnym razie pustą krotkę. import Control.Monad import Data.Char main = do currentchar <- getchar when (isupper currentchar) $ do putchar currentchar main
69 Wejście i wyjście sequence wykonuje przekazaną jako parametr listę akcji IO, tworząc listę wyników. import Control.Monad main = do resultslist <- sequence [getline, getline] print resultslist
70 Wejście i wyjście mapm, mapm_ wykonują zadaną funkcję mapującą na liście, przy czym druga wersja odrzuca dodatkowy wynik w postaci listy pustych krotek. Prelude> mapm print [1, 2] 1 2 [(),()] Prelude> mapm_ print [1, 2] 1 2
71 Wejście i wyjście forever wykonuje podaną akcję IO bez końca. (Przykład na następnym slajdzie.)
72 Wejście i wyjście import Control.Monad import System.Random main = do forever $ do randx <- randomio :: IO Int randy <- randomio :: IO Int let max = 500 putstrln ("Ile to jest " ++ show (randx `mod` max) ++ " + " ++ show (randy `mod` max) ++ "?") givenresult <- getline if (givenresult == show (randx `mod` max + randy `mod` max)) then print "Brawo!" else print ("Zle! Prawidlowa odpowiedz to " ++ show (randx `mod` max + randy `mod` max) ++ "!")
73 Wejście i wyjście form działa jak mapm, jednak ma parametry zamienione miejscami, co pozwala np. na wygodne zastosowanie wyrażenia lambda (w mapm musielibyśmy najpierw wprowadzić wyrażenie lambda, a dopiero potem parametr, co bardzo utrudniłoby zrozumienie kodu). (Przykład na następnym slajdzie).
74 Wejście i wyjście import Control.Monad main = do let personslist = ["John", "Jenny", "Barry"] form personslist (\name -> do putstrln ("Hello, " ++ name ++ "!"))
75 showeet.com Dużo złych rzeczy Kamila Dzwonkowska
76 OPERACJE WEJŚCIA-WYJŚCIA getchar czyta pojedynczy znak z terminala getchar :: IO Char getline czyta całą linię z terminala getline :: IO String getcontents operacja ta czyta wszystko z wejścia aż do napotkania znaku EOF getcontents :: IO String Stosuje leniwe rodzaj wejścia-wyjścia, ponieważ czyta wskazaną rzecz dopiero kiedy jest ona potrzebna. Taki sposób jest pożyteczny kiedy wyjście z jednego programu jest wejściem naszego programu.
77 interact :: (String String) IO () interact bierze funkcję typu String String jako argument. Całe wejście jest przekazywane do funkcji jako jego argument i w rezultacie zmienna typu string jest na wyjściu. Może być używany w programach gdzie otrzymują constents, a następnie oddają wynik. Także gdzie użytkownik podaje na wejściu jedną linię i program musi podać wynik dla tej linii, a następnie ponownie użytkownik wspisuje pewne dane I ponownie czeka na wynik. Jednak dużo zależy co dokładnie chcemy otrzymać za program.
78 Operacje na plikach type FilePath = String Nazwy plików i katalogów są wartościami typu String, które są zależne od systemu operacyjnego. P liki mogą być otwarte ułatwiając pracę w treści pliku. readfile :: FilePath IO String Funkcja ta czyta plik I zwraca jego zawartość jako string. Stosuje leniwą operację, podobnie jak getcontents. writefile :: FilePath String IO () Funkcja zajmuje ścieżkę do pliku i zapisuje w niej zmienną typu String kiedy inna funkcja zwróci wyjście do zapisania. Jeśli plik już istnieje to zostanie on wyczyszczony przed zapisaniem.
79 Warto także wspomnieć data Handle Haskell definiuje operacje dla odczytu i zapisu znaków do pliku, reprezentowane są przez wartości typu Handle. Każda wartośc tego typu jest uchwytem. Właściwości Handle: zarządzanie wejściem, wyjściem lub oboma może być otwarty, zamknięty lub częściowo zamknięty obiekt jest mozliwy do przeszukania buforowanie jest wyłączone lub włączone stdin :: Handle zarządza wejściem stdout :: Handle zarządza wyjściem stderr :: Handle zarządza wyjściem kiedy w programie jest błąd
80 withfile :: FilePath IOMode (Handle IO r) IO r Otwiera plik używając OpenFile i przekazuje uzyskany uchwyt do obliczeń. Uchwyt będzie wtedy zamknięty. openfile :: FilePath IOMode IO Handle Alokuje i zwraca nowy, otwart uchwyt do zarządzania plikiem. Zarządza on wejściem jeśli tryb jest ReadMode, a wyjście ma tryb WriteMode lub ReadMode i oba jeśli wejście I wyjście ma tryb ReadWriteMode. Jeśli plik nie istnieje lub jest otwarty dla wyjścia, to należy go stworzyć jako nowy plik. Jeśli jest tryb WriteMode I plik już istnieje, to wtedy zostanie wyczyszczony. Niektóre systemy w momencie kiedy plik zostanie wyczyszczony to go usuwają, więc nie ma gwaracji, że plik po użyciu OpenFile w trybie zapisu wciąż będzie istniał.
81 appendfile :: FilePath String IO () Różnica pomiędzy poprzednią funkcją jest taka, że appendfile nie czyści pliku ale jeśli już istnieje to tylko dołącza do niego następne rzeczy. System.Directory Teraz ta zabawna część z katalogami createdirectory :: FilePath IO () Tworzy nowy katalog, który początkowo nie istnieje. Ma parę ładnych errorów przez które może nie wyjść, np. ispermissionerror/ PermissionDenied proces miał niewystarczające uprawnienia do operacji. Katalog może już istnieć, może wystąpić fizyczny błąd systemu, nazwa katalogu nie może zostać przyjęta, nie istnieje ścieżka do tego katalogu lub brak miejsca w pamięci.
82 createdirectoryifmissing :: Bool jeśli chcemy stworzyć rodziców katalogu FilePath dodać ścieżkę do katalogu IO () jeśli pierwszy argument ma wartość True to funkcja stworzy rodziców katalogu jeśli ich nie ma/ nie można ich odnaleźć removedirectory :: FilePath IO () Usuwa istniejące już katalogi. Również jest podatny na errory. Występił fizyczny błąd, nie istnieje już katalog z taką nazwą, proces nie miał wystarczający uprawnień do usunięcia katalogu, nie można usunąć katalogu w tym momencie, nie istnieje do niego ścieżka.
83 renamedirectory :: FilePath FilePath IO () Zmienia nazwę katalogu. Najpierw trzeba podać ścieżkę ze starą nazwą a później z nową. Nie można zmienić nazwy, jeśli proponowana nowa nazwa już aktualnie istnieje. getcurrentdirectory :: IO FilePath Zwraca ścieżkę do katalogu, w którym się znajdujemy. Operacje na plikach removefile :: FilePath IO () Usuwa plik, ale tylko jeśli nie jest otwarty w programie.
84 renamefile :: FilePath FilePath IO () Zmienia nazwę pliku, który już istnieje w taki sposób, że zastępuje stary plik nowym plikiem z nową nazwą. Możemy również sprawdzić czy plik lub katalog istnieje doesfileexist :: FilePath IO Bool doesdirectoryexist :: FilePath IO Bool zwraca nam to wartość True albo False
85 Losowe dane Często w programach są nam potrzebne losowe dane, np. do zwykłych testów. Najprostszym przykładem losowości jest to polecenie randomnumber :: (Num a) => a wtedy określamy wartość randomnumber np. randomnumber = 13 wtedy zawsze zostanie nam szczęśliwa trzynastka, ale to kiepska losowość. Jeśli to można tak nazwać. W Haskellu możemy dostać losową liczbę dopiero gdy wykonujemy funckję, która przyjmuje jako parametr jej losowość i w oparciu o parametr zwraca pewną liczbę lub inny typ danych jaki określimy.
86 System.Random Ta biblioteka ma za zadanie rozwiązać nasz problem z pseudolosowym generowaniem liczb. Umożliwia ona generowanie powtarzalnych wyników w oparciu o pewien zalążek wokół którego ma generować te liczby. class RandomGen g where Klasa ta zapewnia wspólny interfejs dla generatorów liczb losowych. Metody tej klasy: next :: g -< (Int,g) Zwraca zmienne typu Int, które są równomiernie rozłożone w zakresie zwróconym przez genrange oraz nowy generator.
87 getrange :: g (Int, Int) Daje zakres wartości zwracanych przez generator. Wymagane jest, aby jeśli (a,b) = genrange g, wtedy a<b genrange zawsze zwraca parę określonych zmiennych typu Int Drugi warunek zapewnia, że genrange nie może badać swojego parametru, a tym samym zwracana wartość jest określona tylko przez RandomGen. To z kolei pozwala na wdrożenie do pojedynczego połączenia genrange ustalenie zakresu danego generatora bez obawy że następny generator będzie miał inny zakres.
88 split :: g (g,g) Operacja umożliwia uzyskanie dwóch różnych generatorów liczb losowych. Jest to bardzo przydatne w programach funkcjonalnych (np. gdy przechodzimy z generatora liczb losowych do rekurencyjnych wywołań), ale i tak mało kto używa split, bo w większości jest niepotrzebny. Biedny split :(
89 Standardowe generatory liczb pseudolosowych data StdGen różni się od RandomGen, że genrange ma co najmniej 30 bitów. Jego właściwości: gwarantuje sukces na dowolnym Stringu gwarantuje zużyć tylko skończoną część Stringu różnie zmienne typu String mogą skutkować różnymi wynikami. mkstdgen :: Int StdGen Zapewnia alternatywny sposób produkcji początkowego generatora poprzez mapowanie na Int w generatorze. Różne argumenty powinny produkować różne generatory.
90 Losowe wartości różnych typów class Random a where Metody tej klasy randomr :: RandomGen g => (a,a) g (a,g) Przyjmuje zasięg (lo,hi) i generator liczb losowych. Zwraca losową wartość równomiernie rozłożoną w zamkniętym przedziale [lo,hi] wraz z nowym generatorem. Nie określa to co zajdzie wtedy gdy lo będzie większe od hi (lo>hi). Dla stałych typów nie ma wymogu, że wartości lo i hi będą wyprodukowane, ale mogą być, wszystko zależy od implementacji I przedziału.
91 random :: RandomGen g => g (a,g) Tak samo jak w przypadku randomr, ale używamy domyślnego zakresu dla danego typu. Dla ograniczonych typów (np. Char) zakres jest wykle całym typem. Dla typów ułamkowych zakres jest zwykle częściowo zamknięty w przedziale [0,1). Dla Integer zakresem jest (arbitalnie) zakres Int.
92 randomrs :: RandomGen g => (a, a) -> g -> [a] Wariant randomr tworzący nieskończoną listę wartości losowych zamiast zwrócić nowy generator. randoms :: RandomGen g => g -> [a] Wariant random tworzący nieskończoną listę wartości losowych zamiast zwrócić nowy generator. randomrio :: (a, a) -> IO a Wariant randomr, który korzysta z globalnego generatora liczb losowych. randomio :: IO a Wariant random, który korzysta z globalnego generatora liczb losowych.
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ółowoZatem w jaki sposób nasze programy mają komunikować się ze światem zewnętrznym?
Wprowadzenie Haskell jest językiem czysto funkcyjnym. W uproszczeniu oznacza to, że w przeciwieństwie do języków imperatywnych (w których podajemy komputerowi ciąg kroków do wykonania) definiujemy co,
Bardziej szczegółowoTWORZENIE SWOICH TYPÓW I TYPÓW KLAS HASKELL (RODZIAŁ 8) ZAJĘCIA 4
TWORZENIE SWOICH TYPÓW I TYPÓW KLAS HASKELL (RODZIAŁ 8) ZAJĘCIA 4 Wprowadzenie do typów algebraicznych WPROWADZENIE DO TYPÓW ALGEBRAICZNYCH Słowo data oznacza zdefiniowanie nowego typu danych Typ Bool
Bardziej szczegółowoznajdował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ółowo4. 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ółowoPo 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ółowoPodstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
Bardziej szczegółowoInformatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Bardziej szczegółowoWstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 12 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Obsługa łańcuchów znakowych getchar(), putchar()
Bardziej szczegółowoPodstawy 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ółowoHaskell 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ółowoProgramowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,
Bardziej szczegółowoWstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
Bardziej szczegółowo- 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ółowoOk. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:
Kurs C++ częśd II Podstawowa obsługa konsoli + zmienne. Autor: Dawid Chróścielski. Wprowadzanie i wyprowadzanie danych z/do konsoli. Jak wyprowadzad dane dowiedzieliśmy się już wcześniej (metoda cout z
Bardziej szczegółowoWskaź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ółowoTypy, 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ółowoObiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Bardziej szczegółowoPodstawy 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ółowo7. Pętle for. Przykłady
. Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i
Bardziej szczegółowo1 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ółowoNazwa 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ółowoNiezwykł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ółowoPodstawy algorytmiki i programowania - wykład 4 C-struktury
1 Podstawy algorytmiki i programowania - wykład 4 C-struktury 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ółowoPodstawy 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ółowoPodstawy i języki programowania
Podstawy i języki programowania Laboratorium 8 - wprowadzenie do obsługi plików tekstowych i wyjątków mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 11 grudnia 2017 1 / 34 mgr inż. Krzysztof
Bardziej szczegółowoCzęść XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.
Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja
Bardziej szczegółowoProgramowanie w języku Python. Grażyna Koba
Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i
Bardziej szczegółowoJAVA W SUPER EXPRESOWEJ PIGUŁCE
JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie
Bardziej szczegółowoPodstawy Pythona. Krzysztof Gdawiec. Instytut Informatyki Uniwersytet Śląski
Podstawy Pythona Krzysztof Gdawiec Instytut Informatyki Uniwersytet Śląski Słownik jest typem mutowalnym. Każdy element to para: klucz wartość. W celu stworzenia słownika pary klucz wartość umieszczamy
Bardziej szczegółowoProgramowanie 3 - Funkcje, pliki i klasy
Instytut Informatyki Uniwersytetu Śląskiego Laborki funkcja; parametry funkcji; typ zwracany; typ void; funkcje bez parametrów; napis.length() - jako przykład funkcji. Zadania funkcja dodająca dwie liczby;
Bardziej szczegółowoJę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ółowoPodstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.
M. Trzebiński C++ 1/14 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IVedycja,2016r. IFJ PAN Przygotowanie środowiska pracy Niniejsza
Bardziej szczegółowoPython 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ółowoProgramowanie strukturalne. Opis ogólny programu w Turbo Pascalu
Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji
Bardziej szczegółowoutworz 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ółowoPodstawy Programowania Podstawowa składnia języka C++
Podstawy Programowania Podstawowa składnia języka C++ Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Szablon programu w C++ Najprostszy program w C++ ma postać: #include #include
Bardziej szczegółowoZajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej
Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()
Bardziej szczegółowoWykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Bardziej szczegółowoPROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec
PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty
Bardziej szczegółowoPrzykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1
Rachunek Prawdopodobieństwa i Statystyka lab 3. Kaja Gutowska (Kaja.Gutowska@cs.put.poznan.pl) 1. Funkcje: - Funkcje nie powinny korzystać ze zmiennych globalnych. - Funkcje powinny być możliwie krótkie.
Bardziej szczegółowoLiczby losowe i pętla while w języku Python
Liczby losowe i pętla while w języku Python Mateusz Miotk 17 stycznia 2017 Instytut Informatyki UG 1 Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak
Bardziej szczegółowoINFORMATYKA Studia Niestacjonarne Elektrotechnika
INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl
Bardziej szczegółowoArgumenty wywołania programu, operacje na plikach
Temat zajęć: Argumenty wywołania programu, operacje na plikach Autor: mgr inż. Sławomir Samolej Zagadnienie 1. (Zmienne statyczne) W języku C można decydować o sposobie przechowywania zmiennych. Decydują
Bardziej szczegółowoElementy 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ółowoKLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany
KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie
Bardziej szczegółowo1 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ółowoCzęść 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
Bardziej szczegółowoPodstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.
Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using
Bardziej szczegółowoSzablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
Bardziej szczegółowoProgramowanie - wykład 4
Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include
Bardziej szczegółowolekcja 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ółowoDefinicje 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ółowoInformatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki
Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu
Bardziej szczegółowoProgramowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Bardziej szczegółowoUwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)
Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie
Bardziej szczegółowoJĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Bardziej szczegółowoInformatyka 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ółowoC++ 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ółowoDekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).
Dekoratory są w miarę ezoteryczną cechą Pythona w przeciwieństwie do funkcji, klas czy iteratorów nie są powszechną cechą języków programowania. Niemniej, warto je omówić mimo wszystko, gdyż są niezwykle
Bardziej szczegółowoWykresy 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ółowoSwift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)
Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.) przeznaczony do programowania zarówno pod ios jak i Mac OS X bazuje na logice Objective-C bez kompatybilności
Bardziej szczegółowoWyraż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ółowoWstęp do programowania
wykład 8 Agata Półrola Wydział Matematyki i Informatyki UŁ semestr zimowy 2018/2019 Podprogramy Czasami wygodnie jest wyodrębnić jakiś fragment programu jako pewną odrębną całość umożliwiają to podprogramy.
Bardziej szczegółowoRozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Bardziej szczegółowoWykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Bardziej szczegółowo3. 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ółowoKLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany
KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie
Bardziej szczegółowoObiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody
Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,
Bardziej szczegółowoWidoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?
Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz
Bardziej szczegółowoProgramowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki
Wykład 2 - podstawy języka C++ Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu. Zmienne i ich nazwy, podstawowe typy: całkowite, rzeczywiste, znakowe i napisowe. Instrukcje:
Bardziej szczegółowoIMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
Bardziej szczegółowoKompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main
Język obiektowy Wykład 13 Programowanie obiektowe z lotu ptaka, str 1 James Gosling, Mike Sheridan, Patrick Naughton Sun Microsystems 1995(20latmłodszyodC) C jest językiem proceduralnym Java jest językiem
Bardziej szczegółowo8. 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ółowoCzym są właściwości. Poprawne projektowanie klas
Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane
Bardziej szczegółowoPrzypomnienie o klasach i obiektach
Wykład 14 Programowanie obiektowe ciąg dalszy, str 1 Przypomnienie o klasach i obiektach -5 należydo int 314 należy do double false należy do boolean {27, 314,-15 należy do double[] wartość należy do typ
Bardziej szczegółowoStał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ółowoPHP 5 język obiektowy
PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje
Bardziej szczegółowoProgramowanie strukturalne i obiektowe. Funkcje
Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy
Bardziej szczegółowoAplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium
Bardziej szczegółowoLaboratorium 1 - Programowanie proceduralne i obiektowe
Laboratorium 1 - Programowanie proceduralne i obiektowe mgr inż. Kajetan Kurus 4 marca 2014 1 Podstawy teoretyczne 1. Programowanie proceduralne (powtórzenie z poprzedniego semestru) (a) Czym się charakteryzuje?
Bardziej szczegółowoPROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Bardziej szczegółowoJę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ółowoParadygmaty programowania
Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów
Bardziej szczegółowoĆwiczenie: JavaScript Cookies (3x45 minut)
Ćwiczenie: JavaScript Cookies (3x45 minut) Cookies niewielkie porcje danych tekstowych, które mogą być przesyłane między serwerem a przeglądarką. Przeglądarka przechowuje te dane przez określony czas.
Bardziej szczegółowoC++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Bardziej szczegółowoZmienne i struktury dynamiczne
Zmienne i struktury dynamiczne Zmienne dynamiczne są to zmienne, które tworzymy w trakcie działania programu za pomocą operatora new. Usuwa się je operatorem delete. Czas ich występowania w programie jest
Bardziej szczegółowoROZDZIAŁ 8: KLASY TYPÓW
ROZDZIAŁ 8: KLASY TYPÓW Definicja typu Bool: data Bool = False True Słowo kluczowe data oznacza, że definiujemy nowy typ danych. Część przed = określa typ jakim jest bool. Cześć po.. = są to konstruktory
Bardziej szczegółowoProgramowanie Komputerów
Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 17 1. Typy i zmienne Jak wiemy, komputer
Bardziej szczegółowoJak napisać program obliczający pola powierzchni różnych figur płaskich?
Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy
Bardziej szczegółowoKonstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
Bardziej szczegółowoPodstawy programowania funkcjonalnego
Podstawy programowania funkcjonalnego haskell.mariuszrozycki.pl Mariusz Różycki Churchill College, University of Cambridge rev. 2014.03.27.1 Wprowadzenie Materiały haskell.mariuszrozycki.pl Slajdy (w tym
Bardziej szczegółowoWSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy
WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy Pojęcie klasy Program napisany w języku Java składa się ze zbioru klas. Każda klasa zawiera
Bardziej szczegółowoJęzyk C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
Bardziej szczegółowo1 Powtórzenie wiadomości
1 Powtórzenie wiadomości Zadanie 1 Napisać program, który w trybie dialogu z użytkownikiem przyjmie liczbę całkowitą, a następnie wyświetli informację czy jest to liczba parzysta czy nieparzysta oraz czy
Bardziej szczegółowoJęzyk JAVA podstawy. wykład 1, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 1, część 3 1 Język JAVA podstawy Plan wykładu: 1. Krótka historia Javy 2. Jak przygotować sobie środowisko programistyczne 3. Opis środowiska JDK 4. Tworzenie programu krok po
Bardziej szczegółowoPodstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++
Podstawy Informatyki Inżynieria Ciepła, I rok Wykład 10 Kurs C++ Historia Lata 70-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard
Bardziej szczegółowoPodstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie Krzysztof Banaś Podstawy programowania 1 są sposobem na przechowywanie w ramach pojedynczej zmiennej zestawu zmiennych różnych typów,
Bardziej szczegółowoSystemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017
Systemy operacyjne Laboratorium 9 Perl wyrażenia regularne Jarosław Rudy Politechnika Wrocławska 28 lutego 2017 Temat obejmuje wykorzystanie wyrażeń regularnych w perlu. Wyrażenia same w sobie są w zasadzie
Bardziej szczegółowoPodstawy 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