Students 2005 Semestrální práce z předmětu Informatika I Dokumentace projektu Vysoké Učení Technické v Brně Fakulta Strojního Inženýrství Mechatronika Staněk Martin E96 stanek_martin@seznam.cz
Obsah Zadání.. 3 Koncepce. 4 Realizace. 7 Uživatelské rozhraní a uživatelská příručka 9 Technické parametry aplikace 14
Zadání projektu Funkce : Program má sloužit, jako jednoduchá evidence studentů. Ke každému studentovi přísluší množina jeho prospěchu ze které se počítá průměr. Tyto průměry se vyhodnocují a je poskytnuta informace o nejlepších a nejhorších studentech. Data jsou uchovávána v souborech. Jazyk : Pascal Diskuze zadaní : Každá studijní skupina nemá blíže definovaný počet studentů, stejně jako není blíže definováno kolik případných skupin má být uloženo v souboru, počet známek jednotlivého studenta není rovněž specifikován. Z těchto důvodů aplikace musí umět zpracovat neomezené množství studijních skupin, v každé skupině může být neomezené množství studentů a každý student může být klasifikován neomezeným množstvím známek. Skupiny mohou vznikat, stejně jako zanikat, studenti mohou odcházet i přicházet a jejích známky se mohou, např. v důsledku chybného zadání, měnit a mazat. Proto aplikace musí být schopná reflektovat na tyto události. Informace o studentech je třeba ukládat do souboru, tento soubor musí reflektovat stejné požadavky na strukturu a množství dat jako samotná aplikace. Proto nelze použít typové soubory, protože jednotlivých položek může být neomezené množství, ale musí být definované s konečnou velikostí. Uživatelské rozhraní je nutno řešit efektivně, elegantně a s požadavkem maximální uživatelské přívětivosti a nejlépe, tak aby uživateli bylo vysloveně zabráněno dopouštět se zadávání chyb na vstupech apod.. Jazyk pro realizaci jsem zvolil Object Pascal 32, IDE Delphi 7.
Koncepce Koncepce projektu spočívá v modelu jádra a uživatelského rozhraní. Jádrem rozumím objekt (třídu), která zapouzdřuje funkce a procedury pro práci s daty v paměti, stejně jako pro práci se soubory. Uživatelské rozhraní s tímto jádrem pouze pracuje, nemělo by provádět žádné operace, které chronologicky spadají do působnosti jádra. Jádro Je realizováno jako objekt, operující nad dynamickým seznamem, musí obsahovat tyto a další funkce : - načtení databáze ze souboru - vytvoření databáze - uložení databáze do souboru - uvolnění databáze z haldy - přidání / odebrání studijní skupiny / odebrání všech studijních skupin - přidání / odebrání / odebrání všech studentů jedné a konkrétní studijní skupiny - přidání / odebrání známky konkrétnímu studentu konkrétní studijní skupiny - výpočet průměru prospěchu konkrétního studenta v konkrétní studijní skupině - výpočet průměru prospěchů konkrétní studijní skupiny - vyhodnocení studijních výsledků pro konkrétní studijní skupinu - apod.... Uživatelské rozhraní Podle diskuze zadání musí být elegantní, přehledné, funkční a jednoznačné. Dialogy vstupů musí být voleny tak, aby uživatele jednoznačně vedly k požadovanému cíli, měly by maximálně omezit možnost zadání chybného vstupu. Uživatelské rozhraní by dále mělo maximálně splňovat veškeré závazné normy pro aplikace typu Win32.
Schématické znázornění databáze Student - Jméno a Příjmení jsou textové položky typu String - Známka je dynamické pole celých čísel - Předchozí a Následující jsou odkazy na předchozího/následujícího studenta typu Pointer Studijní skupina - Název je textová položka typu String - 1. Student je odkaz na prvního studenta ve skupině, implicitně nill - Předchozí a Následující jsou odkazy na předchozí/následující studijní skupinu Databáze - Název a Poznámka jsou textové položky typu String - 1. Skupina je odkaz na první studijní skupinu, implicitně nill
Znázornění databáze na haldě - Nenavazuje-li na prvek nějaký další, je odkaz na následujícího nill - Nenavazuje-li prvek na žádný předchozí, je odkaz na předchozí nill Respektive
Realizace Jádro je tvořeno třídou TStudentsDatabase, tato obsahuje všechny procedury a funkce, tak, aby bylo schopno pracovat nad databází a soubory dle koncepce projektu. Soubory databáze jsou de facto *.ini soubory, práci s těmito soubory elegantně zajišťuje třída TINIFile implementovaná v systému Delphi. Uživatelské rozhraní je tvořeno systémem formulářů. Tyto jsou neprofesionálně nadefinovány staticky, nicméně si troufám tvrdit, že to pro potřebu aplikace tohoto charakteru plně postačuje. Následuje už jenom výpis hlavičky hlavní unity, resp. třídy TStudentsDatabase : type TArrayOfBytes = array of byte; TMarks = TArrayOfBytes; // ukazatel na strukturu TStudent PStudent = ^TStudent; // struktura TSTudent TStudent = record Name : string; // jmeno studenta Surrname : string; // prijmeni studenta Marks : TMarks; // dynamicke pole s jeho prospechem Prew, // pointer na predchoziho studenta Next : PStudent; // pointer na nasledujiciho studenta end; // ukazatel na strukturu TWorkGroup PWorkGroup = ^TWorkGroup; // struktura TWorkGroup TWorkGroup = record Name : string; // nazev prac skupiny Students : PStudent; // pointer na prvniho studenta Prew, // pointer na predchozi pracovni skupinu Next : PWorkGroup; // pointer na nasledujici pracovni skupinu end; // struktura TDatabaseList, predstavujici defakto linearni seznam // s neomezenym poctem pracovnich skupin s neomezenym poctem studentu TDatabaseList = record Name : string; // jmeno databaze Description : string; // poznamka k databazi WorkGroups : PWorkGroup; // pointer na prvni prac. skupinu end; PTreeNode = ^TTreeNode; TStudentDatabase = class(tcomponent) protected DatabaseExists : boolean; INIFile : TINIFile; fdatabaselist : TDatabaseList; ftree : TTreeView; private public constructor Create(AOwner : TComponent; const Tree : TTreeView); reintroduce; destructor Destroy; override; procedure ClearTreeView; procedure DisposeDatabase function GetWorkGroupTreeNode(const workgroupindex : word) : PTreeNode; function GetStudentTreeNode(const workgroupindex, studentindex : word) : PTreeNode; function GetWorkGroup(const ind : word) : PWorkGroup; function GetStudent(const workgroupindex, index : word) : PStudent; function GetStudentByPointer(const workgroup : PWorkGroup; const studentindex : word) : PStudent;
procedure CreateDatabaseList(const name : string); procedure ShowInTree; procedure SelectWorkGroupInTree(const workgroupindex : integer); procedure SelectStudentInTree(const workgroupindex, studentindex : integer); procedure DeleteDatabase; procedure DeleteWorkGroup(const workgroupindex : word); procedure DeleteStudent(const workgroupindex, studentindex : word); procedure DeleteAllStudents(const workgroupindex : word); procedure DeleteAllStudentsByPointer(const workgroup : PWorkGroup); procedure DeleteSelected(const workgroupindex, studentindex : integer); procedure DeleteMark(const workgroupindex, studentindex, mark : integer); function SaveToFile(const filepath : string) : boolean; function LoadFromFile(const filepath : string) : boolean; function AddWorkGroup(const name : string) : integer function AddStudent(const workgroupindex : integer; const name, surrname : string) : integer; function NewDatabase(const databasepath, name, description : string) : boolean; function CanSaveDatabase : boolean; function CanAddItems : boolean; function GetStudentsCount(const workgroupindex : integer) : integer; function GetWorkGroupsCount : integer; function GetStudentsCountByPointer(const workgroup : PWorkGroup) : integer; function AddMark(const workgroup, student : integer; const mark : byte) : integer; function GetStudentAverage(const workgroupindex, studentindex : word) : real; function GetWorkGroupAverage(const workgroupindex : word) : real; function GetBestNStudents(const workgroupindex, n : word) : TArrayOfBytes; property DatabaseList : TDatabaseList read fdatabaselist; published {} end;
Uživatelské rozhraní a uživatelská příručka Instalace Aplikace se neinstaluje, pouze se rozbalí do pracovního adresáře, tento adresář aplikace bude později chápat, jako výchozí pro otevírání a ukládání databází. Je samozřejmě schopna ukládat a načítat z jiných adresářů. Archiv obsahuje soubor students2005.exe, soubor ukázkové databáze fsi.fis a tento dokument students2005.pdf. První kroky Po úspěšné instalaci a spuštění aplikace jsme ohromeni elegancí tohoto okna : Nyní máme v zásadě dvě možnosti, jak pokračovat. Můžeme vytvořit novou databází, a nebo načíst ukázkovou databázi ze souboru. Zvolme variantu a) a klikněme na první tlačítko v nástrojové liště zleva Nová databáze. Otevře se tento průvodce :
Jsme vyvedeni z míry invencí otevřivšího se okna, ale nicméně se přemůžeme a následujeme rady průvodce a vyplníme položky a stiskněme tlačítko Další >. Následuje další část dialogu, z této se samozřejmě můžeme vrátit zpět, stejně tak bez jakýchkoli následků na zdraví a majetku můžeme stisknout Storno, tato volba zmaří veškeré snahy o založení databáze a vrátí nás do výchozího stavu. Bohužel uživateli není možno zabránit, aby se pokusil vytvořit soubor s cestou typu : C:\procnepouzitotaznikyvnazvusouboru?????.fis, proto se aplikace pokusí soubor vytvořit a až na základě selhání zápisu, který je ošetřen standardním try except, vyhodí hlášku o chybě. Zadá-li uživatel název souboru, který již existuje, je na to šetrně upozorněn a je mu nenápadně podsunuta otázka, zda to skutečně zamýšlel a zda si existující soubor přeje přepsat. Pokud jsme prošli úskalím vytvoření nové databáze, měli bychom spatřit něco velmi podobné následujícímu : Přidávání pracovních skupin a studentů
V tuto chvíli se nám již otevírá nesmírně vzrušující možnost přidávat skupiny a studenty, toto nám bylo doposud znemožněno, protože databáze ještě neexistovala a nebyla ani načtena, proto nemělo smysl nic nikam přidávat. Zkusme si nyní přidat několik skupin čtvrtým tlačítkem na nástrojové liště zleva Přidej kruh. : Tlačítko OK se uschopní až v momentě, kdy má vepsaný název skupiny minimálně jeden znak, zneschopní se v momentě, pokud je textové pole prázdné. Vytvořili jsme tedy skupinu a nyní se pokusme přidat do této skupiny studenta, použijeme na to tlačítko Přidej studenta. Výraznou podmínkou úspěchu této akce je, že musí být označena skupina ke které se chystáme přidávat, není-li tomu tak, aplikace nás nařkne z neschopnosti. Podmínka přidání studenta je ještě rozšířena o skutečnost, že musí být vyplněno jak jméno, tak příjmení, experimentování s touto podmínkou vede ke změnám funkční impotence tlačítka OK dialogu stejně jako v případě skupiny. Po vzájemné domluvě s programem dosahujeme cca tohoto výsledku :
Jsme ve fázi, kdy lze s lehkým sadismem, čí bez něj klasifikovat studenty. Učiňme tak prostřednictvím tlačítka Přidej hodnocení. Formulář, který spatříme je záměrně řešen tak, aby uživatel zvolil nějakou známku n, kde n N n < 0, 5 >. Samozřejmě, že následuje opět podmínka označení nějakého studenta. Produktem naší snahy může být něco podobného : Průměr studenta je aktualizován v závislosti na změnách známek.
Odebírání položek databáze Skupiny a studenty jsme přidali a nyní je odebereme, odebrání studenta dosáhneme jeho označení ve skupině a stisknutím tlačítka Smaž, student se odstraní dynamického seznamu a odstraní se z haldy, to samé platí pro skupiny s tím rozdílem, že jsou odstraněni z haldy i všichni studenti skupiny, pokud nějaké měla. Označení kořenu stromu s názvem databáze a stisk tlačítka Smaž má za následek odstranění celé databáze a de facto návrat ve výchozí stav. U klasifikace můžeme při odstraňování známek popustit uzdu fantazii a kreativitě poněkud více, jelikož lze označit jednu známku v tabulce, nebo skupinu po sobě následujících známek, po stisku tlačítka Smaž, bude celý námi vybraný interval smazán a průměr přepočítán. Načtení databáze Vše co platí pro databázi vytvořenou platí i pro tu načtenou. Ze souboru databázi načteme po stisku tlačítka Otevři databázi v nástrojové liště, nepřekvapí nás standardní dialog pro otevření. Uložení změn Změny uložíme tak, že stiskneme tlačítko Ulož. Otevře se standardní dialog pro ukládání, chceme-li pouze uložit změny zvolíme stejný soubor, jaký je ten momentálně načtený. Statistika prospěchu V zadání projektu byla řeč o vyhodnocování prospěchu jednotlivých studentů, aby tomu bylo učiněno zadost stiskněme tlačítko Statistika. Kde se konečně dostáváme k prapůvodnímu požadavku a smyslu cca 3tisíc řádků programového kódu : Toto okno nás informuje kdo je v jaké skupině nejlepší, nejhorší a jak si vedou jednotlivé skupiny.
Technické parametry aplikace Jazyk : Object Pascal 32, IDE Deplhi 7 Personal Platforma : IBM PC, MS Windows 95+ Verze : 1.0.0.build Soubory nutné pro chod programu : students2005.exe Velikost programu : 971.5 kb Programový kód : 2689 řádků, 89.3 kb Jazyková lokalizace : čeština Licence : freeware, opensource Uživatelská podpora : stanek_martin@seznam.cz http://www.stanek-martin.euweb.cz Vývojová platforma Acer TravelMate 620 Intel Pentium IIIm, 1200MHz, 256MB RAM MS Windows XP SP2