Projekty pro výuku programování v jazyce Java



Podobné dokumenty
20. Projekt Domácí mediotéka

Typický prvek kolekce pro české řazení

Principy objektově orientovaného programování

Java - výjimky. private void vstup() throws IOException {... }

Objektově orientované programování

KTE / ZPE Informační technologie

Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda

Abstraktní třída a rozhraní

Teoretické minimum z PJV

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

PREPROCESOR POKRAČOVÁNÍ

11. Dědičnost. Dědičnost strana 103

Generické programování

Java a XML. 10/26/09 1/7 Java a XML

Abstraktní datové typy: zásobník

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

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

Jazyk C# (seminář 6)

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský

Návrhové vzory Design Patterns

RMI Remote Method Invocation

1. Téma 12 - Textové soubory a výjimky

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Java - Kresba. 2/28/11 1/8 Java - kresba

Postřehová hra. Zadání projektu. 1 Moje cíle

Obrázek 6.14: Prohlížec nápovedy

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Gymnázium, Praha 6, Arabská 14. Loydova patnáctka. Dokumentace ročníkového projektu. Předmět: Programování Vyučující: Ing. Tomáš Obdržálek Třída: 1.

Čipové karty Lekařská informatika

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Výčtový typ strana 67

OOPR_05. Případové studie

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

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Soubor jako posloupnost bytů

Java - řazení objektů

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

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

Jazyk C# a platforma.net

Programovací jazyk Java

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Aplikace s grafickým uživatelským rozhraním

Iterator & for cyklus

Programování v Javě I. Leden 2008

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Objektově orientované programování 1 XOBO1. Autor: Doc. Ing. František Huňka, CSc.

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Vytváření a použití knihoven tříd

Z. Kotala, P. Toman: Java ( Obsah )

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

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

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

boolean hasnext() Object next() void remove() Kolekce

17. Projekt Trojúhelníky

Reflexe RTTI Runtime Type Identification

Dědičnost (inheritance)

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Delphi podstata, koncepce a metody MDI aplikace

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

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

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

typová konverze typová inference

Regulární výrazy. Vzory

Přehled probírané látky

Jazyk C# (seminář 3)

GUI v Javě a událostmi řízené programování

GUI v Javě a událostmi řízené programování

Java GUI události. Událostmi řízené programování. Zpracování = obsluha událostí

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

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

Java Enum Java, zimní semestr ,2017 1

Algoritmizace a programování

GUI v Javě a událostmi řízené programování

Úvod do programování - Java. Cvičení č.4

Pokročilé schopnosti OOP

JAVA Unit testing Java, zimní semestr

7. Dynamické datové struktury

Výjimky. v C# a Javě

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

Třídy a objekty -příklady

IRAE 07/08 Přednáška č. 7. Začátek (head)

Technologie JavaBeans

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Java a Caché IV: Manipulace s objekty

Události. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Datové struktury. alg12 1

Transkript:

JIHOČESKÁ UNIVERZITA V ČESKÝCH BUDĚJOVICÍCH Pedagogická fakulta Katedra informatiky Akademický rok: 2006/2007 TEZE BAKALÁŘSKÉ PRÁCE Projekty pro výuku programování v jazyce Java Jméno: František Přinosil VTI Vedoucí práce: RNDr. Jaroslav Icha

Anotace: Tato práce se zabývá výukou programování v objektově orientovaném programovacím jazyce Java. Práce obsahuje okomentované zdrojové kódy na nichž jsou vysvětleny základy programování. Dále práce obsahuje zadání dílčích projektů sloužících k procvičení popisovaného problému. Řešení těchto projektů je uvedeno v příloze. Klíčová slova: Objektově orientované programování Java Výuka Řešené projekty BlueJ This thesis deals with the tuition of programming in object oriented programming language Java. It contains source codes with comments which explain the basics of programming. Further on this thesis contains the assigments of several partial projets used for practising the described problem. The solution to this projets is given in the supplement. Key words: Object oriented programming Java Tuition solved projets BlueJ

