background image

Program: Budżet domowy

Autor: Dariusz Mikołajczuk

UWAGA:

  Przed uruchomieniem programu należy jego  folder skopiować na dysk  gdyż program 

modyfikuje swoje pliki.

Wstęp 

Program   budżet   domowy   pozwala   na   gromadzenie   wpisów   przedstawiających   wpływy   i 

wydatki. Do każdego wpisu można przypisać kategorie: praca, żywność, rozrywka itp. Wprowadza 
się też kwotę, datę i opis operacji.

Dane wyświetlane są w tabeli pozwalającej na przeglądanie wpisów, ich edycję oraz dodawanie 

nowych i usuwanie istniejących wpisów.

Przy zamknięciu programu lista zapisywana jest do pliku, przy starcie lista jest automatycznie 

wczytywane.

Niestety nie zaimplementowałem obsługi bilansów i planów wydatkowych ze względu na brak 

czasu.

Działanie programu

Program działa w oparciu na listę dwukierunkową składających się z obiektów klasy Wpis.

Klasa Wpis przechowuje dane dotyczące pojedynczego wpisu, pozwala na wyświetlanie, edycje 

i tworzenie nowego wpisu.

Klasa Lista pozwala na elementarne operacje na liście dwukierunkowej: tworzenie, dodawanie 

elementów, usuwanie. 

Klasa Baza zajmuje się wyświetlaniem listy operacji, przeprowadza odczyt i zapis bazy do pliku. 

Z uwagi na konieczność intensywnego korzystania z pól klasy Lista, klasa ta dziedziczy z klasy 
Lista.   Pozwoliło   to   na   wykorzystanie   konstruktora   i   destruktora   klasy   Baza   do   operacji 
wczytywanie i zapisywania pliku.

Klasa Menu wyświetla menu główne.

Dodatkowymi elementami są:

1) przestrzeń nazw Kategoria (pierwotnie klasa zawierająca tylko składowe statyczne) pozwala 

na   wyświetlanie   listy  dostępnych   kategorii   operacji.   Konwertuje   numer   kategorii   na   jej 
nazwę. Identyfikuje na podstawie numer rodzaj operacji: wpływ, wydatek.

2) Klasa Data przechowuje datę operacji, pozwala na wczytywanie i sprawdzanie poprawności 

daty. Dodatkowo sprawdza, czy dana data jest wcześniejsza od innej, co wykorzystane jest 
przy   dodawaniu   nowych   wpisów   (wpisy   ułożone   są   w   kolejności   od   najstarszych   do 
najnowszych)

3) Metody statyczne dokonujące konwersji string → uint, string → float, oraz sprawdzająca 

czy dany string zawiera liczbę typu unsigned int

background image

Listing klas, metod i pól:

static bool isUint(string str)  // czy str jest typu unsigned int

static int toUint(string str)  // konwersja string → unsigned int
static float toFloat(string str)  // konwersja string → float

namespace Kategorie

const int countWplyw

; // liczba kategorii wpływów

const string catWplyw[countWplyw]

; // tablica kategorii wpływów

const int countWydat;

 // liczba kategorii wydatków

const string catWydat[countWydat];

 // tablica kategorii wydatków

void wyswietlKategorie();

 // wyświetla listę kategorii wraz z przypisanymi numerami

int iloscKategorii();

 // zwraca łączną ilość kategorii

string getKategoria(int nr);

 // zwraca opis kategorii o danym numerze

bool czyWplyw(int nr);

 // sprawdza czy kategoria o danym numerze jest wpływem

class Data // data operacji

private int dzien; 
private int miesiac;
private int rok;
private bool czyPrzestepny(int& rok)

 // sprawdza czy rok jest przestępny

private bool czyPoprawna(string& str)

 

// czy data jest poprawna, czy postaci: dd-mm-rrrr, d-mm-rrrr, dd-m-rrrr, d-m-rrrr

Data()

 // konstruktor domyślny

void pobierzData(string txt="Podaj datę operacji (DD-MM-RRRR)") 

// prosi o podanie i pobiera datę

int getDzien() 

// zwraca dzień operacji

int getMiesiac()

 // zwraca miesiąc

int getRok()

 // zwraca rok

void setDzien(int& d)

 // ustawia dzień operacji

void setMiesiac(int& m)

 // ustawia miesiąc

void setRok(int& r) 

 // ustawia rok

bool czyWczesniejszaOd(Data Tej)

 // czy data (this) jest wcześniejsza od parametru

string toString() 

// przekształca datę na string postaci dd-mm-rrrr

class Wpis // przechowuje pojedynczą operacje

private string kategoria;
private Data *date;
private float kwota;
private bool wplyw;

 // true - wpis oznacza wpływ, false - wpis oznacza wydatek

private string opis;

background image

private void pobierzKategoria(string str="Wybierz kategorie operacji:")

