Tato tematika je zpracována v Záznamy přednášek: str. 12, 14 23, 34-43

Podobné dokumenty
Tato tematika je zpracována v Záznamy přednášek: str

Tato tematika je zpracována v Záznamy přednášek: str , 44-61

Algoritmizace a programování. Terminálový vstup a výstup

Algoritmizace a programování

Paměť počítače. alg2 1

Algoritmizace a programování

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Slajdy k přednáškám předmětu. KIV/PPA1. Arnoštka Netrvalová

5 Přehled operátorů, příkazy, přetypování

Algoritmizace a programování

Úvod do programovacích jazyků (Java)

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Formátové specifikace formátovací řetězce

Jak v Javě příkazy, operace a výrazy. BD6B36PJV 00 Fakulta elektrotechnická České vysoké učení technické

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

- jak udělat konstantu long int: L long velka = 78L;

Algoritmizace a programování

Úvod do programování. Lekce 1

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Jazyk C# a platforma.net

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Čísla a číselné soustavy.

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

KTE / ZPE Informační technologie

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

7. Datové typy v Javě

Programovací jazyk Pascal

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Datové typy strana 29

Zápis programu v jazyce C#

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Java reprezentace dat, výrazy. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Operátory. Základy programování 1 Tomáš Kühr

Úvod do programování - Java

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Sada 1 - Základy programování

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

3 KTE / ZPE Informační technologie

9. přednáška - třídy, objekty

VISUAL BASIC. Práce se soubory

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

PHP - úvod. Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky.

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

1. Téma 03 - Rozhodování

Informatika Datové formáty

Algoritmizace a programování

Příklad: Součet náhodných čísel ve vektoru s počtem prvků, které zadá uživatel, pomocí sum() a pomocí cyklu for. Ověříme, že příliš výpisů na

Programování v jazyce JavaScript

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Číselné soustavy v mikroprocesorové technice Mikroprocesorová technika a embedded systémy

Seminář Java II p.1/43

Racionální čísla, operátory, výrazy, knihovní funkce

Programování v Javě I. Leden 2008

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Regulární výrazy. Vzory

Racionální čísla, operátory, výrazy, knihovní funkce

Architektury počítačů

Datové typy a jejich reprezentace v počítači.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Desetinná čísla. pro celá čísla jsme používali typ int. pro desetinná čísla používáme typ double

LEKCE 6. Operátory. V této lekci najdete:

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Úvod do programovacích jazyků (Java)

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programování v jazyce JavaScript

Struktura a architektura počítačů (BI-SAP) 5

3 Jednoduché datové typy Interpretace čísel v paměti počítače Problémy s matematickými operacemi 5

NPRG030 Programování I, 2010/11

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

PJC Cvičení #2. Číselné soustavy a binární reprezentace proměnných

Programování v Javě I. Únor 2009

MQL4 COURSE. By Coders guru -4 Operace & Výrazy

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09

Algoritmy a datové struktury

v aritmetické jednotce počíta

2. Základy jazyka. Proměnné. Základy jazyka

KTE / PPEL Počítačová podpora v elektrotechnice

Proměnná a její uložení v paměti

Základy jazyka C. Základy programování 1 Tomáš Kühr

Seznámení s datovými typy a operátory

Programování v jazyce C pro chemiky (C2160) 9. Práce s PDB soubory

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

LabView jako programovací jazyk II

8 Třídy, objekty, metody, předávání argumentů metod

Seminář z IVT Proměnné a operátory. Slovanské gymnázium Olomouc 11. září 2014 Tomáš Kühr

Transkript:

Obsah 2. přednášky: Číselné soustavy Kódování Přehled datových typů Přehled a použití operátorů Generátor náhodných čísel Terminálový formátovaný vstup a výstup Grafický nástroj Drawing Tool Algoritmizace postup řešení jednoduchého problému (ACM) Tato tematika je zpracována v Záznamy přednášek: str. 12, 14 23, 34-43 Problém: Je dán počet testovaných případů t (1 t 100) a pro každý takový případ je na samostatném řádku zadáno celé číslo n (-1000 n 1000). Pro všechna zadaná n spočtěte a na samostatném řádku vypište výsledek následujícího úkolu: Vynásobte číslo n 567mi, poté vydělte výsledek 9, přičtěte 7492, pak vynásobte 235, výsledek vydělte 47 a odečtěte 498. Jaká číslice je ve vypočtené hodnotě na řádu desítek? Úvod k řešení bude uveden na konci této přednášky. Přednášky KIV/PPA1, A. Netrvalová, 2015 2. přednáška

