# data[].attributes.attachment_link.description
A web application to support the development of computational thinking by teaching the Python programming language.

# data[].attributes.attachment_link.readable_text
For more than 50 years, Pitsco Education has supplied classrooms with innovative and engaging kits, equipment, and activities that put the power of STEM learning into students' hands and minds. Our classroom-proven concepts bring together student-centered, standards-based activities with hands-on projects that develop critical thinking and collaboration skills in exciting areas such as robotics, dragsters, aerospace, sustainable energy, structures, engineering, and physical science. Conveniently packaged with classroom management in mind and backed by our industry-leading customer service and technical support, everything we provide is teacher tested and teacher approved.

# data[].attributes.attachment_link.description
For more than 50 years, Pitsco Education has supplied classrooms with innovative and engaging kits, equipment, and activities that put the power of STEM learning into students' hands and minds. Our classroom-proven concepts bring together student-centered, standards-based activities with hands-on projects that develop critical thinking and collaboration skills in exciting areas such as robotics, dragsters, aerospace, sustainable energy, structures, engineering, and physical science.

# data[].attributes.attachment_link.readable_text
Kvalifikované vzdělávací instituce mají nárok na vzdělávací software a služby společnosti Autodesk. Kvalifikovaná vzdělávací instituce je instituce, která byla akreditována autorizovanou vládní agenturou pro primární účel výuky zapsaných studentů. To zahrnuje všechny akreditované veřejné a soukromé školy, včetně následujících:

Druhý stupeň základních škol a střední školy

Nižší stupně vysokých škol

Vysoké školy, univerzity a technické školy

Programy domácího vzdělávaní, které jsou součástí celostátně uznávaného orgánu pro domácí vzdělávání (nebo orgánu, který je řídicím orgánem místní školy uznán jako přijatelná alternativa akreditované vzdělávací instituce)

Následující typy organizací nejsou kvalifikované vzdělávací instituce:

Neakreditované vzdělávací instituce

Školicí střediska

Církve, nemocnice, zdravotnické systémy a veřejné knihovny

Výzkumné laboratoře

Rekvalifikační programy

Pokud vaše organizace nemá nárok, přečtěte si část Možnosti pro organizace, které nemají nárok.

Poznámka: Většina vzdělávacích institucí po celém světě má na přístup pro účely vzdělávání nárok. Výjimku tvoří instituce v zemích, na něž se vztahuje obchodní embargo Spojených států. Další informace naleznete v části Soulad s vývozními předpisy (angličtina).

# data[].attributes.attachment_link.title
Vzdělávání Autodesk | Správci a instituce | Dostupné produkty

# data[].attributes.attachment_link.description
Kvalifikované vzdělávací instituce mají nárok na vzdělávací software a služby společnosti Autodesk. Kvalifikovaná vzdělávací instituce je instituce, která byla akreditována autorizovanou vládní agenturou pro primární účel výuky zapsaných studentů.

# data[].attributes.attachment_link.title
MINDSTORMS EV3 Support | Everything You Need | LEGO® Education

# data[].attributes.attachment_link.description
Bring MINDSTORMS EV3 into your high school classroom with hands-on lesson plans, software downloads, teaching resources, building instructions and FAQs.

# data[].attributes.attachment_link.description
Megarobot.cz - ehsop zabývající se roboty a robotikou pro všechny.

# data[].attributes.attachment_link.readable_text
Don't settle for an all-in-one DevOps tool. Start by connecting Bitbucket and Jira Software via Atlassian's Open DevOps solution, then build out your custom DevOps stack with market-leading partner tools across security, testing and monitoring.

# data[].attributes.attachment_link.title
Bitbucket | Git solution for teams using Jira

# data[].attributes.attachment_link.description
Bitbucket Cloud is a Git-based code and CI/CD tool optimized for teams using Jira.

# data[].attributes.attachment_link.readable_text
Program je uložen v PLC buď v záložní paměti RAM s baterií nebo v jiné energeticky nezávislé flash paměti.

Jak Albert Einstein řekl: " Svět, který jsme si vytvořili, je produktem našeho myšlení. Nelze změnit svět, dokud nezměníme svoje myšlení ". PLC programovací jazyky se vyvinuly tak, aby se přizpůsobily a změnily způsob, jakým programujeme. Podíváme se na všech pět programovacích jazyků, jak jsou definovány normou ČSN EN 61131-3 ed. 2.

Jazyk strukturovaného textu (ST)

Jazyk funkčního blokového schématu (FBD)

Sekvenční funkční diagram (SFC)

Jazyk seznamu instrukcí (IL)

Jazyk příčkového diagramu (LD)

Ne všechny tyto programovatelné jazyky jsou k dispozici v každém PLC. Programování v jazyku příčkového diagramu je zdaleka největším procentuálním využitím v dnešních PLC. Základní pojmy programování PLC jsou společné všem výrobcům. Rozdíly v adresaci I/O, organizaci paměti a instrukčních sadách znamenají, že programy PLC nejsou nikdy vzájemně zaměnitelné mezi různými výrobci. Dokonce i v rámci jedné výrobní řady jednoho výrobce nemusí být různé modely přímo kompatibilní.

Programovací jazyk PLC, který je použit, může ovlivňovat:

Údržbu a odstraňování problémů

Znalost jazyka

Akceptaci země/umístění

Použití PLC

Snadnou změnu programu PLC

Vhodnou metodou vývoje programu je dodržení následujících pěti kroků, které tvoří základ vývoje programu všech PLC.

Těchto pět kroků vám pomůže při programování PLC:

1. Definujte úkol

2. Definujte vstupy a výstupy

3. Vytvořte sled logických operací

4. Vytvořte program pro PLC

5. Otestujte program

Všimněte si, že vlastní programování je druhým až posledním bodem vývoje. Obvykle se věnuje více času pochopení úkolu a provozu.
Jak bylo uvedeno výše, jazyky podporované jednotlivými PLC se mohou lišit. Zjistěte si proto, jaké typy programování, model vašeho PLC podporuje.

Programovací jazyky PLC

Jazyk strukturovaného textu (ST)
Je programovací jazyk na vysoké úrovni, který se velmi podobá programování v Pascalu. K definování toho, co je třeba provést se používají výrazy.

Jazyk funkčního blokového schématu (FBD)
Je grafické znázornění bran AND, NAND, OR, NOR, atd., které jsou zakresleny. Popisuje funkci mezi vstupními a výstupními proměnnými.

Sekvenční funkční diagram (SFC)
Je zobrazen jako vývojový diagram vašeho programu. Definuje kroky, kterými se váš program pohybuje.

Jazyk seznamu instrukcí (IL)
Lze ho také označit jako mnemotechnický kód a seznam příkazů. Obsahuje jednoduché pokyny pro prohlížení vašich polí
proměnných.

Jazyk příčkového diagramu (LD)
Je nejpopulárnější programovací jazyk PLC. Má napodobovat mechanické relé v panelu, které programovatelný automat nahrazuje. Má dvě svislé kolejnice a řadu horizontálních příček mezi nimi. Ovladače většinou skenují zleva doprava a shora dolů. Výstup jednoho stupně je k dispozici pro další příčku.

Programovací metody PLC se stále vyvíjejí. PLC Open je organizace, která definuje nové metody využívající nejnovější počítačové inovace. Stanovili například metodu programování jazyka IL do jazyka XML (Extended Markup Language), který se používá pro vývoj webových aplikací.

Foto: Z přednášky IEC 61131 Basics, Bill Lydon, odborný konzultant a analytik pro automatizační průmysl

# data[].attributes.attachment_link.title
Co by měl každý vědět o programovacích jazycích PLC

# data[].attributes.attachment_link.description
Program je uložen v PLC buď v záložní paměti RAM s baterií nebo v jiné energeticky nezávislé flash paměti. Jak Albert Einstein řekl: " Svět, který jsme si vytvořili, je produktem našeho myšlení. Nelze změnit svět, dokud nezměníme svoje myšlení ". PLC programovací jazyky se vyvinuly tak, aby se přizpůsobily a změnily způsob, jakým programujeme.

# data[].attributes.attachment_link.description
Česká programátorská sociální síť a materiálová základna pro C# .NET, Javu, PHP, HTML a CSS, JavaScript, C, C++, XNA, ASP.NET, algoritmy, databáze a další.

# data[].attributes.attachment_link.readable_text
Proč znovu vynalézat kolo, když to už před vámi udělali jiní? Stejně tak můžete ušetřit spoustu času i peněz tím, když se rozhodnete využít dříve vytvořených 3D modelů součástek i celých sestav nejrůznějších výrobků.

Na následujících řádcích vás seznámíme s nejlepšími weby, na kterých najdete 3D a CAD modely použitelné pro výrobu na 3D tiskárnách, CNC frézkách nebo jako obrazová data pro počítačové hry, vizualizace a animace. Na výběr je z několika milionů objektů v mnoha formátech včetně praktického STL, které jsou navíc často k dispozici zcela zdarma.

Největší úložiště volně dostupných modelů pro 3D tisk se sice v posledních měsících potýká se stížnostmi ze strany uživatelů, kteří zaznamenávají pomalejší odezvu webu, přesto jde stále o volbu číslo 1 pro každého, kdo hledá model pro výrobu nebo inspiraci, ať už jde o Muskův Cybertruck, hlavu Baby Yody pro cosplay nebo čistě praktické držáky, kryty či pomůcky do domácnosti. Vedle samostatných modelů a jejich kolekcí nabízí Thingiverse také stovky bezplatných lekcí pro všechny úrovně škol. K více než dvěma milionům volně dostupných 3D modelů může každý přispět svým vlastním dílem, neboť právě ze sázky na otevřenou komunitu vychází popularita tohoto webu, který původně vznikl jako doprovodná služba pro uživatele 3D tiskáren MakerBot.

Pokud patříte nebo vzhlížíte k profesionálním konstruktérům, pravděpodobně už máte svůj účet na webu Grabcad.com, který je s takřka 7 miliony registrovanými členy pravděpodobně největší on-line komunitou s tímto zaměřením. Vedle sociálního rozměru, který propojuje konstruktéry mezi sebou, je zde rozsáhlá databáze většinou poměrně komplexních modelů v různých 3D CAD formátech, čítající kolem 10 tisíc objektů. Nad rámec této databáze poskytuje GrabCAD navíc unikátní cloudové aplikace pro spolupráci (Workbench) a správu 3D tisku (Print).

Sháníte vyrobitelný CAD model letadlového motoru a nemáte problém za něj zaplatit tisíc dolarů? Právě takové situace řeší on-line tržiště cgtrader.com, obsahující k dnešku již takřka milion převážně profesionálních 3D modelů. O jejich kvalitách nasvědčuje to, že má tento portál více než 2,4 milionu registrovaných uživatelů a data od něj odebírá pětina z pěti set největších firem světa. Pokud hledáte modely použitelné pro 3D tisk, najdete jich zde více než 170 tisíc, přičemž poměrně velké množství z nich je k dispozici zdarma. Jakožto virtuální tržiště vám pak cgtrader.com umožní zpeněžovat vaši vlastní 3D tvorbu, přičemž z každého prodaného modelu obdržíte 70 až 80 % prodejní ceny.

