Konzolová databáze kontaktů v C++

Kategorie >>Programování>> Konzolová databáze kontaktů v C++


Nedávno jsem si předsevzal, že opráším své znalosti v programování v jazyku C++ a vytvořím nějakou jednoduchou aplikaci, prozatím v konzolové verzi, která by se časem mohla zdokonalovat.

Rozhodl jsem se vytvořit něco jako databázi kontaktů, která si bude umět pamatovat alespoň jméno,příjmení,email a icq a která bude jednoduše rozšiřitelná o další data která budu chtít uchovávat.

Vlastní program se skládá z 7 souborů:
main.cpp -> zde se pouze vytvoří instance třídy CContactList a následuje jednoduché menu, které je uzavřeno do nekonečného cyklu.
contactList.h -> zde naleznete deklaraci třídy CContactList
person.h a .cpp -> obsahuje třídu Allocator a Contact.
File.h -> obsahuje třídu CFile
List.h a .cpp -> obsahuje třídu List

Pusťme se tedy do stručného popisu:

main.cpp


Jak již bylo zmíněno, na začátku hlavní metoObrázekdy vytvoříme instanci třídy CContactList a poté následuje nekonečný cyklus jehož úkolem je pouze stále se opakovat dokud uživatel nezmáčkne klávesu 6.

Zajímavý příkazy které se používají jsou:
system("CLS") - vyčistí konzoli.
getch() - čeká na stisknutí klávesy a její hodnotu poté navrací


contactList.h


Třída CContactList obsahuje veřejné metody bool Add(), bool Delete( Contact * person ),bool SaveData(),bool LoadData() a privátní metodu void ReadString( char * buff, WORD len )

metoda bool Add() - jejím cílem je přidat nový kontakt -> zde se zavola přetíženy operátor new, který mi vratí ukazatel na již alokované místo v paměti. Poté se načtou data(jméno, příjmení..) z klávesnice a uloži do jednostranně zřetězeneho seznamu na konec. Pokud se podaří vložit nový kontakt metoda vráti true jinak vráti false.
také je zde použité makro ReadAndSet(x) které má pouze za úkol zpřehlednit zápis kódu. Toto makro volá privátní metodu void ReadString( char * buff, WORD len ), která má za účel načitat z klávesnice vstup dokud nebude stisknuta klávesa ENTER nebo nebude překročena velikost dočasného bufferu, to proto aby nedošlo k nežádoucímu přepisování dat.

metoda bool Delete( Contact * person ) - ta má za účel smazat uživatele ze seznamu kontaktů. Podaří-li se smazat uživatele bude navratová hodnota true jinak false.

metoda List::T Find( BYTE bName ) - jejím účelem je najít podle jména,přijmení,...atd. hledanou první hledaný výraz, který si uživatel sám zadá. Navrátovou hodnoutou je 0 v případě nenalezení hledaného kontaktu jinak je jí pointer na data kontaktu.
Tato metoda by šla jednoduše zobecnit na hledání podle všech možností najednou ( podle jména, přijmení ... )

metody bool LoadData() a bool SaveData() - mají za účel pouze načíst či uložit data kontaktů, které máme momentálně v paměti. To se provede tak, že nejprve načteme z klávesnice soubor který má být načtený/uložený a poté zavoláme příslušnou metodu naší třídy CFile. Návratová hodnota vrací úspěch či neúspěch metody.


person.h .cpp


zde naleznete 2 třídy a to Allocator a Contact. Popišme si je tedz popořádku:

Allocator - jejím učelem je alokování potřebné paměti pro načítání a přidávání nových kontaktů a jeji případné dealokování pkteré se provede v destruktoru při ukončení programu.
Jde o templateovou třídu jejíž jediný parametr template WORD BlockSize = 25600 uvádí kolik paměti se má v allokovat či v případě dojde-li pamět kolik bytů se má přialokovat.
Princip alokatoru je jednoduchy. Nejprve si naalokujeme velkou část paměti, přibližně asi tak velikou, jak odhadujeme, že by databáze mohla obsahovat. Poté se tato oblast pomoci ZeroMemory vynuluje do třídních proměnných se nastaví velikost paměti kterou jsme prave alokovali a uložíme si na tento blok ukazatel. Takze při požadavku o paměť dostane metoda Alloc velikost - wSize, jakou si žádáme alokovat, pokud je velikost kterou žádáme wSize > m_block->m_free = což značí počet volných bytu v bloku vratime ukazatel na pamět a pokud ne alokujeme nový blok a způvodního bloku na něj přidame pointer to proto abychom mohli tuto pamět následně dealokovat.

metoda void * Alloc( WORD wSize ) - vrací v případě neúspěšného pokusu o alokování nulový pointer jinak vratí ukazatel na požadovanou pamět o velikosti wSize. V případě není-li v bloku již dostatek místa, alokuje se nový blok.

metoda void Dealoc() - má prázdné tělo, neboť jak je Vám nejspíše jasné, nemá smysl dealokovat část paměti, která je jen malou částí původně alokované paměti.

metoda void FreeAll() - uvolní veškerou pamět kterou si alokátor na začatku vytvořil.¨

metoda bool CreateBlock()- je privátní. Má za úkol alokovat pamět. Vrací true v případě uspěchu, jinak false.

Na pamět která se alokuje , ta o které jsme až doposud hovořili, je vlastně jakoby namapována struktura struct Block která má následující prototyp:

struct Block
{
Block * prev; //ukazatel na predchozi blok
Block * next; //ukazatel na nasledujici blok - v kodu jej nevyuzivam
WORD m_free; //pocet volnych bytu
PBYTE m_data; //ukazatel na vlastni data
};

Jako poslední věc chci ještě zmínit privátní proměnnou Block * m_block; která v sobě uchovává ukazatel první Block.

Příště popíši dálší třídy a části programu.

zdrojové kódy ke stáhnutí




Vloženo: 23.04.2007 10:51
Přečteno:4872
Autor: Dima

Hlasů: 9 Hodnocení(jako ve škole): 3.22
 

Komentáře (7)

   -     Nový Komentář
Autor:
 MM
Datum:
  23.04.2007 12:18:05
reagovat
Hmm, zajímavé, jen bych asi pro názornost přidal vlastní kód na stránky, aby si člověk mohl přečíst jak přesně vypadá tělo metod a třídy.
Autor:
 hukodum
Datum:
  23.04.2007 19:09:06
reagovat
jeeeeeee, prvni komentar)) diiiik, tak to pravdepodobne udelam;))
Autor:
 dm
Datum:
  24.04.2007 08:45:20
reagovat
ty vole na zakladni skole, todlenctonc tentononc vypada tak nejak poser frendly, kdo to zplichtil ...super nu, ale pozor, jak by rekl fabik ... komentare adin dva try cetyry smetanine
Autor:
 MM
Datum:
  24.04.2007 16:22:48
reagovat
rozumim Ti asi tak jako kdyz prijdes po 15pivkach a sesti absintech. Co se Ti na tom nelibi?
Autor:
 dm
Datum:
  24.04.2007 16:32:01
reagovat
kurna man vole man ,to je nejlepsi tentononc todlenctonc.
Autor:
 dm
Datum:
  24.04.2007 16:32:47
reagovat
dotaz musim prelozit, kdopak je autoprd ? (autor) todlenctonc tohonc tentononc
Autor:
 admin
Datum:
  16.08.2008 22:10:47
reagovat
jj autoprd