Číselné soustavy Příklad: desítková soustava 3 2 1 5321 5 10 3 10 2 10 1 10 Zápis celého čísla v soustavě o základu Z N a m 1 m 2 1 0 m 1 Z am 2Z... a1z a0z Zápis desetinné části N 1 2 a Z a Z... a 1 2 nz kde: Z základ, m počet řádových míst, a i koeficient n počet desetinných míst m K Kapacita soustavy Největší hodnota soustavy N Z m 1 Významné soustavy Z MAX n Základ Soustava Hodnoty 10 2 8 16 desítková (dekadická) 0,1,2,3,4,5,6,7,8,9 dvojková (binární), 0,1 osmičková (oktalová) 0,1,2,3,4,5,6,7 šestnáctková (hexadecimální) 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F Šestnáctková soustava: (A) 16 =(10) 10 (D) 16 =(13) 10 (B) 16 =(11) 10 (E) 16 =(14) 10 (C) 16 =(12) 10 (F) 16 =(15) 10 0 Strana 2 (celkem 26)

Převody - převádíme odděleně část: - celou (x c ) - desetinnou (x d ) Příklad: převod dekadického čísla 25,625 = x (2) do dvojkové soustavy (k=2) x c x c /k x c mod k x d x d *k 25 12 1 0,625 1,250 12 6 0 0,250 0,5 6 3 0 0,5 1,0 3 1 1 1 0 1 25,625 (10) = 11001,101 (2) Převody mezi soustavami o z = 2 N 11001 (2) = 31 (8) 11001 (2) = 19 (16) Kódování - podrobně bude předneseno na konci semestru Kódy pro celá čísla přímý inverzní doplňkový s posunutou nulou Strana 3 (celkem 26)

Kódy pro reálná čísla - jednoduchá a dvojnásobná přesnost Kódy pro znaky ASCII - číslice vs. číslo, znak vs. hodnota ASCII kódu! Kódy pro logické hodnoty Datové typy a Java primitivní datový typ číslo/znak/logická hodnota Číselné typy celá čísla Typ Rozsah byte -128..127 short -32768..32767 int -21474836448..2147483647 long -9223372036854775808..9223372036854775807 Číselné typy reálná čísla Typ Rozsah double 4.9E-324..1.7976931348623157E308 float 1.4E-45.. 3.4028235E38 Poznámka: primitivní datové typy (vždy malými písmeny) a jejich tzv. obalovací třídy (první písmeno velké): např. byte versus Byte Strana 4 (celkem 26)

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) 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 Strana 5 (celkem 26)

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 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 dvě: true (logická 1), false (logická 0) && 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 Strana 6 (celkem 26)

Přehled a použití operátorů Operace s operandy určují operátory unární, binární, ternární (1) aritmetické, relační, přiřazovací, bitové Vyhodnocení výrazu zleva doprava dle priorit Priority možno upravit použitím závorek Priorita operátorů ++, -- inkrementace, dekrementace *, /, % násobení, dělení, modulo +, - sčítání, odčítání <, <=, >, >= relační (menší, menší či rovno) ==,!= je rovno, není rovno && logický součin (AND) logický součet (OR) =, +=, -=, *=, /=, %= přiřazení s operátorem Poznámka: zkrácený zápis přiřazení s operátorem - provede se naznačená operace s aktuální hodnotou operandu vlevo a pak se mu přiřadí nově spočtená hodnota. Příklad: int i = 2; i = i + 1; // i = 3 (2+1) // predchozi radek lze zapsat i jako i += 1; // i = 4 (3+1) Strana 7 (celkem 26)