Úvod V průběhu studia na Pedagogické fakultě mě nejvíce zaujaly předměty týkající se objektově orientovaného programování. Rozhodl jsem se proto zpracovat bakalářskou práci na téma: Projekty pro výuku programování v jazyce Java. Tato bakalářská práce je určena studentům prvního ročníku pedagogické fakulty jako doplňkový materiál ke studiu. A to především studentům dálkového studia. Stejně dobře ji však mohou využít i studenti denního studia jako částečnou náhradu za vynechanou lekci. Pro potřeby výuky jsem zvolil vývojové prostředí BlueJ, které je vyvinuté speciálně pro výuku objektově orientovaného programování v jazyce Java. Práce je rozdělena do několika kapitol. Každá kapitola začíná stručným úvodem, který informuje o znalostech nutných ke studiu dané kapitoly a o dovednostech, které čtenář studiem příslušné kapitoly získá. Dále následuje ukázkový příklad. Příklad se skládá ze zdrojového kódu, který je po částech popsán a vysvětlen. Každý ukázkový příklad si může čtenář stáhnout a vyzkoušet. Následuje série úkolů, při kterých dochází k úpravám či k rozšíření kódu. První kapitola má za úkol seznámit s programovacím jazykem Java a vývojovým prostředím BlueJ, informovat o zdrojích, kde se dají získat potřebné vývojové nástroje, a dále pojednává o způsobu instalace. Druhá kapitola se věnuje základním dovednostem týkajících se programovacího jazyka. Je rozdělena do následujících podkapitol: 1. primitivní typy 2. pole 3. základní řídící konstrukce 4. rozhraní (interface) 5. abstraktní třídy 6. vnitřní třídy Třetí kapitola pojednává o možnosti využití některých knihoven a o práci s nimi. Je rozdělena na podkapitoly: 1. kolekce (java.util) 2. datové toky (java.io) 3. grafické rozhraní (javax.swing)

Čtvrtá kapitola seznamuje čtenáře se základními principy objektově orientovaného programování. Dělí se na podkapitoly: 1. objekt, třída 2. dědičnost 3. polymorfismus

Ukázkový příklad Autorizovaný přístup Nutné znalosti Pro studium této kapitoly jsou nezbytné znalosti pojmů jako je třída, metoda a atribut. Není nutné pouze tyto pojmy znát, ale také umět s nimi pracovat. Dále jsou zvláště v závěru kapitoly předpokládané základní znalosti týkající se výjimek. Cíle kapitoly Cílem kapitoly je seznámit čtenáře s možností přístupu k datům zapouzdřených uvnitř třídy pomocí metod. V těchto metodách mohou být na vstupní parametry kladeny další podmínky, které vyplývají z charakteru úlohy. Demonstrační příklady jsou umístěny na internetové stránce http://frp.wz.cz/jws/ap.php. Jedním ze základních pilířů objektově orientovaného programování je autorizovaný přístup k datům. Principem je skrytí dat uvnitř instance třídy a jejich zpřístupnění pouze pomocí metod. Nejdříve se pokusím na jednoduchém příkladě demonstrovat, k jakým problémům by mohlo dojít při nepoužívání autorizovaného přístupu. K tomu použiji třídy Zamestnanec a GUI. Třída Zamestnanec bude představovat zaměstnance školy. Každý zaměstnanec bude mít tři atributy. Atribut jmeno bude označovat jméno zaměstnance, obdobně atribut prijmeni. Atribut pocethodin bude představovat počet hodni odpracovaných zaměstnancem. Dále obsahuje metodu tostring(), která poskytuje znakovou reprezentaci objektu. Třída GUI bude představovat formulář(obr 1.), který bude sloužit k zadávání údajů o zaměstnanci a zároveň bude vypisovat informace o vytvořených zaměstnancích do listu.