Gigantická databáze obsahující víc než 820 tisíc kvalitních 3D modelů nejrůznějších objektů od technických součástek přes komplexní sestavy (jako je třeba celá ropná plošina) po detailní anatomické modely lidského těla, oslovuje především profesionální tvůrce vizuálního obsahu, jako jsou počítačové hry, speciální efekty nebo virtuální realita. Soubory jsou nabízeny ve čtrnácti různých 3D formátech, kupříkladu STL modelů je v době psaní tohoto článku nabízeno přes 43 tisíc, z toho 765 zdarma.

Web Instructables.com je splněným snem každého nadšeného kutila. Ať už vyrábíte elektroniku, skládáte vlastní CNC frézku, vracíte do života omšelého veterána, chcete uplést indiánské mokasíny nebo si vyrobit náhradní oko, na tomto webu pravděpodobně najdete podrobný návod, jak na to. Nepřeberné množství projektů je podrobně popsáno formou tutoriálů, videí a obvykle nechybí ani zdrojové soubory pro 3D tisk nebo NC výrobu. Navíc zde najdete sadu unikátních lekcí, ve kterých se můžete naučit ovládat různé výrobní technologie od obráběcích strojů přes svářečky po programování vlastní elektroniky.

Řádově statisíce 3D modelů všeho možného s těžištěm v oblasti architektury, nábytku, infrastruktury, ale také dopravních prostředků a strojů, najdete v databázi 3Dwarehouse, která doprovází velmi populární 3D modelovací software SketchUp, který je oblíbený pro svoji šikovnou bezplatnou verzi. Jakožto plošný 3D modelář sice není primárně sám o sobě určen pro tvorbu vyrobitelných a tisknutelných 3D modelů, tyto lze však z aplikace získat s pomocí dostupných plug-inů. SketchUp je navíc díky velmi intuitivnímu rozhraní ideálním softwarem pro ty, kdo se teprve seznamují se 3D modelováním a volně dostupné 3D modely zde mohou posloužit jako cenná inspirace.

Databáze modelů od výrobců 3D tiskáren

Vedle již zmíněného Thingiverse.com, které je sice jednoznačně nejhlubší studnicí modelů pro 3D tisk, by byla škoda opomenout databáze od dalších výrobců 3D tiskáren, jež také nabízejí spoustu zajímavého obsahu. Z českých luhů a hájů pochází ta nejmladší z nich - Prusaprinters.org od pražské firmy Prusa Research, staví na globální popularitě svých opensource 3D tiskáren a z produkce jejich uživatelů nabízí již víc než 13 tisíc tisknutelných modelů.

Za pozornost stojí také web Pinshape.com, který v roce 2016 přežil svoji vlastní smrt. Poté, co se jej jeho zakladatelé rozhodli pro neudržitelný obchodní model zavřít, podpořil jeho další existenci výrobce 3D tiskáren Formlabs a zachránil tak od zániku jeho rozsáhlou databázi tisknutelných 3D modelů, diskusní fóra a další užitečný obsah.

Zejména uživatelé 3D tiskáren typů FDM/FFF pak mohou najít užitečné 3D modely také v databázi Zortrax Library, která obsahuje asi devět stovek objektů ve formátu STL optimalizovaných pro materiál ABS.

Vyhledávače 3D modelů

Jelikož databází komerčních i bezplatných 3D modelů je mnohonásobně více než zmiňuje tento článek a ruční procházení každé z nich při hledání vhodného objektu je kontraproduktivní, můžete si ušetřit spoustu času při využití některého z vyhledávačů, které databáze těchto repozitářů indexují podobně jako webový vyhledávač. V případě, že hledáte primárně STL soubory tisknutelných objektů a chcete je získat zdarma, vyzkoušejte STLfinder.com. Mezi zpoplatněnými 3D modely se dobře orientuje web 3dmdb.com, indexující téměř 4,5 milionu objektů nebo Yeggi.com se zhruba poloviční databází.

# data[].attributes.attachment_link.title
12 nejlepších webů, kde hledat modely pro 3D tisk, obrábění a vizualizace

# data[].attributes.attachment_link.description
Na následujících řádcích vás seznámíme s nejlepšími weby, na kterých najdete 3D a CAD modely použitelné pro výrobu na 3D tiskárnách, CNC frézkách nebo jako obrazová data pro počítačové hry, vizualizace a animace. Na výběr je z několika milionů objektů v mnoha formátech včetně praktického STL, které jsou navíc často k dispozici zcela zdarma.

# data[].attributes.attachment_link.provider_name
CREALITY CLOUD - The All-in-One 3D Printing Platform

# data[].attributes.attachment_link.title
CREALITY CLOUD - The All-in-One 3D Printing Platform

# data[].attributes.attachment_link.description
Creality Cloud is a platform for 3D printing creation and an ever-growing community for EVERYONE.

# data[].attributes.attachment_link.description
Společnost SolidVision dlouhodobě podporuje vzdělávání a výuku 3D CAD systému SOLIDWORKS a CAM systémů na všech úrovních škol - ať už pořádáním seminářů a soutěží, dodávkou softwaru, prováděním certifikací či přípravou výukových podkladů, včetně učebnice. Pro více informací se obraťte přímo na zástupce pro oblast školství, pana Mgr. Michala Ševčíka.

# data[].attributes.attachment_link.readable_text
Na této straně najdete přehled učebních textů, které jsme pro vás během dlouhé historie semináře připravili.

Kuchařky byly začátkem 24. ročníku uspořádány do knihy Programátorské kuchařky.

Základní kuchařky

Studijní text vysvětlující od základů, co to je program a algoritmus. Ukážeme si základní datové struktury (pole, spojové seznamy, grafy, stromy, ...) a také některé z nejzákladnějších programovacích technik, které by měl znát každý programátor: rekurze, backtracking nebo třeba hladové algoritmy. Povinné čtivo pro každého začínajícího řešitele.

"Už to počítá dva dny a ještě nevypadlo ani písmenko..." Jak se porovnává efektivita algoritmů, co je to složitost algoritmu, jak se počítá a jaké jsou její druhy, to všechno se dozvíte v této kuchařce.

Dostaneme seznam lidí, chceme je seřadit podle jmen. Tomu se říká třídění. Jaké algoritmy řešící daný problém v různých podmínkách umíme vymyslet?

Co je to graf? Vrchol, hrana? Sled, tah, cesta? K čemu všechny ty pojmy jsou? V této kuchařce najdete popis prohledávání do hloubky a do šířky a také topologické uspořádání.

Rozšiřující kuchařky

Binární vyhledávání je mocná technika, která se objevuje ve všemožných algoritmech a úlohách. S pomocí binárního vyhledávání umíme rychle vyhledat hodnotu v seřazeném poli nebo třeba zredukovat úlohu hledající největší možný počet hostů v hotelu na úlohu tázající se, jestli umíme ubytovat nějaký konkrétní počet hostů.

Halda je jednoduchá datová struktura, která nabízí rychlé vkládání prvků a výběr prvku největšího. To se dá využít ve dvou důležitých algoritmech: v třídění haldou a Dijkstrově algoritmu pro nalezení nejkratší cesty.

U mnoha problémů jsme schopni zvýšit rychlost tím, že je vyřešíme vhodným rozdělením na menší úlohy, zpracováním a následným sloučením navrácených částečných řešení.

Vyhledávací stromy umí uchovávat proměnlivé množství dat se zaručeně logaritmickými časovými náklady na typické operace.

Treapy jsou blízcí příbuzní vyhledávacích stromů. Mají logaritmickou časovou složitost jen v průměru, ale pracuje se s nimi mnohem příjemněji.

U mnoha problémů jsme schopni zvýšit rychlost tím, že je vyřešíme postupným zapracováváním větších a větších částí vstupu do řešení.

Hešování umí uchovávat proměnlivé množství dat s průměrně konstantními náklady na typické operace.

Pokročilé kuchařky

Rovinné grafy jsou takové, že je můžeme bez křížení hran nakreslit do roviny. Jaké mají vlastnosti?

Kostra je takový podgraf souvislého grafu, který je stromem, ale zároveň obsahuje všechny vrcholy. Minimální kostra v ohodnoceném grafu je taková kostra, kterýchžto hran ohodnocení má nejmenší součet. Jak ji najít je slavný, ale stále ještě ne-úplně-vyřešený problém.

Jak při procházce právě jednou navštívit všechny vrcholy grafu? To je těžký problém, kýžené cestě se říká hamiltonovská. Jak projít všechny hrany grafu? To je naopak jednoduché - takovému tahu v grafu se říká eulerovský a tím se zabývá tento text.

Máme-li předlouhý řetězec S a hledáme-li v něm P, můžeme to zkusit porovnáváním každého podřetězce S délky |P| s P, ale jde to i rychleji a hlavně podstatně zajímavěji.

Máme souřadnice stromů v sadu a chceme sad oplotit co nejkratším plotem. Rozházíme po stole špejle a chtěli bychom vědět, kde všude se kříží. Podíváme se na to, jak se program může naučit zametat a předem si projdeme, naprosté základy analytické geometrie.

Intervalový strom umí uchovávat posloupnost a rychle provádět změnu libovolného prvku a dotaz na nějakou operaci přes libovolný interval z ní (součet, maximum, ...).

Jak přepravit co nejvíc materiálu po distribuční síti? Jak najít maximální párování v bipartitním grafu? Jak zjistit, kolik vede z vrcholu do vrcholu disjunktních cest?

Je P rovno NP? Jaké problémy jsou doopravdy těžké? Řešení podvodem a jiné bláznivosti.

V této spíše teoretické kuchařce najdete směsici různých užitečných poznatků souvisejících především s aritmetikou. Naučíte se z ní například rychle počítat mocniny nebo použití Čínské zbytkové věty.

V této kuchařce nahlédneme do základů teorie pravděpodobnosti a vybudujeme jí dost na to, abychom uměli zkoumat jednoduché randomizované algoritmy.

Nekuchařky

Ve dvanácté sérii jsme k řešení úlohy 12-2-1 sepsali povídání o konstrukci vyhledávacích automatů, a ačkoliv tento textík není vyloženě kuchařka, určitě je hoden pročtení.

# data[].attributes.attachment_link.description
Na této straně najdete přehled učebních textů, které jsme pro vás během dlouhé historie semináře připravili. Kuchařky byly začátkem 24. ročníku uspořádány do knihy Programátorské kuchařky. Studijní text vysvětlující od základů, co to je program a algoritmus. Ukážeme si základní datové struktury (pole, spojové seznamy, grafy, stromy, ...)

# data[].attributes.attachment_link.readable_text
Úvod, srovnání s jinými, oblasti použití Javy

Distribuce, instalace, použití Java SDK

Životní cyklus programu v Javě

Základní praktické úkony - velmi podrobně!!!

program v Javě je meziplatformně přenositelný na úrovni zdrojového i přeloženého kódu

je to umožněno tím, že přeložený javový program běží v tzv. (JVM)

zdrojový i přeložený kód je tedy přenositelný mezi všemi obvyklými platformami (UNIX, Windows, MAC OS X, ale také sálové počítače, minipočítače typu IBM AS/400 apod.)

