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 DrawingTool 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
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
K Zm m N Z 1 Největší hodnota soustavy MAX Kapacita soustavy
Významné soustavy Základ 10 2 8 16
Soustava
Hodnoty
desítková 0,1,2,3,4,5,6,7,8,9 (dekadická) dvojková 0,1 (binární), osmičková 0,1,2,3,4,5,6,7 (oktalová) šestnáctková 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F (hexadecimální)
Š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 Strana 2 (celkem 26)
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)
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);
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
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); } }
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í podtečení
přetečení -max
-min
0
přetečení +max
+min
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(); // 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 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); - šestnáctková soustava, např. pro int j = 30; System.out.format("j = %X%n", j); - počet míst lze určit, např.: System.out.format("j = %3X%n", j); - lze vynutit nevýznamové nuly, např. pro: int j System.out.format("j = %02X%n", j);
// j = 36 // j = 1E // j = 1E
= 10; // 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 = %
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 d = 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 1.7: 1234,57 // od verze 1.7: 1,234567e+03
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.*;
// import java.util.Formatter;
public class PouzitiFormatter { 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
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 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 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 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 1 1 -3
ok ok ok ??? 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
n = -500
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);
3 ok!!!
Pokračovat v řešení problému budeme na konci další přednášky ...
Strana 26 (celkem 26)