4 KTE / ZPE Informační technologie Ing. Petr Kropík, Ph.D. email: pkropik@kte.zcu.cz tel.: +420 377 63 4639, +420 377 63 4606 (odd. informatiky) Katedra teoretické elektrotechniky FEL ZČU Plzeň
Největší společný dělitel použití výjimek při komunikaci s uživatelem (ošetření vstupu): package fel.kte.zpe; import java.util.inputmismatchexception; import java.util.scanner; /** * Největší společný dělitel dvou čísel * * @author Petr Kropík public class Hlavni { public static int nsd(int a, int b) { if ((a <= 0) (b <= 0)) { return 0; while (a > 0) { if (a > b) { a = a - b; else { b = b - a; if (b == 0) { return a; return 0; /** * Hlavní spouštěcí funkce * * @param args the command line arguments public static void main(string[] args) { Scanner klavesnice = new Scanner(System.in); System.out.printf("Největší společný dělitel dvou čísel%n"); int prvnicislo; while (true) { try {
System.out.printf("Zadejte první číslo: "); prvnicislo = klavesnice.nextint(); break; catch (InputMismatchException ex) { System.out.printf("To nebylo číslo...%n"); klavesnice.next(); int druhecislo; while (true) { try { System.out.printf("Zadejte druhé číslo: "); druhecislo = klavesnice.nextint(); break; catch (InputMismatchException ex) { System.out.printf("To nebylo číslo...%n"); klavesnice.next(); int vysledek = nsd(prvnicislo, druhecislo); System.out.printf("Nejvetsi spolecny delitel cisel %d a %d je %d%n", prvnicislo, druhecislo, vysledek);
OOP Objektově Orientované Programování (objektové programování) - princip Vlastnosti tříd - třída je jakýmsi vzorem pro své instance (objekty) - třída je jako datový typ pro proměnné. - má datové prvky atributy, které ji "popisují" - má metody jakýsi "komunikační kanál" k datovým prvkům instance dané třídy (tj. objektu) - dynamická vazba lze vytvořit program tak, že to, která metoda se bude volat, je určeno až za běhu programu.
- objekty viz obrázky výše
- obdobně např.: slon Pepa má vlastnosti -> datové prvky (viz ukázka kódu dále) public class Slon { private int vyska; private String jmeno; // konstruktor třídy public Slon(String novejmeno, int novavyska) throws ZapornaHodnotaException { jmeno = novejmeno; setvyska(novavyska); // a jedna metoda na ukázku public void setvyska(int novavyska) throws ZapornaHodnotaException { if (novavyska >= 0) vyska = novavyska; else throw new ZapornaHodnotaException("Zaporna vyska nelze"); // "spouštěcí funkce třídy" public static void main(string[] args) { Slon a, b; a = new Slon("Ferda", 220); b = new Slon("Bimba", 200); a.setvyska(250); b.setvyska(230); // konec metody main // konec třídy Slon
Zapouzdření (encapsulation) Slon a; a = new Slon("Lojzik", 220); a.vyska = 230; je-li vyska privátní prvek => nešlo by to. - třída (class) je realizací (implementací) abstraktního datového typu Příklad Výpočet obsahu kruhu objektově řešený příklad z první přednášky Formulace problému: vstupní údaj: poloměr r, výstupní údaj: obsah kruhu S Analýza: S= πr 2 Sestavení algoritmu výpočtu: Slovní popis: Je poloměr r >0? ANO NE S= pi*r*r Vypiš:Poloměr r musí být kladný Vypiš: obsah S Konec S Z r > 0 + = π * r * r Piš: S K - Piš: r musí být kladný
Pro objektové jazyky se pro návrh a popis struktury aplikací používá UML - UML Unified Modeling Language vyjadřuje vztahy mezi daty, vlastnosti objektů a co objekty umí (metody)
UML diagram naší aplikace pro výpočet obsahu kruhu package fel.kte.zpe.obsahkruhu; /** * * @author Petr Kropík public class Kruh { private double polomer; public Kruh(double polomer) throws ZapornaHodnotaVyjimka { setpolomer(polomer); public double getpolomer() { return polomer; public final void setpolomer(double novypolomer) throws ZapornaHodnotaVyjimka { if (novypolomer >= 0.0) { polomer = novypolomer;
else { throw new ZapornaHodnotaVyjimka("Zaporny polomer nelze..."); public double kolikmasobsah() { return Math.PI * Math.pow(polomer, 2); package fel.kte.zpe.obsahkruhu; /** * * @author petr public class ZapornaHodnotaVyjimka extends Exception { public ZapornaHodnotaVyjimka(String zprava) { super(zprava); package fel.kte.zpe.obsahkruhu; import java.util.scanner; /** * * @author Petr Kropík public class Hlavni {
/** * @param args parametr příkazového řádku public static void main(string[] args) { Kruh kr1; System.out.printf("Zadej poloměr kruhu: "); Scanner klavesnice = new Scanner(System.in); double r; r = klavesnice.nextdouble(); try { kr1 = new Kruh(r); System.out.printf("%nObsah kruhu o poloměru %f je: %f%n", kr1.getpolomer(), kr1.kolikmasobsah()); catch (ZapornaHodnotaVyjimka ex) { System.out.printf("%nPoloměr kruhu musí být nezáporný.%n"); Příště si rozšíříme příklad na pole Kruhů.