Kód je při běhu dobře zabezpečen:

webové aplikace (servlety, JSP - konkurence proprietárním ASP, SSI, ... a pomalým CGI)

zpracování semistrukturovaných dat (XML)

přenositelné aplikace s GUI

aplikace distribuované po síti (applety nebo Java Web Start)

chování JVM se mění např. pokud se objeví bezpečnostní "díra" nebo nelze-li dosáhnout požadované změny chování pomocí modifikace Java Core API

daleko konzervativnější je samotný jazyk - mění se zřídka, ale přece: např. Java2, v1.4 přidáván nové klíčové slovo "assert", v1.5 přidá enum a další.

používání Javy pro běžný vývoj (i komerční) je zdarma

redistribuce javového vývojového prostředí je dovolena pouze s licencí od Sunu

redistribuce javového běhového prostředí je možná zdarma

distribuce vyvíjí Sun Microsystems Inc. (Javasoft) i další výrobci (např. IBM) a tvůrci Open Source

Zdrojový kód v souboru tomp\ucebnice\Pozdrav.java

Třída Pozdrav je umístěna do balíku tomp.ucebnice ->

její zdrojový soubor musí být uložen v podadresáři tomp\ucebnice.

Překlad

1. Máme nainstalován J2SDK 1.4.2

2. Je-li program správně napsán, přeloží se "mlčky"

3. (výsledný .class soubor bude v témže adresáři jako zdroj)

Spuštění

1. Volba překladače zajistí, že (dříve přeložené) třídy používané při spuštění této třídy budou přístupné pod adresářem .

2. Je-li program správně napsán a přeložen, vypíše se Ahoj!

Vytvoření a editace zdrojového kódu v editoru PSPad 4.2.2 (dostupný zdarma, instalovaný na všech Win strojích v učebnách na FI)

Překlad překladačem javac (úspěšný, bez hlášení překladače)

Spuštění javového programu

= spuštění metody main jedné ze tříd tvořících program

Tato funkce může mít parametry:

Její hlavička musí vypadat vždy přesně tak, jako ve výše uvedeném příkladu, jinak nebude spuštěna!

Systémové proměnné by měly obsahovat:

První cvičení vám pomůže seznámit se s procesem životního cyklus javového programu: zápis a správné umístění zdrojového textu, překlad, spuštění. Proto si jako první krok budete muset vybrat platformu, pod níž budete vaše programy vyvíjet, překládat, spouštět.

Výběr platformy je na vás, ale při odevzdávání hotových úloh se musíte řídit pokyny cvičících, kteří mohou předepsat, v jaké formě zdrojové texty úloh chtějí.
Příklad 2.1. Příklad 2.2.

Pojmy: třída, objekt

Deklarace a definice tříd, jejich vlastnosti (proměnné, metody)

Vytváření objektů (deklarace sama objekt nevytvoří...), proměnné odkazující na objekt

Jmenné konvence - jakk tvořit jména tříd, proměnných, metod

Použití objektů, volání metod, přístupy k proměnným

Modifikátory přístupu/viditelnosti (public, protected...)

Konstruktory (dotvoří/naplní prázdný objekt)

Přetěžování metod (dvě metody se stejným názvem a jinými parametry)

Třída (také poněkud nepřesně zvaná objektový typ) představuje skupinu objektů, které nesou stejné vlastnosti

"stejné" je myšleno kvalitativně, nikoli kvantitativně, tj.

Objekt je jeden konkrétní jedinec (reprezentant, entita) příslušné třídy

pro konkrétní objekt nabývají vlastnosti deklarované třídou konkrétních hodnot

Příklad:

Vlastnostmi objektů jsou:

Vlastnosti objektů - proměnné i metody - je třeba deklarovat.

viz Sun Java Tutorial / Trail: Learning the Java Language: Lesson: Classes and Inheritance

Proměnné

de facto jde o datové hodnoty svázané (zapouzdřené) v objektu

Metody

1. jsou nositeli "výkonných" vlastností; "dovedností" objektů

2. de facto jde o funkce (procedury) pracující (převážně) nad proměnnými objektu

Mějme deklarovánu třídu Clovek

Metoda main v následujícím programu:

Tedy: vypíší se informace o obou vytvořených objektech - lidech.

Nyní podrobněji k objektů.

Ve výše uvedeném programu znamenalo na řádku:

Clovek ales: pouze deklarace (tj. určení typu) proměnné ales - bude typu Clovek.

ales = new Clovek ("Ales Necas", 1966): vytvoření objektu Clovek se jménem Ales Necas.

Lze napsat zvlášť do dvou řádků nebo (tak jak jsme to udělali) na řádek jeden.

Každý příkaz i deklaraci ukončujeme středníkem.

Položky jmeno a rokNarozeni v předchozím příkladu jsou proměnné objektu Clovek.

Jsou deklarovány v těle deklarace třídy Clovek.

Deklarace proměnné objektu má tvar:

např.:
protected int rokNarozeni;
Výše uvedená proměnná rokNarozeni měla datový typ int (32bitové celé číslo). Tedy:

Kromě celých čísel int nabízí Java celou řadu dalších primitivních datových typů. Primitivní typy jsou dané napevno, programátor je jen používá, nedefinuje. Podrobněji viz Datové typy v Javě

Tam, kde nestačí diskrétní hodnoty (tj. primitivní typy), musíme použít typy , objektové.

Objektovými typy v Javě jsou třídy (class) a rozhraní (interface). Třídy už jsme viděli v příkladu Clovek.

Existují třídy definované přímo v Javě, v knihovně Java Core API.

Nenajdeme-li tam třídu, kterou potřebujeme, můžeme si ji nadefinovat sami - viz Clovek.

Na jméno (identifikátor) proměnné sice Java neklade žádná speciální omezení (tedy mimo omezení platná pro jakýkoli identifikátor), ale přesto bývá velmi dobrým zvykem dodržovat při pojmenovávání následující pravidla (blíže viz podrobný rozbor na FIXME):

jména začínají malým písmenem

nepoužíváme diakritiku (problémy s editory, přenositelností a kódováním znaků)

(raději ani český jazyk, angličtině rozumí "každý")

např.:
protected int rokNarozeni;
je identifikátor se správně (vhodně) utvořeným jménem, zatímco:
protected int RokNarozeni;
není vhodný identifikátor proměnné (začíná velkým písmenem)

Dodržování těchto jmenných konvencí je základem psaní srozumitelných programů a bude vyžadováno, sledováno a hodnoceno v odevzdávaných úlohách i písemkách.

Objektů (tzv. ) stejného typu (tj. stejné třídy) si můžeme postupně vytvořit více:

Existují tady dva objekty, každý má své (obecně různé) hodnoty proměnných - např. jsou různá jména obou lidí.

Ve výše uvedených příkladech jsme objekty vytvářeli voláními new Clovek(...) bezděčně jsme tak použili

Vracíme se k prvnímu příkladu: vytvoříme dva lidi a zavoláme postupně jejich metodu vypisInfo.

Vytvoří se dva objekty Clovek a vypíší se informace o nich.

V deklaraci metody uvádíme v její hlavičce tzv. formální parametry.

Syntaxe:

Podobně jako v jiných jazycích parametr představuje v rámci metody lokální proměnnou.

Při volání metody jsou f. p. nahrazeny skutečnými parametry.

Hodnoty primitivních typů - čísla, logické hodnoty, znaky

Hodnoty objektových typů - všechny ostatní (tj. vč. všech uživatelem definovaných typů)

V Javě tedy nemáme jako programátoři moc na výběr, jak parametry předávat

Rozšiřme definici třídy Clovek o metodu zakric s parametry:

Při zavolání:

tato metoda vypíše

Následující třída Ucet modeluje jednoduchý bankovní účet s možnostmi:

Metoda prevedNa pracovat nejen se svým "mateřským" objektem, ale i s objektem kam předaným do metody... opět přes tečkovou notaci.

Příklad použití třídy Ucet:

Kód metody skončí, tj. předá řízení zpět volající metodě (nebo systému - v případě startovní metody main), jakmile

Pozn.: I když metoda něco vrátí, my to nemusíme použít, ale je to trochu divné...

Co a k čemu jsou konstruktory?

Syntaxe (viz výše):

Příklad využití tohoto konstruktoru:

Toto volání vytvoří objekt pepa a naplní ho jménem a rokem narození.

Jak je psát a co s nimi lze dělat?

Ve třídě Ucet přetížíme metodu prevedNa.

Ve třídě Ucet koexistují dvě různé metody se stejným názvem, ale jinými parametry.

Pozn: I když jsou to teoreticky dvě úplně různé metody, pak když už se jmenují stejně, měly by dělat něco podobného.

Lze doporučit. Je to přesně postup divide-et-impera, rozděl a panuj, dělba práce mezi metodami!

Je to o něco instruktivnější, ale přibude další identifikátor - název metody - k zapamatování.

Což může být výhoda (je to výstižné) i nevýhoda (musíme si pamatovat další).

Deklarace proměnné objektového typu ještě žádný objekt nevytváří.

To se děje až příkazem - operátorem - new.

V následující ukázce vytvoříme dva účty.

V proměnné u nebude primárně odkaz na žádný účet.

Od této chvíle můžeme s účtem petruvUcet manipulovat přes odkaz (proměnnou) u.

Což se také děje: u.prevedNa(ivanuvUcet, 50);

Metoda může vracet odkaz na objekt, nad nímž je volána pomocí

Příklad - upravený Ucet s metodou prevedNa vracející odkaz na sebe

Lze deklarovat také metody a proměnné patřící , tj. skupině všech objektů daného typu. Ttakové metody a proměnné nazýváme statické a označujeme v deklaraci modifikátorem static

Představme si, že si budeme pamatovat, kolik lidí se nám během chodu programu vytvořilo a vypisovat tento počet.

Budeme tedy potřebovat do třídy Clovek doplnit:

jednu proměnnou pocetLidi společnou pro celou třídu Clovek - každý člověk ji při svém vzniku zvýší o jedna.

jednu metodu kolikMamLidi, která vrátí počet dosud vytvořených lidí.

Pozn: Všimněte si v obou případech modifikátoru/klíčového slova static.

Druhé cvičení vás pomůže nacvičit práci s více jednoduchými objekty několika tříd.

Úkolem bude:
Příklad 3.1.

Kroky řešení problému na počítači - pár slov o SW inženýrství

Organizace javových pg. - třídy, balíky

„Objektovost": zapouzření, dědičnost

Modifikátory přístupu k proměnným, metodám, třídám

Generický (univerzální, obecný...) model postupu:

1. Zadání problému

2. Shromáždění informací o realitě a jejich analýza

3. Modelování reality na počítači a implementace požadovaných operací nad modelovanou realitou

(podle JS, SW inženýrství):

V tomto předmětu nás z toho bude zajímat jen něco a jen částečně:

Tyto generické modely jsou dále rozpracovávány do podoby konkrétních .

Metodika (tvorby SW) je ucelený soubor inženýrských postupů, jak řízeným způsobem, s odhadnutelnou spotřebou zdrojů dospět k použitelnému SW produktu.

