Za´padoˇceska´ univerzita v Plzni Fakulta aplikovany´ch vˇed Katedra informatiky a vy´poˇcetn´ı techniky
Bakal´ aˇ rsk´ a pr´ ace Sada u ´ loh pro PilsProg a softwarov´ a aplikace pro shromaˇ zd’ov´ an´ı vyˇ reˇ sen´ ych u ´ loh
Plzeˇ n, 2014
Martin Bl´aha
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem bakal´aˇrskou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 7. kvˇetna 2014 Martin Bl´aha
Podˇ ekov´ an´ı M´e podˇekov´an´ı patˇr´ı Ing. Arnoˇstce Netrvalov´e, Ph.D. za odborn´e veden´ı, trpˇelivost a ochotu, kterou mi v pr˚ ubˇehu zpracov´an´ı bakal´aˇrsk´e pr´ace vˇenovala.
Abstract The objectives and outcomes of this work are a set of problems for PilsProg programming contest and a software application for collecting of solved problems. The first part deals with the study of the PilsProg programming contest website and subsequently with the creation of the problem set using the available ACM validators. The purpose of the problem set is to provide a basis for a problem definition for the PilsProg programming contest. The second part of this work describes the application for storing and sharing of solved problems. In the future, the application should also provide an additional teaching material for students involved in programming.
Obsah ´ 1 Uvod
1
2 Vytvoˇ ren´ı sady u ´ loh pro PilsProg 2.1 Programovac´ı soutˇeˇz PilsProg . . . . . . . . . . 2.1.1 Z´akladn´ı u ´daje . . . . . . . . . . . . . . 2.1.2 Registrace . . . . . . . . . . . . . . . . . 2.1.3 Pravidla soutˇeˇze . . . . . . . . . . . . . 2.1.4 Podporovan´e programovac´ı jazyky . . . . 2.1.5 Softwarov´e vybaven´ı . . . . . . . . . . . 2.1.6 Odevzd´an´ı u ´loh a odpovˇedi valid´atoru . 2.2 Valid´ator UVa Online Judge . . . . . . . . . . . 2.2.1 Z´akladn´ı u ´daje . . . . . . . . . . . . . . 2.2.2 Registrace . . . . . . . . . . . . . . . . . ´ 2.2.3 Ulohy . . . . . . . . . . . . . . . . . . . 2.2.4 Zp˚ usob odevzd´an´ı a odpovˇedi valid´atoru 2.3 Vybran´e u ´lohy ze sady u ´loh . . . . . . . . . . . 2.3.1 Seˇrad’te jazyky . . . . . . . . . . . . . . 2.3.2 Dek´odov´an´ı p´asky . . . . . . . . . . . . . 2.3.3 Pˇreteˇcen´ı . . . . . . . . . . . . . . . . . 2.3.4 Z´amek . . . . . . . . . . . . . . . . . . . 2.3.5 Nejdelˇs´ı spoleˇcn´a posloupnost . . . . . . 2.4 Probl´emy pˇri ˇreˇsen´ı u ´loh . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
2 2 2 2 3 4 5 5 5 5 6 6 6 9 10 13 15 17 20 22
3 Softwarov´ e aplikace 3.1 C´ıle aplikace . . . . . . . . 3.2 Pouˇzit´e technologie . . . . 3.2.1 Platforma Java . . 3.2.2 Programovac´ı jazyk 3.2.3 Apache Ant . . . . 3.2.4 Datab´aze MySQL . 3.3 Pouˇzit´e architektury . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
23 23 23 24 24 25 25 26
. . . . . . . . . Java . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
3.4
3.3.1 S´ıt’ov´a architektura klient-server . 3.3.2 V´ıcevrstv´a architektura . . . . . . Program´atorsk´a dokumentace . . . . . . 3.4.1 Datab´aze . . . . . . . . . . . . . 3.4.2 Server . . . . . . . . . . . . . . . 3.4.3 Klient . . . . . . . . . . . . . . .
4 Z´ avˇ er
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
26 27 28 28 29 33 38
´ 1 Uvod V prvn´ı kapitole m´e bakal´aˇrsk´e pr´ace bych v´as chtˇel sezn´amit s programovac´ı soutˇeˇz´ı PislProg. Pro kterou budu vytv´aˇret sadu u ´loh z jednoho z neobl´ıbenˇejˇs´ıho veˇrejn´eho validaˇcn´ıho serveru pro tr´enov´an´ı program´atorsk´ ych u ´loh UVa Online Judge, se kter´ ym v´as tak´e bl´ıˇze sezn´am´ım. D´ale v´am uk´aˇzu vybran´e u ´lohy z t´eto vytvoˇren´e sady, kter´a bude slouˇzit jako podklad pro zad´av´an´ı u ´loh pro program´atorskou soutˇeˇz PilsProg. V druh´e kapitole m´e bakal´aˇrsk´e pr´ace v´am uk´aˇzu softwarovou aplikaci, kter´a bude slouˇzit pro uchov´av´an´ı a sd´ılen´ı vyˇreˇsen´ ych u ´loh s popisem, s jak´ ym algoritmem dan´a u ´loha byla vyˇreˇsena. D´ale si pop´ıˇseme platformu Java s programovac´ım jazykem Java, kter´a bude pouˇzita pro naprogramov´an´ı aplikace. D´ale se sezn´am´ıme s relaˇcn´ı datab´az´ı MySQL, kter´a bude zvolena pro uchov´av´an´ı dat a Apache Ant, kter´ y bude pouˇzit pro pˇreklad aplikace a tak´e si uk´aˇzeme architektury, kter´e budou pouˇzity v aplikaci.
1
2 Vytvoˇren´ı sady u´loh pro PilsProg C´ılem t´eto ˇca´sti bylo vybrat si jeden z veˇrejn´ ych validaˇcn´ıch server˚ u a z nˇeho vytvoˇrit sadu u ´loh, kter´a by mˇela slouˇzit jako podklad pro vytvoˇren´ı zad´an´ı pro program´atorskou soutˇeˇz PilsProg. Pro vytvoˇren´ı sady budeme pouˇz´ıvat validaˇcn´ı server UVa Online Judge. Tento validaˇcn´ı server jsem si vybral proto, ˇze sn´ım pracuji jiˇz od prvn´ıho roˇcn´ıku na vysok´e ˇskole a m´am s n´ım nejv´ıce dobr´ ych zkuˇsenost´ı. Kaˇzd´a u ´loha obsahuje zad´an´ı pˇreloˇzen´e do ˇceˇstiny a zdrojov´ y k´od, kter´ y danou u ´lohu ˇreˇs´ı. Ke kaˇzd´e u ´loze je tak´e pˇrid´an vstupn´ı a v´ ystupn´ı soubor, kter´ y slouˇz´ı pro reprezentaci testovan´ ych pˇr´ıpad˚ u.
2.1 2.1.1
Programovac´ı soutˇ eˇ z PilsProg Z´ akladn´ı u ´ daje
PilsProg [1] je programovac´ı soutˇeˇz pro studenty stˇredn´ıch ˇskol, jej´ımˇz garantem je Katedra informatiky a v´ ypoˇcetn´ı techniky Fakulty aplikovan´ ych vˇed Z´apadoˇcesk´e univerzity v Plzni. Tato soutˇeˇz slouˇz´ı pro porovn´an´ı program´atorsk´ ych schopnost´ı student˚ u r˚ uzn´ ych stˇredn´ıch ˇskol. Soutˇeˇz m˚ uˇze tak´e pomoci u ´spˇeˇsn´ ym soutˇeˇz´ıc´ım k pˇrijet´ı na Fakultu aplikovan´ ych vˇed.
2.1.2
Registrace
Pro u ´ˇcast v soutˇeˇzi je nutn´a bezplatn´a registrace na webov´ ych str´ank´ach PilsProgu [1] v dobˇe, kter´a je urˇcen´a v harmonogramu soutˇeˇze, kter´ y se nach´az´ı na str´ank´ach. Soutˇeˇze se m˚ uˇzou z´ uˇcastnit jednotlivci, ale podm´ınkou pro registraci je, aby byl studentem stˇredn´ı ˇskoly v roce, ve kter´em se soutˇeˇz poˇra´d´a. Po registraci pˇrijde soutˇeˇz´ıc´ımu na e-mail registraˇcn´ı e-mail, kter´ y uvedl pˇri registraci. Soutˇeˇz´ıc´ı je n´aslednˇe schopen se pˇrihl´asit. Po pˇrihl´aˇsen´ı si soutˇeˇz´ıc´ı m˚ uˇze prohl´ednout ilustraˇcn´ı u ´lohy a vyzkouˇset si jejich odevzd´an´ı.
2
Vytvoˇren´ı sady u ´loh pro PilsProg
2.1.3
Programovac´ı soutˇeˇz PilsProg
Pravidla soutˇ eˇ ze
Kaˇzd´ y soutˇeˇz´ıc´ı pracuje samostatnˇe a m´a za u ´kol v urˇcit´e dobˇe vyˇreˇsit a naprogramovat spr´avn´e ˇreˇsen´ı pro zadan´e probl´emy. Soutˇeˇz prob´ıh´a ve dvou kolech - kvalifikaˇcn´ı a fin´alov´e. Kvalifikaˇcn´ıho kola se z´ uˇcastn´ı vˇsichni registrovan´ı soutˇeˇz´ıc´ı. Do fin´alov´eho kola uˇz pak postupuj´ı pouze nejlepˇs´ı soutˇeˇz´ıc´ı. Kvalifikaˇcn´ı soutˇeˇz prob´ıh´a z domova pomoc´ı webov´ ych str´anek [1]. Pˇri spuˇstˇen´ı kvalifikaˇcn´ıho kola jsou na webov´ ych str´ank´ach vyvˇeˇseny programovac´ı u ´lohy, kter´e soutˇeˇz´ıc´ı ˇreˇs´ı. K poˇctu spr´avnˇe odevzdan´ ych u ´loh se tak´e ud´av´a doba od zaˇca´tku kvalifikaˇcn´ıho kola do doby, kdy soutˇeˇz´ıc´ı odevzdal ˇ spr´avnˇe vyˇreˇsenou u ´lohu. Casy, za kter´e soutˇeˇz´ıc´ı jednotliv´e u ´lohy odevzdal, se sˇc´ıtaj´ı. Tento ˇcas pot´e slouˇz´ı pro vyhodnocen´ı poˇrad´ı, pakliˇze soutˇeˇz´ıc´ı maj´ı stejn´ y poˇcet spr´avnˇe odevzdan´ ych u ´loh (viz Obr´azek 2.1). Soutˇeˇz´ıc´ı proto mus´ı zvolit strategii takovou, ˇze zaˇcne vypracov´avat u ´lohy od t´e, kter´a mu zabere nejm´enˇe ˇcasu.
Obr´azek 2.1: V´ ysledek kvalifikace Fin´alov´e kolo prob´ıh´a v prostor´ach Katedry informatiky a v´ ypoˇcetn´ı techniky a je ˇcasovˇe omezen podle poˇctu ˇreˇsen´ ych u ´loh. Kaˇzd´ y soutˇeˇz´ıc´ı m´a pˇriˇrazen´ y poˇc´ıtaˇc, na kter´em ˇreˇs´ı zadan´e u ´lohy. V pr˚ ubˇehu fin´alov´eho kola soutˇeˇz´ıc´ı m˚ uˇze pouˇz´ıvat pouze knihy, kter´e si s´am donesl. Veˇsker´e elektro3
Vytvoˇren´ı sady u ´loh pro PilsProg
Programovac´ı soutˇeˇz PilsProg
technick´e pom˚ ucky jsou zcela zak´az´any. Hodnocen´ı fin´alov´eho kola se prov´ad´ı stejnˇe jako v kvalifikaˇcn´ım kole s t´ım rozd´ılem, ˇze za kaˇzdou ˇspatnˇe odevzdanou u ´lohou se pˇriˇc´ıt´a deset minut do celkov´eho ˇcasu, kter´a byla potˇreba pro vyˇreˇsen´e t´eto u ´lohy.
2.1.4
Podporovan´ e programovac´ı jazyky
V PilsProgu soutˇeˇz´ıc´ı mohou pouˇz´ıvat ˇctyˇri programovac´ı jazyky. Podporovan´e jazyky jsou C, C++, Java a Pascal. Kaˇzd´ y soutˇeˇz´ıc´ı m˚ uˇze vyuˇz´ıvat prostˇredk˚ u, kter´e mu jazyk dovoluje mimo n´ıˇze uveden´ ych moˇznost´ı: • program nesm´ı otev´ırat soubory mimo standardn´ıho vstupu a v´ ystupu, • program nesm´ı vyuˇz´ıvat s´ıt’ovˇe prostˇredky, • program mus´ı vyuˇz´ıvat pouze jeden proces.
Jazyk C Je pouˇzit nejnovˇejˇs´ı standart C11 a u ´lohy jsou pˇrekl´ad´any pˇr´ıkazem gcc -std=c11 -lm -O2 vstup.c.
Jazyk C++ ´ Nejnovˇejˇs´ı standart je pouˇzit i u jazyka C++, kter´ ym je C++11. Ulohy se pˇrekl´adaj´ı pomoc´ı pˇr´ıkazu g++ -std=c++11 -lm -O2 vstup.cpp.
Jazyk Java U jazyka Java je pouˇzita verze 1.7.0. Z d˚ uvodu bezpeˇcnosti nesm´ı soutˇeˇz´ıc´ı vytv´aˇret vlastn´ı bal´ıˇcky.
Jazyk Pascal U jazyka Pascal je pouˇzita verze 2.6.0. 4
Vytvoˇren´ı sady u ´loh pro PilsProg
2.1.5
Valid´ator UVa Online Judge
Softwarov´ e vybaven´ı
Pˇri programov´an´ı v kvalifikaˇcn´ım kole je moˇzn´e pouˇz´ıt libovoln´ y editor, kter´ y soutˇeˇz´ıc´ımu vyhovuje. Ve fin´alov´em kole budou na poˇc´ıtaˇci k dispozici n´ıˇze uveden´e v´ yvojov´e prostˇred´ı, kter´e uˇzivatel m˚ uˇze vyuˇz´ıt: • DevC++ (verze 5.4.2), • Eclipse (Kepler - verze 4.3.1), • FreePascal IDE (verze 1.0.12, verze pˇrekladaˇce 2.6.0).
2.1.6
Odevzd´ an´ı u ´ loh a odpovˇ edi valid´ atoru
Odevzd´av´an´ı vyˇreˇsen´ ych u ´loh se prov´ad´ı pomoc´ı webov´ ych str´anek [1]. Kaˇzd´ y soubor, kter´ y soutˇeˇz´ıc´ı odevzd´av´a, mus´ı m´ıt pˇr´ıponu podle jazyka, kter´ y soutˇeˇz´ıc´ı pouˇzil. C mus´ı m´ıt pˇr´ıponu .c, C++ .cpp, Java .java a Pascal .pas. Pˇri odevzd´an´ı programu soutˇeˇz´ıc´ı m˚ uˇze dostat jednu z n´ıˇze uveden´ ych odpovˇed´ı: • Chyba pˇ ri kompilaci - nelze pˇreloˇzit zdrojov´ y soubor, • Spr´ avn´ eˇ reˇ sen´ı - program byl uzn´an jako spr´avn´e ˇreˇsen´ı zadan´e u ´lohy, • Chybn´ eˇ reˇ sen´ı - program vr´atil ˇspatn´e v´ ysledky pro zadanou u ´lohu, • Pˇ rekroˇ cen´ı ˇ casov´ eho limitu - program neskonˇcil v ˇcasov´em limitu, kter´e poskytuj´ı informaci o tom, jestli dan´ y program splˇ nuje danou u ´lohu nebo ne.
2.2 2.2.1
Valid´ ator UVa Online Judge Z´ akladn´ı u ´ daje
UVa Online Judge [2] je veˇrejn´ y valid´ator pro n´acvik u ´loh, kter´e se vyuˇz´ıvaj´ı v ACM soutˇeˇz´ıch. Tento valid´ator patˇr´ı pod ˇspanˇelskou univerzitu Universidad 5
Vytvoˇren´ı sady u ´loh pro PilsProg
Valid´ator UVa Online Judge
de Valladolid a je pˇr´ıstupn´ y pro vˇsechny uˇzivatele po bezplatn´e registraci. Valid´ator m´a pˇres 100 000 registrovan´ ych uˇzivatel˚ u, kteˇr´ı m˚ uˇzou vypracov´avat pˇres 4 300 probl´em˚ u z r˚ uzn´ ych oblast´ı. Cel´e str´anky jsou kompletnˇe napsan´e v anglick´em jazyce vˇcetnˇe zad´an´ı u ´loh. Mezi podporovan´e programovac´ı jazyky patˇr´ı C/C++, Java a Pascal.
2.2.2
Registrace
Registrace je bezplatn´a a prob´ıh´a na webov´ ych str´ank´ach [2]. Pˇri registraci je nutn´e zadat jm´eno, e-mail, uˇzivatelsk´e jm´eno a heslo. Tak´e m´ame moˇznost pˇri registraci zaˇskrtnout, jestli chceme, aby se v´ ysledky u ´loh zas´ılaly na e-mail. Po zaregistrov´an´ı je ihned moˇzn´e se pˇrihl´asit a zaˇc´ıt ˇreˇsit u ´lohy.
2.2.3
´ Ulohy
Vˇsechny u ´lohy, kter´e m˚ uˇzeme ˇreˇsit, lze prohl´ıˇzet pomoc´ı webov´ ych str´anek a jsou seˇrazeny do nˇekolika r˚ uzn´ ych sekc´ı, kter´e mimo jin´e obsahuj´ı tak´e vˇsechny u ´lohy z ACM-ICPC svˇetov´eho fin´ale od roku 1990 do roku 2013. Kaˇzdou u ´lohu je tak´e moˇzn´e st´ahnou ve form´atu PDF. U kaˇzd´e u ´lohy je zad´ano, v jak´e ˇcasov´e dobˇe mus´ı program skonˇcit a kolik dan´ y algoritmus m˚ uˇze vyuˇz´ıt pamˇeti, pro vyˇreˇsen´ı dan´e u ´lohy.
2.2.4
Zp˚ usob odevzd´ an´ı a odpovˇ edi valid´ atoru
´ Ulohy se odevzd´avaj´ı pomoc´ı webov´e str´anky [2], kde je uˇzivatel pˇrihl´aˇsen pomoc´ı sv´eho uˇzivatelsk´eho u ´ˇctu. Pˇri odevzd´av´an´ı je nutn´e vyplnit ˇc´ıslo ˇreˇsen´e u ´lohy, zaˇskrtnout jazyk, v kter´em je u ´loha naprogramov´ana a pot´e je moˇzn´e dvˇema zp˚ usoby vloˇzit zdrojov´ y k´od ˇreˇsen´ı. Prvn´ı zp˚ usob je vybr´an´ı souboru se zdrojov´ ym k´odem. Druh´ y zp˚ usob je vloˇzen´ı zdrojov´eho k´odu do textov´eho pole (viz Obr´azek 2.2).
6
Vytvoˇren´ı sady u ´loh pro PilsProg
Valid´ator UVa Online Judge
Obr´azek 2.2: Zp˚ usob odevzd´an´ı u ´lohy Po odesl´an´ı u ´lohy si m˚ uˇzeme pomoc´ı webov´ ych str´anek [2] zjistit, jakou odpovˇed’ jsme dostali od valid´atoru, jak m˚ uˇzeme vidˇet na obr´azku (viz Obr´azek 2.3). Na tomto obr´azku vid´ıme, ˇze kaˇzd´e odevzd´an´ı m´a svoje identifikaˇcn´ı ˇc´ıslo, kter´e je ve sloupci #. N´asleduje sloupec, ve kter´em je spoleˇcnˇe identifikaˇcn´ı ˇc´ıslo u ´lohy s jej´ım n´azvem. Ve sloupci Verdict, nalezneme odpovˇed’ od valid´atoru. Sloupec Language obsahuje jazyk, ve kter´em jsme ˇreˇsen´ı napsali a ve sloupc´ıch Run Time a Submission Date, jsou informace o ˇcasu bˇehu a datu, kdy u ´loha byla odevzd´ana.
7
Vytvoˇren´ı sady u ´loh pro PilsProg
Valid´ator UVa Online Judge
Obr´azek 2.3: Informace o odevzdan´ ych u ´loh´ach V´ ysledek se tak´e zas´ıl´a na n´aˇs e-mail, pakliˇze jsme pˇri registraci zaˇskrtli odes´ıl´an´ı v´ ysledk˚ u na e-mail. Moˇzn´e odpovˇedi od valid´atoru jsou: • In Queue (QU) - Valid´ator je zanepr´azdnˇen a nem˚ uˇze hned poskytnout informace o spr´avnosti. V´ ysledky budou hned co bude moc. ˇ sen´ı bylo akceptovan´e pro dan´e zad´an´ı. • Accepted (AC) - Reˇ • Presentation Error (PE) - V´ ystup ˇreˇsen´ı je spr´avn´ y, ale v´ ystup je ˇspatnˇe prezentov´an. • Wrong Answer (WA) - V´ ystup vaˇseho ˇreˇsen´ı je chybn´ y. • Compile Error (CE) - Pˇri kompilaci doˇslo k chybˇe. • Runtime Error (RE) - V pr˚ ubˇehu bˇehu programu se vyskytla chyba. • Time Limit Exceeded (TL) - Vaˇse ˇreˇsen´ı pˇrekroˇcilo ˇcasov´ y limit pro danou u ´lohu. • Memory Limit Exceeded (ML) - Program pˇrekroˇcil pamˇet’ov´e n´aroky, kter´e bylo moˇzn´e vyuˇz´ıt pro danou u ´lohu. 8
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
• Output Limit Exceeded (OL) - Program vypisuje pˇr´ıliˇs mnoho informac´ı. • Submission Error (SE) - Nepodaˇrilo se odevzdat u ´lohu. • Restricted Function (RF) - Program vyuˇz´ıv´a funkce, kter´e jsou zak´azan´e. • Can’t Be Judged (CJ) - Program nem˚ uˇze b´ yt posouzen z d˚ uvodu, ˇze valid´ator nem´a vstupn´ı a v´ ystupn´ı soubory.
2.3
Vybran´ eu ´ lohy ze sady u ´ loh
N´ıˇze si m˚ uˇzete prohl´ednout uk´azky u ´loh z vypracovan´e sady. Vˇsechny u ´lohy byly naprogramov´any pomoc´ı programovac´ıho jazyka Java a vˇsechny byly u ´spˇeˇsnˇe validov´any na validaˇcn´ım serveru UVa Online Judge [2]. U kaˇzd´e u ´lohy je origin´aln´ı zad´an´ı, pˇreloˇzen´e origin´aln´ı zad´an´ı a je pops´ana z´akladn´ı myˇslenka u ´lohy s moˇzn´ ym zp˚ usobem ˇreˇsen´ı. U kaˇzd´e u ´lohy je naps´ano, jak´e probl´emy se u dan´e u ´lohy pˇri ˇreˇsen´ı mohou vyskytnout. Na pˇriloˇzen´em CD pot´e m˚ uˇzete naj´ıt vˇsech tˇriadvacet vyˇreˇsen´ ych u ´loh (viz Obr´azek 2.4) s PDF souborem, ve kter´em je origin´aln´ı zad´an´ı u ´lohy. Naleznete tam tak´e pˇreloˇzen´e zad´an´ı do ˇceˇstiny s popisem moˇzn´eho zp˚ usobu ˇreˇsen´ı pro danou u ´lohu. Ke kaˇzd´e u ´loze jsou vytvoˇreny vstupy a v´ ystupy, kter´e takt´eˇz naleznete na pˇriloˇzen´em CD. Vˇsechny u ´lohy jsou na pˇriloˇzen´em CD rozdˇeleny do tˇr´ı sloˇzek Lehk´e, Stˇrednˇe obt´ıˇzn´e a Obt´ıˇzn´e, podle obt´ıˇznosti ˇreˇsen´ı.
9
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
Obr´azek 2.4: Seznam vyˇreˇsen´ ych u ´loh Pˇri ˇreˇsen´ı u ´loh, jsem vyuˇz´ıval kn´ıˇzku Uˇcebnice jazyka Java [3], kter´a mi pomohla se syntax´ı Javy. Pro algoritmy, jsem vyuˇz´ıval kn´ıˇzku Programming Challenges [4], kter´a je dostupn´a ke staˇzen´ı na Internetu a kn´ıˇzku Algorithms (4th Edition) od autor˚ u Roberta Sedgewicka a Kevina Wayna. Nejv´ıce mi, ale pomohla pˇri ˇreˇsen´ı webov´a str´anka [5], kde se daj´ı naj´ıt diskuze o dan´e u ´loze.
2.3.1
Seˇ rad’te jazyky
Zad´ an´ı Pravdˇepodobnˇe jste si vˇsimli, ˇze angliˇctinou a ˇspanˇelˇstinou se mluv´ı v mnoha oblastech po cel´em svˇetˇe. Ted’ by bylo zaj´ımav´e, seˇradit vˇsechny jazyky podle poˇct˚ u st´at˚ u, kde se dan´ ym jazykem mluv´ı. Dostanete mapu, na kter´e jsou zobrazeny st´aty s jazykem, se kter´ ym dan´ y st´at mluv´ı. Pod´ıvejte se na n´asleduj´ıc´ı mapu jako pˇr´ıklad. ttuuttdd 10
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
ttuuttdd uuttuudd uuttuudd Kaˇzd´e p´ısmeno je zkratka pro jazyk a st´aty. St´at je definov´an jako spojen´a plocha se stejn´ ym p´ısmenem. Dvˇe p´ısmena jsou spojena, pokud druh´e p´ısmeno je vlevo, vpravo, nad nebo pod. To znamen´a, ˇze na mapˇe jsou tˇri st´aty, kde se mluv´ı jazykem ,t‘ , tˇri st´aty, kde se mluv´ı jazykem ,u‘ a jeden st´at, kde lid´e mluv´ı jazykem ,d‘ . Vaˇs´ım u ´kolem je urˇcit poˇcet st´at˚ u pro kaˇzd´ y jazyk a vytisknout v´ ysledky v zadan´em poˇrad´ı.
Vstup Prvn´ı ˇr´adek obsahuje poˇcet testovan´ ych pˇr´ıpad˚ u N. Kaˇzd´ y testovan´ y pˇr´ıpad se skl´ad´a z ˇr´adku s dvˇema ˇc´ısly H a W, kter´a ud´avaj´ı v´ yˇsku a ˇs´ıˇrku mapy. Pot´e n´asleduje H ˇra´dk˚ u s ˇretˇezcem W p´ısmen. Tyto p´ısmena budou vˇzdy mal´a od ,a‘ do ,z‘ .
V´ ystup Pro kaˇzd´ y testovan´ y pˇr´ıpad vypiˇste World #n“, kde n je ˇc´ıslo testovan´eho ” pˇr´ıpadu. Pot´e vypiˇste ˇra´dek pro kaˇzd´ y jazyk, kter´ y se objev´ı v testovan´em ˇ adek obsahuje jazyk, dvojteˇcku, mezeru a poˇcet st´at˚ pˇr´ıpadˇe. R´ u, kde se t´ımto jazykem mluv´ı. Tyto ˇr´adky jsou vyps´any sestupnˇe podle poˇctu st´at˚ u. Pokud dva jazyky maj´ı stejn´ y poˇcet st´at˚ u, seˇrad´ı se podle abecedy, coˇz znamen´a, ˇze napˇr´ıklad jazyk ,i‘ bude pˇred jazykem ,q‘ .
Pˇ r´ıklad vstupu 2 48 ttuuttdd ttuuttdd uuttuudd uuttuudd 11
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
99 bbbbbbbbb aaaaaaaab bbbbbbbab baaaaacab bacccccab bacbbbcab bacccccab baaaaaaab bbbbbbbbb
Pˇ r´ıklad v´ ystupu World #1 t: 3 u: 3 d: 1 World #2 b: 2 a: 1 c: 1
Shrnut´ı zad´ an´ı C´ılem tohoto u ´kolu je zjistit z mapy poˇcet st´at˚ u, ve kter´ ych se mluv´ı stejn´ ym jazykem. Vstupn´ı mapa je d´ana jako pole o velikosti m x n. Jazyk je definov´an jako p´ısmeno na mapˇe. Pokud se stejn´a p´ısmena dot´ ykaj´ı hranou, jde o stejn´ y st´at.
Zp˚ usob ˇ reˇ sen´ı Tento u ´kol lze vyˇreˇsit pomoc´ı rekurzivn´ıho programov´an´ı, kde budeme postupovat od jednoho p´ısmena k dalˇs´ımu a od kaˇzd´eho p´ısmena p˚ ujdeme smˇerem doleva, nahoru, doprava a dol˚ u. Kaˇzd´ y znak, kter´ y objev´ıme si oznaˇc´ıme urˇcit´ ym znakem, kter´ y bude oznaˇcovat, ˇze dan´e p´ısmeno bylo zpracov´ano. Tento znak bude slouˇzit s hranicemi mapy jako ukonˇcen´ı rekurze. Pˇri zpracov´av´an´ı p´ısmen si dˇel´ame statistiky o poˇctu jazyk˚ u. 12
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
Moˇ zn´ e probl´ emy Z d˚ uvodu, ˇze jsme pouˇzili pro ˇreˇsen´ı u ´lohy rekurzivn´ı algoritmus se m˚ uˇze vyskytnout probl´em ohlednˇe nedostatku pamˇeti. Z tohoto d˚ uvodu je potˇreba zaˇr´ıdit, aby kaˇzd´e p´ısmeno, kter´e uˇz bylo zpracovan´e rekurz´ı, zastavilo postup dalˇs´ı rekurze, kter´e by dan´e p´ısmeno chtˇelo zpracov´avat.
2.3.2
Dek´ odov´ an´ı p´ asky
Zad´ an´ı V´aˇs ˇs´ef pr´avˇe objevil v arch´ıvu star´e poˇc´ıtaˇcov´e p´asky. Na tˇechto p´ask´ach s otvory, m˚ uˇzou b´ yt uˇziteˇcn´e informace. Je na v´as, abyste zjistili, co je na nich naps´ano.
Vstup Vstup bude obsahovat jednu p´asku.
V´ ystup V´ ystupn´ı zpr´ava, kter´a je napsan´a na p´asce.
13
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
Pˇ r´ıklad vstupu
| | | | |
ooo . o | ooo . o o | oo o . o | oo . oo | oo o . oo |
Pˇ r´ıklad v´ ystupu quick
Shrnut´ı zad´ an´ı ˇef dal program´atorovi starou dˇernou p´asku a chce zjistit, jestli na n´ı nejsou S´ uloˇzeny nˇejak´e d˚ uleˇzit´e informace.
Zp˚ usob ˇ reˇ sen´ı Tato u ´loha je velmi jednoduch´a, pokud ˇreˇsitel v´ı, jak jsou data uloˇzena na p´asce. Kaˇzd´a p´aska m´a na kaˇzd´e ˇr´adce 6 otvor˚ u. Pokud tento otvor je pr´azdn´ y, znamen´a to, ˇze jeho hodnota je jedna, pokud pln´ y tak 0. Ze ˇsesti otvor˚ u dostaneme 6-ti m´ıstn´e dvojkov´e ˇc´ıslo, kter´e po pˇrevodu do des´ıtkov´e soustavy ud´av´a pozici znaku v ASCII tabulce (viz Obr´azek 2.5).
Obr´azek 2.5: Zp˚ usob pˇrevodu
14
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
Moˇ zn´ e probl´ emy Jedin´ y probl´em, kter´ y m˚ uˇze nastat pˇri ˇreˇsen´ı t´eto u ´lohy je, ˇze program´ator nebude zn´at, jak jsou data uloˇzena na p´asce. Pokud by to nastalo, u ´lohu by nebyl schopen vyˇreˇsit.
2.3.3
Pˇ reteˇ cen´ı
Zad´ an´ı Napiˇste program, kter´ y pˇreˇcte v´ yraz skl´adaj´ıc´ı se ze dvou kladn´ ych ˇc´ısel a oper´atoru. Zjistˇete, zda cel´a ˇc´ısla nebo v´ ysledek v´ yrazu je pˇr´ıliˇs velk´ y pro prezentaci jako norm´aln´ı“ neznam´enkov´ y integer. Typ integer, pokud pracujete ” v Pascalu, typ int pokud pracujete v C.
Vstup Nezn´am´ y poˇcet ˇr´adk˚ u. Kaˇzd´ y ˇr´adek obsahuje cel´e ˇc´ıslo, jeden ze dvou oper´ator˚ u ,+‘ nebo ,*‘ a druh´e cel´e ˇc´ıslo.
V´ ystup Pro kaˇzd´ y ˇr´adek vstupu, vytisknete vstup nasledovan´ y 0 aˇz 3 ˇr´adky obsahuj´ıc´ı jednu z tˇechto zpr´av podle vhodnosti: first number too big“ (prvn´ı ˇc´ıslo je ” pˇr´ıliˇs velk´e), second number too big“ (druh´e ˇc´ıslo je pˇr´ıliˇs velk´e), result too ” ” big“ (v´ ysledek je pˇr´ıliˇs velk´ y).
Pˇ r´ıklad vstupu 300 + 3 9999999999999999999999 + 11
15
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
Pˇ r´ıklad v´ ystupu 300 + 3 9999999999999999999999 + 11 first number too big result too big
Shrnut´ı zad´ an´ı C´ıl t´eto u ´lohy je naˇc´ıst ze ˇra´dky dvˇe ˇc´ısla a jeden oper´ator a zjistit, jestli zadan´a ˇc´ısla nebo spoˇc´ıtan´ y v´ ysledek nepˇretekl datov´ y typ integer.
Zp˚ usob ˇ reˇ sen´ı Naˇcteme ˇra´dek, z nˇehoˇz z´ısk´ame dvˇe ˇc´ısla a operand. Mus´ıme poˇc´ıtat s t´ım, ˇze mezi ˇc´ısly a operandem m˚ uˇze b´ yt v´ıc jak jeden pr´azdn´ y znak. Pro uchov´an´ı vˇsech ˇc´ısel pouˇzijeme BigInteger. N´aslednˇe budeme testovat, jestli prvn´ı ˇc´ıslo nepˇreteklo. Pokud ˇc´ıslo m´a m´enˇe neˇz 10 znak˚ u, nepˇreteˇce. Pokud bude m´ıt v´ıce jak 10 znak˚ u, pˇreteˇce. Pakliˇze ˇc´ıslo m´a pr´avˇe 10 znak˚ u, mus´ıme nejdˇr´ıve otestovat, jestli dan´e ˇc´ıslo je menˇs´ı nebo vˇetˇs´ı neˇz nejvˇetˇs´ı hodnota typu integer a podle toho rozhodnou, jestli dan´e ˇc´ıslo pˇreteˇce nebo ne. Tento postup provedeme i pro druh´e ˇc´ıslo. Pot´e obˇe ˇc´ısla seˇcteme ˇci vyn´asob´ıme podle vstupn´ıho operandu. V´ ysledek budeme vyhodnocovat jako pˇredeˇsl´a ˇc´ısla.
Moˇ zn´ e probl´ emy M˚ uˇze se st´at, ˇze valid´ator bude st´ale dokola d´avat odpovˇed’, ˇze dan´e ˇreˇsen´ı je nespr´avn´e. Jedn´ım z d˚ uvod˚ u m˚ uˇze b´ yt, ˇze jsme si neuvˇedomili, ˇze mezi zadan´ ymi ˇc´ısly a oper´atorem se m˚ uˇze vyskytnout libovoln´ y poˇcet b´ıl´ ych znak˚ u, kter´e jsme zapomnˇeli odstranit.
16
Vytvoˇren´ı sady u ´loh pro PilsProg
2.3.4
Vybran´e u ´lohy ze sady u ´loh
Z´ amek
Zad´ an´ı V posledn´ı dobˇe je jeden z´avaˇzn´ y probl´em s Panda Land Safe Box. Nˇekolik trezor˚ u bylo vykradeno. Trezory pouˇz´ıvaj´ı 4 ˇc´ıselnou kombinaci v´alcov´eho z´amku (viz Obr´azek 2.6). M˚ uˇzete pouze ot´aˇcet ˇc´ıslicemi smˇerem nahoru nebo dol˚ u, dokud vˇsechna ˇctyˇri ˇc´ısla neodpov´ıdaj´ı kl´ıˇci. Kaˇzd´a ˇc´ıslice je navrˇzena tak, aby se ot´aˇcela od 0 do 9. Otoˇcen´ım nahoru z 9 se dostaneme na ˇc´ıslo 0 a otoˇcen´ı dol˚ u z 0 se dostaneme na ˇc´ıslici 9. Vzhledem k tomu existuje 10 000 kl´ıˇc˚ u, 0000 aˇz 9999. Kaˇzd´ y m˚ uˇze vyzkouˇset vˇsechny kombinace, dokud se sejf neodemkne.
Obr´azek 2.6: V´alcov´ y z´amek Co se stalo, stalo se. Aby bylo moˇzn´e zpomalit u ´tok budouc´ıch lupiˇc˚ u, Panda Security Agency (PSA) vymyslela nov´ y bezpeˇcnostn´ı z´amek s nˇekolika tlaˇc´ıtky. Nam´ısto pouˇzit´ı jedn´e kombinace kl´ıˇce, z´amek nyn´ı m˚ uˇze m´ıt aˇz N kl´ıˇc˚ u, kter´e mus´ı b´ yt vˇsechny odemknuty, aby ˇsel trezor odemknout. Tento z´amek funguje takto: • Zpoˇc´atku jsou ˇc´ısla na 0000. • Kl´ıˇce m˚ uˇzou b´ yt uvolnˇeny v libovoln´em poˇrad´ı. • Magick´e tlaˇc´ıtko JUMP m˚ uˇze nastavit ˇc´ıslice do nˇekter´eho z odemˇcen´ ych kl´ıˇc˚ u, aniˇz by bylo nˇejak´e otoˇcen´ı. • Sejf se odemkne jenom tehdy, pokud jsou vˇsechny kl´ıˇce odemknuty s minim´aln´ım poˇctem otoˇcen´ı s v´ yjimkou JUMP. • Pokud dojde k pˇrekroˇcen´ı poˇctu ot´aˇcen´ı, ˇc´ısla se vr´at´ı do 0000 a vˇsechny kl´ıˇce budou opˇet zamˇceny. Tedy bude stav z´amku vynulov´an a prolomen´ı bylo ne´ uspˇeˇsn´e. 17
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
PSA je zcela pˇresvˇedˇcen´e, ˇze tento nov´ y syst´em zpomal´ı prolamov´an´ı a d´a jim dostatek ˇcasu na identifikaci a chycen´ı zlodˇeje. Aby bylo moˇzn´e urˇcit minim´aln´ı potˇrebn´ y poˇcet otoˇcen´ı, chce PSA napsat program. Dostanete vˇsechny kl´ıˇce, spoˇc´ıtejte minim´aln´ı poˇcet otoˇcen´ı, kter´e je potˇreba k odemˇcen´ı sejfu.
Vstup Prvn´ı ˇr´adek obsahuje cel´e ˇc´ıslo T, kter´e ud´av´a poˇcet testovan´ ych pˇr´ıpad˚ u. Kaˇzd´ y pˇr´ıpad zaˇc´ın´a cel´ ym ˇc´ıslem N (1<=N <=500) n´asleduje poˇcet kl´ıˇc˚ u. Kaˇzd´a z N dalˇs´ıch ˇra´dek obsahuje pˇresnˇe 4 ˇc´ıseln´a ˇc´ısla (pˇredn´ı nuly jsou povoleny) pˇredstavuj´ıc´ı kl´ıˇce pro odemknut´ı.
V´ ystup Pro kaˇzd´ y testovan´ y pˇr´ıpad, vytisknete na jednom ˇr´adku minim´aln´ı poˇcet ot´aˇcen´ı, potˇrebn´ y k odemknut´ı vˇsech kl´ıˇc˚ u. Vysvˇetlen´ı pro 2. pˇr´ıpad: • Dejte 0000 do 1111, otoˇcen´ı: 4 • Dejte 1111 do 1155, otoˇcen´ı: 8 • Skok z 1155 do 1111, m˚ uˇzeme to udˇelat, protoˇze 1111 bylo uˇz odemknuto. • Dejte 1111 do 5511, otoˇcen´ı 8 Celkem otoˇcen´ı = 4 + 8 + 8 = 20
Pˇ r´ıklad vstupu 4 2 3 3 4
1155 1111 1234 2145
2211 1155 5511 5678 9090 0213 9113 8113 18
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
Pˇ r´ıklad v´ ystupu 16 20 26 17
Shrnut´ı zad´ an´ı Dostaneme mnoˇzinu kl´ıˇc˚ u, kter´e maj´ı odemknout ˇctyˇrcifern´ y rolovac´ı z´amek. Z´amek se odemkne, pokud odemkneme vˇsechny kl´ıˇce s nejm´enˇe otoˇcen´ım. Z´amek m´a tak´e funkci, kter´a dok´aˇze nastavit cifry na hodnotu z dˇr´ıve odemˇcen´eho kl´ıˇce. Pˇri t´eto funkci se nezapoˇc´ıt´av´a ˇza´dn´e otoˇcen´ı.
Zp˚ usob ˇ reˇ sen´ı Naˇcteme vˇsechny kl´ıˇce, kter´e budou slouˇzit jako vrcholy grafu. Pot´e vytvoˇr´ıme hrany, mezi vˇsemi vrcholy a vypoˇc´ıt´ame hodnotu hrany tak, ˇze zjist´ıme, kolik je potˇreba otoˇcen´ı na z´amku, abychom jsme se dostali z jednoho kl´ıˇce do druh´eho. N´aslednˇe budeme hledat minim´aln´ı kostru grafu. Nejdˇr´ıve si seˇrad´ıme hrany od nejmenˇs´ı hodnoty, kterou jsme si vypoˇc´ıtali. Pot´e budeme proch´azet seˇrazen´e hrany a ukl´adat si v´ ysledn´e hrany, kter´e budou spojovat vrcholy. Hranu d´ame do v´ ysledn´ ych, pokud hrana, se kterou spoj´ıme dva vrcholy nevytvoˇr´ı v grafu cyklus. Pokud ho vytvoˇr´ı, hranu zahod´ıme. Po zjiˇstˇen´ı hran, kter´a tvoˇr´ı kostru, projedeme vˇsechny tyto hrany a budeme sˇc´ıtat jejich hodnoty. Pot´e mus´ıme k v´ ysledku pˇriˇc´ıst nejmenˇs´ı hodnotu, z kter´e se dostaneme od poˇca´teˇcn´ı hodnoty do nˇekter´eho z kl´ıˇc˚ u. V´ ysledn´a hodnota je ˇreˇsen´ı pro dan´ y pˇr´ıpad.
Moˇ zn´ e probl´ emy Tato u ´loha nejde ˇreˇsit pomoc´ı brut´aln´ı s´ıly z d˚ uvodu, ˇze se nevejdeme do ˇcasov´eho limitu. Z tohoto d˚ uvodu si mus´ıme uvˇedomit, ˇze dan´ y probl´em lze ˇreˇsit pomoc´ı minim´aln´ı kostry grafu.
19
Vytvoˇren´ı sady u ´loh pro PilsProg
2.3.5
Vybran´e u ´lohy ze sady u ´loh
Nejdelˇ s´ı spoleˇ cn´ a posloupnost
Zad´ an´ı M´ate dvˇe sekvence znak˚ u. Vypiˇste d´elku nejdelˇs´ı spoleˇcn´e posloupnosti obou sekvenc´ı. Napˇr´ıklad nejdelˇs´ı spoleˇcn´a posloupnost z tˇechto dvou sekvenc´ı abcdgh aedfhr je adh d´elky 3. Vstup se skl´ad´a ze dvou ˇra´dek. Prvn´ı ˇra´dek obsahuje prvn´ı ˇretˇezec, druh´ y ˇra´dek obsahuje druh´ y ˇretˇezec. Kaˇzd´ y ˇretˇezec je na samostatn´e ˇra´dce a obsahuje nejv´ yˇse 1000 znak˚ u. Pro kaˇzd´e dva ˇra´dky vypiˇste ˇra´dek obsahuj´ıc´ı jedno cel´e ˇc´ıslo, kter´e splˇ nuje v´ yˇse uveden´a krit´eria.
Pˇ r´ıklad vstupu a1b2c3d4e zz1yy2xx3ww4vv abcdgh aedfhr abcdefghijklmnopqrstuvwxyz a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0 abcdefghijklmnzyxwvutsrqpo opqrstuvwxyzabcdefghijklmn
Pˇ r´ıklad v´ ystupu 4 3 26 14
20
Vytvoˇren´ı sady u ´loh pro PilsProg
Vybran´e u ´lohy ze sady u ´loh
Shrnut´ı zad´ an´ı Na vstupu dostaneme dva ˇretˇezce a mus´ıme zjistit d´elku nejdelˇs´ı spoleˇcn´e posloupnosti.
Zp˚ usob ˇ reˇ sen´ı Tento probl´em lze vyˇreˇsit pomoc´ı dynamick´eho programovan´ı. Vytvoˇr´ı se celoˇc´ıseln´e dvourozmˇern´e pole o d´elce prvn´ıho slova a ˇs´ıˇrce druh´eho slova. K poli pˇrid´ame jeˇstˇe jeden ˇra´dek a sloupek. Prvn´ı sloupek a prvn´ı ˇra´dek se vypln´ı nulami. Index ˇra´dku ukazuje na znak v prvn´ım slovˇe a index sloupce ukazuje na znak ve druh´em slovˇe. N´asleduj´ıc´ı buˇ nky se vyplˇ nuj´ı podle n´asleduj´ıc´ıho postupu. Buˇ nky se budou vyplˇ novat po ˇra´dc´ıch. Pokud jsou si znaky rovny, vloˇz´ı se do buˇ nky ˇc´ıslo o jednu hodnotu vˇetˇs´ı, neˇz je na pozici ˇc´ıslo o jeden sloupek a jeden ˇra´dek zpˇet. Pokud si znaky nejsou rovny, vloˇz´ı se do buˇ nky ˇc´ıslo, kter´e je o sloupek zpˇet nebo o ˇr´adek n´ıˇz podle toho, kter´e je vˇetˇs´ı. T´ımto postupem se vypln´ı cel´e pole (viz Tabulka 2.1). V´ yslednou hodnotu najdeme v posledn´ı buˇ nce.
0 a 0 1 0 b 0 2 0 c 0 3 0 d 0 4 0 e 0
z 0 0 0 0 0 0 0 0 0 0
z 1 y 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1
y 0 0 1 1 1 1 1 1 1 1
2 x x 3 w 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 3 3 2 2 2 3 3 2 2 2 3 3
w 0 0 1 1 2 2 3 3 3 3
4 v 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
v 0 0 1 1 2 2 3 3 4 4
Tabulka 2.1: Vyplnˇen´e pole
Moˇ zn´ e probl´ emy Pokud program´ator zn´a algoritmus, kter´ y nejdelˇs´ı spoleˇcnou posloupnost vypoˇc´ıt´a, nen´ı probl´em u ´lohu vyˇreˇsit. 21
Vytvoˇren´ı sady u ´loh pro PilsProg
2.4
Probl´emy pˇri ˇreˇsen´ı u ´loh
Probl´ emy pˇ ri ˇ reˇ sen´ı u ´ loh
Nejvˇetˇs´ı probl´em pˇri ˇreˇsen´ı u ´loh se t´ yk´a anglick´eho jazyka. V zad´an´ı b´ yv´a spousta detail˚ u, kter´e je potˇreba splnit. Pokud ale program´ator neovl´ad´a anglick´ y jazyk na v´ yborn´e u ´rovni, tyto detaily nemus´ı pochopit a pˇri odevzd´av´an´ı sloˇzitˇe hledat d˚ uvod, proˇc dan´e ˇreˇsen´ı valid´ator neakceptuje. Dalˇs´ım velk´ ym probl´emem pˇri ˇreˇsen´ı je ˇcasov´ y limit na vyˇreˇsen´ı dan´eho probl´emu. Tento limit je nastaven stejnˇe pro vˇsechny programovac´ı jazyky. Z tohoto d˚ uvodu je znev´ yhodnˇena Java oproti jazyku C/C++, kter´e jsou ˇ v´ yraznˇe rychlejˇs´ı. Casto se proto st´av´a, ˇze algoritmus, kter´ y ˇreˇs´ı dan´ y probl´em a je naprogramov´an v Javˇe, neprojde na ˇcasov´ y limit, ale pokud se naprogramuje v C/C++, tento algoritmus projde.
22
3 Softwarov´e aplikace 3.1
C´ıle aplikace
Mnoho student˚ u a zamˇestnanc˚ u Z´apadoˇcesk´e univerzity se u ´ˇcastn´ı program´atorsk´ ych soutˇeˇz´ı. Tyto soutˇeˇze maj´ı spoleˇcn´ y z´aklad v tom, ˇze je zadan´a u ´loha a je potˇreba vymyslet optim´aln´ı algoritmus, kter´ y ji ˇreˇs´ı a realizovat ho pomoc´ı zdrojov´eho k´odu. Pro ˇreˇsen´ı zadan´eho probl´emu se ˇcasto vyuˇz´ıvaj´ı z´akladn´ı algoritmy, jako je napˇr´ıklad prohled´av´an´ı grafu do hloubky, prohled´av´an´ı grafu do ˇs´ıˇrky, dynamick´e programov´an´ı atd.. Rozd´ıl je pouze v zad´an´ı u ´lohy, z kter´e mus´ı soutˇeˇz´ıc´ı poznat, jak´ y algoritmus pro dan´ y probl´em m´a pouˇz´ıt. Z tohoto d˚ uvodu vznikla tato softwarov´a aplikace, ve kter´e by mˇeli uˇzivatel´e shromaˇzd’ovat a sd´ılet vyˇreˇsen´e u ´lohy s popisem, s jak´ ym algoritmem danou u ´lohu vyˇreˇsili. Uˇzivatel´e by d´ıky t´eto aplikaci mˇeli m´ıt moˇznost z vyˇreˇsen´ ych u ´loh poznat, jak´ y algoritmus maj´ı pouˇz´ıt pro dan´ y probl´em. Hotov´e pˇr´ıklady s doprovodn´ ym textem by v budoucnu mˇely slouˇzit jako pomocn´ y uˇcebn´ı materi´al pro uˇzivatele zab´ yvaj´ıc´ı se programov´an´ım. Aplikace by mˇela fungovat ve dvou reˇzimech. V prvn´ım reˇzimu, by aplikace mˇela b´ yt schopna prohl´ıˇzet a upravovat vˇsechny u ´lohy, kter´e jsou v aplikaci uloˇzeny, pokud je aplikace pˇripojena na Internet. V druh´em reˇzimu by uˇzivatel mˇel m´ıt moˇznost proch´azek u ´lohy, kter´e si v prvn´ım reˇzimu uloˇzil bez toho, ˇze by aplikace musela b´ yt pˇripojena na Internet. K u ´loh´am by mˇela b´ yt tak´e diskuze, kde by uˇzivatel´e mohli diskutovat o dan´e u ´loze.
3.2
Pouˇ zit´ e technologie
Aplikace byla naprogramov´ana pomoc´ı platformy Java SE s programovac´ım jazykem Java. Pro sestaven´ı aplikace byla pouˇzita aplikace Apache Ant. K uloˇzen´ı dat aplikace vyuˇz´ıv´a relaˇcn´ı datab´azi MySQL.
23
Softwarov´e aplikace
3.2.1
Pouˇzit´e technologie
Platforma Java
Java platforma je sada softwarov´eho vybaven´ı, kter´a slouˇz´ı pro v´ yvoj a spuˇstˇen´ı aplikac´ı, kter´e byly naps´any v programovac´ım jazyce Java. Platforma byla vyrobena a specifikov´ana firmou Sun Microsystems, kter´a byla v roce 2009 koupena spoleˇcnost´ı Oracle. Z´akladem platformy Javy je Java Virutal Machine(JVM) slouˇz´ıc´ı pro spuˇstˇen´ı Java bytecodu a Java Application Programming Interface(API) obsahuj´ıc´ı z´akladn´ı knihovny pro v´ yvoj aplikac´ı. Java bytecode dostaneme pˇreloˇzen´ım zdrojov´eho k´odu napsan´eho v programovac´ım jazyce Java. Existuj´ı i pˇrekladaˇce, kter´e jsou schopny vytvoˇrit Java bytecode ze zdrojov´eho k´odu, kter´ y byl napsan´ y v jin´em programovac´ım jazyce napˇr. Python. Protoˇze n´aˇs program se nejdˇr´ıve pˇrekl´ad´a do Java byte k´odu a ten se spouˇst´ı v JVM, m˚ uˇze naˇse aplikace bˇeˇzet na r˚ uzn´ ych zaˇr´ızen´ı, na kter´ ych bˇeˇz´ı JVM. Platforma je vyd´avan´a ve v´ıce verz´ı, kter´e obsahuj´ı potˇrebn´e softwarov´e vybaven´ı pro v´ yvoj v dan´em prostˇred´ı. A to jsou: • JavaCard - v´ yvoj aplikac´ı pro platebn´ı a kreditn´ı karty, • Java SE - v´ yvoj aplikac´ı pro dom´ac´ı poˇc´ıtaˇce, • Java EE - v´ yvoj rozs´ahl´ ych podnikov´ ych aplikac´ı, • Java ME - v´ yvoj pro mobiln´ı aplikace.
3.2.2
Programovac´ı jazyk Java
Programovac´ı jazyk Java patˇr´ı mezi objektov´e orientovan´e programovac´ı jazyky, kter´ y byl vyroben firmou Sun Microsystems v roce 1995. Je to hlavn´ı programovac´ı jazyk pro v´ yvoj aplikac´ı na platformˇe Java. Java patˇr´ı mezi nejpouˇz´ıvanˇejˇs´ı programovac´ı jazyky na svˇete. Nejvˇetˇs´ı jej´ı pˇrednost´ı je jej´ı multiplatformn´ı nez´avislost. Pomoc´ı programovac´ıho jazyka Java m˚ uˇzeme vytv´aˇret aplikace pro r˚ uzn´a zaˇr´ızen´ı od poˇc´ıtaˇc˚ u aˇz po ˇcipov´e karty.
24
Softwarov´e aplikace
Pouˇzit´e technologie
V´ yhody jazyka Javy • Multiplatformn´ı nez´avislost • Jednoduch´a syntaxe • Objektovˇe orientovan´ y • Velk´e mnoˇzstv´ı knihoven
Nev´ yhody jazyka Javy • Pomal´ y start aplikace - Tento probl´em vznik´a z d˚ uvodu, ˇze zdrojov´ y k´od je nejdˇr´ıve pˇreloˇzen do Java bytecodu, kter´ y je n´aslednˇe spuˇstˇen´ y v JVM. • Velk´ a pamˇ et’ov´ a n´ aroˇ cnost - N´asledkem pouˇzit´ı Garbage collectoru, kter´ y se star´a v Javˇe o pˇridˇelen´ı a uvolˇ nov´an´ı pamˇeti.
3.2.3
Apache Ant
Apache Ant je open source softwarov´a aplikace slouˇz´ıc´ı pro sestavov´an´ı softwarov´ ych aplikac´ı napsan´ y pˇrev´aˇznˇe v jazyce Java. Protoˇze je Ant kompletnˇe naps´an v jazyce Java, jde o aplikaci multiplatformnˇe nez´avislou. Pro napsan´ı scriptu, kter´ y Ant zpracov´av´a se pouˇz´ıv´a jazyk XML.
3.2.4
Datab´ aze MySQL
MySQL je relaˇcn´ı datab´azov´ y syst´em vytvoˇren´ y firmou MySQL AB a nyn´ı vlastnˇeno firmou Oracle. Jde o multiplatformn´ı datab´azi, kter´a slouˇz´ı pro uchov´av´an´ı dat. Pro komunikaci s datab´az´ı se vyuˇz´ıv´a dotazovac´ı jazyk SQL.
Jazyk SQL Jazyk SQL je standardizovan´ y dotazovac´ı jazyk pro z´ısk´av´an´ı dat z relaˇcn´ıch datab´az´ı. Pˇrestoˇze jde o dotazovac´ı jazyk, m˚ uˇzeme tak´e pomoc´ı SQL pˇr´ıkazu
25
Softwarov´e aplikace
Pouˇzit´e architektury
vytv´aˇret, mazat a upravovat data v datab´azi. SQL pˇr´ıkazy lze rozdˇelit do tˇr´ı skupin. • Pˇ r´ıkazy pro manipulaci s daty - Tyto pˇr´ıkazy slouˇz´ı pro z´ısk´an´ı a manipulaci dat z datab´aze. Oznaˇcuj´ı se zkratkou DML. Mezi tyto pˇr´ıkazy patˇr´ı SELECT, UPDATE, INSERT, DELETE atd. • Pˇ r´ıkazy pro definici dat - Pˇr´ıkazy slouˇz´ıc´ı pro vytvoˇren´ı struktury v datab´azi. Oznaˇcuj´ı se zktratkou DDL. Mezi tyto pˇr´ıkazy patˇr´ı CREATE, DROP a ALTER. • Pˇ r´ıkazy pro ˇ r´ızen´ı dat - Pˇr´ıkazy slouˇz´ı pro nastaven´ı pˇr´ıstupov´ ych pr´av a ˇr´ızen´ı transakc´ı. Oznaˇcuj´ı se zkratkou DCL. Mezi tyto pˇr´ıkazy patˇr´ı REVOKE, COMMIT, ROLLBACK atd.
3.3
Pouˇ zit´ e architektury
Pro vytvoˇren´ı aplikace byla pouˇzita s´ıt’ov´a architektura klient-server. Obˇe aplikace jsou naps´any pomoc´ı v´ıcevrstv´e architektury.
3.3.1
S´ıt’ov´ a architektura klient-server
Klient-server je s´ıt’ov´a architektura, kter´a rozdˇeluje aplikaci na klienta a server. Tyto dvˇe aplikace mezi sebou komunikuj´ı pomoc´ı poˇc´ıtaˇcov´e s´ıtˇe.
Server Aplikace, kter´a slouˇz´ı jako server, pracuje pasivnˇe, kdy ˇcek´a na dotazy od pˇripojen´eho klienta. Tento dotaz server zpracuje a odes´ıl´a klientovi odpovˇed’ (viz Obr´azek 3.1).
Klient Tato aplikace se pˇripojuje k serveru a pracuje aktivnˇe. Po odesl´an´ı dotazu serveru klient ˇcek´a, aˇz server zaˇsle odpovˇed’ (viz Obr´azek 3.1). 26
Softwarov´e aplikace
Pouˇzit´e architektury
Obr´azek 3.1: Klient-server
3.3.2
V´ıcevrstv´ a architektura
V´ıcevrstv´a architektura je zp˚ usob v´ yvoje aplikace, kter´a rozdˇel´ı aplikaci do nˇekolika vz´ajemnˇe nez´avisl´ ych vrstev, kter´e mezi sebou komunikuj´ı podle definovan´eho rozhran´ı. Kaˇzd´a z vrstev se m˚ uˇze starat o r˚ uznou ˇca´st aplikace. Mezi nejzn´amˇejˇs´ı v´ıcevrstvou architekturu patˇr´ı tˇr´ıvrstv´a (viz Obr´azek 3.2), kter´a rozdˇeluje vrstvy do tˇechto tˇr´ı vrstev: • Prezenˇ cn´ı vrstva - Prezenˇcn´ı vrstva se star´a o komunikaci s uˇzivatelem. Pro komunikaci s uˇzivatelem se nejˇcastˇeji pouˇz´ıv´a grafick´e uˇzivatelsk´e rozhran´ı. • Aplikaˇ cn´ı vrstva - Aplikaˇcn´ı vrstva se star´a o logickou ˇca´st aplikace. • Datov´ a vrstva - Datov´a vrstva se star´a o naˇcten´ı a uloˇzen´ı dat. Tato vrstva m˚ uˇze vyuˇz´ıvat napˇr. datab´azi, soubory atd.
27
Softwarov´e aplikace
Program´atorsk´a dokumentace
Obr´azek 3.2: Tˇr´ıvrstv´a architektura
3.4
Program´ atorsk´ a dokumentace
Cel´a softwarov´a aplikace je pojmenovan´a ACM u ´loˇziˇstˇe. Je rozdˇelena na dvˇe aplikace a to ACM u ´loˇziˇstˇe - server a ACM u ´loˇziˇstˇe - klient.
3.4.1
Datab´ aze
Pro uloˇzen´ı dat jsou v datab´azi vytvoˇreny ˇctyˇri tabulky: • diskuze, • uzivatele, • slozky, • ulohy.
Tabulka diskuze V t´eto tabulce se ukl´adaj´ı informace o diskuz´ıch v u ´loh´ach. Kaˇzd´ y z´aznam v tabulce mus´ı obsahovat id z´aznamu, id rodiˇce, kdo z´aznam vloˇzil, datum vloˇzen´ı a k jak´e u ´loze z´aznam patˇr´ı. Kaˇzd´a u ´loha, kter´a byla vytvoˇrena, mus´ı
28
Softwarov´e aplikace
Program´atorsk´a dokumentace
vytvoˇrit pro danou u ´lohu z´aznam v diskuzi s rodiˇcem null, kter´ y znamen´a, ˇze dan´ y z´aznam, nem´a rodiˇce.
Tabulka uzivatele V tabulce uzivatele se ukl´adaj´ı informace o uˇzivateli. Tabulka obsahuje id uˇzivatele, nick, e-mail, heslo, kter´e se pˇri vloˇzen´ı ˇsifruje, datum registrace, potvrzovac´ı ˇc´ıslo a u ´daj, jestli uˇzivatel potvrdil registraci.
Tabulka slozky Tabulka slozky obsahuje n´azvy sloˇzek, do kter´ ych m˚ uˇzeme pˇrid´avat u ´lohy. Kaˇzd´a sloˇzka obsahuje id sloˇzky, ˇc´ıslo rodiˇce, n´azev sloˇzky, ˇc´ıslo, kter´e ud´av´a, jestli sloˇzka byla vymaz´ana, datum vymaz´an´ı a ˇc´ıslo uˇzivatele, kter´ y sloˇzku vymazal. Tabulka mus´ı obsahovat jednu sloˇzku, kter´a je hlavn´ı. Tato sloˇzka m´a hodnotu rodiˇce null, kter´a znamen´a, ˇze ˇz´adn´eho rodiˇce nem´a.
Tabulka ulohy Vˇsechny u ´lohy se ukl´adaj´ı do tabulky ulohy. Tato tabulka obsahuje vˇsechny informace a data o u ´loze. Kaˇzd´a u ´loha m´a id, ˇc´ıslo rodiˇce, kter´ y ukazuje, do kter´e sloˇzky dan´a u ´loha patˇr´ı a n´azev u ´lohy, ˇc´ıslo, kter´e ud´av´a, jestli u ´loha byla vymaz´ana, datum vymaz´an´ı a ˇc´ıslo uˇzivatele, kter´ yu ´lohu vymazal. D´ale jsou uloˇzeny tˇri soubory s jejich n´azvy. V tˇechto tˇrech souborech je uloˇzen´e zad´an´ı, ˇreˇsen´ı a zdrojov´ y k´od, kter´e dan´e zad´an´ı ˇreˇs´ı. Jako posledn´ı informace v tabulce je uvedena informace o tom, v jak´em programovac´ım jazyce byl probl´em vyˇreˇsen.
3.4.2
Server
Server vyuˇz´ıv´a tˇr´ıvrstvou architekturu. Prezenˇcn´ı vrstva je dˇelan´a pomoc´ı textov´eho uˇzivatelsk´eho rozhran´ı. Aplikaˇcn´ı vrstva se star´a o pˇripojen´ı klienta a zpracov´an´ı poˇzadavk˚ u od klienta. Datov´a vrstva obsahuje tˇr´ıdy pro odesl´an´ı e-mailu a tˇr´ıdy pro spolupr´aci s datab´az´ı. Datov´a vrstva tak´e obsahuje tˇr´ıdy, kter´e se odes´ılaj´ı mezi serverem a klientem. 29
Softwarov´e aplikace
Program´atorsk´a dokumentace
Pouˇ zit´ e extern´ı knihovny Aplikace vyuˇz´ıv´a dvˇe extern´ı knihovny: • JavaMail - Slouˇz´ı pro pˇripojen´ı k smtp serveru a odesl´an´ı e-mailu, • MySQL Connectors - Pouˇz´ıv´a se pro pˇripojen´ı k MySQL datab´azi a pr´aci sn´ı. Tyto knihovny se staraj´ı o pˇripojen´ı datab´aze a pr´aci sn´ı a pro pˇripojeni k smtp serveru a odesl´an´ı e-mailu.
Konfiguraˇ cn´ı soubor Konfiguraˇcn´ı soubor se mus´ı jmenovat config.properties. Tento soubor mus´ı obsahovat u ´daje o pˇripojen´ı k smtp serveru, kter´e boudou pouˇzity pro odesl´an´ı potvrzovac´ıho e-mailu, a pˇrihlaˇsovac´ı u ´daje do datab´aze, kter´a bude slouˇzit pro ukl´ad´an´ı dat. D´ale mus´ı byt uveden port, na kter´em aplikace bude naslouchat. Konfiguraˇcn´ı soubor obsahuje na kaˇzd´e ˇra´dce jednu informaci. Informace je uloˇzena ve form´atu promˇenn´a = hodnota. Vˇsechny promˇenn´e aˇz na promˇennou domena jsou povinn´e. Pokud u promˇenn´e domena, je potˇreba nastavit v´ıce e-mail˚ u, jsou oddˇelen´e ˇca´rkou. Promˇenn´e, kter´e se mus´ı nastavit aˇz na promˇennou domena jsou: • smtp server - adrese smtp serveru, • smtp ucet - u ´ˇcet na smtp serveru, • smtp heslo - heslo k u ´ˇctu na smtp serveru, • databaze url - url adresa datab´aze, • databaze uzivatel - jm´eno uˇzivatele v datab´azi, • databaze heslo - heslo uˇzivatele v datab´azi, • port - ˇc´ıslo portu na kter´em aplikace bude naslouchat, • domena - dom´ena, kterou mus´ı e-mail obsahovat (nepovinn´e). 30
Softwarov´e aplikace
Program´atorsk´a dokumentace
Tˇ r´ıda Hlavni Hlavn´ı tˇr´ıda obsahuje statickou metodu main, kter´a se vol´a pˇri spuˇstˇen´ı aplikace. Tato tˇr´ıda nepatˇr´ı do ˇz´adn´e vrstvy. Tˇr´ıda se star´a o naˇcten´ı konfiguraˇcn´ıho souboru, kde se nach´azej´ı u ´daje o smtp serveru, datab´azi a portu, na kter´em m´a aplikace naslouchat. Pokud jsou u ´daje z konfiguraˇcn´ıho souboru spr´avnˇe naˇcten´e, vytv´aˇrej´ı se dvˇe instance PotvrzovaciMail a PripojeniMySQL. N´aslednˇe se vytv´aˇr´ı ServerSocet, kter´ y v nekoneˇcn´e smyˇcce bude ˇcekat na pˇripojen´ı klienta. Pokud je klient pˇripojen, vytvoˇr´ı se nov´e vl´akno pomoc´ı instance VlaknoUzivatel.
Tˇ r´ıda VlaknoUzivatel (Aplikaˇ cn´ı vrstva) Je to jedin´a tˇr´ıda, kter´a patˇr´ı do aplikaˇcn´ı vrstvy. Tˇr´ıda se star´a o zpracov´an´ı dotaz˚ u od klienta a odesl´an´ı odpovˇed´ı. Tˇr´ıda obsahuje metody pro zpracov´an´ı pˇr´ıkazu od nepˇrihl´aˇsen´eho tak i pˇrihl´aˇsen´eho uˇzivatele. D´ale zde tak´e najdeme metodu, kter´a se star´a o vygenerov´an´ı potvrzovac´ıho ˇc´ısla.
Tˇ r´ıda PrispevekDiskuze (Datov´ a vrstva) Tˇr´ıda obsahuje informace o jednom pˇr´ıspˇevku v diskuzi, kde jsou veˇrejn´e atributy o id pˇr´ıspˇevku, id rodiˇce, kdo pˇr´ıspˇevek napsal, text, datum vloˇzen´ı a id u ´lohy, kter´emu pˇr´ıspˇevek patˇr´ı.
Tˇ r´ıda Slozka (Datov´ a vrstva) Tato tˇr´ıda obsahuje informace o jedn´e sloˇzce, kde jsou veˇrejn´e atributy, kter´e obsahuj´ı id sloˇzky, id rodiˇce a n´azev sloˇzky.
Tˇ r´ıda UlohyObsah (Datov´ a vrstva) Tˇr´ıda slouˇz´ı pro uchov´av´an´ı z´akladn´ıch u ´daj˚ u o u ´loze v atributech, kter´e ´ jsou veˇrejn´e. Udaje o u ´loze jsou id u ´lohy, id rodiˇce a n´azev u ´lohy. Tato tˇr´ıda neobsahuje soubory k u ´loze.
31
Softwarov´e aplikace
Program´atorsk´a dokumentace
Tˇ r´ıda Uloha (Datov´ a vrstva) Datov´a tˇr´ıda obsahuje vˇsechny u ´daje o jedn´e u ´loze. Uchov´av´a svoje id a id rodiˇce. D´ale tˇr´ıda uchov´av´a n´azev u ´lohy s n´azvy soubor˚ u. Tˇr´ıda obsahuje soubory se zad´an´ım, ˇreˇsen´ım a se zdrojov´ ym k´odem.
Tˇ r´ıda Obsah (Datov´ a vrstva) Tˇr´ıda slouˇz´ı pro uchov´an´ı vˇsech sloˇzek a u ´loh, kter´e obsahuje aplikace. Tˇr´ıda obsahuje ArrayList instanc´ı tˇr´ıdy Slozek a ArrayList instanc´ı tˇr´ıdy Uloh.
Tˇ r´ıda Potvrzovac´ıMail (Datov´ a vrstva) Tˇr´ıda slouˇz´ı k odesl´an´ı potvrzovac´ıho e-mailu uˇzivateli pˇri registraci. Pˇri vytvoˇren´ı instance je potˇreba zadat u ´daje pro vytvoˇren´ı spojen´ı se smtp serverem. Pro odesl´an´ı potvrzovac´ıho e-mailu m´a tˇr´ıda metodu odesliPotvrzovaciMail, kde je nutn´e zadat jako parametr e-mail pˇr´ıjemce a potvrzovac´ı ˇc´ıslo.
Tˇ r´ıda Prikaz (Datov´ a vrstva) Tˇr´ıda Prikaz patˇr´ı do datov´e vrstvy a slouˇz´ı pro komunikaci mezi serverem a klientem, obsahuje statick´e ˇc´ıseln´e konstanty vˇsech pˇr´ıkaz˚ u, kter´e se mohou v aplikaci pouˇz´ıt. Pˇri odes´ıl´an´ı tˇr´ıdy je potˇreba nastavit ˇc´ıslo pˇr´ıkazu. Pokud pˇr´ıkaz obsahuje data, jsou uloˇzena ve tˇr´ıdˇe jako atribut instance Object.
Tˇ r´ıda PripojeniMySQL (Datov´ a vrstva) Tˇr´ıda se star´a o pˇripojen´ı a pr´aci s datab´az´ı MySQL. Pˇri vytvoˇren´ı instance je vytvoˇren´e spojen´ı mezi aplikac´ı a datab´az´ı MySQL. Tˇr´ıda obsahuje spoustu metod pro z´ısk´avan´ı a u ´pravu dat v datab´azi. Posledn´ı metodou ve tˇr´ıdˇe je ukonˇcen´ı spojen´ı s datab´az´ı.
32
Softwarov´e aplikace
Program´atorsk´a dokumentace
Tˇ r´ıda PripojeniTCP (Datov´ a vrstva) Tˇr´ıda VlaknoSpojeniTCP vytv´aˇr´ı TCP spojen´ı mezi klientem a servem. Obsahuje metody pro pˇr´ıjem pˇr´ıkazu od klienta a odesl´an´ı odpovˇedi.
Tˇ r´ıda Konzole (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı textov´e uˇzivatelsk´e rozhran´ı, kter´e slouˇz´ı pro komunikaci s uˇzivatelem pomoc´ı pˇr´ıkaz˚ u.
3.4.3
Klient
Klientsk´a ˇc´ast m´a tˇr´ıvrstvou architekturu. Pro komunikaci s uˇzivatelem je vyuˇzito grafick´e uˇzivatelsk´e rozhran´ı.
Konfiguraˇ cn´ı soubor Konfiguraˇcn´ı soubor se mus´ı jmenovat config.properties a mus´ı obsahovat u ´daje o adrese serveru, kde bˇeˇz´ı serverov´a ˇca´st aplikace, a portu na kter´em tento server naslouch´a. Konfiguraˇcn´ı soubor obsahuje na kaˇzd´e ˇra´dce jednu informaci. Informace je uloˇzena ve form´atu promˇenn´a = hodnota. Promˇenn´e, kter´e mus´ıme nastavit jsou: • ip - adresa serveru, • port - ˇc´ıslo portu na kter´em naslouch´a server.
Pouˇ zit´ e extern´ı knihovny Aplikace vyuˇz´ıv´a ˇctyˇri extern´ı knihovny: • Apache PDFBox - tisknut´ı PDF souboru, 33
Softwarov´e aplikace
Program´atorsk´a dokumentace
• Java Syntax Highlighter - zobrazen´ı syntaxe u zdrojov´eho k´odu, • Pdf-renderer - zobrazen´ı a manipulaci s PDF souborem, • datove-tridy - knihovna obsahuj´ıc´ı datov´e tˇr´ıdy pro komunikaci se serverem. Tyto knihovny se staraj´ı o zobrazen´ı PDF souboru, zv´ yraznˇen´ı syntaxe ve zdrojov´em k´odu a tisk PDF souboru.
Tˇ r´ıda Hlavni Hlavn´ı tˇr´ıda aplikace obsahuje statickou metodu main volaj´ıc´ı pˇri spuˇstˇen´ı aplikace. Po spuˇstˇen´ı aplikace se naˇcte z konfiguraˇcn´ıho souboru adresa serveru a port, na kter´em server naslouch´a. Po u ´spˇeˇsn´em naˇcten´ı se vytv´aˇr´ı instance PripojeniTCP, kter´a se pot´e d´av´a jako parametr pˇri vytv´aˇren´ı instance Uzivatel.
Tˇ r´ıda Uzivatel (Aplikaˇ cn´ı vrstva) Tato tˇr´ıda se star´a o zpracov´an´ı dotaz˚ u, kter´e se odes´ılaj´ı na server a kter´e pˇriˇsly ze serveru. Tˇr´ıda tak´e obsahuje mnoho metod, kter´e se volaj´ı pˇri ud´alosti v GUI.
Tˇ r´ıda Filter (Aplikaˇ cn´ı vrstva) Tˇr´ıda Filter se star´a o to, aby instance tˇr´ıdy JFileChooser, kter´a tento filtr pouˇz´ıv´a, mohla vybrat pouze z PDF soubor˚ u.
Tˇ r´ıda PripojeniTCP (Datov´ a vrstva) Tˇr´ıda z datov´e vrstvy vytv´aˇr´ı spojen´ı mezi klientem a servem. Tˇr´ıda funguje jako vydavatel. Pro pˇr´ıjem dat je pouˇzita tˇr´ıda ObjectInputStream, pokud data pˇrijdou, je na to upozornˇen pˇredplatitel, kter´emu se data pˇredaj´ı. Pro odesl´an´ı dat je vytvoˇrena metoda odesliData, kter´a vyuˇz´ıv´a tˇr´ıdu ObjectOutputStream. 34
Softwarov´e aplikace
Program´atorsk´a dokumentace
Tˇ r´ıda UlozeniDat (Datov´ a vrstva) Tˇr´ıda se star´a o uloˇzen´ı dat do poˇc´ıtaˇce a jejich naˇcten´ı zpˇet. Tˇr´ıda obsahuje statick´e metody, kter´e se proto vyuˇz´ıvaj´ı.
Tˇ r´ıda SouboryKUloham (Datov´ a vrstva) Tˇr´ıda obsahuje tˇri File promˇenn´e: • zadani, • zdrojak, • reseni. Ty odkazuj´ı na soubory, kter´e slouˇz´ı pro zobrazen´ı jedn´e u ´lohy.
Tˇ r´ıda HlavniOkno (Prezenˇ cn´ı vrstva) Hlavn´ı tˇr´ıda prezenˇcn´ı vrstvy se star´a o zobrazen´ı hlavn´ıho okna aplikace. Okno aplikace obsahuje strom s obsahem, panel se z´aloˇzkami, kter´e zobrazuj´ı ´ vybranou u ´lohu a diskuzi k n´ı. Ulohu lze vybrat pomoc´ı stromu. Pro zobrazen´ı v syntaxe u zdrojov´eho k´odu tˇr´ıda vyuˇz´ıv´a knihovnu Java Syntax Highlighter.
Tˇ r´ıda DiskuzePanel (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı panel, kter´ y zobrazuje diskuzi k vybran´e u ´loze. Tento panel vyuˇz´ıv´a tˇr´ıda HlavniOkno.
Tˇ r´ıda MujRendererStrom (Prezenˇ cn´ı vrstva) Tˇr´ıda dˇed´ı od tˇr´ıdy DefaultTreeCellRenderer a upravuje zobrazen´ı ikon instance JTree, kter´a danou tˇr´ıdu vyuˇz´ıv´a.
35
Softwarov´e aplikace
Program´atorsk´a dokumentace
Tˇ r´ıda ZobrazeniPdfPanel (Prezenˇ cn´ı vrstva) Prezenˇcn´ı tˇr´ıda staraj´ıc´ı se o zobrazen´ı PDF souboru v JPanelu. Tˇr´ıda vyuˇz´ıv´a knihovnu Pdf-renderer. Tato tˇr´ıda tak´e implementuje metody pro pr´aci s PDF jako je napˇr´ıklad pˇresun na dalˇs´ı str´anku nebo nastaven´ı PDF souboru.
Tˇ r´ıda PotvrzeniOkno (Prezenˇ cn´ı vrstva) Tˇr´ıda zobrazuje okno, kter´e slouˇz´ı pro zad´an´ı potvrzovac´ıho ˇc´ısla od uˇzivatele.
Tˇ r´ıda PresunouDialog (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı dialog, kde uˇzivatel m˚ uˇze pˇresunout u ´lohu nebo sloˇzku ve stromˇe na jinou pozici.
Tˇ r´ıda PrihlaseniOkno (Prezenˇ cn´ı vrstva) Tato tˇr´ıda vytv´aˇr´ı okno, kde je moˇzn´e zadat u ´daje od uˇzivatele pro pˇrihl´aˇsen´ı do aplikace. Okno m´a tak´e odkazy na registraci a spuˇstˇen´ı aplikace offline.
Tˇ r´ıda RegistraceOkno (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı okna, kter´e slouˇz´ı pro zad´an´ı u ´daj˚ u od uˇzivatele pro registraci do aplikace.
Tˇ r´ıda StromPanel (Prezenˇ cn´ı vrstva) Tˇr´ıda Strom dˇed´ı od tˇr´ıdy JTree a slouˇz´ı pro vytvoˇren´ı stromu s obsahem aplikace. Tˇr´ıda obsahuje mnoho metod, kter´e nastavuj´ı chov´an´ı stromu.
36
Softwarov´e aplikace
Program´atorsk´a dokumentace
Tˇ r´ıda TiskDialog (Prezenˇ cn´ı vrstva) Tˇr´ıda zobrazuje dialog, kde si uˇzivatel m˚ uˇze vybrat, zda si chce vytisknout zad´an´ı u ´lohy, popis ˇreˇsen´ı u ´lohy nebo zdrojov´ y k´od, kter´ y ˇreˇs´ı danou u ´lohu.
Tˇ r´ıda VlozeniUlohyDialog (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı dialog, kter´ y se star´a o vloˇzen´ı u ´daj˚ u, kter´e jsou potˇreba pro vytvoˇren´e nov´e u ´lohy.
Tˇ r´ıda UpravaUlohyDialog (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı dialog, kter´ y se star´a o u ´pravu u ´daj˚ u, kter´e jsou uloˇzeny u u ´lohy.
Tˇ r´ıda VlozitPrispevekDialog (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı dialog pro vloˇzen´ı pˇr´ıspˇevku do diskuze k u ´loh´am.
Tˇ r´ıda VlozitSlozkuDialog (Prezenˇ cn´ı vrstva) Tˇr´ıda vytv´aˇr´ı dialog, pro vytvoˇren´ı nov´e sloˇzky v aplikaci.
Tˇ r´ıda ZdrojovyKodPanel (Prezenˇ cn´ı vrstva) Tˇr´ıda se star´a o zobrazen´ı zdrojov´eho k´odu a zobrazen´ı syntaxe. Tato tˇr´ıda tak´e obsahuje metody pro v´ ymˇenu zdrojov´eho k´odu. Tˇr´ıdu vyuˇz´ıv´a tˇr´ıda HlavniOkno.
37
4 Z´avˇer V prvn´ı kapitole m´e bakal´aˇrsk´e pr´ace jsem se zab´ yval programovac´ı soutˇeˇz´ı PilsProg a veˇrejn´ ym validaˇcn´ım serverem UVa Online Judge, kter´ y jsem n´aslednˇe pouˇzil jako zdroj pro v´ ybˇer a vytvoˇren´ı sady u ´loh. Pˇri vytv´aˇren´ı sady u ´loh jsem si procviˇcil sv´e program´atorsk´e schopnosti z hlediska vyˇreˇsen´ı probl´emu v co nejlepˇs´ım ˇcase. Pˇri tˇechto u ´loh´ach jsem pouˇzil program´atorsk´e strategie, kter´e jsem se nauˇcil ve ˇskole, jako je napˇr´ıklad rekurzivn´ı programovan´ı nebo dynamick´e programov´an´ı. Pˇri u ´loh´ach jsem si tak´e vyzkouˇsel, ˇze u ´lohy jsou obvykle nastaven´e tak, aby se nedaly vyˇreˇsit pomoc´ı hrub´e s´ıly. Vˇsech tˇriadvacet u ´loh, kter´e jsem vyˇreˇsil, m˚ uˇzete naj´ıt na pˇriloˇzen´em CD. Na tomto CD naleznete origin´aln´ı a pˇreloˇzen´e zad´an´ı do ˇceˇstiny. U kaˇzd´e u ´lohy je tak´e popis moˇzn´eho zp˚ usobu ˇreˇsen´ı se zdrojov´ ym k´odem. Vˇsechny u ´lohy jsou na pˇriloˇzen´em CD rozdˇeleny do tˇr´ı sloˇzek Lehk´e, Stˇrednˇe obt´ıˇzn´e a Obt´ıˇzn´e, podle obt´ıˇznosti ˇreˇsen´ı. Ke kaˇzd´e u ´loze byly tak´e vytvoˇreny vstupy a v´ ystupy, kter´e takt´eˇz naleznete na pˇriloˇzen´em CD. V druh´e kapitole jsem se zamˇeˇril na vytvoˇren´ı aplikace, kam by uˇzivatel´e mohli shromaˇzd’ovat a sd´ılet vyˇreˇsen´e u ´lohy s popisem, s jak´ ym algoritmem danou u ´lohu vyˇreˇsili. Ke kaˇzd´e u ´loze je tak´e diskuze, kde by uˇzivatel´e mohli diskutovat o dan´e u ´loze. Aplikace dok´aˇze fungovat ve dvou reˇzimech. Online, kdy aplikace je pˇripojena na server a offline, kdy aplikace dok´aˇze fungovat bez toho, ˇze by byla pˇripojena na server. Online reˇzimu aplikace m˚ uˇze prov´adˇet vˇsechny operace jako je napˇr´ıklad vloˇzen´ı nov´e u ´lohy, vloˇzen´ı pˇr´ıspˇevku, uloˇzen´ı u ´lohy atd.. Offline reˇzimu m˚ uˇzeme pouze proch´azet a prohl´ıˇzet si u ´lohy, kter´e jsme si v online reˇzimu uloˇzili a tisknout jejich ˇc´asti. Pro naprogramov´an´ı aplikace jsem pouˇzil platformu Java s programovac´ım jazykem Java. Pˇri vytv´aˇren´ı aplikace jsem z´ıskal zkuˇsenosti, jak naprogramovat aplikace, kter´e mezi sebou komunikuj´ı pomoc´ı poˇc´ıtaˇcov´ı s´ıtˇe. Protoˇze vˇsechna data jsem si ukl´adal do datab´aze MySQL, procviˇcil jsem si tak´e pr´aci s n´ı a s t´ım, jak k dat˚ um pˇristupovat z Javy. Pro naprogramov´an´ı t´eto aplikace jsem tak´e vyuˇzil extern´ı knihovny, kter´e jsem vyhled´aval na internetu a s jejichˇz funkc´ı a pouˇzit´ı jsem se pot´e seznamoval. Jako posledn´ı jsem pouˇzil aplikaci Apache Ant pro sestaven´ı aplikace. Pˇri vytv´aˇren´ı bakal´aˇrsk´e pr´ace jsem se nauˇcil mnoho nov´ ych vˇec´ı, kter´e, 38
Z´avˇer
vˇeˇr´ım, vyuˇziji v navazuj´ıc´ım studiu a n´aslednˇe ve sv´e budouc´ı program´atorsk´e pr´aci.
39
Seznam zkratek UVa - University of Valladolid ACM - Association for Computing Machinery ACM-ICPC - ACM International Collegiate Programming Contest PDF - Portable Document Format JDK - Java Development Kit JVM - Java virtual machine API - Application Programming Interface Java SE - Java Platform, Standard Edition Java ME - Java Platform, Enterprise Edition Java EE - Java Platform, Micro Edition DML - Data Manipulation Language DDL - Data Definition Language DCL - Data Control Language SMTP - Simple Mail Transfer Protocol GUI - Graphical User Interface
40
Literatura [1] Program´atorsk´a soutˇeˇz PilsProg URL:
[citov´ano: 4.5.2014] [2] Valid´ator UVa Online Judge URL: [citov´ano: 4.5.2014] [3] Steven S. Skiena, Miguel A. Revilla. Programming Challenges. URL: [citov´ano: 4.5.2014] [4] Doc. Ing. Pavel Herout, Ph.D. Uˇcebnice jazyka Java. 2007. ISBN 978-80-7232-323-4 [5] Diskuze k UVa Online Judge valid´atoru URL: [citov´ano: 4.5.2014] [6] Robert Sedgewick a Kevin Wayne Algorithms (4th Edition). 2011. ISBN 978-0-321-57351-3
41
Pˇ r´ılohy Seznam pˇ r´ıloh Sch´ema 1 ERA model datab´aze Uˇzivatelsk´a pˇr´ıruˇcka
42
Sch´ema 1 ERA model datab´aze
43
Uˇ zivatelsk´ a pˇ r´ıruˇ cka
44
Pro pˇreloˇzen´ı a bˇeh obou aplikac´ı je nutn´e m´ıt nainstalovan´ y JDK 1.7 nebo vyˇsˇs´ı.
Server Pˇ reloˇ zen´ı Aplikace se pˇreloˇz´ı pomoc´ı pˇr´ıkazu ant, ve sloˇzce server. T´ımto pˇr´ıkazem vznikne spustiteln´ y soubor ACM u ´loˇziˇstˇe - server.jar.
Pˇ red spuˇ stˇ en´ım Pˇred spuˇstˇen´ım aplikace je nutn´e nastavit konfiguraˇcn´ı soubor, kter´ y se mus´ı jmenovat config.properties a mus´ı b´ yt ve stejn´e sloˇzce jako ACM u ´loˇziˇstˇe server.jar. Konfiguraˇcn´ı soubor obsahuje na kaˇzd´e ˇra´dce jednu informaci. Informace je uloˇzena ve form´atu promˇenn´a = hodnota (viz Obr´azek 1). Vˇsechny promˇenn´e aˇz na promˇennou domena je nutn´e nastavit. Pokud se promˇenn´a domena nenastav´ı, jsou povoleny pro registraci vˇsechny e-maily. Pokud je potˇreba u promˇenn´e domena nastavit v´ıce e-mail˚ u, jsou oddˇelen´e ˇca´rkou. • smtp server - adrese smtp serveru, • smtp ucet - u ´ˇcet na smtp serveru, • smtp heslo - heslo k u ´ˇctu na smtp serveru, • databaze url - url adresa datab´aze, • databaze uzivatel - jm´eno uˇzivatele v datab´azi, • databaze heslo - heslo uˇzivatele v datab´azi, • port - ˇc´ıslo portu, na kter´em aplikace bude naslouchat, • domena - dom´ena, kterou mus´ı e-mail obsahovat pˇri registraci.
45
Obr´azek 1: Konfiguraˇcn´ı soubor Spuˇ stˇ en´ı Spuˇstˇen´ı prob´ıh´a pomoc´ı pˇr´ıkazu java -jar ’ACM u ´loˇziˇstˇe - server.jar’. Pot´e je moˇzno zadat dva pˇr´ıkazy. Pˇr´ıkaz vytvor databazi, vytvoˇr´ı novou datab´azi a pˇr´ıkaz konec, slouˇz´ı pro ukonˇcen´ı aplikace.
Klient Aplikace se pˇreloˇz´ı pomoc´ı pˇr´ıkazu ant, ve sloˇzce klient. T´ımto pˇr´ıkazem vznikne spustiteln´ y soubor ACM u ´loˇziˇstˇe - klient.jar.
Pˇ red spuˇ stˇ en´ım Pˇred spuˇstˇen´ım aplikace je nutn´e nastavit konfiguraˇcn´ı soubor, kter´ y se mus´ı jmenovat config.properties a mus´ı b´ yt ve stejn´e sloˇzce jako ACM u ´loˇziˇstˇe klient.jar. Konfiguraˇcn´ı soubor obsahuje na kaˇzd´e ˇra´dce jednu informaci. Informace je uloˇzena ve form´atu promˇenn´a = hodnota. Promˇenn´e, kter´e mus´ıme nastavit jsou: • ip - adresa serveru,
46
• port - ˇc´ıslo portu na kter´em naslouch´a server.
Spuˇ stˇ en´ı Spuˇstˇen´ı aplikace prob´ıh´a pomoc´ı pˇr´ıkazu java -jar ’ACM u ´loˇziˇstˇe - klient.jar’ nebo spuˇstˇen´ı souboru ACM u ´loˇziˇstˇe - klient.jar.
Pˇ rihlaˇ sovac´ı okno a registrace Po spuˇstˇen´ı aplikace se n´am spust´ı okno pro pˇrihl´aˇsen´ı (viz Obr´azek 2). V oknˇe m˚ uˇzeme vyplnit e-mail s heslem a t´ım se pˇrihl´asit do aplikace, kter´a funguje online. To znamen´a, ˇze je pˇripojena na server. Pokud uˇzivatel nem´a pˇrihlaˇsovac´ı u ´daje, je nejdˇr´ıve potˇreba se zaregistrovat. Do registrace se dostaneme kliknut´ım na odkaz registrovat. Po kliknut´ı na odkaz registrovat se n´am spust´ı okno (viz Obr´azek 3), kde je nutn´e vyplnit e-mail, kter´ y mus´ı m´ıt dom´enu, kter´a je urˇcena serverem, a heslo, kter´e mus´ı b´ yt delˇs´ı jak 5 znak˚ u. Tyto informace m˚ uˇzeme tak´e zjistit, kdyˇz najedeme myˇs´ı na otazn´ık. Po registraci pˇrijde uˇzivateli e-mail s ˇc´ıslem, kter´e je potˇreba zadat pˇri vyˇz´ad´an´ı. Zad´an´ı ˇc´ısla se mus´ı prov´est do 24 hodin, nebo se bude muset znova prov´est registrace. Pot´e je moˇzn´e se do aplikace pˇrihl´asit. Na oknˇe pro pˇrihl´aˇsen´ı m˚ uˇzeme tak´e kliknout na odkaz Bez pˇrihl´aˇsen´ı, kter´a spust´ı aplikaci v offline reˇzimu. To znamen´a, bez pˇripojen´ı na server.
Obr´azek 2: Okno pro pˇrihl´aˇsen´ı
47
Obr´azek 3: Okno pro registraci Hlavn´ı okno s pˇ rihl´ aˇ sen´ım Hlavn´ı okno aplikace je rozdˇeleno na tˇri ˇca´sti (viz Obr´azek 4). V prav´e ˇc´asti aplikace je strom, kter´ y obsahuje sloˇzky a n´azvy u ´loh. Prav´a strana je rozdˇeˇ sen´ı a lena vodorovnˇe na dvˇe ˇca´sti. Horn´ı ˇca´st m´a tˇri z´aloˇzky a to Zad´an´ı, Reˇ Zdrojov´y k´od, kde se zobrazuj´ı ˇca´sti u ´lohy. V doln´ı ˇca´sti se zobrazuje diskuze k t´eto u ´loze. Ve stromˇe lze vybrat u ´lohu pomoc´ı toho, ˇze na n´ı klikneme lev´ ym tlaˇc´ıtkem myˇsi. Po kliknut´ı prav´ ym tlaˇc´ıtkem myˇsi na sloˇzku nebo u ´lohu se zobraz´ı menu. U sloˇzky lze vybrat, jestli danou sloˇzku chceme pˇrejmenovat, odstranit nebo do n´ı vloˇzit novou sloˇzku ˇci novou u ´lohu. U u ´lohy m˚ uˇzeme vybrat, jestli chceme danou u ´lohu pˇrejmenovat, upravit nebo odstranit. U u ´lohy m˚ uˇzeme tak´e vybrat, ˇze danou u ´lohu chceme vytisknou. Po kliknut´ı na tisk je pot´e potˇreba vybrat, jakou ˇc´ast u ´lohy se m´a vytisknout. U kaˇzd´e u ´lohy, m˚ uˇzeme pˇrid´avat nov´ y pˇr´ıspˇevek pomoc´ı tlaˇc´ıtka Vloˇz pˇr´ıspˇevek nebo reagovat na pˇr´ıspˇevek jin´eho uˇzivatele tak, ˇze klikneme u jeho e-mailu na odkaz reagovat. Pˇri vloˇzen´ı nov´eho pˇr´ıspˇevku nebo reakci na pˇr´ıspˇevek se zobraz´ı dialog, kam dan´ y pˇr´ıspˇevek nap´ıˇseme. Hlavn´ı okno m´a tak´e v doln´ım prav´em rohu naps´ano, jestli dan´a u ´loha je uloˇzena nebo ne. Pˇred t´ımto popisem je znak + nebo -, pˇri jehoˇz kliknut´ı uloˇz´ıme nebo odstran´ıme danou u ´lohu.
48
Obr´azek 4: Hlavn´ı okno aplikace s vybranou u ´lohou Hlavn´ı okno bez pˇ rihl´ aˇ sen´ı Hlavn´ı okno v reˇzimu offline vypad´a stejnˇe jako v reˇzimu online. Je omezena pouze jeho funkˇcnost, kdy lze pouze prohl´ıˇzet u ´lohy, kter´e jsme si v online reˇzimu uloˇzili. V tomto reˇzimu nelze upravovat ˇz´adn´a data, pouze prohl´ıˇzet a tisknout ˇc´asti u ´loh.
49