typy, operacje, sterowanie

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Mgr inż.Marcin Borkowski Podstawy Java Część II
Mgr inż.Marcin Borkowski Podstawy Java Krótkie wprowadzenie dla studentów Wyższej Szkoły Ekologii i Zarządzania
Wzorce.
Wprowadzenie do języka skryptowego PHP – cz. 2
Języki programowania C++
Tworzenie i obsługa programów – przykład 3 uwagi cd. Wykorzystując różne klasy biblioteki języka Java należy pamiętać w jakim pakiecie się znajdują. Wszystkie.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Inżynieria oprogramowania Lecture XXX JavaTM – część IV: IO
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Wykład 2 struktura programu elementy języka typy zmienne
Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
AWK Zastosowania Informatyki Wykład 1 Copyright, 2003 © Adam Czajka.
Podstawy C# Grupa .NET PO.
Podstawy programowania
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
A ctive S erver P ages Technologia dostępu do danych.
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
Programowanie Windows na przykładzie C# część 1
Warsztaty programowania w języku Python
Programowanie obiektowe – zastosowanie języka Java SE
JAVA.
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Programowanie obiektowe III rok EiT
STEROWANIE Ale nie tylko
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Systemy wejścia i wyjścia Michał Wrona. Co to jest system wejścia i wyjścia? Pobierania informacji ze źródeł danych, zdolnych przesyłać sekwencje bajtów,
Podstawy informatyki 2013/2014
  ELEMENTY JĘZYKA JAVA komentarze w Javie, słowa kluczowe i operatory, proste typy danych, tablice, podstawowy zestaw instrukcji.