// prosi o podanie i pobiera kategorię

private void pobierzKwota(string str="Podaj kwotę operacji")

// prosi o podanie i pobiera kwotę

private void pobierzOpis(string str="Podaj opis operacji (opcjonalnie)")

// prosi o podanie i pobiera opis

Wpis() 

// konstruktor domyślny

// prosi o podanie wszystkich danych wpisu i zapisuje je

Wpis(string &dataline)

 // konstruktor– tworzy nowy wpis na podstawie pełnej linii pliku

Wpis(Wpis& wp)

 // konstruktor kopiujący

bool edytuj()

 // pozwala na edycje istniejącego wpisu, zwraca true jeśli edytowano datę 

  // należy wówczas ponownie dodać wpis w odpowiednim miejscu listy aby 
  // zachować kolejność operacji

void wyswietl() 

// wyświetla pojedynczą linijkę zawierającą dane wpisu, podczas przeglądania bazy

bool czyWczesniejszyOd(Wpis &Tego)

// sprawdza czy wpis (this) ma wcześniejszą datę operacji od parametru

bool getWplyw() 

// zwraca wartość true jeśli wpis opisuje operacje wpływu

Data getData() 

// zwraca datę operacji

Data* getpData()

 // zwraca wskaźnik do obiektu daty operacji

float getKwota()

 // zwraca kwotę operacji

string getKategoria()

 // zwraca kategorię operacji

string getOpis()

 // zwraca opis operacji

~Wpis() 

// destruktor usuwa pole Data

class Lista // przechowuje i przeprowadza elementarne operacje na liście dwukierunkowej

protected struct element 

{ // zawartość pojedynczego elementu listy

Wpis *oper;

// wszystkie pola są protected, aby klasa dziedzicząca: Baza

struct element *prev;

 // miała dostęp do pól klasy Lista

struct element *next; 

};

protected typedef struct element element;
protected typedef element* list;
protected list first, actual, last, temp;

 

// wskaźniki do elementów listy wykorzystywane w metodach klasy Lista i Baza

protectedlist pWpisToList(Wpis* nowy_wpis)

 { 

// tworzy nowy element listy zapisując w nim wskaźnik do utworzonego zewnętrznie Wpisu

protected int count;

 // ilość elementów listy

Lista()

 // konstruktor domyślny, inicjalizuje listę

void addLast(Wpis* nowy_wpis) 

// dodaje nowy wpis na końcu listy

void addPrzed(list Tym, Wpis* nowy_wpis)

 

// dodaje nowy wpis przed konkretnym elementem listy

bool empty()

 // sprawdza czy lista jest pusta

void usunAktualny()

 // usuwa element wskazywany przez wskaźnik actual

int ileElementow() 

 // zwraca ilość elementów listy

~Lista()

 // usuwa listę z pamięci (na zakończenie programu)

background image

class Baza : public Lista // klasa zarządzająca bazą wpisów

private const char* dbfname; 

// nazwa pliku (inicjalizacja w konstruktorze na „baza.txt”)

privatebool writeList;  

// czy zapisać listę przy wyjściu (klawisz q przy przeglądaniu wychodzi bez zapisu)
// ESC – wyjście z zapisem listy

Baza() : Lista() 

// konstruktor domyślny, wywołuje konstruktor Listy. Sam odczytuje plik z bazą (jeśli istnieje)

void dodajWpis(Wpis* nowy_wpis)

// szuka miejsca w jakie należy dodać nowy wpis aby zachować porządek chronologiczny
// następnie wywołuje odpowiednie metody listy w celu jego dodania

void reAddActual() 

// usuwa wpis wskazywany przez wskaźnik Lista::actual

 // tworzy nowy wpis na podstawie usuniętego i przekazuje go metodzie dodajWpis

void dodajWpis()

 // powoduje pobranie danych nowego wpisu i jego dodanie

bool przegladajWpisy() 

// wyświetla interfejs pozwalający na przeglądanie bazy i jej edycje
// zwraca true jeśli wyjście nastąpiło przy pomocy klawisza ESC i należy zapisać 
// listę, jeśli za pomocą klawisza q – nie zapisuj listy (false)

virtual char zapisz(const char *dbfname) 

// zapisuje listę do pliku (wirtualna gdyż wykorzystywana w destruktorze)

~Baza() 

// zapisuje listę do pliku (następnie usuwana lista)

// wykrywa przypadek niemożliwości zapisania pliku, pozwalając na podjęcie decyzji

class Menu // wyświetla menu główne (klasa jest mało uzyteczna)

private Baza* db

 // baza wpisów

Menu() 

// konstruktor domyślny – tworzy bazę

void wyswietl()

 // wyświetla menu główne

~Menu() 

// destruktor – usuwa bazę

Program został  stworzony dla systemu  Windows XP, kompiluje się  poprawnie w programie 

Dev – C++ . 


Document Outline