Slajdy k přednáškám předmětu
POČÍTAČE A PROGRAMOVÁNÍ 1 http://portal.zcu.cz
KIV/PPA1
Arnoštka Netrvalová © 2016
Slidy jsou určeny studentům předmětu Počítače a programování 1 vyučovaného Katedrou informatiky a výpočetní techniky Fakulty aplikovaných věd Západočeské univerzity v Plzni jako doplněk a podpora přednášek. Jakékoliv jiné využití těchto slidů podléhá souhlasu autorky. Základním studijním materiálem je záznam přednášek z předmětu Počítače a programování 1 - 2009 vytvořený Pavlem Heroutem, jemuž za možnost využití materiálu tímto děkuji.
A. Netrvalová
Obsah 1. přednášky: O předmětu Problém – algoritmus – program Java – editace, překlad, spuštění Proměnná – název, deklarace, typ Datové typy, typové konverze Operátory, výraz, příkaz, přiřazení Komentáře a dokumentace kódu Základní matematické funkce (Math) Generátor náhodných čísel (Random) Terminálový vstup (Scanner) Grafický nástroj DrawingTool
Tato tematika je zpracována v Záznamy přednášek: str. 4-16, 18-31, 38- 43
Strana 2 (celkem 37)
O předmětu (podrobně portal.zcu.cz – nutno přečíst) 1. Požadavky
Absolvování + zisk bodů domácí úlohy (DÚ) písemný test (T) samostatná práce (SP) písemná zkouška (P)
Něco se nepovedlo? stanoven min. a max. počet bodů z každé kategorie (DÚ, T, SP, on-line test ONL, P). možnost opravy bonusy (ACM úlohy, vybrané DÚ, SP rozšíření)
Výsledná známka (součet bodů za celý semestr) 2. Kritéria hodnocení Kategorie Max. Min.
DÚ T SP ONL P
18 25 7 10 40
9 7 5 0 16
Bonusy navíc
DÚ SP ACM
7 4 10 21
Známka Bodů
1 2 3 4 Min.
≥90 ≥70 ≥50 <50 37!!!
100 37 Strana 3 (celkem 37)
3. Etika, opisování a práce na zakázku Poradit není totéž, co opsat! DÚ, - kontrola shodnosti validovaných řešení SP, ACM - obhajoba T, P, ONL - kontrola identity, dozor Kontrola počtu získaných bodů: práce „pod dohledem“ vs. práce ostatní.
Definition of Academic Dishonesty Academic dishonesty is any action or attempted action that may result in creating an unfair academic advantage for yourself or an unfair academic advantage or disadvantage for any other member or members of the academic community. University of California, Berkeley
Více o etice: portal.zcu.cz – Studijní materiály
Strana 4 (celkem 37)
Problém – algoritmus – program 1. Problém Definice (Slovník spisovného jazyka českého) “Věc k řešení, nerozřešená sporná otázka, otázka k rozhodnutí, nesnadná věc”
Definice (informatika): Každý problém P je určen uspořádanou trojicí (vst; vyst; fce), kde: vst je množina přípustných vstupů vyst je množina očekávaných výstupů fce: vst→vyst přiřazuje přípust. vstupu očekávaný výstup Příklad problému ... nalezení cesty do hotelu, postup vaření těstovin, dostat se do autobusu č. 30, vypsání 5x Ahoj , ...
2. Algoritmus Nejstarší známý algoritmus - starověký Egypt - nalezen v roce 1858 na tzv. Rhindově papyru (asi z r. 1800 před n. l.): algoritmus násobení dvou přirozených čísel. Název algoritmus – odvozen ze jména - Abú Jafar Muhammad Ibu Músa Al Khwarizmí (Chwárizmí, Chovarizmí, Choresmí) významný perský matematik (cca 800 n.l.), autor díla Algoritmi de numeré Indorum (lat. překl.). Jméno bylo ve středověku latinizované na Al-Gorizmí.
Algoritmus = obecný předpis sloužící pro řešení daného problému - posloupnost kroků doplněná jednoznačnými pravidly Strana 5 (celkem 37)
Vlastnosti: elementárnost determinovanost konečnost rezultativnost (efektivnost) hromadnost
Přístupy k návrhu algoritmu (více viz 9. přednáška): dekompozice a abstrakce problému metodologie „shora dolů“ a „zdola nahoru“.
Prostředky pro zápis algoritmů: vývojový diagram pseudojazyk programovací jazyk Příklad problému, dekompozice a algoritmu Vypsání 5x Ahoj: - opakuj 5x výpis Ahoj - proveď dekompozici výpisu: - zjisti tvar příkazu pro výpis, vlož řetězec "Ahoj", příkaz zapiš 5x (lépe: použij cyklus)
3. Program - zápis algoritmu některým z uvedených prostředků Niklaus Wirth (*15. 2. 1934 Winterthur, Švýcarsko) Vzdělání: University of California, Berkeley, USA (1963), Laval University, Canada (1960), Spolková vysoká technická škola v Curychu (1959) 1984Turingova cena za vývoj programovacích jazyků .
Algoritmus + datové struktury = program Strana 6 (celkem 37)
Programovací jazyk syntaxe (pravidla) a sémantika (význam) strojově orientované vs. vyšší programovací jazyky Metody implementace: interpretační, kompilační
Interpret editace→zdrojový kód+vst. data → interpret→ výst.data
Kompilátor editace→zdrojový kód→kompilátor→ →cílový program + vst.data→výstupní data
Programovací jazyky Algol, Simula, Cobol, Fortran, Basic, Pascal, Delphi, C, C++, C#, LISP, Java, Python, Prolog, ADA, SQL,...
Java – editace, překlad, spuštění
Strana 7 (celkem 37)
Nezávislost na platformě bytecode
Java Interpret
Java Interpret
Windows
Linux
Java Interpret
...
Solaris
Java - historie
James Gosling (*1954), Oak (1994) Java, 1995, Sun
2004 – JDK 1.5 – nové prvky jazyka
2006 – JDK 1.6 – žádné změny jazyka
2011 – JDK 1.7 – malé změny (parametr přepínače, formátovaný výstup, …) 2014 – JDK 1.8 – verze aktuální pro PPA1 (pro úvodní kurz PPA1 - žádné změny)
Program v Javě jeden či více zdrojových souborů Jmeno.java překlad do vnitřní formy (bytekód) vznikne soubor Jmeno.class interpretaci provádí program java JVM (Java Virtual Machine)
program využívá knihovny (Java Core API Application Programming Interface)
JVM + Java Core API = Java platforma program v Javě = třída(y) Strana 8 (celkem 37)
Vývojové prostředky JDK (Java Development Kit) + příkazová řádka SciTe Eclipse
Instalace Javy dle návodů na portálu (vše ke stažení) nejprve instalace Javy pak Scite a Eclipse Další informace: http://java.sun.com http://www.scintilla.org http://www.eclipse.org/platform
Jak na první program v Javě? Zásady: program (zdrojový soubor) vytváříme v textovém editoru (Scite, NotePad, WordPad, PSPad), Eclipse název třídy začíná velkým písmenem, ve více slovném názvu začíná každé slovo velkým písmem, nepoužívá se podtržítko ani pomlčka, v názvu nesmí být mezera, třída tvoří blok {...} – více viz Konvence v Javě (str. 12)
ukládaný zdrojový soubor musí mít název shodný s názvem třídy a to včetně malých a velkých písmen uložení zdrojového souboru s příponou *.java překlad: javac Pozdrav.java spuštění: java Pozdrav
Strana 9 (celkem 37)
Příklad: Vytvořte program, který vypíše jednou slovo Ahoj. public class Pozdrav { public static void main(String[] args) { System.out.println("Ahoj"); } }
Poznámka (bude vysvětlováno i později): modifikátor public – přístupové právo k třídě, metodě, atributu Metoda public static void main(String[] args) je veřejná statická metoda, jejíž hlavička musí být zapsána shodně s výše uvedeným příkladem! Metoda main() nevrací žádnou hodnotu, její návratový typ je vždy(!) void (tj. „prázdný“). Parametrem metody (metoda má název s počátečním malým písmenem, vyjadřující děj) je pole řetězců pojmenované args (může být i jinak) představující argumenty (možnost zadání vstupních dat z příkazové řádky, např. jméno souboru). Příkaz System.out.println("Ahoj"); je voláním metody pro výpis na obrazovku, metoda pracuje se standardním výstupem (out), patří do třídy System, která je připojena automaticky (není třeba import). Výraz "Ahoj" představuje řetězec, což je text uzavřený v řetězových závorkách, "" (toto je prázdný řetězec). Strana 10 (celkem 37)
Java a čeština public class PozdravČesky { public static void main(String[] args) { System.out.println("Ahoj světe!"); System.out.println("Žluťoučký kůň příšerně úpěl ďábelské ódy."); } } Java češtinu „umí“, češtinu ale nepoužívejte v programech ani v komentářích při ověřování DÚ na validátoru ZČU!
Poznámka (jen pro začátečníky): A. Základní operace s obsahem paměťových míst 1. Uložení hodnoty - původní obsah buňky je přepsán, původní hodnota není dostupná. 2. Výběr hodnoty - obsah buňky je zachován, tj. výběr lze opakovat. 3. Přiřazení hodnoty buňky jiné buňce (operace 3), dochází ke kopírování obsahu do jedné či více buněk, přičemž se jejich původní obsah definitivně ztrácí. 4. Uložení hodnoty výsledku operace s obsahy dvou či více buněk (operace 4). Obsah výchozích buněk se nemění, obsah buňky, do které se uloží výsledek této operace, získává novou hodnotu. S obsahem výchozích buněk je možno dále pracovat. 5. Uložení výsledku operace s obsahy dvou či více buněk (operace 5) zpět do jedné z výchozích buněk. Podobně jako ve výše uvedených případech obsah této buňky získává novou hodnotu (např. inkrementace - zvětšení hodnoty o 1). Každé paměťové místo má svou vymezenou pozici – je označeno adresou. Paměťovému místu je přidělována mnemotechnická zkratka shodná se jménem proměnné.
Strana 11 (celkem 37)
paměťové místo, buňka, na adrese
z
uložení operace 3
x2
x1
a
b sum
c
výběr operace 5
operace 4
B. Číselné soustavy a převody Příklad: desítková soustava
5321 5 103 3 10 2 2 101 1 10 0 Zápis celého čísla v soustavě o základu Z
N am1 Z m1 am2 Z m2 ..... a1 Z 1 a0 Z 0 Zápis desetinné části
N a1Z 1 a2 Z 2 ......an Z n kde: Z … základ, m … počet řádových míst, ai … koeficient n … počet desetinných míst Kapacita soustavy K Z m m Největší hodnota soustavy N MAX Z 1
Významné soustavy Základ Soustava Hodnoty 10 desítková (dekadická) 0,1,2,3,4,5,6,7,8,9 dvojková 2 0,1 (binární), osmičková 8 0,1,2,3,4,5,6,7 (oktalová) šestnáctková 16 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F (hexadecimální) Strana 12 (celkem 37)
Šestnáctková soustava: (A)16=(10)10 (B)16=(11)10 (C)16=(12)10
(D)16=(13)10 (E)16=(14)10 (F)16=(15)10
Převody ◦ převádíme odděleně část: ◦ celou (xc) ◦ desetinnou (xd) Příklad: převod dekadického čísla 25,625 = x(2) do dvojkové soustavy (k=2) xc 25 12 6 3 1
xc/k 12 6 3 1 0
xc mod k 1 0 0 1 1
xd 0,625 0,250 0,5
xd*k 1,250 0,5 1,0
25,625(10) = 11001,101(2)
Převody mezi soustavami o Z = 2N 11001 (2) = 31 (8) 11001(2) = 19 (16)
Proměnná - název, deklarace, typ Proměnná
= symbolicky pojmenovaný datový objekt v operační paměti Identifikátor – název (jméno) proměnné, konstanty, metody, třídy...
Pravidla pro zápis identifikátoru - neomezená délka - začíná písmenem, podtržítkem _ či dolarem $ - nesmí obsahovat operátory - nelze použít rezervovaná slova (tzv. klíčová slova jazyka) Strana 13 (celkem 37)
Konvence v Javě – nutno dodržovat („srozumitelnost kódu“) ◦ ◦ ◦ ◦
třídy – začínají velkým písmenem (další slovo velkým) metody a proměnné – začínají malým písmenem konstanty – všechna písmena velká, podtržítka balíky – pouze malá písmena
Deklarace ◦ stanovení symbolického jména a datového typu ◦ inicializace (stanovení počáteční hodnoty) ◦ pojmenovaná konstanta (hodnota se nemění, final)
Proměnné musí být při deklaraci přiřazen datový typ a před použitím hodnota (inicializace).
Datové typy, konverze Datový typ = množina hodnot + množina operací primitivní datový typ – číslo/znak/logická hodnota Poznámka1: primitivní datové typy (vždy malými písmeny) a jejich tzv. „obalovací“ třídy (první písmeno velké): např. byte versus Byte Poznámka2: s datovými typy úzce souvisí problematika kódování (kódy pro celá čísla, reálná čísla, znaky, logické hodnoty) - bude předneseno na konci semestru!
Číselné datové typy Číselné typy – celá čísla Typ Rozsah byte -128..127 short -32768..32767 int -21474836448..2147483647 long -9223372036854775808..9223372036854775807 Strana 14 (celkem 37)
Číselné typy – reálná čísla Typ Rozsah double 4.9E-324..1.7976931348623157E308 float 1.4E-45 .. 3.4028235E38
Konstanty – tzv. literály Standardní číselné konstanty Double.POSITIVE_INFINITY (+∞) Double.NEGATIVE_INFINITY(-∞) Double.NaN (Not a Number) Integer.MAX_VALUE (největší hodnota celočíselná) Byte.MIN_VALUE (nejmenší hodnota typu byte: -128) Double.MAX_VALUE (největší hodnota reálná), … atd. Celočíselné konstanty – zápis (od Java 1.7) implicitně typu int, jinak zadat typ: např. 1234L (1234l), 077L - long
desítkové (posloupnost číslic, z nichž první nesmí být nula): např.: 5,128, 0, -6 osmičkové (číslice 0 následovaná číslicemi 0 až 7): např. 0123, 0, 07 šestnáctkové (číslice 0 následovaná znakem x či X a posloupnost 0 až 9, A až F či a až f): např. 0x56, 0x0, 0XCD, 0Xa dvojkové (číslice 0 následovaná znakem b či B a číslicemi 0 či 1): např. 0b1001, 0B101 (Java 1.7) Strana 15 (celkem 37)
Reálné konstanty – zápis (mohou začínat a i končit desetinnou tečkou, obsahovat znaménka, exponenty, atd. ) – jsou implicitně typu double: např. 1., .2, 5e6, 0.0, -7E2, 3.1415 jinak zadat typ: např. 3.14F (3.14f), 1.F, 1e-4f - float Poznámka: od Java 1.7 – podtržítko v numerických literálech (tzn. pouze mezi číslicemi) - oddělení číslic do skupin pro přehlednost: např. 1234_5678, 0b0010_0101, 0xFF_EC_DE_5E, 0_52 pozor ALE: _52 je identifikátor!
Znakové typy a konstanty deklarace char - znaková konstanta je uzavřena v apostrofech, může být reprezentována:
jedním znakem: např. 'A', '1', '%'
posloupností '\uXXXX', kde XXXX reprezentují číslice šestnáctkové: např. '\u00E1' ~ 'á'
„escape” sekvence: např. '\t ' ~ '\u0009' (tabulátor), '\\ ' ~ '\u005C' (zpětné lomítko - backslash) (více v Záznamy přednášek str. 28)
Řetězcové konstanty String (řetězec) je v Javě třída, proto zatím budeme řetězce užívat pouze pro výstup, např.
"tento retezec" a "tento" + "retezec" (pozor na typ uvozovek!)
Logický typ a konstanty deklarace boolean hodnoty jsou dvě: true (logická 1), false (logická 0)
Strana 16 (celkem 37)
Základní logické funkce && logický součin, || logický součet, ! negace
A
B
A && B
A || B
!A
false
false
false
false
true
false
true
false
true
true
true
false
false
true
false
true
true
true
true
false
Poznámka – datový typ výčet (Záznamy str. 66)* – pro zájemce
Konverze datových typů proměnné lze přiřadit jen hodnotu stejného typu - jinak přetypování: ◦ implicitní (automaticky) ◦ explicitní (nutno napsat), jen pro danou operaci, typ proměnné se trvale nezmění! Typy konverzí: ◦ identická - konverze na shodný typ
◦ rozšiřující - provádějí se implicitně a není nutné uvádět operátor přetypování
◦ zužující - při nich může dojít ke ztrátě informace a musí se provádět operátorem přetypování - jeho syntaxe je: (typ) operand
◦ převod základního datového typu na řetězec a naopak (viz přednáška: třída String). ◦ zakázaná konverze - obvykle nemá smysl (např. přetypování na void). Strana 17 (celkem 37)
Příklady konverzí číselných typů: double r, p; r = 3; // implicitni - rozsireni typu int i = 1; p = i; // implicitni p = (double) i; // lepe explicitne, je to umysl i = (int) r; // explicitni – ztrata rozsahu i = (int) p + r; // chybne!!! i = (int) (p + r); // spravne
Operátory, výraz, příkaz, přiřazení Operátory provádí operace s operandy (proměnné, konstanty, ...) Typy operátorů: ◦ aritmetické ◦ relační ◦ logické ◦ bitové (např. >>, |, &)* - použití je nad rámec PPA1 ◦ přiřazení Priority operátorů ++, -inkrementace (zvětšení obsahu o 1), dekrementace
*, /, % násobení, dělení (celočís., reálné), operace modulo +, sčítání, odčítání <, <=, >, >= menší, menší či rovno, větší, větší či rovno ==, != je rovno, není rovno && logický součin (AND) || logický součet (OR) =, +=, -=, *=, /=, %= přirazení s operací (před rovnítkem) s operandem (vlevo) a opětné přiřazení do operandu (vlevo)
Priority operací možno upravit použitím závorek! Strana 18 (celkem 37)
Výraz - předepisuje postup při výpočtu hodnoty určitého typu - skládá se z operandů (proměnné, konstanty, volání metod, ...) a operátorů (+,-,*,/, ...) Vyhodnocení výrazu: zleva doprava dle priorit
Příkaz - jednotka vykonávání kódu, ukončení znakem ; Druhy příkazů: o o o
o o
prázdný (neprovádí nic, nejjednodušší) deklarativní (deklarace proměnné a její inicializace) výrazový (nejčastější- např. přiřazení, inkrementace, volání metody – např. výpis hodnot proměnných) toku programu (určuje pořadí vykonávání příkazů) složený příkaz - blok
Příkaz přiřazení ◦ nastaví hodnotu proměnné vlevo = (není to rovnice!) ◦ vypočtenou hodnotu můžeme přiřadit (vložit) do proměnné pouze stejného typu
Příkaz přiřazení: proměnná = výraz;
Blok - sekvence příkazů a deklarací lokálních proměnných (pravidla používání – později) uzavřených do složených závorek { }. Použití – tam, kde je možno použít příkaz. Blok může být i prázdný, pak se chová stejně jako prázdný příkaz. Příkazy v bloku jsou vykonávány od prvního příkazu k poslednímu, pokud není ukončen předčasně.
Strana 19 (celkem 37)
Příklad: Výměna obsahu dvou proměnných (jak jinak?) int a = 3; int b = 5; int pom =a; a = b; b = pom
a = b = pom a = b =
3 5 = 3 5 3
Příklad: Blok (lokální proměnná v bloku) int i = 1; { // vnitrni blok int i = 3; // i - lokalni promenna } // konec bloku System.out.println("i = " + i);
i=1
Operace modulo % - zbytek po celočíselném dělení např.: 13 % 5 = 3
Příklad: Kolik plných plat lze naplnit daným počtem vajec a kolik vajec zbude?
public class Vejce { public static void main(String [] args ){ int pocetVajec = 80; int velikostPlata = 12; int pocetPlat = pocetVajec/velikostPlata; int zbytek = pocetVajec % velikostPlata; System.out.println("Pocet plat = " + pocetPlat); System.out.println("Zbyde " + zbytek + " vajec."); } Pocet plat = 6 } Zbyde 8 vajec. Strana 20 (celkem 37)
Příklad: Příkazy public class Prikazy { public static void main(String []args){ double suma = 1 + 2 * 3.5; System.out.println("suma = " + suma); double delenec = 3; double delitel = 2; // ilustrace fce operatoru deleni // zakomentovat predchozi a odkomentovat nasledujici radek // int delitel = 2; double podil = delenec/ /*(double)*/ delitel; // po odkomentovani "(double)" bude deleni opet realne !
System.out.println("podil = " + podil); int a = 1; int b = 3; int aMinusBNaDruhou = a*a - 2*a*b + b*b; System.out.println("(a-b)*(a-b) = " + aMinusBNaDruhou); double realne = Math.pow(a - b, 3) / (a + b); //reálné dělení System.out.println("realne = " + realne); int c = 4; int d = 5; double prumer = (a + b + c + d)/4.; //reálné dělení double median = (b + c)/2.0; System.out.println("prumer = " + prumer); System.out.println("median = " + median); } }
suma = 8.0 podil = 1.5 (a-b)*(a-b) = 4 realne = -2.0 prumer = 3.25 median = 3.5 Strana 21 (celkem 37)
Příklad: Inkrementace (zvětšení hodnoty proměnné o 1) public class Inkrementace { public static void main(String [] args ){ int i = 1; System.out.println("i = " + i); i = i + 1; System.out.println("i = " + i); i += 1; System.out.println("i = " + i); i++; System.out.println("i = " + i); ++i; System.out.println("i = " + i);
i i i i i i i i i
= = = = = = = = =
1 2 3 4 5 1 2 1 2
sum sum sum sum
int sum = 0; //pozor na poradi operaci! i = 1; System.out.println("i = " + i + " sum = " + sum); sum = sum + i++; // zde System.out.println("i = " + i + " sum = " + sum); i = 1; sum = 0; System.out.println("i = " + i + " sum = " + sum); sum = sum + ++i; //zde System.out.println("i = " + i + " sum = " + sum); } }
Důležitá poznámka k problematice dělení v Javě / .... celočíselné vs. reálné Oba operandy celočíselné – celočíselné dělení, jinak reálné dělení, možnost přetypování! Strana 22 (celkem 37)
= = = =
0 1 0 2
Komentáře a dokumentace - snazší orientace ve zdrojovém kódu Typy komentářů řádkový (do konce řádku) // text blokový (více řádek) /* text */ dokumentační /** dokumentace */ Co dokumentovat? nestandardní názvy proměnných nestandardní programové konstrukce metody třídy Vygenerování dokumentace (z příkazové řádky) program javadoc příkaz javadoc –d mujDokument Jmeno.java založí adresář mujDokument s html soubory spustit Index.html
Jméno autora (v dokumentaci - @author) a příkaz: javadoc –author –d mujDokument Jmeno.java
Příkaz pro dokumentování více souborů: javadoc –author –d mujDokument *.java
A pokud není užit modifikátor public: javadoc –author –private –d mujDokument *.java Strana 23 (celkem 37)
Příklad dokumentace - pro již uvedený program Ahoj.java import java.io.*; // import netreba, jen pro ukazku - kam dokumentaci umistit
/** *Vypis pozdravu Ahoj! * @author netrvalo * @version 1 - 03.07.2013 */
public class Ahoj { /** * Metoda main() - spousteni programu * @param args pole retezcu argumentu - nevyuzito */
public static void main(String[] args) { /* prikaz volani metody println () vypise text Ahoj! */
// toto byl blokovy komentar
System.out.println("Ahoj!");
// vypis Ahoj!
} }
Vygenerování dokumentace – příkazová řádka - generuje se do adresáře s názvem doc volbou -d: javadoc –d doc Ahoj.java - vygeneruje se i se jménem autora: javadoc –author –d doc Ahoj.java Strana 24 (celkem 37)
Zobrazení dokumentace k programu:
Strana 25 (celkem 37)
Poznámka: Vývojové prostředí Eclipse – generování automaticky (volbou z menu), nutno nastavit cestu k javadoc.exe. Strana 26 (celkem 37)
Základní matematické funkce Standardní funkce (Třída Math) - viz Java Core API – – – – –
mocnina druhá odmocnina goniometrické funkce logaritmus exponenciální fce
Konstanty - π, e Příklady použití konstant a standard. funkcí: double pi = Math.PI; //3.141592653 double e = Math.E; // Math.exp(1); int a =3, b = 4; double prepona = Math.sqrt(Math.pow(a,2)+b*b); // 5 double v = Math.pow(Math.sin(1),2)+Math.pow(Math.cos(1),2); // 1 double logaritmusDes = Math.log10(100); // 2 double logaritmusPriroz = Math.log(Math.E); // 1 double nahodneCisloX = Math.random(); // 0.0 ≤X≤ 1.0
Příklad: Minimum ze tří čísel // minimum ze 3 cisel
int a = 1, b = 2, c = 3 ; int min = Math.min (Math.min (a, b),c); System.out.println("min = " + min); min = 1 Strana 27 (celkem 37)
Příklad: Vzdálenost dvou bodů v rovině v
x1 x2 2 y1 y2 2
int x1 = 0, y1 = 0; int x2 = 1, y2 = 1; double v = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); System.out.println("v = " + v); v = 1,41...
/* lepe: int rX = x1 - x2; int rY = y1 - y2; v = Math.sqrt(rX*rX + rY*rY); // v = Math.sqrt(Math.pow(rX,2) + Math.pow(rY,2)); */
Příklad: Výpočet plochy kruhu s pomocí Math public class VypocetPlochyMath { public static void main(String [] args) { int polomer = 1; double plocha = Math.pow(polomer,2)*Math.PI; System.out.println("P("+polomer+")="+plocha); // vypocet dalsi plochy
P(1)=3.141592653589793
polomer = 2; plocha = Math.pow(polomer,2)*Math.PI; System.out.println("P("+polomer+")="+plocha); } }
P(2)=12.566370614359172 Strana 28 (celkem 37)
Příklad: Přehled často používaných metod třídy Math public class StandardniFce { // dalsi fce - viz dokumentace Javy public static void main(String[] arg){ int a = 2, b = 3; int d = a - b; System.out.println("d = " + d); System.out.println("a = " + a + ": a^2 = " + a * a); System.out.println(("a = " + a + ": a^7 = " + Math.pow (a,7)); System.out.println("vysledek a^7 jako cele cislo = " + (int) Math.pow (a,7)); System.out.println("mensi ze dvou cisel (" + a + "," + b + ") = " + Math.min (a,b) ); int c = 4; System.out.println("odmocnina z " + c + " = " + Math.sqrt(c)); System.out.println("treti odmocnina z 27 = " + Math.cbrt (27)); double p = 123.0625, r = -67.89; System.out.println("cela cast " + p + " = " + Math.round(p)); System.out.println("nejmensi cele cislo vetsi nez p = " + (int)Math.ceil (p)); System.out.println("nejmensi cele cislo mensi nez p = " + (int)Math.floor (p)); System.out.println("cele cislo = " + (int)Math.rint (p)); System.out.println("cele cislo = " + (int)Math.rint (123.5)); System.out.println("desetinna cast = " + (p-Math.round(p))); System.out.println("abs.hodnota z " + r + " = " + Math.abs(r)); System.out.println("realne nahodne cislo = " + Math.random()); int m = 10, n = 1; System.out.println("cele nahodne cislo c = " + (int) (Math.random()*m + n)); System.out.println("pi = " + Math.PI); System.out.println("oriznute pi = " + (double)(int)(Math.PI *100)/100); } // lépe pouzit formatovany vystup
} d = -1 a = 2: a^2 = 4 a = 2: a^7 = 128.0 vysledek a^7 jako cele cislo = 128 mensi ze dvou cisel (2,3) = 2 odmocnina z 4 = 2.0 treti odmocnina z 27 = 3.0 cela cast 123.0625 = 123
nejmensi cele cislo vetsi nez p = 124 nejmensi cele cislo mensi nez p = 123 cele cislo = 123 cele cislo = 124 desetinna cast = 0.0625 abs.hodnota z -67.89 = 67.89 realne nahodne cislo = 0.5332038516131532 cele nahodne cislo c = 10 pi = 3.141592653589793 oriznute pi = 3.14 Strana 29 (celkem 37)
Generátor náhodných čísel (pseudo)náhodná čísla (celá, reálná): třída Random ◦ nutný import balíčku java.util ◦ inicializace = vytvoření objektu import java.util.*; public class NahodnaCisla { static private Random r = new Random(); // inicializace // static privateRandom r = new Random(1); // stale stejna posloupnost
public static void main (String[]args) { // Random r = new Random(); // tez funkcni, ale lepe takto
double realne = r.nextDouble(); // nema parametr int rozsah = 10; // tj. 0,1,2,3,4,5,6,7,8,9 int cele = r.nextInt(rozsah); // muze mit parametr System.out.println("" + realne + " : " + cele); long velkeCele = r.nextLong(); // nema parametr System.out.println("" + velkeCele); }
0.08244313229478573 : 2
}
-9158810925546707464
Poznámka: r je proměnná - reference třídy Random nextInt() - metoda vrací náhodné celé číslo typu int nextInt(celeCislo) vrací náhodné celé číslo v rozsahu 0, celeCislo-1 nextDouble() je metoda třídy Random vracející náhodné reálné číslo 0.0, 1.0 Náhodné číslo (třída Math) – už známe Math.random() – reálné číslo z intervalu (0.0, 1.0 Strana 30 (celkem 37)
Terminálový vstup (z klávesnice) od JDK 1.5 - jednoduché řešení - třída Scanner, použitelné i pro soubory (bude uvedeno později), postupujeme obdobně jako u třídy Random - import balíčku java.util - inicializace, vytvoření objektu (new) - nutno řešit lokalizaci (. vs. - používá metody:
, v reálném čísle)
nextInt(), nextDouble(), next(), nextLine() Příklad: Načti dvě čísla (reálné, celé) a spočti jejich průměr. import java.util.*; public class VstupScanner { private static Scanner sc = new Scanner(System.in); public static void main(String [] args) { //Scanner sc = new Scanner(System.in); sc.useLocale(Locale.US); // lokalizace ! System.out.print("Zadej 1. cislo realne: "); double cislo1 = sc.nextDouble(); System.out.println("Zadano bylo: " + cislo1); System.out.print("Zadej 2. cislo cele: "); int cislo2 = sc.nextInt(); System.out.println("Zadano bylo: " + cislo2); double prumer = (cislo1 + cislo2)/2; System.out.println("Prumer = " + prumer); } }
Zadej 1. cislo realne: 12.3 Zadano bylo: 12.3 Zadej 2. cislo cele: 12 Zadano bylo: 12 Prumer = 12.15 Strana 31 (celkem 37)
Příklad (problém vyprázdnění vstupu) import java.util.*; public class VyprazdneniVstupu { private static Scanner sc = new Scanner(System.in); public static void main(String [] args) { sc.useLocale(Locale.US); System.out.print("Zadej cele cislo: "); int cislo = sc.nextInt(); System.out.println("Zadano bylo: " + cislo); System.out.print("Zadej realne cislo: "); double realne = sc.nextDouble(); System.out.println("Zadano bylo: " + realne); sc.nextLine(); //zakomentovanim vznikne chyba // docteni radky
a - vyprazdneni vstupu System.out.print("Zadej vetu: "); String veta = sc.nextLine(); System.out.println("Zadano bylo: " + veta); System.out.print("Zadej znak: "); char znak = sc.next().charAt(0); System.out.println("Zadano bylo: " + znak); System.out.print("Zadej slovo: "); String slovo = sc.next(); System.out.println("Zadano bylo: " + slovo); } } Strana 32 (celkem 37)
Výstup programu: Bez zakomentování Zadej cele cislo: 12 Zadano bylo: 12 Zadej realne cislo: 12.2 Zadano bylo: 12.2 Zadej vetu: Jak se mas? Zadano bylo: Jak se mas? Zadej znak: w Zadano bylo: w Zadej slovo: lepidlo Zadano bylo: lepidlo
Se zakomentováním Zadej cele cislo: 12 Zadano bylo: 12 Zadej realne cislo: 12.2 Zadano bylo: 12.2 Zadej vetu: Zadano bylo: Zadej znak: w Zadano bylo: w Zadej slovo: lepidlo Zadano bylo: lepidlo
Upozornění: Metody nextInt(), nextDouble() a next() jsou tzv. „žravé“ – přečtou a zlikvidují všechny „bílé“ znaky (mezera, znaky konce řádky, tabulátor) před prvním nebílým znakem, čtení skončí na prvním bílém znaku, tento znak však zůstává (tj. není „požrán“) ve vyrovnávací paměti (buffer)
Řešení - před použitím metody nextLine() vyprázdnit vstup příkazem sc.nextLine() Pozor – ale: metoda nextLine() není žravá, ale zato zlikviduje znaky konce řádky, proto se za ní nesmí použít příkaz sc.nextLine()! Vyprázdnění vstupu bývá častou chybou! Strana 33 (celkem 37)
Správné použití třídy Scanner public class PouzitiScanneru{ static private Scanner sc = new Scanner(System.in); public static void main (String [] args) { int a = sc.nextInt(); } }
Takto budeme Scanner používat při vícenásobném volání (např. v main (), v cyklu, či v jiné metodě) – více bude vysvětleno později.
Poznámka: Vstup s využitím argumentů (tj. parametrů příkazové řádky)
public class VstupArgumenty { // cisla zadana jako parametry na prikazove radce
public static void main(String[] args) { int a = Integer.parseInt(args[0]); //1. argument // metoda Integer.parseInt () - prevod retezce na cele cislo
System.out.print(" a = " + a); int b = Integer.parseInt(args[1]); //2. argument System.out.print(" b = " + b); int suma = a + b; System.out.println("suma = " + suma); } }
Metoda parseInt()převádí řetězec na celé číslo (bude vysvětleno až se třídou String), později kód ještě doplníme o test existence argumentů (parametrů). Strana 34 (celkem 37)
Grafický nástroj DrawingTool1 vytvořen pro PPA2 pouze pro kreslení fraktálů (cílem nebylo, a ani teď není, vytvořit kreslicí utilitu!) umí nakreslit čáru z bodu do bodu počátek grafického souřadného systému 0,0 je
v levém horním rohu (pracuje se s pixely) soubor DrawingTool.java musí být uložen ve
stejném adresáři s naší aplikací (DrawingTool je v podstatě samostatná třída, kterou náš program používá) aplikace musí mít na 1. řádku příkaz:
import.java.awt.*; Příklad použití – na cvičení Soubor DrawingTool.java a aplikace Kreslení .java překlad: javac *.java // *.java -prelozi se obe tridy spuštění: java Kresleni Úloha: Nakreslete úhlopříčku vedoucí z levého horního do pravého dolního rohu černou barvou na bílém pozadí v okně s rozměry 300x200.
1
© 2005 Ing. Roman Tesař (příklady studenti doktorského studia na KIV), pro předmět PPA2.
Strana 35 (celkem 37)
import java.awt.*; public class Kresleni { public static void main(String[] args) { /* nejprve inicializace objektu: sirka = 300, vyska = 200, barva pozadi = bila DrawingTool je typ, dt je reference na objekt DrawingTool, Color je trida balicku java.awt – pro kresleni, WHITE je konstanta tridy Color
*/ DrawingTool dt = new DrawingTool(300, 200, Color.WHITE, true); /* nastaveni barvy cary na cernou: setColor() je metoda tridy DrawingTool, BLACK je konstanta
*/
dt.setColor(Color.BLACK); /* nakresleni uhlopricky z leveho horniho rohu [0, 0] do praveho dolniho rohu [300 - 1, 200 - 1] */ dt.line(0, 0, 299, 199); // metoda tridy DrawingTool kresli caru } }
Výstup:
Strana 36 (celkem 37)
Příklad: Výpočet přepony, obvodu a obsahu pravoúhlého trojúhelníka, jsou-li dány odvěsny. import java.util.* ; /** * Vypocet prepony, obvodu a obsahu pravouhleho trojuhelnika, * jsou-li dany odvesny * @author netrvalo * @version 13.02.2016 */
public class PravouhlyTrojuhelnik { private static Scanner sc = new Scanner (System.in); /** * Metoda main() - spousteni programu * @param args pole retezcu argumentu - nevyuzito */
public static void main(String[] args) { sc.useLocale(Locale.US); System.out.print("Nacti odvesnu a = "); double a = sc.nextDouble(); System.out.print("Nacti odvesnu b = "); double b = sc.nextDouble(); double c = Math.sqrt(Math.pow(a,2) + Math.pow(b,2)) // rychleji: Math.sqrt(a*a + b*b);
double obvod = a + b + c; double obsah = a*b/2; System.out.println(Trojuhelnik: "); System.out.println("a, b, c: " + a + ", " + b + ", " + c); System.out.println("O = " + obvod ); Nacti odvesnu a = 3 System.out.println("P = " + obsah ); Nacti odvesnu b = 4 } }
Trojuhelnik: a, b, c: 3.0, 4.0, 5.0 O = 12.0 P = 6.0 Strana 37 (celkem 37)