Obr 1. Jak vidíte formulář obsahuje tři textová pole pojmenovaná tpjmeno, tpprijmeni, tppocethodin, která jsou určena pro vstup jednotlivých parametrů. Dále obsahuje grafickou komponentu List nazvanou list, která slouží ke zobrazování vytvořených zaměstnanců. Poslední komponentou, o které se budu zmiňovat, je tlačítko uložit nazvané tlulozit, po jehož stisknutí se vykoná metoda public void actionperformed(actionevent e). Detailnějším popisem se nebudu zabývat, gui není předmětem této práce. Uvnitř třídy GUI je také vytvořena instance třídy ArrayList, která slouží k uchovávání instancí typu Zamestnanec. private ArrayList<Zamestnanec> seznamzamestnancu; Třída Zamestnanec public class Zamestnanec { /** * Proměná představující jméno zaměstnance */ public String jmeno; /** * Proměná představující příjmení zaměstnance */ public String prijmeni; /**

* Proměná představující počet odpracovaných hodin */ public int pocethodin; /** * Konstruktor pro objekt třídy Zaměstnanec */ public Zamestnanec() { public String tostring() { return jmeno + " " + " " +prijmeni + " " + String.valueOf(pocetHodin); Třída GUI public class GUI extends JFrame { JButton tluloz; /** * Textové pole sloužící pro vstup parametru jmeno. */ JTextField tpjmeno; /** * Textové pole sloužící pro vstup parametru prijmeni. */ JTextField tpprijmeni; /** * Textové pole sloužící pro vstup parametru pocetdeti. */ JTextField tppocetdeti; /** * Seznam sloužící k uchovávání instancí typu Zamestnanec. */ private ArrayList<Zamestnanec> seznamzamestnancu; /** * Grafická komponenta sloužící k zobrazování údajů o Zaměstnancích.

*/ JList list; GUI() { tluloz.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { String jmeno = tpjmeno.gettext(); String prijmeni = tpprijmeni.gettext(); int pocethodin = Integer.valueOf(tpPocetDeti.getText()); Zamestnanec zm = new Zamestnanec(); zm.jmeno = jmeno; zm.prijmeni = prijmeni; zm.pocethodin = pocethodin; seznamzamestnancu.add(zm); li.setlistdata(seznamzamestnancu.toarray()); public static void main(string[] args) { new GUI().setVisible(true); Jak vidíte, nejzajímavější je zde metoda public void actionperformed(actionevent e). Jsou zde deklarovány tři nové proměnné metody: jmeno, prijmeni a pocethodin, do kterých jsou ukládány hodnoty z textových polí. Dále zde dochází k vytvoření instance typu Zamestnanec a následně k uložení hodnot z textových polí do příslušných instančních proměnných instance třídy Zamestnanec a to pomocí metody gettext(), která vrací objekt typu string. V závěru je nově vytvořený zaměstnanec přidán do seznamu zaměstnanců, jehož obsah je posléze vypsán do listu.

Nyní mohu program spustit a vytvořit svého prvního zaměstnance (obr 2). Obr 2. Jak vidíte z obrázku, hodnoty, které jsem zadal do textových polí nebyly zvoleny nejvhodněji. Počet odpracovaných hodin je záporný. Jméno a příjmení začíná malým písmenem. Z hlediska kódu je ale vše v pořádku jmeno a prijmeni jsou proměnné typu string a pocethodin proměnná typu int. Jak zajistit, aby do proměnných jmeno a prijmeni mohly být ukládány pouze hodnoty typu string začínající velkým písmenem a do proměnné pocethodin pouze nezáporná celá čísla? Použiji následující řešení: Instanční proměnné uvodím klíčovým slovem private, tím znepřístupním tyto proměnné ze všech tříd, kromě třídy Zamestnanec. Pokusíme-li se k některé z těchto privátních proměnných přistoupit z jiné třídy něž je Zamestnanec například voláním zm.jmeno = petr; v metodě void actionperformed(actionevent e) třídy GUI, bude nám ohlášena chyba: jmeno has private access in Zamestnanec, již při kompilaci. K těmto privátním proměnným budu přistupovat pomocí veřejných metod, kde mohu klást na vstupní hodnoty další podmínky. Z pravidla se vytvářejí dvě metody pro jednu proměnnou. Jedna z metod, obvykle se její název vytváří z předpony get a jména proměnné, slouží k získání hodnoty proměnné. Druhá metoda, obvykle se její jméno skládá z předpony set a jména proměnné, slouží k uložení hodnoty do proměnné. Samozřejmě z hlediska češtiny tohle

není zcela korektní řešení, ale z hlediska programování se takto vytváří velmi dobře čitelný kód. Právě v metodě, určené pro uložení hodnoty do proměnné instance máme možnost omezit příslušnou podmínkou uložení dané hodnoty. Například metoda pro ukládání hodnoty do proměnné pocethodin by mohla vypadat následovně: public void setpocethodin(int pocethodin) { if (pocethodin>=0) this.pocethodin=pocethodin; Její ekvivalent metoda sloužící pro získání hodnoty uložené v instanční proměnné pocethodin by mohla vypadat takto: public int getpocethodin() { return pocethodin; Obdobným způsobem upravíme i přístup ke zbývajícím instančním proměnným třídy Zamestnanec. public void setjmeno(string jmeno) { if(jmeno.substring(0, 1).equals(jmeno.substring(0,1).toUpperCase())) this.jmeno = jmeno; public void setprijmeni(string prijmeni) { if(prijmeni.substring(0, 1).equals(prijmeni.substring(0,1).toUpperCase())) this.prijmeni = prijmeni; public String getjmeno() { return jmeno; public String getprijmeni() { return prijmeni;

Nyní ještě musíme provést drobnou úpravu v metodě void actionperformed(actionevent e) třídy GUI, nemůžeme již přistupovat k proměnným jmeno, prijmeni a pocethodin přímo, ale musíme použít již vytvořené metody. zm.setpocethodin(integer.valueof(tppocetdeti.gettext())); zm.setjmeno(tpjmeno.gettext()); zm.setprijmeni(tpprijmeni.gettext()); Nyní můžeme program zpustit a vytvořit si několik zaměstnanců. Použijeme-li hodnoty, které budou vyhovovat námi stanoveným podmínkám, budou tyto hodnoty uloženy do instančních proměnných. V opačném případě zůstane v instančních proměnných uložena jejich implicitní hodnota. Vše ukazuje následující obrázek: Obr 3. Neprojde-li hodnota našimi podmínkami, bylo by vhodné na tuto skutečnost upozornit. Například tak, že bude vyvolána výjimka. Nic nám nebrání v tom vytvořit novou výjimku typu IllegalArgumentExceptino a zajistit její vyhození příkazem throw při patřičné situaci. Následující příklad je ukázkou pozměněné metody setpocethodin, která vyhazuje při zadání záporného počtu hodin příslušnou výjimku. Obdobným způsobem jsou upraveny i metody setjmeno a setprijmeni.

public void setpocethodin(int pocethodin) { if (pocethodin<0) { throw new IllegalArgumentException("Pocet odpracovaných hodin nemůže být záporné číslo."); this.pocethodin=pocethodin; Bude-li nyní pomocí metody setpocethodin ukládána záporná hodnota, dojde za běhu programu k vyhození výjimky. V opačném případě se uloží hodnota parametru metody do proměnné pocethodin. K vyhození výjimky může dojít tedy při ukládání hodnot, proto by bylo vhodné uzavřít tyto části kódu do chráněné oblasti. V našem případě budeme odchytávat výjimky v metodě void actionperformed(actionevente) třídy GUI. Odchycení by mohlo vypadat třeba následovně: try { zm.setjmeno(tpjmeno.gettext()); catch(illegalargumentexception ex) { System.out.println(ex.toString()); try { zm.setprijmeni(tpprijmeni.gettext()); catch(illegalargumentexception ex) { System.out.println(ex.toString()); try { zm.setpocethodin(integer.valueof(tppocetdeti.gettext())); catch(illegalargumentexception ex) { System.out.println(ex.toString());

Odchycení výjimky a její následující vypsání ukazuje následující obrázek. K výpisu je použito terminálové okno BlueJ. Obr 4. Jak je z obrázku patrné, byla vytvořena instance třídy Zamestnanec, v jejich instančních proměnných jmeno a prijmeni je uložena implicitní hodnota, zadávané hodnoty nevyhovovali požadavkům, nebyly uloženy a byly tudíž vyvolány příslušné výjimky. Pokud bychom požadovali, aby instance třídy v případě zadání špatných parametrů vůbec nebyla vytvořena, museli bychom provádět kontrolu parametrů již v konstruktoru. Z toho vyplývá nutnost použití konstruktoru z parametry. public Zamestnanec(String jmeno, String prijmeni, int pocethodin) { if (!(jmeno.substring(0, 1).equals(jmeno.substring(0,1).toUpperCase()))) { throw new IllegalArgumentException("Jmeno zaměstnance nemůže začínat malým písmenem.");

Z uvedeného kódu je patrná jistá duplicita, vždyť podobné ověření se provádí v metodách setjmeno, Nebylo by vhodnější inicializovat instanční proměnné již v konstruktoru pomocí přístupových metod a tím se vyhnout duplicitnímu a složitému kódu? Konstruktor by pak vypadal následovně: public Zamestnanec(String jmeno, String prijmeni, int pocethodin) { setjmeno(jmeno); setprijmeni(prijmeni); setpocethodin(pocethodin); Nyní při vytváření instance třídy Zamestnanec může být vyhozena výjimka. Na tuto skutečnost musíme ještě reagovat drobnou úpravou v kódu třídy GUI. try { Zamestnanec zm = new Zamestnanec(jmeno, prijmeni, pocethodin); seznamzamestnancu.add(zm); catch (IllegalArgumentException ex) { System.out.println(ex.toString()); Nyní při zadání nekorektních parametrů nebude instance třídy Zamestnance vytvořena a bude vyhozena příslušná výjimka. Vše ukazuje následující obrázek:

Obr 5.

Co je již hotovo, co plánuji udělat Kompletně zpracovaná čtvrtá kapitola týkající se základních principů objektově orientovaného programování (35 stran). Dále je z velké části vytvořena druhá kapitola - chybějí pouze ukázkové příklady k podkapitolám abstraktní a vnitřní třídy. V třetí kapitole je ke každé podkapitole vytvořeno několik příkladů. Výběr demonstračního příkladu ještě zvažuji. Práci bych ještě rád doplnil o vhodné animace, které umožní lepší proniknutí do některých problémů. Zvláště vhodné se mi jeví u podkapitol týkajících se řídících konstrukcí, a to jak podmínkových příkazů tak u cyklů. V současné době vedu kroužek programování v jazyce Java na Střední škole podnikání. Tato aktivita mi umožňuje získat zpětnou vazbu o mé práci. Tyto informace bych rád použil jako vodítko pří výběru vhodnosti ukázkových projektů.

Seznam odborné literatury: David J. Barnes, Michael Kölling. Objects First With Java, second edition. Pearson Education Limited, 2005. Rudolf Pecinovský. Myslíme objektově v jazyku Java 5. Grada Publishing, a.s., 2004.

Závěr Vzhledem k tomu, že práce detailně popisuje uvedená témata a snaží se přímým způsobem seznámit čtenáře se základními dovednostmi při programování v jazyce Java, může být využíván pro potřeby studentů JU. A to jak pro studenty prezenčního studia k zopakování či ujasnění látky, tak i pro studenty kombinovaného studia. Z těchto potřeb je připravena i elektronická verze práce ve formě webové prezentace.