// Jacek Szwaj, K1I3, projekt nr4 zadanie 5 , semestr 1
// Program do prowadzenia budzetow.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// +++++++++++++++++++++++++++++++++++++++++++++++++
#define NBUDZETOW 3
#define NMAX 5
#define NSTR 40
#define R_BUFOR 1024
char buff[R_BUFOR], c, k, szuk_kontrahent[NSTR]; // c i k = zmienna polecenia
int l_trans[NBUDZETOW*NMAX], ID = 0, szuk = 0, ilosc_budzetow = 0, l_wszystkich_t = 0;
double saldo[NBUDZETOW];
double szuk_kwota_min = 0.0, szuk_kwota_max = 0.0;
char kryt_data = 'n', kryt_kwota = 'n', kryt_kontrahent = 'n', nowy_budzet = 'n';
char sort_wgco = 'd', sort_metoda = 'r', szyfrowanie = 'n';
int sort_ile = 0, ost_ile = 0;
int nr_najstarszej_tr[NBUDZETOW];
char budzet[NBUDZETOW][NSTR];
int ktory_budzet = 0, z_budzet = -1;
FILE *plik, *splik;
// obsluga katalogoow +++++++++++++++++++++++++++++++++++++++++++++++++
char nazwa[40], nazwa2[40];
struct wezel_drzewa *root = NULL;
struct lista {
struct wezel_drzewa *wsk;
struct lista *next;
};
struct wezel_drzewa {
char katalog[40];
struct lista *pocz;
struct wezel_drzewa *nad_drzewo;
};
struct datka // struktura przechowujaca daty
{
int rok;
int miesiac;
int dzien;
};
struct transakcja // najwazniejsza struktura, zawierajaca transakcje
{
struct datka data;
double kwota;
char kontrahent[NSTR];
char opis[40*NSTR+1];
struct wezel_drzewa *katalog;
int nr_budzetu;
};
struct datka dat_min;
struct datka dat_max;
struct transakcja rekord[NMAX*NBUDZETOW]; // glowna tablica struktur transakcja
struct transakcja ost_wyszukane[NMAX]; // tablica przechowuje wyniki ostatniego wyszukiwania
struct transakcja *sorty[NMAX]; // tablica wskaznikow potrzebna do sortowania
// +++++++++++++++++++++++++++++++++++++++++++++++++
void edytuj_transakcje (char, int); // deklaruje funkcje edycji transakcji
void dostepne_budzety(); // deklaracja
void czysc_buff ();
void wczyt_do_buf(); // deklaracja
void sprawdz_dane(int, int); // deklaracja
void dodaj_katalog (struct wezel_drzewa *doktorego, struct wezel_drzewa *w_nazwa);
// +++++++++++++++++++++++++++++++++++++++++++++++++
void stworz_pierwszy_katalog () {
root = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));
strcpy(root->katalog, "transakcje");
root->pocz = NULL;
root->nad_drzewo = NULL;
}
struct wezel_drzewa * znajdz_wezel(struct wezel_drzewa *temp, char *nazwa){
struct lista *l_temp;
struct wezel_drzewa *wynik;
if(temp != NULL)
{
if(strcmp(temp->katalog, nazwa) == 0)
return temp;
l_temp = temp->pocz;
while(l_temp != NULL)
{
if((wynik = znajdz_wezel(l_temp->wsk, nazwa))!= NULL)
return wynik;
l_temp = l_temp->next;
}
}
return NULL;
}
void wypisz_drzewo_do_plik (struct wezel_drzewa *root) {
struct wezel_drzewa *aktualny;
struct lista *l_temp;
static int wciecie = 1;
int i = 0;
for(i = 0; i < wciecie; i++)
//fprintf(plik, "\t");
aktualny = root;
if(strcmp(aktualny->katalog, "transakcje") != 0)
fprintf(plik, "%s\t%s\n", aktualny->nad_drzewo->katalog, aktualny->katalog);
l_temp = root->pocz;
while(l_temp != NULL)
{
wciecie++;
wypisz_drzewo_do_plik(l_temp->wsk);
l_temp = l_temp->next;
wciecie--;
}
printf("\n");
}
void zapis_do_plik () {
char nazwa[NSTR];
int i;
printf("Podaj nazwe pliku do ktorego zapisac dane: "); wczyt_do_buf (); strcpy(nazwa, buff);
plik = fopen(nazwa, "w");
for(i = 0; i < NBUDZETOW; i++)
fprintf(plik, "%s\n", budzet[i]);
for(i = 0; i < l_wszystkich_t; i++)
fprintf(plik, "%d;%d;%d;%.2lf;%s;%s;%s;%d;\n", rekord[i].data.rok, rekord[i].data.miesiac, rekord[i].data.dzien, rekord[i].kwota, rekord[i].kontrahent, rekord[i].opis, rekord[i].katalog->katalog, rekord[i].nr_budzetu);
fprintf(plik, "\t\n");
wypisz_drzewo_do_plik(root);
printf("Dane zostaly zapisane.\n\n");
fclose(plik);
}
void zapis_szyfr_do_plik () {
char nazwa[NSTR], haslo[NSTR];
int i, znak;
FILE *tmp;
plik = fopen(".tmpek", "w+"); //zmiana z r+
printf("Podaj haslo do pliku, aby go zabezpieczyc: "); wczyt_do_buf (); strcpy(haslo, buff);
fprintf(plik, "*%s\n", haslo);
for(i = 0; i < NBUDZETOW; i++)
fprintf(plik, "%s\n", budzet[i]);
for(i = 0; i < l_wszystkich_t; i++)
fprintf(plik, "%d;%d;%d;%.2lf;%s;%s;%s;%d;\n", rekord[i].data.rok, rekord[i].data.miesiac, rekord[i].data.dzien, rekord[i].kwota, rekord[i].kontrahent, rekord[i].opis, rekord[i].katalog->katalog, rekord[i].nr_budzetu);
fprintf(plik, "\t\n");
wypisz_drzewo_do_plik(root);
printf("Podaj nazwe pliku do ktorego zapisac dane: "); wczyt_do_buf (); strcpy(nazwa, buff);
//tmp = plik;
tmp = fopen(nazwa, "w");
rewind(plik);
while( (znak = getc(plik)) != EOF )
putc(znak+1, tmp);
printf("Dane zostaly zapisane.\n\n");
fclose(plik);
fclose(tmp);
remove(".tmpek");
}
void odczyt_z_plik () {
char wiersz[4*NSTR], nad[4*NSTR], pod[4*NSTR];
int i,j = 0, licz = 0, znak, blad, kropka;
struct wezel_drzewa *cel, *kat;
for(i = 0; i < NBUDZETOW; i++) {
fgets(wiersz, 4*NSTR, plik); while(wiersz[j] != '\0') { if(wiersz[j] == '\n') wiersz[j] = '\0'; j++; } j = 0;
strcpy(budzet[i], wiersz);
if(strlen(budzet[i]) > 0) licz++;
//printf("budzet: %s\n", budzet[i]);
}
ilosc_budzetow = licz;
// budzety zostaly wczytane jusz w tym miejscu
licz = 0;
for(i = 0; i < (NBUDZETOW*NMAX); i++)
l_trans[i] = 0;
for(i = 0; i < (NBUDZETOW); i++)
saldo[i] = 0.0;
while((znak = getc(plik)) != '\t'){
ungetc(znak, plik);
while((znak = getc(plik)) != '\n'){
ungetc(znak, plik);
// ROK *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (rekord[licz].data.rok = atoi(buff)) > 2100) // rok max np 2100
{
printf("UWAGA!! Bledny rok %s! Odczyt przerwany! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
// MIESIAC *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
{
printf("UWAGA!! Bledny miesiac %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
// DZIEN *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
{
printf("UWAGA!! Bledny dzien %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
// KWOTA *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
blad = 0;
kropka = 0;
if(buff[j] != '\0' && blad == 0)
{
if(buff[j] == '.') // "zabawy z kropka" liczby zmiennoprzecinkowe
if(kropka == 0)
kropka = 1;
else if (kropka == 1)
blad = 1;
if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
{ j++; continue; }
if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
j++;
}
if(blad == 1)
{
printf("UWAGA!! Bledna kwota %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
rekord[licz].kwota = atof(buff);
// KONTRAHENT *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
strcpy(rekord[licz].kontrahent, buff);
// OPIS *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
strcpy(rekord[licz].opis, buff);
// KATALOG *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(!znajdz_wezel(root, buff)){
printf("UWAGA!! Bledny katalog %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
rekord[licz].katalog = znajdz_wezel(root, buff);
// NUMER BUDZETU *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(plik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(atoi(buff) >= NBUDZETOW || atoi(buff) < 0){
printf("UWAGA!! Bledny budzet %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
rekord[licz].nr_budzetu = atoi(buff);
l_trans[rekord[licz].nr_budzetu]++;
saldo[rekord[licz].nr_budzetu] = saldo[rekord[licz].nr_budzetu] + rekord[licz].kwota;
licz++;
l_wszystkich_t = licz;
}
}
// mamy wczytane transakcje teraz czas na strukture katalogoow
getc(plik);
root->pocz = NULL; // ciach
while(fscanf(plik, "%s%s", &nad, &pod) != EOF && znajdz_wezel(root, nad)) { //printf("\n\n%s i %s\n\n", nad, pod);
cel = znajdz_wezel(root, nad);
kat = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));
strcpy(kat->katalog, pod);
dodaj_katalog (cel, kat);
} //if(!znajdz_wezel(root, nad)) printf("Blad!! nie mozna utworzyc katalogu!\n\n");
}
void odczyt_szyfr_z_plik () {
char wiersz[4*NSTR], nad[4*NSTR], pod[4*NSTR], haslo[NSTR], pomhaslo[NSTR];
int i,j = 0, licz = 0, znak, blad, kropka;
struct wezel_drzewa *cel, *kat;
printf("Plik szyfrowany: Podaj haslo do pliku: "); wczyt_do_buf (); strcpy(haslo, buff);
splik = fopen(".tmpek", "w");
// tmp = fopen(".tmpek2", "w+");
rewind(plik);
; while( (znak = getc(plik)) != EOF )
putc(znak-1, splik);
fclose(splik);
splik = fopen(".tmpek", "r");
fgets(wiersz, NSTR, splik);
pomhaslo[0] = '*';pomhaslo[1] = '\0';
strcat(pomhaslo, haslo); strcat(pomhaslo, "\n");// printf("%s i %s", wiersz, pomhaslo);
if(strcmp(wiersz, pomhaslo) != 0){printf("\n\nZle haslo! \n\n"); return;}
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
//printf("teste\nteste\nteste\nteste\n");
for(i = 0; i < NBUDZETOW; i++) {
fgets(wiersz, 4*NSTR, splik); while(wiersz[j] != '\0') { if(wiersz[j] == '\n') wiersz[j] = '\0'; j++; } j = 0;
strcpy(budzet[i], wiersz);
if(strlen(budzet[i]) > 0) licz++;
//printf("budzet: %s\n", budzet[i]);
}
//
ilosc_budzetow = licz;
// budzety zostaly wczytane jusz w tym miejscu
licz = 0;
for(i = 0; i < (NBUDZETOW*NMAX); i++)
l_trans[i] = 0;
for(i = 0; i < (NBUDZETOW); i++)
saldo[i] = 0.0;
while((znak = getc(splik)) != '\t'){
ungetc(znak, splik);
while((znak = getc(splik)) != '\n'){
ungetc(znak, splik);
// ROK *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (rekord[licz].data.rok = atoi(buff)) > 2100) // rok max np 2100
{
printf("UWAGA!! Bledny rok %s! Odczyt przerwany! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
// MIESIAC *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
{
printf("UWAGA!! Bledny miesiac %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
// DZIEN *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
{
printf("UWAGA!! Bledny dzien %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
// KWOTA *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
blad = 0;
kropka = 0;
if(buff[j] != '\0' && blad == 0)
{
if(buff[j] == '.') // "zabawy z kropka" liczby zmiennoprzecinkowe
if(kropka == 0)
kropka = 1;
else if (kropka == 1)
blad = 1;
if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
{ j++; continue; }
if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
j++;
}
if(blad == 1)
{
printf("UWAGA!! Bledna kwota %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
rekord[licz].kwota = atof(buff);
// KONTRAHENT *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
strcpy(rekord[licz].kontrahent, buff);
// OPIS *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
strcpy(rekord[licz].opis, buff);
// KATALOG *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(!znajdz_wezel(root, buff)){
printf("UWAGA!! Bledny katalog %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
rekord[licz].katalog = znajdz_wezel(root, buff);
// NUMER BUDZETU *****************************************************************************************************
i = 0; czysc_buff ();
while((znak = getc(splik)) != ';'){
buff[i] = znak;
i++;
}
buff[i+1] = '\0';
if(atoi(buff) >= NBUDZETOW || atoi(buff) < 0){
printf("UWAGA!! Bledny budzet %s! Wiersz transakcji nr %i. \n", buff, licz);
return;
}
rekord[licz].nr_budzetu = atoi(buff);
l_trans[rekord[licz].nr_budzetu]++;
saldo[rekord[licz].nr_budzetu] = saldo[rekord[licz].nr_budzetu] + rekord[licz].kwota;
licz++;
l_wszystkich_t = licz;
}
}
// mamy wczytane transakcje teraz czas na strukture katalogoow
getc(splik);
root->pocz = NULL; // ciach
while(fscanf(splik, "%s%s", &nad, &pod) != EOF && znajdz_wezel(root, nad)) { //printf("\n\n%s i %s\n\n", nad, pod);
cel = znajdz_wezel(root, nad);
kat = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));
strcpy(kat->katalog, pod);
dodaj_katalog (cel, kat);
} //if(!znajdz_wezel(root, nad)) printf("Blad!! nie mozna utworzyc katalogu!\n\n");
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
fclose(splik);
// fclose(tmp);
remove(".tmpek");
}
void odczyt_z_plik_form () {
char nazwa[NSTR];
int i, znak;
printf("Podaj nazwe pliku z ktorego odczytac dane: "); wczyt_do_buf (); strcpy(nazwa, buff);
if( (plik = fopen(nazwa, "r")) == NULL ) {
printf("\n\nNie moge odworzyc pliku %s ! \n\n", nazwa);
return;
}
//printf("KONTROLLLLLAAA X");
if((znak = getc(plik)) == '+')
{
ungetc(znak, plik);
odczyt_szyfr_z_plik (); // poprawic dodac rozpoznawanie pliku szyf i nie
}
else {
ungetc(znak, plik);
odczyt_z_plik ();
}
fclose(plik);
}
void przychody_rozchody_katalogi(struct wezel_drzewa *dany_katalog) {
int i;
double przychody = 0.0, odchody = 0.0;
for(i = 0; i < l_wszystkich_t; i++)
if(rekord[i].katalog == dany_katalog)
{
if(rekord[i].kwota > 0.0)
przychody += rekord[i].kwota;
else
odchody += rekord[i].kwota;
}
printf("p: %.2lf, r: %.2lf", przychody, odchody);
}
int czy_mbudzetowa (int nr_tr) { // funkcja dostaje numer transakcji i zwraca 1 lub -1 jest transakcja jest miedzybudzetowa i 0 jesli nie jest
if(nr_tr > 0)
if((rekord[nr_tr].nr_budzetu == ktory_budzet || rekord[nr_tr-1].nr_budzetu == ktory_budzet) && rekord[nr_tr].data.rok == rekord[nr_tr-1].data.rok && rekord[nr_tr].data.miesiac == rekord[nr_tr-1].data.miesiac && rekord[nr_tr].data.dzien == rekord[nr_tr-1].data.dzien && rekord[nr_tr].katalog == rekord[nr_tr-1].katalog && rekord[nr_tr].kwota == -rekord[nr_tr-1].kwota && !strcmp(rekord[nr_tr].kontrahent, rekord[nr_tr-1].kontrahent) && !strcmp(rekord[nr_tr].opis, rekord[nr_tr-1].opis))
return -1;
if(nr_tr < l_wszystkich_t-1)
if((rekord[nr_tr].nr_budzetu == ktory_budzet || rekord[nr_tr+1].nr_budzetu == ktory_budzet) && rekord[nr_tr].data.rok == rekord[nr_tr+1].data.rok && rekord[nr_tr].data.miesiac == rekord[nr_tr+1].data.miesiac && rekord[nr_tr].data.dzien == rekord[nr_tr+1].data.dzien && rekord[nr_tr].katalog == rekord[nr_tr+1].katalog && rekord[nr_tr].kwota == -rekord[nr_tr+1].kwota && !strcmp(rekord[nr_tr].kontrahent, rekord[nr_tr+1].kontrahent) && !strcmp(rekord[nr_tr].opis, rekord[nr_tr+1].opis))
return 1;
return 0;
}
void przychody_rozchody_mtransakcje() {
int i;
double przychody = 0.0, odchody = 0.0;
for(i = 1; i <= l_wszystkich_t; i++)
{
if((rekord[i].nr_budzetu == ktory_budzet || rekord[i-1].nr_budzetu == ktory_budzet) && rekord[i].data.rok == rekord[i-1].data.rok && rekord[i].data.miesiac == rekord[i-1].data.miesiac && rekord[i].data.dzien == rekord[i-1].data.dzien && rekord[i].katalog == rekord[i-1].katalog && rekord[i].kwota == -rekord[i-1].kwota && !strcmp(rekord[i].kontrahent, rekord[i-1].kontrahent) && !strcmp(rekord[i].opis, rekord[i-1].opis))
{
if(rekord[i].nr_budzetu == ktory_budzet)
{
if(rekord[i].kwota <= 0.0)
odchody += rekord[i].kwota;
else
przychody += rekord[i].kwota;
}
else
{
if(rekord[i-1].kwota <= 0.0)
odchody += rekord[i-1].kwota;
else
przychody += rekord[i-1].kwota;
}
}
//printf("\n\nliczba transakcji - %i\n\n", l_wszystkich_t);
//printf("%i | %i\n", rekord[i-1].nr_budzetu, rekord[i].nr_budzetu);
//printf("%i/%i/%i | %i/%i/%i\n", rekord[i-1].data.rok, rekord[i-1].data.miesiac, rekord[i-1].data.dzien, rekord[i].data.rok, //rekord[i].data.miesiac, rekord[i].data.dzien);
//printf("%s | %s\n", rekord[i-1].katalog->katalog, rekord[i].katalog->katalog);
//printf("%.2lf | %.2lf\n", rekord[i-1].kwota, -rekord[i].kwota);
//printf("%s | %s\n", rekord[i-1].kontrahent, rekord[i].kontrahent);
//printf("%s | %s\n", rekord[i-1].opis, rekord[i].opis);
}
printf("\n\nBilans z innymi budzetami przychody: %.2lf, rozchody: %.2lf\n\n", przychody, odchody);
}
void wypisz_drzewo (struct wezel_drzewa *root) {
struct wezel_drzewa *aktualny;
struct lista *l_temp;
static int wciecie = 1;
int i = 0;
for(i = 0; i < wciecie; i++)
printf("---");
aktualny = root;
printf("/%s ", aktualny->katalog); przychody_rozchody_katalogi(znajdz_wezel(root, aktualny->katalog)); printf("\n");
l_temp = root->pocz;
while(l_temp != NULL)
{
wciecie++;
wypisz_drzewo(l_temp->wsk);
l_temp = l_temp->next;
wciecie--;
}
}
void dodaj_element_listy (struct lista **root, struct wezel_drzewa *wsk) {
struct lista *temp;
struct lista *temp2;
int i = 0;
temp = (struct lista *)malloc(sizeof(struct lista));
temp->next = NULL;
temp->wsk = wsk;
if(*root == NULL)
*root = temp;
else
{
temp2 = *root;
while(temp2->next != NULL)
temp2 = temp2->next;
temp2->next = temp;
}
}
void dodaj_katalog (struct wezel_drzewa *doktorego, struct wezel_drzewa *w_nazwa) {
struct wezel_drzewa *wsk_znal, *temp;
int licz = 1;
char temp_str2[NSTR];
if(doktorego == NULL)
{
printf("Podaj nazwe wezla, do ktorego mamy wstawic element: "); wczyt_do_buf (); sprawdz_dane(32, -1); //scanf("%s", nazwa);
strcpy(nazwa, buff);
wsk_znal = znajdz_wezel(root, nazwa);
}
else
{
wsk_znal = doktorego;
}
if(wsk_znal != NULL)
{
temp = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));
if(w_nazwa == NULL)
{
printf("Podaj nazwe nowego katalogu: "); wczyt_do_buf (); sprawdz_dane(31, -1); //scanf("%s", nazwa2);
strcpy(nazwa2, buff);
}
else
{
strcpy(temp_str2, w_nazwa->katalog);
while(znajdz_wezel(root, temp_str2) != NULL)
{
// sprintf(temp_str, "*", licz);
strcat(temp_str2, "*");
licz++;
}
strcpy(nazwa2, temp_str2);
}
strcpy(temp->katalog, nazwa2);
temp->pocz = NULL;
temp->nad_drzewo = wsk_znal;
dodaj_element_listy(&wsk_znal->pocz, temp);
//wypisz_drzewo(root);
}
}
void zmiana_nazwy_katalogu ()
{
struct wezel_drzewa *wsk_znal;
//while(wsk_znal == NULL)
printf("Podaj nazwe katalogu do zmiany: "); wczyt_do_buf (); sprawdz_dane(32, -1); strcpy(nazwa, buff);// scanf("%s", nazwa);
wsk_znal = znajdz_wezel(root, nazwa);
printf("Podaj nowa nazwe katalogu: "); wczyt_do_buf (); sprawdz_dane(31, -1); strcpy(nazwa, buff);// scanf("%s", nazwa);
strcpy(wsk_znal->katalog, nazwa);
}
int usun_katalog()
{
struct wezel_drzewa *wsk_znal, *nad_wsk_znal, *d_temp;
struct lista *temp;
//while(wsk_znal == NULL)
printf("Podaj nazwê katalogu do usuniecia: "); wczyt_do_buf (); sprawdz_dane(32, -1); strcpy(nazwa, buff); //scanf("%s", nazwa);
wsk_znal = znajdz_wezel(root, nazwa);
nad_wsk_znal = wsk_znal->nad_drzewo;
if(nad_wsk_znal == NULL)
{
printf("Nie mozna usunac glownego katalogu!\n");
return 0;
}
temp = nad_wsk_znal->pocz;
while(temp->next != NULL)
temp = temp->next;
temp->next = wsk_znal->pocz;
temp = nad_wsk_znal->pocz;
if(strcmp(nad_wsk_znal->pocz->wsk->katalog, nazwa) == 0)
nad_wsk_znal->pocz = nad_wsk_znal->pocz->next;
else {
while(1)
{
if(strcmp(temp->next->wsk->katalog, nazwa) == 0)
{ temp->next = temp->next->next; break; }
else
temp = temp->next;
}
}
free(wsk_znal);
}
void katalog_przenies (){
struct wezel_drzewa *wsk_znal, *nad_wsk_znal, *wsk_znal2, *nad_wsk_znal2;
struct lista *temp, *temp2, *pom;
printf("Podaj nazwe katalogu do przeniesienia: "); wczyt_do_buf (); sprawdz_dane(32, -1); strcpy(nazwa, buff); // scanf("%s", nazwa);
printf("Podaj nazwe katalogu do którego podczepic katalog: "); wczyt_do_buf (); sprawdz_dane(32, -1); strcpy(nazwa2, buff); //scanf("%s", nazwa2);
if(strcmp(root->katalog, nazwa) == 0) {
printf("\n\nNie mozna przeniesc drzewa z korzeniem!;] \n\n"); return;
}
wsk_znal = znajdz_wezel(root, nazwa);
nad_wsk_znal = wsk_znal->nad_drzewo;
temp = nad_wsk_znal->pocz;
if(znajdz_wezel(wsk_znal, nazwa2)) {
printf("\n\nNie mozna przeniesc katalogu nadrzednego do podrzednego! \n\n"); return;
}
if(strcmp(temp->wsk->katalog, nazwa) == 0)
{
nad_wsk_znal->pocz = nad_wsk_znal->pocz->next;
temp->next = NULL;
}
else
{
while(strcmp(temp->next->wsk->katalog, nazwa) != 0)
temp = temp->next;
pom = temp;
temp = temp->next;
pom->next = pom->next->next;
temp->next = NULL;
}
wsk_znal2 = znajdz_wezel(root, nazwa2);
if(wsk_znal2->pocz == NULL)
wsk_znal2->pocz = temp;
else
{
temp2 = wsk_znal2->pocz;
while(temp2->next != NULL)
temp2 = temp2->next;
temp2->next = temp;
}
wsk_znal->nad_drzewo = wsk_znal2;
}
void tworz_kopie_drzewo (struct wezel_drzewa *kopiowany, struct wezel_drzewa *cel) {
struct lista *l_temp, *pom;
dodaj_katalog (cel, kopiowany);
l_temp = kopiowany->pocz;
pom = cel->pocz;
while(l_temp != NULL)
{
tworz_kopie_drzewo(l_temp->wsk, pom->wsk);
l_temp = l_temp->next;
}
}
void katalog_kopiuj () {
struct wezel_drzewa *wsk_znal, *nad_wsk_znal, *wsk_znal2, *nad_wsk_znal2;
struct lista *temp, *temp2, *pom;
printf("Podaj nazwe katalogu do skopiowania: "); wczyt_do_buf (); sprawdz_dane(32, -1); strcpy(nazwa, buff);//scanf("%s", nazwa);
printf("Podaj nazwe katalogu do którego skopiowac katalog: "); wczyt_do_buf (); sprawdz_dane(32, -1); strcpy(nazwa2, buff);//scanf("%s", nazwa2);
wsk_znal = znajdz_wezel(root, nazwa);
nad_wsk_znal = wsk_znal->nad_drzewo;
wsk_znal2 = znajdz_wezel(root, nazwa2);
tworz_kopie_drzewo (wsk_znal, wsk_znal2);
}
// +++++++++++++++++++++++++++++++++++++++++++++++++
void czysc_buff (){ // funkcja wykonuje czysczenie bufora [tablicy buff]
int i;
for(i = 0; i < R_BUFOR; i++)
buff[i] = '\0';
}
// +++++++++++++++++++++++++++++++++++++++++++++++++
int czy_rowne (char s1[NSTR], char s2[NSTR]){ // funkcja sprawdza czy dwa stringi [tablice znakowe] sa rowne
int odp = 0, i = 0;
while(s1[i] == s2[i] && (s1[i] != '\0' || s2[i] != '\0')) {i++; odp = 1;}
if(s1[i] != s2[i]) odp = 0;
return odp;
}
//++++++++++++++++++++++++++++++++++++++++++++++++
int porownaj_r (char s1[100], char s2[100]) // funkcja porownuje stringi
{
int i = 0;
while(s1[i] == s2[i] && (s1[i] != '\0' || s2[i] != '\0')) i++;
if(s1[i] > s2[i]) // < wyrazy rosnaco
return 0;
else
return 1;
}
//++++++++++++++++++++++++++++++++++++++++++++++++
int porownaj_m (char s1[100], char s2[100]) // funkcja porownuje stringi
{
int i = 0;
while(s1[i] == s2[i] && (s1[i] != '\0' || s2[i] != '\0')) i++;
if(s1[i] < s2[i]) // < wyrazy malejaco
return 0;
else
return 1;
}
//++++++++++++++++++++++++++++++++++++++++++++++++
void wczyt_do_buf () // wczytywanie danych do bufora, niezwykle przydatna funkcja
{
char znak;
int i = 0;
czysc_buff ();
while((znak = getchar()) != '\n' && znak != EOF)
{
if(i < R_BUFOR-1){
buff[i] = znak;
i++;
}
else if(i == R_BUFOR - 1) {
buff[R_BUFOR-1] = '\0';
}
}
// fflush(stdin);
}
void sprawdz_dane (int opcja, int numer_t) // f. sprawdzajaca poprawnosc wprowadzonych danych
{
int i = 0, j = 0, nr = 0;
_Bool blad, kropka;
if(opcja == 1){ // wczytujemy rok
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (rekord[numer_t].data.rok = atoi(buff)) > 2100) // rok max np 2100
{
printf("Bledny rok %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 2){ //wczytujemy miech
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (rekord[numer_t].data.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
{
printf("Bledny miesiac %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 3){ //wczytujemy dzien
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (rekord[numer_t].data.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
{
printf("Bledny dzien %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 4){ //wczytujemy kwote
blad = 0;
kropka = 0;
while(buff[j] != '\0' && blad == 0)
{
if(buff[j] == '.') // "zabawy z kropka" liczby zmiennoprzecinkowe
if(kropka == 0)
kropka = 1;
else if (kropka == 1)
blad = 1;
if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
{ j++; continue; }
if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
j++;
}
if(blad == 1)
{
printf("Bledna kwota %s! Podaj poprawna: ", buff);
wczyt_do_buf ();
}
rekord[numer_t].kwota = atof(buff);
}
if(opcja == 5) { // wprowadzamy kontrahenta
while(buff[nr] != '\0'){
rekord[numer_t].kontrahent[nr] = buff[nr];
nr++;
}
nr = 0;
}
if(opcja == 6) { // wprowadzamy opis
while(buff[nr] != '\0'){
rekord[numer_t].opis[nr] = buff[nr];
nr++;
}
nr = 0;
}
if(opcja == 7) { // wprowadzamy numer transakcji do edycjii
while(((ID = atoi(buff)) == 0) || atoi(buff) < 0 || atoi(buff) > l_wszystkich_t || rekord[ID-1].nr_budzetu != ktory_budzet){
printf("Bledny numer ID transakcji! Podaj poprawny: ");
wczyt_do_buf ();
}
}
if(opcja == 8) { // sprawdzamy polecanie
while(buff[0] < 'a' || buff[0] > 'z' || buff[1] != '\0'){
printf("Bledne polecenie! Podaj poprawne: ");
wczyt_do_buf ();
}
c = buff[0];
}
if(opcja == 9){ // wczytujemy rok dat min
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (dat_min.rok = atoi(buff)) > 2100) // rok max np 2100
{
printf("Bledny rok %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 10){ //wczytujemy miech dat min
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_min.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
{
printf("Bledny miesiac %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 11){ //wczytujemy dzien dat min
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_min.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
{
printf("Bledny dzien %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 12){ // wczytujemy rok dat max
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (dat_max.rok = atoi(buff)) > 2100) // rok max np 2100
{
printf("Bledny rok %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 13){ //wczytujemy miech dat max
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_max.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
{
printf("Bledny miesiac %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 14){ //wczytujemy dzien dat max
while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_max.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
{
printf("Bledny dzien %s! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
}
if(opcja == 15){ //wczytujemy kwote min
blad = 0;
kropka = 0;
while(buff[j] != '\0' && blad == 0)
{
if(buff[j] == '.') // "zabawy z kropka" liczby zmiennoprzecinkowe
if(kropka == 0)
kropka = 1;
else if (kropka == 1)
blad = 1;
if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
{ j++; continue; }
if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
j++;
}
if(blad == 1)
{
printf("Bledna kwota %s! Podaj poprawna: ", buff);
wczyt_do_buf ();
}
szuk_kwota_min = atof(buff);
}
if(opcja == 16){ //wczytujemy kwote max
blad = 0;
kropka = 0;
while(buff[j] != '\0' && blad == 0)
{
if(buff[j] == '.') // "zabawy z kropka" liczby zmiennoprzecinkowe
if(kropka == 0)
kropka = 1;
else if (kropka == 1)
blad = 1;
if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
{ j++; continue; }
if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
j++;
}
if(blad == 1)
{
printf("Bledna kwota %s! Podaj poprawna: ", buff);
wczyt_do_buf ();
}
szuk_kwota_max = atof(buff);
}
if(opcja == 17) { // wprowadzamy kontrahenta
while(buff[nr] != '\0'){
szuk_kontrahent[nr] = buff[nr];
nr++;
}
nr = 0;
}
if(opcja == 18) { // czy z data
while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
printf("Bledne polecenie %s! Podaj poprawne: ", buff);
wczyt_do_buf ();
}
kryt_data = buff[0];
}
if(opcja == 19) { // czy z kwota
while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
printf("Bledne polecenie %s! Podaj poprawne: ", buff);
wczyt_do_buf ();
}
kryt_kwota = buff[0];
}
if(opcja == 20) { // czy z kontrahent
while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
printf("Bledne polecenie %s! Podaj poprawne: ", buff);
wczyt_do_buf ();
}
kryt_kontrahent = buff[0];
}
if(opcja == 21) { // sort
while((buff[0] != 'd' && buff[0] != 'k' && buff[0] != 'c') || buff[1] != '\0'){
printf("Bledne polecenie %s! Podaj poprawne: ", buff);
wczyt_do_buf ();
}
sort_wgco = buff[0];
}
if(opcja == 22) { // sort metoda
while((buff[0] != 'r' && buff[0] != 'm') || buff[1] != '\0'){
printf("Bledne polecenie %s! Podaj poprawne: ", buff);
wczyt_do_buf ();
}
sort_metoda = buff[0];
}
if(opcja == 23) { // sprawdzamy liczbe wyswietlanych transakcji po sortowaniu
while(((sort_ile = atoi(buff)) == 0) || atoi(buff) < 0 || atoi(buff) > l_trans[ktory_budzet]){
printf("Bledna liczba transakcji do wyswietlenia! Podaj poprawna: ");
wczyt_do_buf ();
}
}
if(opcja == 24) { // sprawdzamy liczbe wyswietlanych transakcji po sortowaniu
while(((ost_ile = atoi(buff)) == 0) || atoi(buff) < 0 || atoi(buff) > szuk){
printf("Bledna liczba transakcji do wyswietlenia! Podaj poprawna: ");
wczyt_do_buf ();
}
}
if(opcja == 25) { // sprawdzanie poprawnosci nazwy nowego budzetu
while(buff[nr] != '\0' && nr < NSTR-1){
budzet[ilosc_budzetow][nr] = buff[nr];
nr++;
}
nr = 0;
czysc_buff (); // czyscimy buff-a
}
if(opcja == 26) { // sprawdzanie poprawnosci wyboru budzetu
while(atoi(buff) < 1 || atoi(buff) >= ilosc_budzetow+1)
{
printf("Bledny [%s] numer! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
ktory_budzet = atoi(buff)-1;// printf("ktory: %d \n\n\n\n", ktory_budzet);
}
if(opcja == 27) { // czy z kontrahent
while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
printf("Bledne polecenie %s! Podaj poprawne: ", buff);
wczyt_do_buf ();
}
nowy_budzet = buff[0];
}
if(opcja == 28) { // sprawdzanie poprawnosci wyboru budzetu
while(atoi(buff) < 1 || atoi(buff) >= ilosc_budzetow+1 || (atoi(buff)-1) == ktory_budzet)
{
printf("Bledny [%s] numer! Podaj poprawny: ", buff);
wczyt_do_buf ();
}
z_budzet = atoi(buff)-1;// printf("ktory: %d \n\n\n\n", ktory_budzet);
}
if(opcja == 29) { // sprawdzamy polecanie
while(buff[0] < 'a' || buff[0] > 'z' || buff[1] != '\0'){
printf("Bledne polecenie! Podaj poprawne: ");
wczyt_do_buf ();
}
k = buff[0];
}
if(opcja == 30) { // sprawdzamy poprawnosc nazwy katalogu
while(!znajdz_wezel(root, buff)){
printf("Nie ma takiego katalogu! Wybierz inny: ");
wczyt_do_buf ();
}
rekord[numer_t].katalog = znajdz_wezel(root, buff);
}
if(opcja == 31) { // sprawdzamy poprawnosc nazwy katalogu
while(znajdz_wezel(root, buff)){
printf("Taki katalog juz istanieje! Wpisz inna nazwe: ");
wczyt_do_buf ();
}
}
if(opcja == 32) { // sprawdzamy poprawnosc nazwy katalogu
while(!znajdz_wezel(root, buff)){
printf("Taki katalog nie istanieje! Wpisz inna nazwe: ");
wczyt_do_buf ();
}
}
if(opcja == 33) { // czy z szyfrowanie
while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
printf("Bledne polecenie %s! Podaj poprawne: ", buff);
wczyt_do_buf ();
}
szyfrowanie = buff[0];
}
}
// ++++++++++++++++++++++++++++++++++++++++++++++++
int dodaj_transakcje (char m) // funkcja dodajaca transakcje
{
// char tab[40*NSTR+1], pom[255];
// char c;
int i = 0, li_str = 0;
if(l_trans[ktory_budzet] == NMAX)
{
edytuj_transakcje ('m', nr_najstarszej_tr[ktory_budzet]);
nr_najstarszej_tr[ktory_budzet]++;
nr_najstarszej_tr[ktory_budzet] = nr_najstarszej_tr[ktory_budzet] % NMAX;
}
else
{
// getchar();
printf("Uzupelnij dane: \n");
if(m == 'm')
{
for(i = 1; i <= ilosc_budzetow; i++)
printf("%d. %s\n", i, budzet[i-1]);
printf("\nWpisz numer budzetu z ktorym chcesz przeprowadzic transakcje: "); wczyt_do_buf (); sprawdz_dane(28, -1);
}
printf(" Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (1, l_wszystkich_t);
printf(" Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (2, l_wszystkich_t);
printf(" Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (3, l_wszystkich_t);
printf("- kwota transakcji: "); wczyt_do_buf (); sprawdz_dane (4, l_wszystkich_t);
printf("- kontrahent: "); wczyt_do_buf (); sprawdz_dane (5, l_wszystkich_t);
printf("- opis: "); wczyt_do_buf (); sprawdz_dane (6, l_wszystkich_t);
wypisz_drzewo(root);
printf("\n- wybierz nazwe katalogu: "); wczyt_do_buf (); sprawdz_dane (30, l_wszystkich_t);
rekord[l_wszystkich_t].nr_budzetu = ktory_budzet; // transakcja dodawana jest do obeznego budzetu
printf("\nTransakcja przyjeta :) \n\n");
saldo[ktory_budzet] = saldo[ktory_budzet] + rekord[l_wszystkich_t].kwota;
l_trans[ktory_budzet]++;
l_wszystkich_t++;
if(m == 'm')
{ if(l_trans[z_budzet] == NMAX) return 1;
rekord[l_wszystkich_t].data.rok = rekord[l_wszystkich_t-1].data.rok;
rekord[l_wszystkich_t].data.miesiac = rekord[l_wszystkich_t-1].data.miesiac;
rekord[l_wszystkich_t].data.dzien = rekord[l_wszystkich_t-1].data.dzien;
rekord[l_wszystkich_t].kwota = -rekord[l_wszystkich_t-1].kwota;
while(rekord[l_wszystkich_t-1].kontrahent[li_str] != '\0') { rekord[l_wszystkich_t].kontrahent[li_str] = rekord[l_wszystkich_t-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[l_wszystkich_t-1].opis[li_str] != '\0') { rekord[l_wszystkich_t].opis[li_str] = rekord[l_wszystkich_t-1].opis[li_str]; li_str++;} li_str = 0;
rekord[l_wszystkich_t].katalog = rekord[l_wszystkich_t-1].katalog;
rekord[l_wszystkich_t].nr_budzetu = z_budzet;
saldo[z_budzet] = saldo[z_budzet] + rekord[l_wszystkich_t].kwota; //taprintf("kwota odj: %lf i %lf\n\n", rekord[l_wszystkich_t].kwota, rekord[l_wszystkich_t-1].kwota);
l_trans[z_budzet]++;
l_wszystkich_t++;
z_budzet = -1;
}
}
return 1;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void posortowane_pokaz (int n) // funkcja wyswietla wynik sortowania
{
int i;
printf("\nWynik sortowania: \n");
printf(" ID || data || kwota || kontrahent || katalog || opis\n");
printf("--------------------------------------------------------\n");
for(i = 1; i <= n; i++){
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %15s || %10s\n", i, sorty[i-1]->data.rok, sorty[i-1]->data.miesiac, sorty[i-1]->data.dzien, sorty[i-1]->kwota, sorty[i-1]->kontrahent, sorty[i-1]->katalog->katalog, sorty[i-1]->opis);
}
printf("--------------------------------------------------------\n");
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void sortuj_transakcje (char wg_danych, char metoda) // wg_danych: d - daty, k - kwoty, c - kontrahent | metoda: r - rosnaco, m - malejaco
{
int i = 0, j = 0;
struct transakcja *tmp;
for(i = 0; i < l_wszystkich_t; i++)
{
sorty[i] = &rekord[i];
// printf("Tablica: %i, Sorty: %i \n", rekord[i].data.rok, sorty[i]->data.rok);
}
if(wg_danych == 'd')
{
if(metoda == 'r')
{
for(i = 0; i < l_wszystkich_t; i++)
{
for(j = 1; j < l_wszystkich_t; j++)
{
// printf("j: %d; j-1:%d ", sorty[j]->nr_budzetu, sorty[j-1]->nr_budzetu);
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
{
if(sorty[j]->data.rok < sorty[j-1]->data.rok)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
if(sorty[j]->data.rok == sorty[j-1]->data.rok)
{
if(sorty[j]->data.miesiac < sorty[j-1]->data.miesiac)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
if(sorty[j]->data.miesiac == sorty[j-1]->data.miesiac)
{
if(sorty[j]->data.dzien < sorty[j-1]->data.dzien)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
}
//printf("pierwszy\n");
}
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
// printf("drugi\n");
}
}
}
posortowane_pokaz (sort_ile);
}
if(metoda == 'm')
{
for(i = 0; i < l_wszystkich_t; i++)
{
for(j = 1; j < l_wszystkich_t; j++)
{
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
{
if(sorty[j]->data.rok > sorty[j-1]->data.rok)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
if(sorty[j]->data.rok == sorty[j-1]->data.rok)
{
if(sorty[j]->data.miesiac > sorty[j-1]->data.miesiac)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
if(sorty[j]->data.miesiac == sorty[j-1]->data.miesiac)
{
if(sorty[j]->data.dzien > sorty[j-1]->data.dzien)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
}
}
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
}
posortowane_pokaz (sort_ile);
}
}
if(wg_danych == 'k')
{
if(metoda == 'r')
{
for(i = 0; i < l_wszystkich_t; i++)
{
for(j = 1; j < l_wszystkich_t; j++)
{
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
{
if(sorty[j]->kwota < sorty[j-1]->kwota)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
}
posortowane_pokaz (sort_ile);
}
if(metoda == 'm')
{
for(i = 0; i < l_wszystkich_t; i++)
{
for(j = 1; j < l_wszystkich_t; j++)
{
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
{
if(sorty[j]->kwota > sorty[j-1]->kwota)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
}
posortowane_pokaz (sort_ile);
}
}
if(wg_danych == 'c')
{
if(metoda == 'r')
{
for(i = 0; i < l_wszystkich_t; i++)
{
for(j = 1; j < l_wszystkich_t; j++)
{
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
{
if(porownaj_r(sorty[j]->kontrahent, sorty[j-1]->kontrahent))
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
}
posortowane_pokaz (sort_ile);
}
if(metoda == 'm')
{
for(i = 0; i < l_wszystkich_t; i++)
{
for(j = 1; j < l_wszystkich_t; j++)
{
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
{
if(porownaj_m(sorty[j]->kontrahent, sorty[j-1]->kontrahent))
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
{
tmp = sorty[j];
sorty[j] = sorty[j-1];
sorty[j-1] = tmp;
}
}
}
posortowane_pokaz (sort_ile);
}
}
}
// +++++++++++++++++++++++++++++++++++++++++++++++
int sortuj_formularz () // wprowadzamy parametry sortowania
{
if(l_trans[ktory_budzet] == 0){ printf("Brak transakcji do sortowania\n\n"); return 1;}
printf("Wedlug jakich danych chcesz sortowac? [d - daty, k - kwoty, c - kontrahenta]: "); wczyt_do_buf (); sprawdz_dane (21, -1);
printf("Rosnaco czy malejaco? [r - rosnaco, m - malejaco]: "); wczyt_do_buf (); sprawdz_dane (22, -1);
printf("Ile pierwszych transakcji wyswietlic?: "); wczyt_do_buf (); sprawdz_dane (23, -1);
sortuj_transakcje (sort_wgco, sort_metoda);
return 1;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void wyswietl_transakcje () // wyswietlamy transakcje aktualnie przechowywane w programie
{
int li = 1, sumat = 0;
//for(li = 0; li <= (NBUDZETOW*NMAX); li++)
// sumat += l_trans[li]; //printf("sumat: %d \n\n\n\n", sumat);
//printf("ktory_budzet: %d \n\n\n\n", ktory_budzet);
printf("\nProgram przechowuje nastepujace transakcje: \n");
printf(" ID || data || kwota || kontrahent || katalog || opis\n");
printf("--------------------------------------------------------\n");
for(li = 1; li <= l_wszystkich_t; li++){
if(rekord[li-1].nr_budzetu == ktory_budzet && rekord[li-1].data.rok != 0)
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].katalog->katalog, rekord[li-1].opis/*, rekord[li-1].nr_budzetu*/);
}
// getchar();
printf("--------------------------------------------------------\n");
}
// +++++++++++++++++++++++++++++++++++++++++++++++
int data_porownaj (int r1, int m1, int d1, int r2, int m2, int d2) // funkcja porownujaca dwie daty
{
int data1 = 0, data2 = 0;
data1 = d1+31*m1+12*31*r1;
data2 = d2+31*m2+12*31*r2;
if(data1 > data2)
return 1;
else
return 0;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void szukaj_transakcje () // funkcja wyszukujaca transakcje
{
int li = 0, li_str = 0;
double zmiana_salda = 0.0;
// getchar();
szuk = 0;
printf("\nCzy szukac wg daty? [t lub n]: "); wczyt_do_buf (); sprawdz_dane (18, -1);
printf("Czy szukac wg kwoty? [t lub n]: "); wczyt_do_buf (); sprawdz_dane (19, -1);
printf("Czy szukac wg kontrahenta? [t lub n]: "); wczyt_do_buf (); sprawdz_dane (20, -1);
printf("\nWpisz kryteria wyszukiwania: \n");
if(kryt_data == 't'){
printf("- data poczatkowa: \n");
printf(" Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (9, -1);
printf(" Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (10, -1);
printf(" Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (11, -1);
printf("- data koncowa: \n");
printf(" Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (12, -1);
printf(" Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (13, -1);
printf(" Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (14, -1);
}
if(kryt_kwota == 't'){
printf("- minimalna kwota transakcji: "); wczyt_do_buf (); sprawdz_dane (15, -1);
printf("- maksymalna kwota transakcji: "); wczyt_do_buf (); sprawdz_dane (16, -1);
}
if(kryt_kontrahent == 't'){
printf("- kontrahent: "); wczyt_do_buf (); sprawdz_dane (17, -1);
}
printf("\nWyniki wyszukiwania: \n\n");
printf("--------------------------------------------------------\n");
if(kryt_data == 't' && kryt_kwota == 't' && kryt_kontrahent == 't')
{
for(li = 1; li <= l_wszystkich_t; li++)
{
if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
{
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
zmiana_salda = zmiana_salda + rekord[li-1].kwota;
ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
szuk++;
}
}
}
if(kryt_data == 't' && kryt_kwota == 't' && kryt_kontrahent == 'n')
{
for(li = 1; li <= l_wszystkich_t; li++)
{
if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && rekord[li-1].nr_budzetu == ktory_budzet)
{
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
zmiana_salda = zmiana_salda + rekord[li-1].kwota;
ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
szuk++;
}
}
}
if(kryt_data == 'n' && kryt_kwota == 't' && kryt_kontrahent == 't')
{
for(li = 1; li <= l_wszystkich_t; li++)
{
if(rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
{
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
zmiana_salda = zmiana_salda + rekord[li-1].kwota;
ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
szuk++;
}
}
}
if(kryt_data == 't' && kryt_kwota == 'n' && kryt_kontrahent == 't')
{
for(li = 1; li <= l_wszystkich_t; li++)
{
if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
{
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
zmiana_salda = zmiana_salda + rekord[li-1].kwota;
ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
szuk++;
}
}
}
if(kryt_data == 't' && kryt_kwota == 'n' && kryt_kontrahent == 'n')
{
for(li = 1; li <= l_wszystkich_t; li++)
{
if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && rekord[li-1].nr_budzetu == ktory_budzet)
{
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
zmiana_salda = zmiana_salda + rekord[li-1].kwota;
ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
szuk++;
}
}
}
if(kryt_data == 'n' && kryt_kwota == 't' && kryt_kontrahent == 'n')
{
for(li = 1; li <= l_wszystkich_t; li++)
{
if(rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && rekord[li-1].nr_budzetu == ktory_budzet)
{
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
zmiana_salda = zmiana_salda + rekord[li-1].kwota;
ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
szuk++;
}
}
}
if(kryt_data == 'n' && kryt_kwota == 'n' && kryt_kontrahent == 't')
{
for(li = 1; li <= l_wszystkich_t; li++)
{
if(czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
{
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
zmiana_salda = zmiana_salda + rekord[li-1].kwota;
ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
szuk++;
}
}
}
// getchar();
printf("--------------------------------------------------------\n");
printf("Zmiana salda w wyniku powyszych transakcji to: %.2lf \n", zmiana_salda);
zmiana_salda = 0.0;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void edytuj_mtrans (int str, int nr_tr){
printf("\nAktualizuj dane: \n");
printf(" Rok [format YYYY] [obecnie: %i]: ", rekord[nr_tr].data.rok); wczyt_do_buf (); sprawdz_dane (1, nr_tr);
printf(" Miesiac [format MM] [obecnie: %i]: ", rekord[nr_tr].data.miesiac); wczyt_do_buf (); sprawdz_dane (2, nr_tr);
printf(" Dzien [format DD] [obecnie: %i]: ", rekord[nr_tr].data.dzien); wczyt_do_buf (); sprawdz_dane (3, nr_tr);
printf("- kwota transakcji [obecnie: %.2lf]: ", rekord[nr_tr].kwota);
saldo[rekord[nr_tr].nr_budzetu] = saldo[rekord[nr_tr].nr_budzetu] - rekord[nr_tr].kwota; wczyt_do_buf (); sprawdz_dane (4, nr_tr);
printf("- kontrahent [obecnie: %s]: ", rekord[nr_tr].kontrahent); wczyt_do_buf (); sprawdz_dane (5, nr_tr);
wypisz_drzewo(root);
printf("- katalog [obecnie: %s]: ", rekord[nr_tr].katalog->katalog); wczyt_do_buf (); sprawdz_dane (30, nr_tr);
printf("- opis: "); wczyt_do_buf (); sprawdz_dane (6, nr_tr);
saldo[rekord[nr_tr].nr_budzetu] = saldo[rekord[nr_tr].nr_budzetu] + rekord[nr_tr].kwota;
rekord[nr_tr+str].data.rok = rekord[nr_tr].data.rok;
rekord[nr_tr+str].data.miesiac = rekord[nr_tr].data.miesiac;
rekord[nr_tr+str].data.dzien = rekord[nr_tr].data.dzien;
saldo[rekord[nr_tr+str].nr_budzetu] -= rekord[nr_tr+str].kwota;
rekord[nr_tr+str].kwota = -rekord[nr_tr].kwota;
strcpy(rekord[nr_tr+str].kontrahent, rekord[nr_tr].kontrahent);
strcpy(rekord[nr_tr+str].opis, rekord[nr_tr].opis);
rekord[nr_tr+str].katalog = rekord[nr_tr].katalog;
saldo[rekord[nr_tr+str].nr_budzetu] += rekord[nr_tr+str].kwota;
printf("\nTransakcja zaktualizowana :) \n\n");
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void edytuj_transakcje (char metoda, int index) // funkcja umozliwiajaca edycje transakcji
{
int li = 0;
if(metoda == 'n'){
printf("\nMozesz edytowac nastepujace transakcje: \n");
printf(" ID || data || kwota || kontrahent || opis\n");
printf("--------------------------------------------------------\n");
for(li = 1; li <= l_wszystkich_t; li++){
if(rekord[li-1].nr_budzetu == ktory_budzet && rekord[li-1].data.rok != 0)
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
}
// getchar();
printf("--------------------------------------------------------\n");
printf("\nWpisz numer ID transakcji do edycji: "); wczyt_do_buf (); sprawdz_dane (7, 0);
if(czy_mbudzetowa (ID-1) != 0) {
printf("\nUWAGA! Transakcja miedzybudzetowa.\n\n");
edytuj_mtrans (czy_mbudzetowa (ID-1), ID-1);
return;
}
printf("\nAktualizuj dane: \n");
printf(" Rok [format YYYY] [obecnie: %i]: ", rekord[ID-1].data.rok); wczyt_do_buf (); sprawdz_dane (1, ID-1);
printf(" Miesiac [format MM] [obecnie: %i]: ", rekord[ID-1].data.miesiac); wczyt_do_buf (); sprawdz_dane (2, ID-1);
printf(" Dzien [format DD] [obecnie: %i]: ", rekord[ID-1].data.dzien); wczyt_do_buf (); sprawdz_dane (3, ID-1);
printf("- kwota transakcji [obecnie: %.2lf]: ", rekord[ID-1].kwota);
saldo[ktory_budzet] = saldo[ktory_budzet] - rekord[ID-1].kwota; wczyt_do_buf (); sprawdz_dane (4, ID-1);
printf("- kontrahent [obecnie: %s]: ", rekord[ID-1].kontrahent); wczyt_do_buf (); sprawdz_dane (5, ID-1);
wypisz_drzewo(root);
printf("- katalog [obecnie: %s]: ", rekord[ID-1].katalog->katalog); wczyt_do_buf (); sprawdz_dane (30, ID-1);
printf("- opis: "); wczyt_do_buf (); sprawdz_dane (6, ID-1);
printf("\nTransakcja zaktualizowana :) \n\n");
saldo[ktory_budzet] = saldo[ktory_budzet] + rekord[ID-1].kwota;
}
else
{ //printf("[nr_starej: %d]: \n", index);
for(li = 0; li < l_wszystkich_t; li++){
if(rekord[li].nr_budzetu == ktory_budzet)
{
if(index == 0) break;
if(index > 0)
index--;
}
}
printf("Uzupelnij dane: \n", li);
printf(" Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (1, li);
printf(" Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (2, li);
printf(" Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (3, li);
printf("- kwota transakcji: "); wczyt_do_buf ();
saldo[ktory_budzet] = saldo[ktory_budzet] - rekord[li].kwota; sprawdz_dane (4, li);
printf("- kontrahent: "); wczyt_do_buf (); sprawdz_dane (5, li);
printf("- opis: "); wczyt_do_buf (); sprawdz_dane (6, li);
wypisz_drzewo(root);
printf("- katalog: ", rekord[li].katalog->katalog); wczyt_do_buf (); sprawdz_dane (30, li);
printf("\nTransakcja przyjeta :) \n\n");
saldo[ktory_budzet] = saldo[ktory_budzet] + rekord[li].kwota;
}
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void wyswietl_ost_wyszukane (int szuk) // wyswietlamy ostatnie wyszukiwanie
{
int li = 1;
double zmiana_salda = 0.0;
printf("\nWynik ostatniego wyszukiwania: \n");
printf(" ID || data || kwota || kontrahent || opis\n");
printf("--------------------------------------------------------\n");
for(li = 1; li <= szuk; li++){
printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, ost_wyszukane[li-1].data.rok, ost_wyszukane[li-1].data.miesiac, ost_wyszukane[li-1].data.dzien, ost_wyszukane[li-1].kwota, ost_wyszukane[li-1].kontrahent, ost_wyszukane[li-1].opis);
zmiana_salda = zmiana_salda + ost_wyszukane[li-1].kwota;
}
// getchar();
printf("--------------------------------------------------------\n");
printf("Zmiana salda w wyniku powyszych transakcji to: %.2lf \n", zmiana_salda);
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void formularz_ost_wyszukane () // ustalamy parametry do wyswietlenia ostatniego wyszukiwania
{
if(szuk == 0){
printf("\n\nNie szukales jeszcze transakcji! \n\n");
}
else{
printf("Ile transakcji wyswietlic? [max = %d]: ", szuk); wczyt_do_buf (); sprawdz_dane (24, -1);
wyswietl_ost_wyszukane (ost_ile);
}
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void menu_katalogi ()
{
do {
if(k == 'd')
{
dodaj_katalog (NULL, NULL);
}
if(k == 'u')
{
usun_katalog ();
}
if(k == 'k')
{
katalog_kopiuj ();
}
if(k == 'p')
{
katalog_przenies ();
}
if(k == 'z')
{
zmiana_nazwy_katalogu ();
}
printf("\n ++++++++++++++++++++++++++++++++++++ \n");
wypisz_drzewo (root);
printf("\nd - dodaj katalog \n");
printf("u - usun istniejacy katalog \n");
printf("p - przenies katalog \n");
printf("k - kopiuj katalog \n");
printf("z - zmien nazwe katalogu \n");
printf("q - opusc menu katalogow \n");
printf("\nPolecanie: "); wczyt_do_buf (); sprawdz_dane (29, -1);
}
while(k != 'q');
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void menu () // funkcja wyswietlajaca menu programu
{
int i = 0;
do {
if(c == 'd')
{
dodaj_transakcje ('x');
}
if(c == 'e')
{
edytuj_transakcje ('n', -1);
}
if(c == 's')
{
sortuj_formularz ();
}
if(c == 'f')
{
szukaj_transakcje ();
}
if(c == 'w')
{
wyswietl_transakcje ();
}
if(c == 'o')
{
formularz_ost_wyszukane ();
}
if(c == 'b')
{
dostepne_budzety ();
}
if(c == 'y')
{
menu_katalogi ();
}
if(c == 'm')
{
if(ilosc_budzetow == 1){printf("Masz tylko jeden budzet...\n\n"); }
else{ dodaj_transakcje ('m');}
}
if(c == 'p')
{
przychody_rozchody_mtransakcje();
}
if(c == 'z')
{
printf("Czy plik ma byc szyfrowany? [t/n]: "); wczyt_do_buf (); sprawdz_dane (33, -1);
if(szyfrowanie == 't')
zapis_szyfr_do_plik ();
else
zapis_do_plik ();
}
if(c == 'l')
{
odczyt_z_plik_form (); // doklepac funkcje rozpoznajaca plik szyfrowany i zwykly
}
// if(c == 't') // pozycja do testowania funkcji
// {
// for(i = 0; i < l_wszystkich_t; i++)
// printf("nr: %d - %d\n", i, czy_mbudzetowa (i));
// }
printf("\n ++++++++++++++++++++++++++++++++++++ \n");
printf("Liczba transakcji przechowywanych w budzecie [%s]: %d/%d\n", budzet[ktory_budzet], l_trans[ktory_budzet], NMAX);
printf("Saldo: %.2f\n", saldo[ktory_budzet]);
printf("Menu: \nq - koniec \nd - dodaj transakcje \ne - edytuj transakcje \ns - sortuj transakcje\nf - szukaj transakcji\nw - wyswietl transakcje\no - wyswietl wynik ostatniego wyszukiwania\nb - wybierz inny budzet lub dodaj nowy\nm - trans. z innym budzetem\ny - drzewo katalogow\np - bilans transakcji z innymi budzetami\nz - zapis do pliku\nl - odczyt z pliku\n");
printf("Polecanie: "); wczyt_do_buf (); sprawdz_dane (8, -1); //c = getchar();
}
while(c != 'q');
printf("\nMoze jeszcze kiedys tu wrocisz ;) BYE BYE\n\n");
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void stworz_budzet ()
{
if(ilosc_budzetow == NBUDZETOW)
{
printf("Zalozyles juz maksymalna ilosc budzetow.\n\n");
}
else
{
printf("Podaj nazwe dla nowego budzetu: "); wczyt_do_buf (); sprawdz_dane(25, -1);
printf("Budzet %s zostal utworzony.\n\n", budzet[ilosc_budzetow]);
ilosc_budzetow++;
}
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void dostepne_budzety()
{
int i;
if(ilosc_budzetow == 0)
{
printf("Nie zalozyles jeszcze zadnego budzetu.\n\n");
stworz_budzet();
}
else {
printf("Czy chcesz zalozyc nowy budzet? [t/n]: "); wczyt_do_buf (); sprawdz_dane(27, -1);
if(nowy_budzet == 't')
stworz_budzet ();
}
printf("Dotepne budzety:\n\n");
for(i = 1; i <= ilosc_budzetow; i++)
printf("%d. %s\n", i, budzet[i-1]);
printf("Wpisz numer budzetu na ktorym chcesz operowac: "); wczyt_do_buf (); sprawdz_dane(26, -1);
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int main () // main;]
{
stworz_pierwszy_katalog ();
dostepne_budzety ();
menu ();
return 0;
}