Některé skupiny metodik:

Nevracím se nikdy o více jak jednu úroveň zpět:

Nyní zpět k Javě a jednoduchým programům...

Co bude odlišné oproti dosavadním programátorským zkušenostem?

Struktura a rozsah programu:

: zdrojové (.pas) soubory, výsledný (jeden) spustitelný soubor (.exe), resp. přeložené kódy jednotek (.tpu)

: zdrojové (.java) soubory, přeložené soubory v bajtkódu (.class) - jeden z nich spouštíme

v Javě je nezbytná - zdrojové soubory organizujeme podle toho, ve kterých balících jsou třídy zařazeny

(přeložené soubory se implicitně ukládájí vedle zdrojových)

Zkusme naznačit, jak bychom realizovali jednoduchý systém, který bude

1. shromažďovat, ukládat a na požádání zpřístupňovat informace o psech (+ jejich výcviku, očkování...)

2. o jejich chovatelích

3. a dalších souvisejících entitách (např. chovatelských sdruženích, veterinářích,...)

Zjistíme, jaké typy objektů se ve zkoumaném výseku reality vyskytují a které potřebujeme zachytit

Zjistíme a zachytíme vztahy mezi objekty našeho zájmu

Zjistíme, které činnosti objekty (aktéři, aktoři) provádějí

neformálními prostředky - tužkou na papíře vlastními slovy v přirozeném jazyce

formálně pomocí nějakého vyjadřovacího aparátu - např. grafického jazyka

pomocí CASE nástroje přímo na počítači

Zatím se přidržíme neformálního způsobu...

Určení základních tříd, tj.

skupin (kategorií) objektů, které mají podobné vlastnosti/schopnosti:

Soubor Zivocich.java bude obsahovat (pozor na velká/malá písmena - v obsahu i názvu souboru):

public značí, že třída je "veřejně" použitelná, tj. i mimo balík

Třídy zorganizujeme do balíků.

V balíku jsou vždy umístěny související třídy.

Co znamená související?

Balíky obvykle organizujeme do hierarchií, např.:

Hierarchie balíků má tedy význam spíše pro srozumitelnost a logické členění.

V realitě jsme často svědci toho, že třídy jsou podtřídami jiných:

Podtřída je tedy "zjemněním" nadtřídy:

V Javě je uživatelem definovaná třída potomkem nějaké jiné - neuvedeme-li předka explicitně, je předkem vestavěná třída Object

Terminologie:

Dědění může mít i více "generací", např.

Zivocich <- Clovek <- Chovatel (živočich je rodičovskou třídou člověka, ten je rodičovskou třídou chovatele)

