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
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;
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)
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++ .