Kurs języka C++ – wykład 9 ( )
Projektowanie stron WWW
Podstawy języka Instrukcje - wprowadzenie
Zmienne i typy danych w C#
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Podsumowanie wiedzy MPDI2 sem.3 INFORMATYKA. tworzenie nowego pliku i katalogu, nawigacja po katalogach, listowanie zawartości katalogu, zmiana nazw,
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
Kolekcje (3) Zbiory. Porównywanie i porządkowanie elementów kolekcji. (c) Krzysztof Barteczko 2014.
Kolekcje (4) Mapy Widoki i algorytmy (c) Krzysztof Barteczko 2014.
© Krzysztof Barteczko, PJWSTK 2012
do programowania obiektowego w języku Groovy
Visual Basic przygotował Michał Miłek Visual Basic – język programowania wysokiego poziomu i narzędzie programistyczne firmy Microsoft. Składnia jest oparta.
Dominik Benduski Michał Mandecki Podstawy Visual Basic w Excelu.
1 Kolekcje i tablice © Krzysztof Barteczko, PJWSTK 2009.
P ASCAL Definicje, deklaracje, podstawowe instrukcje 1.
W pełni obiektowyInterpretowany i kompilowany Kompilowany do JVM Bytecode Umożliwia korzystanie z bibliotek Java Skonstruowany z myślą o wysokiej produktywności.
Podstawowe konstrukcje języka Java Bartosz Walter InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Czym jest PHP? ● Językiem programowania przeznaczonym do tworzenia i generowania dynamicznych stron WWW. Działa po stronie serwera: Klient Żądanie strony.
Lua - wprowadzenie ● lua.org – źródła, dokumentacja, podręcznik itp ● Interpreter - Lua.org->Downloads->Binaries->get a binary-> Windows->Wersja >Executables->
Programowanie Obiektowe – Wykład 6
Typy wyliczeniowe, kolekcje
(według:
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
(c) Krzysztof Barteczko 2014
Visual Basic w programie Microsoft Excel
Programowanie obiektowe – zastosowanie języka Java SE
Dane, zmienne, instrukcje
Założenia projektowe Javy
Haskell Składnia funkcji.
Zapis prezentacji:

typy, operacje, sterowanie Podstawy Groovy: typy, operacje, sterowanie © Krzysztof Barteczko, PJWSTK 2012-2015 1

Skrypty Cytaty: The Quiet Revolution:Open Source Scripting Co to są skrypty i języki skryptowe ? Zastosowania: - programy uniwersalne - makra w systemach (aplikacjach) - integracja Integracja: - skrypty działające w ramach systemu - skrypty - łaczniki między różnymi aplikacjami - skrypty w Internecie i mashupy No hard-and-fast definition of what a scripting language is exists, but generally scripting languages are interpreted languages that feature higher productivity than more traditional systems languages. Perl, Python, REXX, Ruby, PHP, ... VBScript, WinScripting, AppleScripting Scripting languages are glue languages. They stitch together existing software, such as objects, components, widgets, operating system commands, programs, functions, and other forms of existing code. Scripting languages are higher-level than traditional programming languages because they more easily leverage existing software. Cytaty: The Quiet Revolution:Open Source Scripting by Howard Fosdick 2009 2

Groovy * is an agile and dynamic language for the Java Virtual Machine * builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk * supports Domain-Specific Languages and other compact syntax so your code becomes easy to read and maintain * makes writing shell and build scripts easy with its powerful processing primitives, OO abilities and an Ant DSL * increases developer productivity by reducing scaffolding code when developing web, GUI, database or console applications * seamlessly integrates with all existing Java objects and libraries * compiles straight to Java bytecode so you can use it anywhere you can use Java Cytat ze strony Groovy 3

Groovy Groovy = Java – "boiler plate code" + dynamiczne typowanie + dynamiczne wykonanie kodu (skryptowanie) + znacznie poszerzona funkcjonalność bibliotek + rozbudowane oraz modyfikowalne instrukcje sterujące + przeciążanie operatorów + przyjemna składnia dla kolekcji + domknięcia i elementy programowania funkcyjnego + latwe w użyciu parsery (XML/HTML, JSON) + rozbudowane rodzaje napisów i "templates" + wbudowane w składnię przetwarzanie wyr. regularnych + buildery (Swing, Ant, Html, Xml, JSON, Graphics ...) + metaprogramowanie fazy kompilacji i wykonania + doskonałe wsparcie do tworzenia DSL 4

Skrypty w języku Groovy kod w jednym pliku źródłowym (lub jako napis w programie), nie ma potrzeby definiowania klas ani metod (ale można), nie ma potrzeby deklarowania zmiennych (ale można). Można łatwo pisać proste programy. Groovy: name = 'World' println "Hello $name" Java: public class Greeting { public static void main(String ... args) { String name = "World"; System.out.println("Hello " + name); } Średnik: w Groovy można pomijać, gdy w jednym wierszu jedna instrukcja. Nawiasy w wywołaniu metody/ funkcji: można pomijać, gdy są argumenty wywołania. 5

Porównanie: Java a Groovy import java.util.*; public class PostfixFilter { public static List<String> getIdsFromListWithPostfix(List<String> list, String postfix) { List<String> result = new ArrayList<>(); for (String name : list) { if (name.endsWith(postfix)) result.add(name); } return result; public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("AWA Warszawa"); names.add("AKR Kraków"); names.add("AWR Wroclaw"); names.add("\"xxx\" Warszawa"); String loc = "Warszawa"; List<String> waw = getIdsFromListWithPostfix(names, loc); System.out.println("Znalezione dla " + loc + ": " + waw.size()); for (String name : waw) { String[] words = name.split(" +"); System.out.println(words[0]); names = [ 'AWA Warszawa', 'AKR Kraków','AWR Wroclaw', '"xxx" Warszawa'] loc = 'Warszawa' waw = names.findAll { it.endsWith loc } println "Znalezione dla $loc: " + waw.size() waw.each { println it.tokenize()[0] } 6

Przykład praktyczny: kursy euro import groovy.swing.SwingBuilder def url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml' def rates = new XmlParser().parse(url) def map = [:] rates.Cube.Cube.Cube.each { map[it.@currency] = it.@rate } new SwingBuilder().edt { frame(title: 'Euro rates', pack: true, visible: true) { panel() { comboBox(id: 'cb', border: titledBorder('Select currency'), prototypeDisplayValue: 'xxxxxxxxxxxxx', items: map.keySet().toList(), actionPerformed: { def cur = it.source.selectedItem lab.text = map[cur] }) label(id: 'lab', preferredSize: cb.preferredSize, border: titledBorder('Rate'))

Instalacja 1. JDK z java.sun.com - program instalacyjny prowadzi za rękę 2. Dokumentacja z java.sun.com - unzip 3. Groovy z groovy.codehaus.org - unzip 4. (opcjonalnie) Wybrane IDE 5. Ustawić zmienne środowiskowe PATH, JAVA_HOME i GROOVY_HOME 6. Test: Zapisać program w pliku Start.groovy: println "I'm Groovy!" Z wiersza poleceń: groovy Start.groovy Na konsoli uzyskamy napis: I’m Groovy! 8 8

Praca z Eclipse Eclipse pobrać można ze strony eclipse.org. Pobrane archiwum wystarczy rozpakować na dysku. Należy też doinstalować plug-in dla języka Groovy (“Software updates”). Na starcie Eclipse wybieramy Workspace - czyli obszar roboczy. Jest to wybrany przez nas katalog, w którym będą nasze programy. Workspace zawiera projekty. Programy umieszczane są w projektach. Zatem sekwencja działań jest następująca: * uruchomić Eclipse, * wybrać Workspace, * utworzyć nowy projekt (”Groovy project"), * w danym projekcie utworzyć program (”Groovy class"). 9

Znaki - kodowanie Unicode Literały Literały liczbowe: 1 10 2.1 1000.33 Literały napisowe: 'Hello Groovy' '1‘ /I'm slashy string\x/ "I'm Gstring $v" '''Multiline string''' """Multiline GString $x = $y""" Znaki - kodowanie Unicode W Groovy literały są obiektami odpowiednich klas, np. 1 - typ (klasa) Integer 1.1 - typ BigDecimal 'x' - typ String '1' - typ String 'ala ma kota' - typ String "ala ma kota" - typ GString Literały boolowskie - słowa kluczowe: true false Integer - całkowite od -2147483648 do 2147483647 BigDecimal - dowolnie duże liczby z dowolną precyzją 10

print - bez przejścia do nowej linii, Literały - znaki specjalne print '\u03b1\u03b2\u03b3 ' print '\\' print '\'' print " alfa beta gamma '" println '\nalfa\nbeta\ngamma' println "c:\\util\\bak" println /c:\util\bak/ Uwaga na: znaki specjalne, slashy string, różnice w działaniu print - bez przejścia do nowej linii, println - z przejściem αβγ \' alfa beta gamma ' alfa beta gamma c:\util\bak By uzyskać na konsoli Eclipse znaki UTF: "Run Config-Common-Console Encoding" UTF-8 MODTFIKATORY float f = 1f, long l = 1L, double d = 1d, BigDecimal = 1g 11

Zmienne i dynamiczne typowanie W skryptach można nie deklarować zmiennych: x = 10 Deklaracja zmiennej: def lub użycie konkretnego typu. Zmienne nie zadeklarowane lub zadeklarowane z def są dynamicznie typowane: def x = 10 // typ: Integer x = 'Ala' // a teraz zmienił się na String Użycie konkretnego typu w deklaracji zmiennej wymusza zgodność typów (typ zmiennej nie może być zmieniony). Integer v = 1 v = 'Groovy' Zamiast nazwy typu - słowo def (deklaracja zmiennej dowolnego typu): def v = 1 v = 'Groovy' Redeklaracje niedozwolone: def v ... String s Integer s Ok Błędy Błąd 12

Zmienne zawierają referencje do obiektów! W Groovy wszystko jest obiektem . Gdy używamy liczb, napisów, znaków, wartości boolowskich odpowienie obiekty tworzone są automatycznie. W każdym innym przypadku musimy sami tworzyć obiekty za pomocą wyrażenia new, np. d = new Date() scanner = new Scanner(text) file = new File('c:/temp/text.txt') Argumenty wywołania konstruktorów Zmienne zawierają referencje do obiektów! 13

Hierarchie typów Typy są wyznaczane przez klasy i przez interfejsy. Klasy mogą dziedziczyć inne klasy i implementować interfejsy. Object Number extends Object Integer extends Number Literał 1 jest typu Integer i Number i Object AbstractMap extends Object implements Map HashMap extends AbstractMap Obiekt hash-mapa jest typu Object, Map, AbstractMap, HashMap 14

Typy proste W Javie oprócz typów obiektowych występują typy proste. W języku Groovy można używać typów prostych, ale dane tych typów są i tak przekształcane na obiekty odpowiadających im klas. byte b = 1 long l = 1111111 char c = 'x' int i = 111 [ b, l, c, i ].each { println it.class.name } Wynik: java.lang.Byte java.lang.Long java.lang.Character java.lang.Integer Autoboxing! 15

Operatory Operatory arytmetyczne: * mnożenie / dzielenie + dodawanie - odejmowanie ** potęgowanie (G) % reszta z dzielenia ++ zwiększanie -- zmniejszanie Operatory relacyjne: < mniejsze <= mniejsze lub równe >= większe lub równe > większe == czy równe != czy nie równe Przypisania: = (i pochodne) Operatory logiczne: ! negacja || alternatywa && koniunkcja I wiele innych …. Operator instanceof: stwierdzenie typu: x instanceof A czy x jest typu A lub dowolnego jego podtypu Groovy pozwala na definiowanie operatorów w klasach i w wielu jego standardowych klasach jest to zrobione. 16

Operacje na liczbach - cechy szczególne Przy dzieleniu dwóch liczb całkowitych następuje promocja do BigDecimal i wynik jest zgodny z "arytmetyką". Java: 1/3 == 0 Groovy: 1/3 = 0.33333333 Literały rzeczywiste są typu BigDecimal, wobec tego operacje są dokładne. Java: 3 * 0.2 != 0.6 Groovy: 3 * 0.2 = 6 Ciekawe - ULP (Unit of Least Precision, Unit in the Last Place) Potęgowanie: Java: konieczne użycie funkcji z klasy Math Groovy: operator ** 17

Złożone operatory przypisania Złożone operatory przypisania mają postać: op= gdzie op - to jeden z operatorów * / % + – << >> >>> & ^ | Złożone operatory przypisania, stosowane w następujący sposób: x op= wyrażenie są wygodną formą skrócenia zapisu: x = x op ( wyrażenie ) gdzie: x - dowolna zmienna wyrażenie - dowolne wyrażenie op - symbol operatora Na przykład, zamiast: numOfChildren = numOfChildren + 2 możemy napisać: numOfChildren += 2 18

Zwiększanie i zmniejszanie Przyrostkowa forma operatorów (znak operatora po argumencie) modyfikuje wartość argumentu po jej wykorzystaniu w wyrażeniu. Przedrostkowa (znak operatora przed argumentem) - przed wykorzystaniem tej wartości. Np. def n, i = 1 n = i++ // przyrostkowa forma operatora ++ zmienna i zostanie zwiększona o 1, ale zmiennej n zostanie nadana wartość zmiennej i sprzed zwiększenia, czyli po wykonaniu instrukcji: n będzie równe 1 , a i będzie równe 2. def n, i = 1; n = ++i; // przedrostkowa forma operatora ++ zmienna i zostanie zwięksozna o 1 i ta nowa jej wartosć zostanie przypsiana zmiennej n, czyli po wykonaniu instrukcji: n = 2 , i = 2. o jeden wartość argumentu (zmiennej) 19

Rodzaje napisów w Groovy 'aa' "bb" 'aaaaa "oo" bb' "bbbbb 'cd' ef" "v = $v" "Today = ${new Date()}" "x[1] = ${x[1]}" '''first line second''' """multi line ev. Gstring""" /In slashy Strings you can use \ without escaping/ Gdy "..." i $ - GString z substytucją zmiennych i wyrażeń Napisy wielowierszowe 'Slashy' Strings

Rodzaje napisów w Groovy (2) Multiline slashy strings: def poem = / to be or not to be / Dollar slashy strings = slashy + GString: „multi-line GString similar to the slashy string, but with slightly different escaping rules. You are no longer required to escape slash (with a preceding backslash) but you can use '$$' to escape a '$' or '$/' to escape a slash if needed”. def town = "Warsaw" def dollarSlashy = $/ In $town, today is ${new Date() } normal $ dollar-sign $$town dollar-sign escaped \ backslash / slash $/$$ slash and dollar /$ println dollarSlashy In Warsaw, today is Tue Mar 13 05:05:05 CET 2012 normal $ dollar-sign $town dollar-sign escaped \ backslash / slash /$ slash and dollar

Łączenie napisów Do łączenia napisów służy operator + txt1 = 'Groovy' txt2 = 'an agile language' res = txt1 + ' is ' + txt2 // Groovy is an agile language Można dołączać inne dane (będą przekształcone na napisy): res = txt1 + ' number ' + 1 // Groovy number 1 now = new Date() res = 'Now is: ' + now // Now is: Sun Aug 09 05:24:07 CEST 2009 Użycie cudzysłowu daje GString (substytucja wyrażeń poprzedzonych $): res = "$txt1 is $txt2" // Groovy is an agile language res = "Now is: ${new Date()}" // Now is: Sun Aug 09 05:24:07 CEST 2009 Uwaga: String na początku! Jeśli wyrażenie nie jest zmienną ujmujemy je w nawiasy klamrowe 22

Proste działania na napisach A. Metody klasy String B. Dodatkowo Groovy: def s = 'abcdefegh' println s.size() println s[0] println s[1] println s[-1] println s[0..2] println s[0..<2] println s.reverse() println s[-1..0] println s.padLeft(15, '+') println s.padRight(15, '+') println s.center(15, '*') println s*2 println s - 'e' println s - 'abc' 9 a b h abc ab hgefedcba ++++++abcdefegh abcdefegh++++++ ***abcdefegh*** abcdefeghabcdefegh abcdfegh defegh Proste działania na napisach A. Metody klasy String B. Dodatkowo Groovy: def s = 'abcdefegh' println s.size() println s[0] println s[1] println s[-1] println s[0..2] println s[0..<2] println s.reverse() println s[-1..0] println s.padLeft(15, '+') println s.padRight(15, '+') println s.center(15, '*') println s*2 println s - 'e' println s - 'abc' 9 a b h abc ab hgefedcba ++++++abcdefegh abcdefegh++++++ ***abcdefegh*** abcdefeghabcdefegh abcdfegh defegh Dostęp do znaków Podłańcuchy Specjalne operatory 23

Konwersje napisy - liczby Pojedyncze znaki mają swoje liczbowe kody i mogą być traktowane jak liczby: char a = 'A' int kod = a println "$a - code: $kod" char c = '1' println "$c - code: " + (int) c kod++ c = (char) kod println "$c - code: $kod" a += 1 println a Po to by z napisu (a nie typu char) uzyskać liczbę, potrzebne są dodatkowe środki: s = '65' int v v = s v = s.toInteger() + 1 // Ok, 66 s.toDouble() s.toBigDecimal() .... inne Błąd wykonania A - code: 65 1 - code: 49 B - code: 66 B Operator rzutowania 24

Błędy konwersji Gdy napis nie daje się potraktować jako liczba odpowiedniego typu występuje wyjątek NumberFormatException. Można go oczywiście obsłużyć (jak w Javie), ale w Groovy istnieje możliwość wcześniejszego sprawdzenia czy napis może być traktowany jako liczba odpowiedniego typu. def s1 = '10' def s2 = '1.1' println s1.isInteger() println s2.isDouble() println s2.isBigDecimal() println s1.isDouble() println s1.isBigDecimal() println s2.isInteger() println s1.isNumber() println s2.isNumber() Result: true false Metody sprawdzania typu 25

Listy - wprowadzenie Lista - zestaw elementów, które mają określone pozycje w zestawie i mogą się powtarzać. Utworzenie listy w programie: list1 = ['A', 'B', 'C'] list2 = [1, 2, 3, 4, 5] list3 = [1, 'A', 2, 'B', new Date()] elist = [] // pusta lista Dostęp do elementów (indeksowanie od 0): println list1[0] // A list3[1] = 2 // teraz [1,2,2,B ...] Liczba elementów na liście: list1.size() // == 3 Ost. element: list1[-1] // C Odwracanie: list1.reverse() lub list1[-1..0] Sublisty: list[1..2] // [ B, C ] list[-2..-1] // dwa ostatnie znaki Dodawanie elementów do listy: elist << 77 << 81 // teraz [77, 81] list1 += 'A' // teraz [A, B, C, A] Usuwanie elementów z listy: list1 -= 'A' // teraz [B, C] list2.remove(1) // teraz [1,3,4,5] Takie listy są typu: Collection, List i ArrayList. Usuwa dany element Usuwa element o podanym indeksie 26

Wieloprzypisania W jednej instrukcji przypisanie na wiele zmiennych (lista zmiennych) = dowolny obiekt z operatorem indeksowania (a, b) = [1, 2] (a, b) = [b,a] // swap (a, b) = 'ab' 27

Rozbiór tekstów def s1 = 'Groovy, Java - ok' Separatory = białe znaki def list = s1.tokenize() println list list = s1.tokenize(' ,-') Wynik: [Groovy,, Java, -, ok] [Groovy, Java, ok] Separatory = białe znaki ' \t\n\r\f' Separatory = podane 28

Łączenie elementów kolekcji w napisy String join(String separator) Concatenates the toString() representation of each item in this collection, with the given String as a separator between each item. String txt def list = [1,2,3,4] txt = list.join(' - ') println txt txt = ' a b c d' list = txt.tokenize() txt = list.join(' ') Result: 1 - 2 - 3 - 4 a b c d Ten sam efekt: txt = txt.tokenize().join(' ') 29

Interakcja z programem Wprowadzania danych: z konsoli za pomocą skanera (klasa Scanner) input = new Scanner(System.in).next...() z użyciem dialogu wejściowego input = JOptionPane.showInputDialog('Message') (wynikiem jest wprowadzony napis lub null, jeśli anulowano dialog) Pokazywanie wyników w okienku komunikatów JOptionPane.showMessageDialog(null, string) 30

Interakcja – przykład 1 import static javax.swing.JOptionPane.* (kwota, ods) = showInputDialog('Podaj kwote i oprocentowanie').tokenize() println "Kwota: $kwota" println "Oprocentowanie: $ods" kwota = kwota.toBigDecimal() ods = ods.toBigDecimal() println 'Po dodaniu odsetek kwota wynosi ' + (1+ods)*kwota 31

Interakcja - przykład 2 import static javax.swing.JOptionPane.* input = showInputDialog("Enter phrase") data = input.tokenize() println data println "Phrase contains ${data.size()} word(s)" println 'Enter line in console' input = new Scanner(System.in).nextLine() println input input = showInputDialog("Enter 2 integers") scan = new Scanner(input) sum = scan.nextInt() + scan.nextInt() showMessageDialog(null, "Sum: $sum") Rozbicie tekstu na słowa Skaner nałożony na String nextInt pobiera kolejny symbol i przekształca go w liczbę całkowitą [a, b, c] Phrase contains 3 word(s) Enter line in console Groovy lang Console 32

Mapy - wprowadzenie Mapa: zestaw par klucz-wartość Tworzenie w programie: map1 = [:] // pusta mapa map2 = [ Joan: '622-130-170', Steve: '677-190-278'] map3 = [:].withDefault { 10 } // z domyślnymi wartościami Dostęp: map2.Joan // 622-130-170 map2['Joan'] // 622-130-170 map2.Dave // null name = 'Steve' map2[name] // 677-190-278 map1['x'] = 7 map1.y = 23 map1.x + map1.y // 30 map3.x = 10 map3.x + map3.y // 30 Takie mapy są typu: Map i LinkedHasMap Zbior kluczy: map.keySet() Zbiór wartości: map.values() Kolekcja wejść: map.entries() 33

Interakcja - przykład 3 import static javax.swing.JOptionPane.* map2 = [ Joan: '622-130-170', Steve: '677-190-278'] name = showInputDialog("Enter name:") tel = map2[name] showMessageDialog(null, "$name - tel. $tel") 34

Możliwe własne konstrukcje! Sterowanie if (..) { } if (…) { } else { } while(…) { } do { } while for (init; cond; upd) { } for (typ x : obj) { } for (x in obj) operator in switch(…) … Operator warunkowy Elvis-operator try { } catch { } finally {} throw exc Możliwe własne konstrukcje! 35

Warunki W Groovy warunkiem może być wyrażenie dowolnego typu (nie void). W momencie testowania warunku w takich instrukcjach jak if i while wyrażenie jest przekształcane do wartości boolowskiej (true lub false) wg. następującego schematu: Uwaga: w Javie warunkiem może być tylko wyrażenie typu boolean. 36

Porównania Operatory służące do porównań: >, <, >=, <= wołana jest metoda a.compareTo(b) ==, != wołana jest metoda a.equals(b) def txt1 = 'Groovy', txt2 = 'Java' def x = 1, y = 10 def list = ['a', 'b', 'c'] def elist = ['a', 'b', 'c'] max = y if (x > y) max = x println max txt3 = 'G' txt3 += 'roovy' println txt2 > txt1 println txt1 == txt3 println list == elist Wyniki porównań zależą od definicji metod equals i compareTo w klasach obiektów. 10 // bo x.compareTo(y) zwraca false true // bo 'Java'.compareTo('Grovy') zwraca wartość > 0 true // bo zawartość obiektów wskazywanych przez txt1 i txt2 jest taka sama true // bo list i elist ma tę samą zawartość 37

Wyrażenia warunkowe Operator warunkowy ?: ma trzy argumenty - wyrażenia i stosowany jest do konstrukcji wyrażenia warunkowego w następujący sposób: e1 ? e2 : e3 // jeśli e1 daje true wynikiem jest e2, inaczej e3 Elvis-operator (skrót dla niektórych sytuacji) e1 ?: e2 // wynik: jeśli e1 daje true (np. !null) e1, inaczej e2 import static javax.swing.JOptionPane.*; name = showInputDialog('Enter name') userName = name ? name : 'Anonymous' // ternary println "User: $userName" name = showInputDialog('Enter name') ?: 'Anonymous' println "User: $name" 38

Zakresy Obiekty typu Range określają zakresy. Wprowadzamy je za pomocą operatorów .. lub ..< Przykłady: 1..10 // zestaw liczb od 1 do 10 1..<10 // zestaw liczb od 1 do 9 10..1 // zakres odwrócony (10, 9, 8, ... 1) 'a'..'c' // litery a, b, c d1 = new Date() d2 = d1 + 7 d1..d2 // daty od dziś do za tydzień

Operator in Wyrażenie: e in ob użyte jako warunek (nie w iteracyjnym for) ma wartość true jeśli w klasie obiektu ob zdefiniowana metoda isCase() zwraca true. def r1 = 1..10 def r2 = 'a'..'c' def d = new Date() def r3 = d..d + 7 def l = [1, 3, 7] def map = [ a: 1, b: 2] def s = 'xaz' println 3 in r1 println 11 in r1 println 'b' in r2 println 'z' in r2 println d + 3 in r3 println d + 10 in r3 println 3 in l println 'b' in map // isCase sprawdza zawartośc keySet println 'xaz' in s // isCase == equals // ale: println 'x' in s true false

Instrukcja switch switch(candidate) { case classifier1 : code [ break ] ... case classifierN : code; [ break] default : code } Przykład: switch(e) { case 1 : println "$e - one"; break case 'Groovy' : println "$e - lang"; break case 'a'..'z' : println "$e - in range"; break case [ 'ala', 'kot'] : println "$e - in list"; break case [ klucz1: 1, klucz2: 2] : println "$e - key in map"; break case BigDecimal : println "$e - BigDecimal"; break default: println "$e - Don't know it" Wynik: if (e== 1) 1 - one if (e == 'Groovy') Groovy - lang if (e == 'x') x - in range if ( e == 2.3) 2.3 – BigDecimal ala - in list klucz1 - key in map Do klasyfikatora której etykiety case pasuje kandydat? Tam przejdzie sterowanie. Jeśli nie ma break wykonywany jest kod następnej etykiety. Jeśli kandydat nigdzie nie pasuje - wykonywany jest kod etykiety default. switch (num) { case 1..3 : println 'Small' break case 4..7 : println 'Medium' case 8..11 : println 'Large' default: println 'Undefined' } Decyduje isCase(candidate) z klasy obiektu case.

for (var in iterable) ins for (Typ var : iterable) ins Instrukcja for-each Gotowe iterable: Kolekcje Mapy Zakresy Napisy Ma postać: for (var in iterable) ins gdzie: var - nazwa zmiennej iterable - obiekt iterowalny (np. zakres, lista, mapa, napis) ins - instrukcja Działanie: w każdym kroku pętli kolejny element obiektu iterowalnego (zestawu) jest podstawiany na zmienną var i wykonywana jest instrukcja ins (w której zazwyczaj sięgamy do zmiennej var) Zgodna z Javą postać tej instrukcji: for (Typ var : iterable) ins ma takie same działanie, ale wymaga podania typu zmiennej

For-each przykłady entry rng = 1..10 sum = 0 for (x in rng) sum += x println sum list = [ 'a', 'b', 'c' ] list1 = [] for (elt in list) list1 << elt + 'X' println list1 for (x in [a:1, b:2, c: 3]) { println x println "$x.key $x.value" } low = 'a' up = 'd' for (c in up..<low) print c napis = 'Warszawa' println() for (c in napis) print "-$c-" entry Z entry można pobrać klucz (.key) i wartość (.value) 55 [aX, bX, cX] a=1 a 1 b=2 b 2 c=3 c 3 dcb -W--a--r--s--z--a--w--a-