Přeneseně tedy předkem (nikoli bezprostředním) chovatele je živočich.
public class Clovek extends Zivocich {
Deklarace import nesouvisí s děděním, ale s organizací tříd programu do balíků:

Import není nutné deklarovat mezi třídami téhož balíku!

Pak lze používat všechny třídy z uvedeného balíku

Doporučuje se "import s hvězdičkou" nepoužívat:

Jak víme, třídy popisují skupiny objektů podobných vlastností

Třídy mohou mít tyto skupiny vlastností:

Vlastnosti jsou ve třídě "schované", tzv. zapouzdřené (encapsulated)

Třída připomíná pascalský záznam (record), ten však zapouzdřuje jen proměnné, nikoli metody.

Dědičnost (alespoň v javovém smyslu) znamená, že dceřinná třída (podtřída, potomek)

Cíl: vylepšit třídu Ucet

Postup:

Vzorový zdroják sám o sobě nepůjde přeložit, protože nemáme třídu, na níž závisí. Celý kód vystavím až po kontrole příslušných úloh.

Klíčové slovo extends - značí, že třída KontokorentniUcet je potomkem/podtřídou/rozšířením/dceřinnou třídou () třídy Ucet.

Konstrukce značí, že je volána metoda rodičovské třídy/předka/nadtřídy ( superclass). Kdyby se nevolala překrytá metoda, super by se neuvádělo.

Větvení if() {...} else {...} - složené závorky se používají k uzavření příkazů do sekvence - ve smyslu pascalského begin/end.

Přístup ke třídám i jejim prvkům lze (podobně jako např. v C++) regulovat:

Omezení přístupu je kontrolováno hned při překladu -> není-li přístup povolen, nelze program ani přeložit.

Tímto způsobem lze regulovat přístup staticky, mezi celými třídami, nikoli pro jednotlivé objekty

Přístup je v Javě regulován jednotlivě po prvcích

ne jako v C++ po blocích

Omezení přístupu je určeno uvedením jednoho z tzv. modifikátoru přístupu ( access modifier) nebo naopak neuvedením žádného.

Pro vlastnosti tříd = proměnné/metody:

public => přístupné odevšad

třída Ucet je veřejná = lze např.

protected => přístupné jen a ze tříd stejného balíku

používá se jak pro metody (velmi často), tak pro proměnné (méně často)

používá se spíše u proměnných než metod, ale dost často se vyskytuje z lenosti programátora, kterému se nechce psát protected

osobně moc nedoporučuji, protože svazuje přístupová práva s organizací do balíků (-> a ta se může přece jen měnit častěji než např. vztah nadtřída-podtřída.)

Mohlo by mít význam, je-li práce rozdělena na více lidí na jednom balíku pracuje jen jeden člověk - pak si může přátelským přístupem chránit své neveřejné prvky/třídy -> nesmí ovšem nikdo jiný chtít mé třídy rozšiřovat a používat přitom přátelské prvky.

Používá se relativně často pro neveřejné třídy definované v jednom zdrojovém souboru se třídou veřejnou.

private => přístupné jen v rámci třídy, ani v podtřídách - používá se častěji pro proměnné než metody

označením private prvek zneviditelníme i případným podtřídám!

Nastavení musí vycházet z povahy dotyčné proměnné či metody.

Nevíme-li si rady, jaká práva přidělit, řídíme se následujícím:

Cílem třetí úlohy je zvládnutí jednoduchého použití dědičnosti v objektovém programu. Hotovým základem je balík tomp.ucebnice.auta, v něm třídy Auto a Demo. Třídy tohoto balíku si stáhněte k sobě a pracujte s nimi lokálně (i když na UNIXech je teoreticky lze namapovat přímo z cesty/home/tomp/public_html/java/ucebnice/javasrc/ a dále.... Auto představuje třídu vozidel - aut, od této třídy zatím nebudeme vytvářet speciálnější typy aut - osobní, nákladní. Demo je třída, která musí fungovat, jakmile jí poskytneme/dopíšeme níže uvedené třídy.

Do balíku tomp.ucebnice.auta.mycky napište třídy Mycka, RucniMycka a MyckaSUdrzbou tak, aby potomkem - podtřídou třídy Mycka byla RucniMycka a jejím potomkem MyckaSUdrzbou.

Třída Mycka musí umět auto umýt (metoda s hlavičkou public double umyj(Auto a) - vrací cenu za umytí jako hodnotu typu double - cenu si zvolte sami dle uvážení...), obdobně navoskovat (metoda navoskovat) a musí nabízet "kompletní program" (metoda kompletniProgram) se slevou 20 % součtu cen jednotlivých služeb v rámci programu.

Třída RucniMycka musí umět totéž jako Mycka a navíc musí umět čištění interiéru (metoda s hlavičkou public double vycistiInterier(Auto a)). Její "kompletní program" (metoda kompletniProgram) bude dostupný za cenu podobně spočtenou jako v předchozí třídě a bude obsahovat navíc čištění interiéru.

Třída MyckaSUdrzbou musí umět totéž jako RucniMycka a navíc musí umět údržbu spodku vozidla (metoda s hlavičkou public double provedUdrzbuSpodku(Auto a)). Její "kompletní program" (metoda kompletniProgram) bude dostupný za cenu podobně spočtenou jako v předchozí třídě a bude obsahovat navíc údržbu spodku.

Výsledkem - Vašim řešením - jsou tedy dopsané třídy umístěné v balíku tomp.ucebnice.auta.mycky.

Pozn: ve třídách balíku tomp.ucebnice.auta.mycky budete v metodách používat třídu Auto - parametr typu Auto. Abyste jej v tomto místě zpřístupnili (je totiž v jiném balíku), musíte napřed deklarací třídy (po package, před class...) uvést import tomp.ucebnice.auta.Auto; - blíže viz slidy.

Přiřazovací příkaz =

Řízení toku programu (větvení, cykly)

Volání metody

Návrat z metody - příkaz return

Příkaz je ukončen středníkem ;

v Pascalu středník příkazy , v Javě (C/C++)

Operátor přiřazení = (assignment)

na levé straně musí být proměnná

Rozlišujeme přiřazení primitivních hodnot a odkazů na objekty

Na pravé straně výraz vracející hodnotu primitivního typu

číslo, logická hodnotu, znak (ale ne např. řetězec)

Na levé straně proměnná téhož typu jako přiřazovaná hodnota nebo typu širšího

Při zužujícím přiřazení se také provede konverze, ale může dojít ke ztrátě informace

Přiřazením primitivní hodnoty se hodnota zduplikuje ("opíše") do proměnné na levé straně.

Konstrukci = lze použít i pro přiřazení do objektové proměnné:
Zivocich z1 = new Zivocich();
Co to udělalo?

Nyní můžeme na tentýž vytvořený objekt znovu přiřadit - do z2:
Zivocich z2 = z1;
Proměnné z1 a z2 ukazují nyní na stejný objekt typu živočich!!!

Proměnné objektového typu obsahují (reference) na objekty, ne objekty samotné!!!

Metoda objektu je vlastně procedura/funkce, která realizuje svou činnost primárně s proměnnými objektu.

Volání metody určitého objektu realizujeme:

Buďto automaticky posledním příkazem v těle metody

způsobí ukončení provádění těla metody a návrat, přičemž může být specifikována návratová hodnota

typ skutečné návratové hodnoty musí korespondovat s deklarovaným typem návratové hodnoty

Příkaz (neúplného) větvení if
if (logický výraz) příkaz
Příkaz úplného větvení if - else

Tělo cyklu se provádí tak dlouho, dokud platí podmínka

obdoba while v Pascalu

v těle cyklu je jeden jednoduchý příkaz ...

... nebo příkaz složený

Tělo cyklu se nemusí provést ani jednou - pokud už hned na začátku podmínka neplatí

Větvení, cykly: doporučuji vždy psát se složeným příkazem v těle (tj. se složenými závorkami)!!!

jinak hrozí, že se v těle větvení/cyklu z neopatrnosti při editaci objeví něco jiného, než chceme, např.:

Pišme proto vždy takto:

Dokud nejsou přečteny všechny vstupní argumenty:

Dalším příkladem je použití while pro realizaci celočíselného dělení se zbytkem:
Celočíselné dělení se zbytkem
Tělo se provádí dokud platí podmínka (vždy aspoň jednou)

obdoba repeat v Pascalu (podmínka je ovšem interpretována opačně)

Relativně málo používaný - je méně přehledný než while

Syntaxe:

obecnější než for v Pascalu, podobně jako v C/C++

De-facto jde o rozšíření while, lze jím snadno nahradit

Syntaxe:

for (počáteční operace; vstupní podmínka; příkaz po každém průchodu)
    příkaz;

anebo (obvyklejší, bezpečnější)

Používejte asymetrické intervaly (ostrá a neostrá nerovnost):

podmínka daná počátečním přiřazením i = 0 a inkrementací i++ je neostrou nerovností, zatímco

opakovací podmínka i < 10 je ostrou nerovností -> i už nesmí hodnoty 10 dosáhnout!

Vytvarujte se složitých příkazů v hlavičce (kulatých závorkách) for cyklu -

je lepší to napsat podle situace před cyklus nebo až do jeho těla

Někteří autoři nedoporučují psát deklaraci řídicí proměnné přímo do závorek cyklu

ale rozepsat takto:

potom je proměnná i přístupná ("viditelná") i mimo cyklus - za cyklem, což se však ne vždy hodí.

Obdoba pascalského select - case - else

Větvení do více možností na základě ordinální hodnoty

Syntaxe:

Je-li roven některé z hodnot, provede se sekvence uvedená za příslušným case. Sekvenci obvykle ukončujeme příkazem break, který předá řízení ("skočí") na první příkaz za ukončovací závorkou příkazu switch. Vícecestné větvení

Větvení if - else můžeme samozřejmě vnořovat do sebe:

Je možné "šetřit" a neuvádět složené závorky, v takovém případě se else vztahuje vždy k nejbližšímu neuzavřenému if, např. znovu předchozí příklad:

Tak jako u cyklů - tento způsob zápisu nelze v žádném případě doporučit!!!
Vnořené větvení
Někdy rozvíjíme pouze druhou (negativní) větev:

Neplatí-li podmínka1, testuje se podmínka2, neplatí-li, pak podmínka3...

neplatí-li žádná, provede se příkaz za posledním - samostatným - else.

Opět je dobré všude psát složené závorky!!!
Řetězené if
Umožní ještě jemnější řízení průchodu vnořenými cykly

pomocí návěští můžeme naznačit, který cyklus má být příkazem break přerušen nebo

tělo kterého cyklu má být přeskočeno příkazem continue. Návěští

Raději NEPOUŽÍVAT, ale jsou menším zlem než by bylo goto (kdyby v Javě existovalo...), protože nepředávají řízení dále než za konec struktury (cyklu, větvení).

Toto však již neplatí pro break a continue na návěští!

Poměrně často se používá break při sekvenčním vyhledávání prvku

Jednoduché vlastní implementace vyhledávacích a řadicích algoritmů (Lineární a binární vyhledávání)

Tato úloha bude používat pole, které se dosud na přednáškách zmiňovalo jen v souvislosti s argumenty metody main, konkrétně v její hlavičce jsme viděli: main(String[] args).

Ani tato úloha ale nebude vyžadovat více znalostí o práci s polem, než jen to, že:

proměnná typu pole čísel float se deklaruje např. float[] poleCisel;

pole samo o sobě (i když obsahuje primitivní hodnoty) je objektového typu, tj. přiřazení poleCisel2 = poleCisel; pouze kopíruje odkaz, neduplikuje celé pole vč. obsahu!

obdobně deklarace proměnné typu pole, např. float[] poleCisel; pole nevytvoří, jen deklaruje odkaz na pole, které musí vzniknout jinak.

na jednotlivé prvky se, stejně jako ve většině jazyků, odkazujeme přes index prvku, tj. např. poleCisel[1] je druhý prvek pole. V Javě jsou totiž meze indexů polí vždy 0..početprvků-1.

Počet prvků pole najdeme v jeho proměnné length (nezapomínejme, že pole je objekt, může tudíž mít proměnné...),

tj. poleCisel má poleCisel.length prvků, nejvyšší index je poleCisel.length-1.

Dále pak napsat dvě třídy rozšiřující dvě výše uvedené tak, aby navíc:

Jak se budou třídy lišit:

Jak postupovat:

Cílem je napsat dvě třídy objektů, jejichž objekty budou umět:

Jak se budou dvě třídy lišit:

Jak postupovat:

Pozn: Pokud cvičící zadání modifikuje, je to OK. Tohle je vzorové zadání. Za obě části úlohy dohromady získáte opět max. 5 bodů.

Primitivní vs. objektové typy

Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou

Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Java striktně rozlišuje mezi hodnotami

Základní rozdíl je v práci s proměnnými:

Důsledek -> dvě objektové proměnné mohou nést odkaz na tentýž objekt

Proměnné těchto typů nesou elementární, z hlediska Javy atomické, dále nestrukturované hodnoty.

Deklarace takové proměnné (kdekoli) způsobí:

1. rezervování příslušného paměťového prostoru (např. pro hodnotu int čtyři bajty)

2. zpřístupnění (pojmenování) tohoto prostoru identifikátorem proměnné

V Javě existují tyto skupiny primitivních typů:

V Javě jsou celá čísla vždy interpretována jako znaménková

"Základním" celočíselným typem je 32bitový int s rozsahem -2 147 483 648 až 2147483647

menší rozsah mají

Pro celočíselné typy existují (stejně jako pro floating-point typy) konstanty - minimální a maximální hodnoty příslušného typu. Tyto konstanty mají název vždy , analogicky MAX... Viz např. Minmální a maximální hodnoty

char představuje jeden 16bitový znak v kódování UNICODE

Konstanty typu char zapisujeme

Java vnitřně kóduje znaky a řetězce v UNICODE, pro vstup a výstup je třeba použít některou za serializací (převodu) UNICODE na sekvence bajtů:

Problém může nastat při interpretaci kódování znaků národních abeced přímo ve zdrojovém textu programu.

Ve zdroj. textu správně napsaného javového vícejazyčného programu by žádné národní znaky VŮBEC neměly vyskytovat.

Je vhodné umístit je do speciálních souborů tzv. (v Javě objekty třídy java.util.ResourceBundle).

Kódována podle ANSI/IEEE 754-1985

Možné zápisy literálů typu float (klasický i semilogaritmický tvar) - povšimněte si "f" za číslem - je u float nutné!:
float f = -.777f, g = 0.123f, h = -4e6f, 1.2E-15f;
double: tentýž zápis, ovšem bez "f" za konstantou!, s větší povolenou přesností a rozsahem

Kladné a záporné nekonečno:

Viz také Minimální a maximální hodnoty

Přípustné hodnoty jsou false a true.

Na rozdíl od Pascalu na nich definováno uspořádání.

Význam podobný jako v C/C++.

Není v pravém slova smyslu datovým typem, nemá žádné hodnoty.

Označuje "prázdný" typ pro sdělení, že určitá metoda nevrací žádný výsledek.

Pole v Javě je speciálním objektem

Můžeme mít pole jak primitivních, tak objektových hodnot

Kromě pole v Javě existují i jiné objekty na ukládání více hodnot - tzn. kontejnery, viz dále

Syntaxe deklarace

Syntaxe přístupu k prvkům

Používáme

Syntaxe vytvoření pole: jako u jiného objektu - voláním konstruktoru:

nebo vzniklé pole rovnou naplníme hodnotami/odkazy

Pole je objekt, je třeba ho před použitím nejen deklarovat, ale i vytvořit:

Nyní můžeme pole naplnit:

Co kdybychom pole pouze deklarovali a nevytvořili:

Toto by skončilo s běhovou chybou "NullPointerException", pole neexistuje, nelze do něj tudíž vkládat prvky!

Pokud tuto chybu uděláme v rámci metody:

překladač nás varuje:

Pokud ovšem pole bude proměnnou objektu/třídy:

Překladač chybu neodhalí a po spuštění se objeví:

Co kdybychom pole deklarovali, vytvořili, ale nenaplnili příslušnými prvky:

Toto by skončilo také s běhovou chybou NullPointerException:

V Javě obecně přiřazení proměnné objektového typu vede pouze k duplikaci odkazu, nikoli celého odkazovaného objektu.

Nejinak je tomu u polí, tj.:

V proměnné lidi2 je nyní odkaz na stejné pole jako je v lidi1.

Zatímco, provedeme-li vytvoření nového pole + arraycopy, pak lidi2 obsahuje duplikát/klon/kopii původního pole.

viz též Dokumentace API třídy "System"

Také arraycopy však do cílového pole zduplikuje jen odkazy na objekty, nevytvoří kopie objektů!

Implementace rozhraní třídou

Implementace více rozhraní jednou třídou

Rozšiřování rozhraní (dědičnost mezi rozhraními)

Rozšiřování více rozhraní (vícenásobná dědičnost mezi rozhraními)

Abstraktní třídy (částečná implementace)

V Javě, na rozdíl od C++ neexistuje vícenásobná dědičnost -

Pokud po třídě chceme, aby disponovala vlastnostmi z několika různých množin (skupin), můžeme ji deklarovat tak, že

Vypadá i umisťuje se do souborů podobně jako deklarace třídy

Všechny metody v rozhraní musí být public a v hlavičce se to ani nemusí uvádět.

Těla metod v deklaraci rozhraní se nepíší. (Metody v rozhraní tudíž vypadají velmi podobně jako abstraktní metody ve třídách, ale nemusím psát abstract.)

Příklad deklarace rozhraní

Příklad

Čteme: Třída Clovek implementuje rozhraní Informujici.

Třída implementuje všechny metody předepsané rozhraním

1. Potřebujeme-li u jisté proměnné právě jen funkcionalitu popsanou určitým rozhraním,

2. tuto proměnnou můžeme pak deklarovat jako typu rozhraní - ne přímo objektu, který rozhraní implementuje.

Příklad

    Informujici petr = new Clovek("Petr Novák", 1945);
    petr.vypisInfo(); // "petr" stačí deklarovat jen jako Informujici
                      // jiné metody než předepsané tímto intf.
                      // nepotřebujeme!

Třída sice smí dědit maximálně z jedné nadtřídy (předka), ale

zato může současně implementovat libovolný počet rozhraní!

Podmínkou ovšem je, aby se metody ze všech implementovaných rozhraní „snesly" v jedné třídě.

Které že se nesnesou? Např. dvě metody se skoro stejnou hlavičkou, lišící se „jen" návratovým typem...

Příklad - kromě výše uvedeného intf. Informujici mějme ještě:

Třída Clovek implementuje dvě rozhraní:

Podobně jako u tříd, i rozhraní mohou být rozšiřována/specializována. Mohou dědit.

Na rozdíl od třídy, která dědí maximálně z jedné nadtřídy (předka) -

Přesto to nepřináší problémy jako u klasické plné vícenásobné dědičnosti např. v C++, protože rozhraní samo

Příklad - Informujici informuje „jen trochu", DobreInformujici je schopen ke standardním informacím ( vypisInfo) přidat dodatečné informace ( vypisDodatecneInfo).

Používají se i prázdná rozhraní - nepředepisující žádnou metodu

deklarace, že třída implementuje také rozhraní, ji "k ničemu nezavazuje", ale poskytuje typovou informaci o dané třídě

i v Java Core API jsou taková rozhraní - např. java.lang.Cloneable

I když Java disponuje rozhraními, někdy je vhodné určitou specifikaci implementovat pouze :

Abstraktní třída je tak označena v hlavičce, např.:
public abstract class AbstraktniChovatel ...
Obvykle má alespoň jednu abstraktní metodu, deklarovanou např.:
public abstract void vypisInfo() ...
Od a.t. nelze vytvořit instanci, nelze napsat např.:
Chovatel ch = new AbstraktniChovatel(...);
Viz Svět chovatelství z učebnice:

Pozn.: Obecný chovatel se ihned úplně implementovat nedá (ještě to neumíme), proto je definován jako abstraktní třída AbstraktniChovatel a teprve až ChovatelPsu je neabstraktní třída.

Je mnoho způsobů...

kontrolní tisky - System.err.println(...)

integrovaným debuggerem v IDE

pomocí speciálních nástrojů na záznam běhu pg.:

nejrůznější "loggery" - standardní poskytuje od JDK1.4 balík java.util.logging nebo alternativní a zdařilejší

Postup:

1. Přeložit jej s volbou -source 1.4

2. Spustit jej s volbou -ea (-enableassertions).

Aktivovat aserce lze i selektivně pro některé třídy (-ea název_třídy nebo-ea název_balíku... - tři tečky na konci!!!).

Třída Zlomek používá assert k ověření, že zlomek není (chybou uživatele) vytvářen s nulovým jmenovatelem.

Za assert uvedeme, co musí v daném místě za běhu programu platit.

Program přeložíme (s volbou -source 1.4):

Program spustíme (s volbou -ea nebo selektivním-ea:NázevTřídy):

Spustíme-li bez povolení assert (bez volby -ea nebo naopak s explicitním zákazem:-da), pak program podmínky za assert neověřuje:

Uvědomit si, že žádný nástroj za nás nevymyslí, JAK máme své třídy testovat. Pouze nám napomůže ke snadnějšímu sestavení a spuštění testu.

Postup:

1. Stáhnout si z http://junit.org poslední (stačí binární) distribuci testovacího prostředí.

2. Nainstalovat JUnit (stačí rozbalit do samostatného adresáře).

3. Napsat testovací třídu/třídy - buďto implementují rozhraní junit.framework.Test nebo obvykleji rovnou rozšiřují třídujunit.framework.TestCase

4. Testovací třída obsahuje metodu na nastavení testu ( setUp), testovací metody (test) a úklidovou metodu ( tearDown).

5. Testovací třídu spustit v prostředí (řádkovém nebo GUI) - junit.textui.TestRunner,junit.swingui.TestRunner...

6. Testovač zobrazí, které testovací metody případně selhaly.

Třída Zlomek zůstává zhruba jako v předchozím příkladu, přibývají však metody equals (porovnává dva zlomky, zda je jejich číselná hodnota stejná) a soucet (sečítá dva zlomky, součet vrací jako výsledek).

Testovací třída JUnitDemo má „přípravnou" metodu setUp, tearDown a testovací metody.

Spuštění testovače v prostředí GUI Swing nad testovací třídou JUnitDemo.

Pokud testovací třída prověří, že testovaná třída/y je/jsou OK, vypadá to přibližně takto:

Má-li testovaná třída/y chyby a zjistí-li to testovač, vypadá to třeba takto:

jass je preprocesor javového zdrojového textu. Umožňuje ve zdrojovém textu programu vyznačit podmínky, jejichž splnění je za běhu kontrolováno.

Podmínkami se rozumí:

Postup práce s jass:

Úloha je obdobou té předchozí.

Část Ia. Jde o to zmodifikovat třídy z předchozí úlohy, aby:

a obě implementovaly rozhraní v balíku tomp.searching2.

Rozhraní Searcher je zatím v balíku tomp.searching2, přesuňte si je do cz.muni.fi.{vaslogin}.searching2 - nezapomeňte, že s přesunem do jiného balíku musíte změnit deklaraci package.

Část Ib. Dále zmodifikujte třídy z předchozí úlohy, aby:

Jak postupovat:

1. Upravte třídy z předchozí úlohy, aby dělaly, co mají.

2. Uložte je do patřičného balíku.

3. Do stejného balíku uložte také třídu Demo a upravte si ji tak, aby používala třídy XXXSearcher, XXXSearcherMinMax.

4. Třídy pro vyhledávání vyzkoušejte spuštěním vaší třídy Demo.

Část II. Na závěr reimplementujte (čili použijte a předělejte z úlohy 4.) do balíku cz.muni.fi.{vaslogin}.sorting2 také třídy BubbleSorter a QuickSorter tak, aby obě implementovaly rozhraní Sorter.

Při reimplementaci využijte společného abstraktního předka - třídu AbstractSorter, kterou si vytvoříte a umístíte do balíku cz.muni.fi.{vaslogin}.sorting2. Tato abstraktní třída bude implementovat rozhraní Sorter - tj. bude implementovat ty metody, jež ve třídách BubbleSorter, QuickSorter vycházejí naprosto stejné.

Z praktických důvodů je vhodné nadeklarovat v této třídě například pomocnou metodu , která prohodí v poli hodnoty na indexech i, j. Kontrolní otázka: Jaký přístupový modifikátor by tato metoda měla/mohla mít?

K reimplementovaným třídám vytvořte vhodné demo, které ukáže, že jsou funkční.

Za tyto úlohy dohromady získáte max. 5 bodů.

Operátory v Javě: aritmetické, logické, relační, bitové

Porovnávání primitivních hodnot a objektů, metody equals a hashCode

Ternární operátor podmíněného výrazu

Typové konverze

Operátor zřetězení

Tyto lze použít na porovnávání primitivních hodnot:

Test na rovnost/nerovnost lze použít na porovnávání primitivních hodnot i objektů:

Upozornění:

Použití ==

Chceme-li (intuitivně) chápat rovnost objektů podle obsahu, tj.

musíme pro danou třídu překrýt metodu equals, která musí vrátit true, právě když se výchozího a srovnávaného objektu rovná.

Fungování equals lze srovnat s porovnáváním dvou databázových záznamů podle primárního klíče.

Nepřekryjeme-li equals, funguje původní equals přísným způsobem, tj. rovné si budou jen totožné objekty.

Příklad: objekt třídy Clovek nese informace o člověku. Dva objekty položíme stejné (rovnocenné), nesou-li stejná příjmení:
Obrázek 9.1. Dva lidi jsou stejní, mají-li stejná příjmení
Méně agresivní verze by nemusela při porovnávání s jiným objektem než Clovek vyhodit výjimku, pouze vrátit false.

Jakmile u třídy překryjeme metodu equals, měli bychom současně překrýt objektů i metodu hashCode:

V těle hashCode s oblibou „přehráváme" (delegujeme) řešení na volání hashCode jednotlivých složek objektu - a to těch, které figurují v equals:
Obrázek 9.2. Třída Clovek s metodami equals a hashCode
Jediný ternární operátor

Platí-li první operand (má hodnotu true) ->

Typ prvního operandu musí být boolean, typy druhého a třetího musí být přiřaditelné do výsledku.

Podobně jako v C/C++

Píše se (typ)hodnota, např. ( Clovek)o, kde o byla proměnná deklarovaná jako Object.

Naproti tomu u primitivních typů se jedná o úpravu hodnoty - např. int přetypujeme na short a „ořeže" se tím rozsah.

Výsledkem je vždy řetězec, ale argumenty mohou být i jiných typů, např.

sekvence int i = 1; System.out.println("promenna i="+i); je v pořádku

s řetězcovou konstantou se spojí řetězcová podoba dalších argumentů (např. čísla).

Pokud je argumentem zřetězení odkaz na objekt o ->

nejvyšší prioritu má násobení, dělení, nejnižší přiřazení

Kontejnery jako základní dynamické struktury v Javě

Kolekce, iterátory (Collection, Iterator)

Seznamy (rozhraní List, třídy ArrayList, LinkedList)

Množiny (rozhraní Set, třída HashSet), uspořádané množiny (rozhraní SortedSet, třída TreeSet), rozhraní Comparable, Comparator

Mapy (rozhraní Map, třída HashMap), uspořádané mapy (rozhraní SortedMap, třída TreeMap)

Starší typy kontejnerů (Vector, Stack, Hashtable)

Kontejnery (containers) v Javě

Většinou se používají kontejnery hotové, vestavěné, tj. ty, jež jsou součastí Java Core API:

vestavěné kontejnerové třídy jsou definovány v balíku java.util

je možné vytvořit si vlastní implementace, obvykle ale zachovávající/implementující „standardní" rozhraní

K čemu slouží?

jsou prostředkem, jak "chodit" po prvcích kolekce buďto

Každý iterátor musí implementovat velmi jednoduché rozhraní Iterator se třemi metodami:

Vytvoříme seznam, naplníme jej a chodíme po položkách seznamovým iterátorem, vytvořeným na určité pozici (indexu) v seznamu.

K procházení seznamovým iterátorem lze použít metody next, previous.

Cílem množin je mít možnost rychle (se složitostí O(log(n))) provádět atomické operace:

Standardní implementace množiny:

Uspořádání je dáno buďto:

Vložíme prvky do uspořádané množiny. Prvky musejí implementovat rozhraní Comparable, nebo musíme poskytnout komparátor. Když neuděláme ani jedno:

Nefunguje, prvky třídy Clovek nebyly porovnatelné.

Prvky implementují rozhraní Comparable:

Funguje, prvky třídy Clovek jsou porovnatelné, množina je uspořádána podle příjmení lidí.

( asociativní pole, nepřesně také hašovací tabulky nebo haše) fungují v podstatě na stejných principech a požadavcích jako Set:

Ukládají ovšem dvojice (klíč, hodnota) a umožnují rychlé vyhledání dvojice podle hodnoty klíče.

Základními metodami jsou: dotazy na přítomnost klíče v mapě ( containsKey),

výběr hodnoty odpovídající zadanému klíči ( get),

Mapy mají:

Příklad, kdy jsou klíče uspořádané komparátorem:
Obrázek 10.15. Vložení účtů do mapy pod uspořádaným klíčem člověka - vlastníka
téměř vždy se používá ArrayList - stejně rychlý a paměťově efektivnější

Existují tyto starší typy kontejnerů (-> náhrada):

V této úloze důkladně procvičíme nejběžnější kontejnery (včetně uspořádaných), iterátory nad nimi a také tvorbu vlastních komparátorů.

Úkolem bude realizovat jednoduchý systémek simulující zasílání zpráv. Vše bude v balíku messaging (cvičící může jméno balíku upřesnit, např. tak, aby obsahovalo vaši identifikaci - login, UČO). Systémek bude obsahovat následují třídy:

osoba, která bude přijímat a odesílat zprávy ( Message). K osobě si pamatujeme její jméno a příjmení (řetězce) a odkazy na dvě složky ( Folder) na poštu: odeslanou a přijatou. Složky na zprávy se mohou vytvořit ihned s vytvořením osoby. Odeslání zprávy je realizováno jejím vytvořením, naplněním textem (nemusí zadávat přímo uživatel z klávesnice, stačí programově voláním metody), dále pak následuje vložení do složky odeslaných zpráv odesílatele a do složky přijatých zpráv u všech příjemců.

zpráva. Bude obsahovat odkaz na osobu, která ji odeslala ( Person) a množinu příjemců ( Set), kterým je určena. Dále si při vytvoření zapamatuje aktuální čas (stačí vytvořit a zapamatovat si objekt třídy java.util.Date). Kromě toho ponese pochopitelně také vlastní text zprávy ( String).

složka na poštu. Bude si pamatovat svého vlastníka ( Person), bude umět přidat do sebe zprávu a vypsat všechny zprávy jednak v pořadí, v jakém byly přijímány, a také podle příjmení odesílatele (vzestupně).

demo třída s metodou main, která vytvoří tři lidi. Poté první a druhý člověk pošlou nějaké zprávy třetímu. Následně vypíšeme zprávy odeslané prvním člověkem (v pořadí odeslání) a zprávy doručené třetímu člověku (v abecedním pořadí podle příjmení odesílatele).

MessagesBySenderComparator

třída implementující rozhraní java.util.Comparator. Objekt této třídy předáváme při vytváření uspořádané množiny, do níž se budou vkládat zprávy v pořadí podle příjmení odesílatele. Metoda compareTo( Object o1, Object o2) tedy musí vracet záporné číslo, je-li příjmení osoby o1 před příjmením o2, kladné číslo v případě, že příjmení osoby o2 předchází příjmení o1. Jsou-li obě příjmení stejná, může vrátit kladné nebo záporné číslo, neměl by však vracet nulu, jsou-li zprávy odlišné. Nulu by měl vrátit pouze a jen tehdy, jsou-li celé zprávy, tj. i text zprávy, její čas odeslání a odesílatel stejné. Kdo by si chtěl pohrát, může při shodnosti příjmení řadit sekundárně podle textu zprávy, data odeslání apod. K implementaci metody compare využijte metodu compareTo třídy String.

Možná realizace výše uvedeného zadání znázorněná jako diagram tříd (navržený v Together 6.0).

Pozn: Pokud cvičící zadání modifikuje, je to OK. Tohle je vzorové zadání. Za úlohu získáte opět max. 5 bodů.

Dokumentace javových programů, dokumentace API

Typy komentářů - dokumentační komentáře

Generování dokumentace

Značky javadoc

Distribuční archívy .jar

Vytvoření archívu, metainformace

Spustitelné archívy

Základním a standardním prostředkem je tzv. dokumentace API

Zde se budeme věnovat především dokumentaci programátorské, určené těm, kdo budou náš kód využívat ve svých programech, rozšiřovat jej, udržovat jej. Programátorské dokumentaci se říká dokumentace API (apidoc, apidocs).

Při jejím psaní dodržujeme tato pravidla:

Podobně jako např. v C/C++:

od značky // do konce řádku, nepromítnou se do dokumentace API

začínají /* pak je text komentáře, končí */ na libovolném počtu řádků

dokumentační

od značky /** po značku */ může být opět na libovolném počtu řádků

Každý další řádek může začínat mezerami či *, hvězdička se v komentáři neprojeví.

Dokumentační komentáře uvádíme:

Dokumentace má standardně podobu HTML stránek (s rámy i bez)

Dokumentace je generována nástrojem javadoc z

1. dokumentačních komentářů

2. i ze samotného zdrojového textu

Lze tedy (základním způsobem) dokumentovat i program bez vložených komentářů!

Chování javadoc můžeme změnit

1. volbami (options) při spuštění,

2. použitím jiného tzv. doclet u, což je třída implementující potřebné metody pro generování komentářů.

Princip generování ze zdrojových textů pomocí speciálních doclet ů se dnes používá i po jiné než dokumentační účely - např. pro generátory zdrojových kódu aplikací EJB apod.

javadoc můžeme podrobněji instruovat pomocí značek vkládaných do dokumentačních komentářů, např.:

Zdrojový text třídy Window:

Příklad dokumentačního komentáře k proměnné:

Tyto a další příklady a odkazy lze vidět v původním materiálu JavaStyleGuide des IGE, odkud byly ukázky převzaty.

Zdroják s dokumentačními komentáři - Komentáře

Ukázkové spuštení javadoc

Distribucí nemyslíme použití nástroje typu "InstallShield"..., ale spíše něčeho podobného tar/ ZIP u

Sbalením vznikne soubor (archív) .jar formátově podobný ZIP u (obvykle to ZIP formát), ale nemusí být komprimován.

Součástí archívu nejsou jen .class soubory, ale i další zdroje, např. , soubory s národními variantami řetězců, zdrojové texty programu, dokumentace...

Volby JAR lze vypsat i spuštěním jar bez parametrů:

Vezměme následující zdrojový text třídy JarDemo v balíku tomp.ucebnice.jar, tj. v adresáři c:\tomp\pb162\java\tomp\ucebnice\jar:

Vytvoříme archív se všemi soubory z podadresáře tomp/ucebnice/jar (s volbou c - create, v - verbose, f - do souboru):

Vzniklý .jar soubor lze prohlédnout/rozbalit také běžným nástrojem typu unzip, gunzip, WinZip, PowerArchiver nebo souborovým managerem typu Servant Salamander...

Tento archív rozbalíme v adresáři /temp následujícím způsobem:

Formáty vycházející z JAR:

liší se podrobnějším předepsáním adresářové struktury a dalšími povinnými metainformacemi

Vytvoříme jar s manifestem obsahujícím tento řádek:

poté zadáme:

a spustí se metoda main třídy NázevSpouštěnéTřídy.

Nejprve vytvoříme soubor manifestu. Příklad jeho obsahu:

Následně zabalíme archív s manifestem:

Spuštění aplikace zabalené ve spustitelném archívu je snadné:

Výjimky - proč a jak, co to vlastně je výjimka

Syntaxe bloku s ošetřením (zachycením) výjimky

„Únik" výjimky z metody - deklarace metody propouštějící výjimku

Reakce na výjimku

Kaskády výjimek

Kategorizace výjimek (hlídané, běhové, vážné chyby)

Vlastní typy výjimek, objektová hierarchie výjimek

Klauzule finally

podobně jako v C/C++, Delphi

výjimky jsou mechanizmem, jak psát robustní, spolehlivé programy odolné proti chybám "okolí" - uživatele, systému...

v Javě jsou výjimky ještě lépe implementovány než v C++ (navíc klauzule finally)

není dobré výjimkami "pokrývat" chyby programu samotného - to je hrubé zneužití

Základní syntaxe:

    try {
        //zde může vzniknout výjimka

    } catch (TypVýjimky proměnnáVýjimky) {
        // zde je výjimka ošetřena
        // je možné zde přistupovat k proměnnéVýjimky

    }

Příklad - Otevření souboru může vyvolat výjimku

Jak můžeme reagovat?

1. Napravit příčiny vzniku chybového stavu - např. znovu nechat načíst vstup

2. Poskytnout za chybný vstup náhradu - např. implicitní hodnotu

3. Operaci neprovést („vzdát") a sdělit chybu výše tím, že výjimku „propustíme" z metody

Výjimková pravidla:

1. Vždy nějak reagujme! Neignorujme, nepotlačujme, tj.

2. Nelze-li reagovat na místě, propusťme výjimku výše (a popišme to v dokumentaci...) - Příklad komplexní reakce na výjimku

pak můžeme bloky catch řetězit, viz přechozí příklad: Příklad komplexní reakce na výjimku

Pozor na řetězení catch s výjimkami typů z jedné hierarchie tříd: pak musí být výjimka z podtřídy (tj. speciálnější) uvedena - zachycována - dříve než výjimka obecnější - Takto ne!

Všechny objekty výjimek a chybových stavů implementují rozhraní java.lang.Throwable - „vyhoditelný"

Vážné chyby JVM (potomci/instance java.lang.Error) - obvykle signalizují těžce napravitelné chyby v JVM - např. Out Of Memory, Stack Overflow..., ale též např. chybu programátora: AssertionError

V této úloze procvičíme použití kontejnerů, výjimek (vč. definice vlastních tříd výjimek) a také testování s junit.

Úkolem bude realizovat jednoduchou implementaci abstraktního datového typu fronta (queue) a několika souvisejících výjimek. Kromě toho je součástí programu také testovací třída (rozšiřující junit.framework.TestCase) pro junit (používejte aktuální verzi balíku junit dostupnou na http://junit.org).

Program bude obsahovat následují rozhraní a třídy:

Rozhraní fronty. Popisuje operace put (vložení provku do fronty), get (odebrání prvku z fronty), empty (test na prázdnost fronty) a size (počet prvků aktuálně ve frontě).

Obrázek 12.1. Zdrojový text rozhraní Queue

// rozhraní fronty ukládající prvky typu String
public interface Queue {
   void put(String s) throws QueueFullException; // vloží prvek do fronty
   String get() throws QueueEmptyException;      // odebere z fronty prvek a vrátí jej
   boolean empty();    // test na prázdnost fronty, vrátí true, je-li prázdná
   int size();         // vrátí aktuální počet prvků ve frontě
   int freeCapacity(); // vrátí aktuální počet prvků, které ještě lze bez odebírání vložit
   void clear();       // vyprázdní frontu
}

Třída implementující rozhraní Queue. Fronta bude fungovat tak, že prvky budou ukládány do vhodného kontejneru (asi List) uvnitř objektu typu QueueImpl. Konstruktor bude mít jeden celočíselný parametr určující celkovou kapacitu fronty (maximální počet současně přítomných prvků ve frontě).

Obecná výjimka při práci s frontou. Nadefinujete si ji sami, v programu se nebudou vytvářet přímo instance tohoto typu, ale až některé ze tříd potomků, viz dále.

Je výjimka, kterou vyhodí operace get (pomocí příkazu throw) v případě, že chceme odebrat prvek z prázdné fronty. Nadefinujete si ji sami, tak, aby byla potomkem QueueException.

Je výjimka, kterou vyhodí operace put v případě, že chceme vložit prvek do fronty, jejíž kapacita je již naplněna. Nadefinujete si ji sami, tak, aby byla potomkem QueueException.

Testovací třída s metodou main, která rovnou spustí junit testovač (spouštěč testů) junit.swingui.TestRunner.

Obrázek 12.2. Zdrojový text metody main třídy QueueTest

// metoda main rovnou aktivující spouštěč testů (TestRunner)
public static void main(String[] args) {
   // zjisti jména testovacích tříd (=testů)
   String[] testCaseNames = {QueueTest.class.getName()};
   // aktivuj spouštěč testů
   junit.swingui.TestRunner.main(testCaseNames);
}

Testovací třídu implementujte tak trochu podle svého - nepředepisuji přesně, co a jak důkladě se má testovat. Z povahy třídy QueueImpl však plyne, že by se minimálně mělo otestovat:

že funguje vložení do nenaplněné (např. prázdné fronty);

že naopak nefunguje (tj. vyhodí výjimku) vložení do plné fronty;

taktéž nefunguje (tj. vyhodí výjimku) odebrání z prázdné fronty;

že empty() je true, právě když size() je 0 - a to nastane mj. po zavolání clear();

že freeCapacity() po zkonstruování objektu fronty musí být rovna hodnotě parametru konstruktoru;

a především že fronta se opravdu chová jako fronta, tj. struktura FIFO - prvky jsou odebírány v tom pořadí, v jakém byly vkládány.

Váš cvičící pravděpodobně určí balík, do kterého budete vytvořené třídy (a případně i výchozí rozhraní Queue) ukládat. Stejně tak může upřesnit požadavky na testovací třídu. Pokud cvičící zadání modifikuje, je to OK. Tohle je vzorové zadání. Za úlohu získáte opět max.5 bodů.

Koncepce I/O proudů v Javě, skládání (obalování vlastnostmi)

Práce se soubory a adresáři, třída File

Binární proudy, třídy InputStream, OutputStream

Znakové proudy, třídy Reader, Writer

Serializace objektů

založeny na v/v proudech

plně platformově nezávislé

V/V proudy jsou

koncipovány jako "stavebnice" - lze vkládat do sebe a tím přidávat vlastnosti, např.

Téměř vše ze vstupních/výstupních tříd a rozhraní je v balíku java.io.

počínaje J2SDK1.4 se rozvíjí alternativní balík -

Blíže viz dokumentace API balíků java.io, java.nio.

vše je opět v balíku java.io

základem je třída - nositel jména souboru, jakási "brána" k fyzickým souborům na disku.

používá se jak pro soubory, tak adresáře, linky i soubory identifikované UNC jmény (\\počítač\adresář...)

opět plně platformově nezávislé

na odstínění odlišností jednotlivých systémů souborů lze použít vlastností (uvádíme jejich hodnoty pro JVM pod systémem MS Windows):

Vytvoření konstruktorem - máme několik možností:

Testy existence a povahy souboru:

test na existenci souboru (nebo adresáře)

test, zda jde o soubor (tj. ne adresář)

test, zda jde o adresář

Test práv ke čtení/zápisu:

Vytvoření souboru nebo adresáře:

(pro adresář) vrací true, když se podaří adresář vytvořit

navíc si dotvoří i příp. neexistující adresáře na cestě

Vytvoření dočasného (temporary) souboru:

Zrušení:

Přejmenování (ne přesun mezi adresáři!):

Klíčem je opět třída File - použitelná i pro adresáře

Jak např. získat (filtrovaný) seznam souborů v adresáři?

Vstupní jsou odvozeny od abstraktní třídy InputStream

Výstupní jsou odvozeny od abstraktní třídy OutputStream

Uvedené metody, kromě abstract byte read(), nemusejí být nutně v neabstraktní podtřídě překryty.

java.io.FilterInputStream - je bázová třída k odvozování všech vstupních proudů přidávajících vlastnost/schopnost filtrovat poskytnutý vstupní proud.

Příklady filtrů (ne všechny jsou v java.io!):

základem je abstraktní třída Reader, konkrétními implementacemi jsou:

nebudeme důkladně probírat všechny typy

principy:

Příklady:

PrintStream

poskytuje metody pro pohodlný zápis hodnot primitivních typů a řetězců - příkladem jsou System.out a System.err

PrintWriter

poskytuje metody pro pohodlný zápis hodnot primitivních typů a řetězců

Ze vstupního binárního proudu InputStream (čili každého) je možné vytvořit znakový Reader pomocí

Podporované názvy znakových sad naleznete na webu IANA Charsets.

Obdobně pro výstupní proudy - lze vytvořit Writer z OutputStream.

V této úloze procvičíme použití souborů, vstupních a výstupních operací, ale i kontejnerů, výjimek atd.

Úkolem bude realizovat jednoduchý správce osobních kontaktů (adresář), v němž bude uživatel mít možnost uchovávat kontaktní údaje o osobách. O každé osobě bude v adreáři zaznamenáno:

Program by měl určitě obsahovat následují třídy, všechny ve stejném balíku (cvičící určí, jakém):

Třída správce kontaktů.

Bude umět kontakty načíst ze souboru, všechny vypsat a uložit do textového souboru. Soubor, ze kterého se čte a zapisuje, bude určen pro daný správce kontaktů jednou provždy při konstrukci. Zapisuje se do stejného souboru, z něhož se čte. Údaj o jedné osobě bude uložen na právě jednom řádku textového souboru ve formátu: login jméno příjmení e-mail telefon. Jednotlivá pole řádku vstupu jsou oddělena vždy jednou mezerou. Telefon je dlouhé celé číslo, jinak jsou to řetězce. Můžeme předpokládat, že údaje jsou v souboru vždy ve správném formátu, tj. nemusíme chyby vstupu/uživatele detekovat.

Správce kontaktů musí umět zařadit nový kontakt - pozor, login osobu jednoznačně určuje, proto vložením nové osoby s loginem, který už některá stávající osoba má, bude stávající osoba nahrazena.

Dále musí umět vyřadit osobu s daným loginem.

Třída osob.

Každá osoba nese výše uvedené údaje (tj. login, jméno, příjmení, e-mail a telefonní číslo).

Osoba musí umět vypsat nebo vrátit v řetězcové podobě údaje o sobě.

Demo třída. Udělá po řadě následující operace:

Vytvoří správce kontaktů, tj. jeden objekt typu AddressBook, načtením z textového souboru, jehož jméno je zadáno jako první argument na příkazovém řádku při spuštění aplikace. Nad takto inicializovaným správcem provede následující operace:

Načtené kontakty vypíše.

Načte od uživatele, z příkazového řádku (std. vstupu), údaje o jedné osobě (login, jméno, příjmení, e-mail a telefonní číslo), vytvoří osobu a přidá do správce kontaktů.

Načte od uživatele, z příkazového řádku (std. vstupu), login osoby, kterou chce smazat, a osobu s tímto loginem ze správce kontaktů smaže.

Vypíše všechny kontakty.

Uloží všechny kontakty zpět do souboru na disk.

Poznámka

Poznámka

Poznámka

Poznámka

Váš cvičící pravděpodobně určí balík, do kterého budete vytvořené třídy ukládat. Stejně tak může upřesnit požadavky na demo třídu. Pokud cvičící zadání modifikuje, je to OK. Tohle je vzorové zadání. Za úlohu získáte opět max.5 bodů.
V Javě lze psát přenositelné aplikace s "okenním" rozhraním - s GUI

při jejich vývoji se s výhodou uplatní prostředí IDE - „builder", např. JBuilder, Sun Studio ONE, NetBeans...

V tomto kurzu budeme pracovat s moderním Swing GUI, což je součást JFC (Java Foundation Classes). Starší variantou - dosud živou v Javě verzí 1.1.x, je grafické rozhraní nad komponentami AWT (Abstract Windowing Toolkit).

Základním principem tvorby aplikací s GUI je řízení programu událostmi.

Netýká se však pouze GUI, je to obecnější pojem označující typ asynchronního programování, kdy je:

Postup (životní cyklus události):

1. Událost vznikne (typicky uživatelskou akcí nad komponentou GUI).

2. Systém vyvolá příslušnou metodu posluchače - my tu metodu obvykle smysluplně implementujeme tak, aby realizovala potřebnou akci.

Viz též příklad - První GUI aplikace.

Technicky jsou dotyčné třídy a rozhraní komponent definovány obvykle v balících:

Události mohou souviset s uživatelskou akcí nad/s:

Velmi často - a skoro nikde jinde - se jako objekt posluchače používá objektu anonymní vnitřní třídy:
V případě posluchačů události obvykle vnitřní třída má jen jednu metodu.
Proč vůbec pomocí vnitřní třídy?

vnitřní třída má přístup k (i chráněným) prvkům mateřské třídy!

poněkud nepřehledné, třída je skryta v ostatním kódu

navíc: pokud si speciálně nepamatujeme odkaz na jednou vytvořený a zapojený posluchač, pak jej nelze z paměti odstranit - nemáme na něj odkaz

V následujícím úryvku kodu se:

...vytvoří jedna instance anonymní vnitřní třídy a ta se předá/použije jako posluchač událostí.

# data[].attributes.attachment_link.description
Úvod, srovnání s jinými, oblasti použití Javy Distribuce, instalace, použití Java SDK Životní cyklus programu v Javě Základní praktické úkony - velmi podrobně!!! program v Javě je meziplatformně přenositelný na úrovni zdrojového i přeloženého kódu je to umožněno tím, že přeložený javový program běží v tzv.

# data[].attributes.attachment_link.readable_text
Přednášející: Martin Mikala, Monet+/ProID

Webinář se zaměří na asymetrickou kryptografii, faktorizaci a poskvantovou kryptografii.

Kryptografie - klasické šifry a historie

Přednášející: Pavel Vondruška, CETIN

Webinář zaměřený na: Jednoduché záměny, luštění, slabiny,Hledání zesílení odolné proti frekvenční analýze, Cesta I. - substituce, homofonní šifra, nomenklátory, kódové knihy, Cesta II. - polyalfabetické šifry, Základy - klíč: Alberti, Trithemius, Belasa, Cardano, Porta, Systémy: Blaise de Vigenére, Gaspar Schott (Gronsfeld), Giovanni Sestri , Francis Beaufort, Luštění: Francouz de Viaris, Charles Babbage , Friedrich Wilhelm Kasiski, Claud Elwood Shannon, Absolutně bezpečný systém - OTP, Požadavky na OTP, použití (agenturní systémy), chyby v použití vedoucí k prolomení

1. 3. 2021

Prezentace soutěže a partnerů

23. 2. 2021

Aktuální hrozby a trendy v oblasti kybernetické bezpečnosti

# data[].attributes.attachment_link.description
Přednášející: Martin Mikala, Monet+/ProID Webinář se zaměří na asymetrickou kryptografii, faktorizaci a poskvantovou kryptografii. Přednášející: Pavel Vondruška, CETIN Webinář zaměřený na: Jednoduché záměny, luštění, slabiny,Hledání zesílení odolné proti frekvenční analýze, Cesta I. - substituce, homofonní šifra, nomenklátory, kódové knihy, Cesta II.

# data[].attributes.attachment_link.readable_text
The world is getting more digital and having the skills to secure devices is critical to solving the challenges we face. The number of connected devices alone is expected to grow to 75 billion sensors, objects, and
other connected 'things' by the year 2023.

This course is now part of our reimagined Cybersecurity pathway, designed to better prepare you for the best learning outcomes. You will be redirected to Networking Academy's new leaner experience at SkillsForAll.com. Join, start the course, and explore the pathway.

Duration: 6 hours

# data[].attributes.attachment_link.title
Cisco Networking Academy. Build your skills today, online. It's Free

# data[].attributes.attachment_link.description
The world is getting more digital and having the skills to secure devices is critical to solving the challenges we face. The number of connected devices alone is expected to grow to 75 billion sensors, objects, and other connected 'things' by the year 2023.

# data[].attributes.attachment_link.title
Home - Mind+ - Get ready to take the leap from zero to a coding expert

# data[].attributes.attachment_link.description
Mind+ can easily create a visualized story or game with coding blocks. By adding support for Arduino, micro:bit and other educational microcontrollers, you can even build a fun project that interacts with real life. Mind+ also comes with a build-in interpreter that converts blocks into Python or C l…