/* ********* Priklady: operatory a operace ********* */ public class Prikazy2 { public static void main(string []args){ int a = 1; int b = 3; System.out.println("a = " + a + ", b = " + b); a *= b; // a = a*b System.out.println("a = " + a + ", b = " + b); int c = 6; int d = 5; System.out.println("c = " + c + ", d = " + d); c %= d; // c = c%d System.out.println("c = " + c + ", d = " + d); boolean ano = true; boolean ne = false; boolean logsoucet = ano ne; boolean logsoucin = ano && ne; boolean negace =!ano; System.out.println("logicky soucet = " + logsoucet); System.out.println("logicky soucin = " + logsoucin); System.out.println("negace = " + negace); System.out.println("negace negace = " +!negace); boolean podminka = (a <= b) && (c!= d); System.out.println("podminka = " + podminka); Podminka = (a <= b) && (c == d); System.out.println("podminka = " + podminka); char znak = 'A' + 2; // ASCI 65+2=67, tj. znak C System.out.println("znak = " + znak); znak--; // ASCI 67-1=66, tj. B System.out.println("znak = " + znak); a = 1, b = 3 a = 3, b = 3 c = 6, d = 5 c = 1, d = 5 logicky soucet = true logicky soucin = false negace = false negace negace = true podminka = true podminka = false znak = C znak = B Strana 8 (celkem 26)

Důležitá poznámka Problémy při provádění aritmetických operací (důvod: zobrazení čísel, zaokrouhlování, ) 1. Přetečení a podtečení (čísla, exponentu) Je-li výsledná absolutní hodnota: větší než maximální zobrazitelná dojde k přetečení menší než minimální zobrazitelná dojde k podtečení přetečení podtečení přetečení -max -min 0 +min +max Náprava pokud lze - zvětšit rozsah (změnit datový typ) 2. Porovnání dvou reálných čísel double x, y; x == y!! takto NE!!! upravit prostřednictvím <=, >= if (x == y) nahradit if (Math.abs(x - y) < ε) kde: ε absolutní chyba porovnání 3. Problém zaokrouhlení Nevhodným řazením operací s řádově odlišnými hodnotami čísel, opakováním výpočtů, atd. může docházet i k výrazným numerickým chybám. int a = 2, b = 5, c = 7; double soucetmocnin = a*a + b*b + c*c; double odmocnina = Math.sqrt(soucetMocnin); System.out.println(1/Math.sqrt(3) * odmocnina); //ne! System.out.println(odmocnina / Math.sqrt(3)); //ok! 5.099019513592786 5.099019513592785 Strana 9 (celkem 26)

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(); System.out.println("" + velkecele); // nema parametr 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 10 (celkem 26)

Terminálový formátovaný Vst/Výst terminálový velmi primitivní V/V (klávesnice, obrazovka - txt režim) formátovaný čísla na výstupu automaticky převedena na řetězec číslic v desítkové soustavě Klasický výstup System.out.print(parametr), System.out.println(), System.out.println(parametr) print(parametr) metoda třídy System, pro výstup parametr primitivní typ nebo řetězec funkce - pro každý primitivní typ existuje implicitní konverze na řetězec int i=1; System.out.print ("i = " +i); // i = 1 System.out.println('A'); // i = 1A System.out.println(Math.E); // 2.718281828459045 System.out.println(5); // 5 System.out.println(5.25); // 5.25 System.out.println("Hello world\n"); // "\n" odradkovani // ALE POZOR: prevod na typ prvniho vystupu (tj. na int) System.out.println(5 + i + 'A'); /* 5+1+65 = 71 (65=kod pismena A) nutno na zacatek umistit prazdny retezec */ System.out.println("" + 5 + i + 'A'); // 51A ok! // JESTE jednou POZOR: chci soucet i+2, System.out.println("index = " + i + 2); // ale vypis je 12 nutno uzavrit do zavorek System.out.println("index = " + (i+2)); // 3 ok! Strana 11 (celkem 26)

Lepší řešení výstupu (od JDK 1.5) Použití metody - System.out.format(parametr) pozor: parametry jsou odděleny, (čárkou) nikoliv + Používat jen, je-li to nutné! Více informací: Záznamy přednášek (str. 36 38) + java.util.formatter Základní pravidla: - ve formátovacím řetězci - za znakem % formátovací znaky - kolik je znaků %, tolik dalších parametrů int i = 1, sum = 33; System.out.format("i = %d, suma = %d%n", i, sum); // i = 1, suma = 33 Poznámka: Desetinný oddělovač je závislý na lokalitě pro ČR je to čárka, pro US tečka (viz dále). Výpis celého čísla v desítkové soustavě - používá se %d, např. pro int i = -1234; System.out.format("i = %d%n", i); // i = -1234 - počet míst lze stanovit, pak se doplňují mezery zleva, tj. zarovnání doprava, např.: System.out.format("i = %7d%n", i); // i = -1234 - počet míst lze stanovit a zarovnat doleva (zbylé místo se doplní mezerami), např.: System.out.format("i = %-7dahoj%n", i); // i = -1234 ahoj - lze vynutit výpis i + znaménka, např. pro int i = 1234; System.out.format("i = %+7d%n", i); // i = +1234 - vynutí se výpis nevýznamových nul, např.: System.out.format("i = %07d%n", i); // i = -001234 - vypisuje se i oddělovač řádů, např.: System.out.format("i = %,7d%n", i); // i = -1 234 Strana 12 (celkem 26)

Výpis celého čísla v jiných soustavách - osmičková soustava, např. pro int j = 30; System.out.format("j = %o%n", j); // j = 36 - šestnáctková soustava, např. pro int j = 30; System.out.format("j = %X%n", j); // j = 1E - počet míst lze určit, např.: System.out.format("j = %3X%n", j); // j = 1E - lze vynutit nevýznamové nuly, např. pro: int j = 10; System.out.format("j = %02X%n", j); // j = 0A Výpis znaku - používá se %c, např. pro char c = 'a'; System.out.format("c = %c%n", c); // c = a - lze použít přetypování a lze vypsat více proměnných najednou System.out.format("Znak %c ma ASCII hodnotu: %d%n", c, (int) c); // Znak a ma ASCII hodnotu: 97 Výpis reálného čísla (od verze Java 1.7 všude znak:,) - reálné číslo %f, např. pro double d = 1234.567; System.out.format("d = %f%n", d); // d = 1234,567000 - výpis ve vědeckotechnické notaci %g, %e např. pro: double d = 1234.567; System.out.format("d = %g%n", d); // d = 1234,57 System.out.format("d = %e%n", d); // d = 1,234567e+03 - lze nastavit počet míst celkem (10) a počet míst za desetinným oddělovačem (1), číslo bude zaokrouhleno System.out.format("d = %10.1f%n", d); // d = 1234,6 - lze použít zarovnání doleva, výpis nevýznamových nul, oddělovač řádů apod. stejně jako u celého čísla Strana 13 (celkem 26)

Výpis řetězce - používá se %s, např. pro String s = "Ahoj lidi"; System.out.format("s = %s%n", s); // s = Ahoj lidi - řetězec lze vypsat velkými písmeny System.out.format("s = %S%n", s); // s = AHOJ LIDI - lze stanovit šířku výpisu, výpis bude zarovnán doprava System.out.format("s = %11s %n", s); // s = Ahoj lidi - výpis lze zarovnat i doleva System.out.format("s = %-11s %n", s); // s = Ahoj lidi Příklad (program + výstup): public class FormatovaniVystupu { public static void main(string [] args) { System.out.format("nova radka%n"); int i = -1234; System.out.format("i = %d%n", i); System.out.format("i = %7d%n", i); System.out.format("i = %-7d%n", i); System.out.format("i = %+7d%n", i); System.out.format("i = % 7d%n", i); System.out.format("i = %07d%n", i); System.out.format("i = %, 7d%n", i); char c = 'a'; System.out.format("c = %c%n", c); System.out.format("c = %3c%n", c); System.out.format("c = %C%n", c); System.out.format("c = %c%n", c); System.out.format("c = %c%n", 65);... pokračování na dalším slidu Strana 14 (celkem 26)

double d = 1234.567; System.out.format("d = %f%n", d); System.out.format("d = %g%n", d); // zmena v java 1.7 System.out.format("d = %e%n", d); // zmena v java 1.7 System.out.format("d = %10.1f%n", d); System.out.format("d = %-10.1f%n", d); int j = 30; System.out.format("j = %o%n", j); System.out.format("j = %x%n", j); System.out.format("j = %X%n", j); System.out.format("j = %3X%n", j); System.out.format("j = %#x%n", j); String s = "ahoj lidi"; System.out.format("s = %s %n", s); System.out.format("s = %S %n", s); System.out.format("s = %11s %n", s); System.out.format("s = %-11s %n", s); System.out.format("s = %.3s %n", s); System.out.format("s = %11.3s %n", s); System.out.format("Pivo \"lezak\" ma 12%%%n"); System.out.format("Znak 'backslash' je \\%n"); j = 30; System.out.format("%d = %o = %X%n", j, j, j); System.out.format("%1$d = %1$o = %1$X%n", j); System.out.format("%d = %<o = %<X%n", j); String zformatovanyretezec = String.format ("%6d", 123); System.out.println(zformatovanyRetezec); String hexcislo = "1A"; int cislo = Integer.parseInt(hexCislo, 16); System.out.format("%s H = %d D = %o O%n", hexcislo, cislo, cislo); System.out.println("konec"); Strana 15 (celkem 26)

nova radka i = -1234 i = -1234 i = -1234 i = -1234 i = -1234 i = -001234 i = -1 234 c = a c = a c = A c = a c = A d = 1234,567000 d = 1234.57 // od verze 1.7: 1234,57 d = 1.234567e+03 // od verze 1.7: 1,234567e+03 d = 1234,6 d = 1234,6 j = 36 j = 1e j = 1E j = 1E j = 0x1e s = ahoj lidi s = AHOJ LIDI s = ahoj lidi s = ahoj lidi s = aho s = aho Pivo "lezak" ma 12% Znak 'backslash' je \ 30 = 36 = 1E 30 = 36 = 1E 30 = 36 = 1E 123 1A H = 26 D = 32 O konec Od verze Java 1.7 se u formátů reálných čísel v System.out.format() zobrazuje vždy desetinná čárka. Strana 16 (celkem 26)

Jak tedy zobrazit ve formátovaném výstupu desetinnou tečku? Použijeme třídu Formatter (obdobně jako Scanner) Výpis se pak volá stejně jako System.out.format, jen místo System.out se použije objekt Formatteru import java.util.*; public class PouzitiFormatter { // import java.util.formatter; Formatter f = new Formatter(System.out, Locale.US); //US //Formatter f = new Formatter(System.out); //CZ public static void main(string [] args){ double d = 1234.567; f.format("d = %f%n", d); f.format("d = %g%n", d); f.format("d = %e%n", d); f.format("d = %10.1f%n", d); f.format("d = %-10.1f%n", d); f.close(); // nutno uzavrit Výpisy - v US lokalizaci: d = 1234.567000 d = 1234.57 d = 1.234567e+03 d = 1234.6 d = 1234.6 V CZ lokalizaci (tj. bez nastavení lokalizace): d = 1234,567000 d = 1234,57 d = 1,234567e+03 d = 1234,6 d = 1234,6 Strana 17 (celkem 26)

Formátovaný vstup 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., v reálném čísle) - používá metody: 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 18 (celkem 26)

Příklad (problém vyprázdnění vstupu) import java.util.*; public class VyprazdneniVstupu { public static void main(string [] args) { Scanner sc = new Scanner(System.in); 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(); //zakomentovat - chyba // docteni radky <cr> a <lf> - 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 19 (celkem 26)

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 20 (celkem 26)

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(), či v nějaké další metodě) více bude vysvětleno později. Vstup s použitím argumentů (příkazová řádka) public class VstupArgumenty { // cisla zadana jako parametry v 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); Poznámka: Metoda parseint() provádí převod řetězce na celé číslo (bude vysvětleno později - se třídou String), později ještě kód doplníme o test existence argumentů (parametrů). Strana 21 (celkem 26)

Grafický nástroj DrawingTool 1 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 22 (celkem 26)

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 23 (celkem 26)

Jak na problém z úvodu přednášky? Použijeme pouze znalosti z dnešní přednášky. Rozdělíme problém na podproblémy (červené vynecháme). Je dán počet testovaných případů t (1 t 100) a pro každý takový případ je na samostatném řádku zadáno celé číslo n (-1000 n 1000). Pro zadané n spočtěte a na samostatném řádku vypište výsledek následujícího úkolu: Vynásobte číslo n 567-mi, poté vydělte výsledek 9, přičtěte 7492, pak vynásobte 235, výsledek vydělte 47 a odečtěte 498. Začátek čti n v n * 567 / 9 v (v + 7492) * 235 načti n v n * 567 / 9 v (v + 7492) * 235 v v/ 47 498 vypiš v v v/ 47-498 vypiš v Konec Strana 24 (celkem 26)

Jaká číslice je ve vypočtené hodnotě na řádu desítek? Použijeme operaci mod - např. 123 % 10 = 3 Začátek čti n v n * 567 / 9 v (v + 7492) * 235 načti n v n * 567 / 9 v (v + 7492) * 235 v v/ 47 498 v v/10 mod 10 vypiš v v v/ 47-498 v v/ 10 mod 10 vypiš v Konec Je to ale ok? n = 200 n = 50 n = -50 n = -500 6 ok 1 ok 1 ok -3??? není ok! Co je tedy ještě třeba? - udělat absolutní hodnotu z výsledku Strana 25 (celkem 26)

Začátek čti n v n * 567 / 9 v (v + 7492) * 235 v v/ 47-498 načti n v n * 567 / 9 v (v + 7492) * 235 v v/ 47 498 v v/10 mod 10 v v vypiš v v v/ 10 mod 10 v v vypiš v Konec int n = sc.nextint(); int v = (n * 567 / 9 + 7492) * 235 / 47 498; v = v/10 % 10; v = Math.abs(v); System.out.println(v); n = -500 3 ok!!! Pokračovat v řešení problému budeme na konci další přednášky... Strana 26 (celkem 26)