#include #include #include #include #include #define FORMAT "%7.2f" struct ucet { int poradi; char cislo[12]; float bilance; }; int pocet_uctu = 0; int max_ucet = 1; float sum_penez = 0; struct ucet **dle_poradi = NULL; struct ucet **dle_cisla = NULL; void reset(int silent = 0) { if (dle_poradi) { for (int i = 0; i < pocet_uctu; i++) free(dle_poradi[i]); free(dle_poradi); } if (dle_cisla) free(dle_cisla); dle_poradi = dle_cisla = NULL; pocet_uctu = 0; sum_penez = 0; if (!silent) printf("Reset systemu.\n\n"); } int __sort_dle_cisla(const void *a, const void *b) { const ucet *u1 = *(const ucet **) a; const ucet *u2 = *(const ucet **) b; return strcmp(u1->cislo, u2->cislo); } int __sort_dle_poradi(const void *a, const void *b) { const ucet *u1 = *(const ucet **) a; const ucet *u2 = *(const ucet **) b; return (u1->poradi > u2->poradi)?1: (u1->poradi == u2->poradi)?0: -1; } ucet *najdi_ucet(char *cislo) { ucet tmp; ucet *ptmp = &tmp; ucet **retv; strcpy(tmp.cislo, cislo); retv = (ucet **) bsearch(&ptmp, dle_cisla, pocet_uctu, sizeof(dle_cisla[0]), __sort_dle_cisla); if (!retv) return NULL; return *retv; } /******************************************/ void statistika() { printf("Pocet uctu: %i\n", pocet_uctu); printf("Celkem: %10.2f\n\n", sum_penez); } void list() { int i; printf("Pocet uctu: %i\n", pocet_uctu); for (i = 0; i < pocet_uctu; i++) printf ("%s %10.2f\n", dle_poradi[i]->cislo, dle_poradi[i]->bilance); printf("Celkem: %10.2f\n\n", sum_penez); } void zaloz(char *cislo) { ucet *our; ucet *tmp; tmp = najdi_ucet(cislo); if (tmp) { printf("Ucet %s uz existuje.\n\n", cislo); return; } our = (ucet *) malloc(sizeof(our[0])); strcpy(our->cislo, cislo); our->bilance = 0; our->poradi = max_ucet; max_ucet++; pocet_uctu++; dle_poradi = (ucet **) realloc((void *) dle_poradi, sizeof(dle_poradi[0])*pocet_uctu); dle_cisla = (ucet **) realloc((void *) dle_cisla, sizeof(dle_cisla[0])*pocet_uctu); dle_cisla[pocet_uctu-1] = our; dle_poradi[pocet_uctu-1] = our; qsort(dle_cisla, pocet_uctu, sizeof(dle_cisla[0]), __sort_dle_cisla); qsort(dle_poradi, pocet_uctu, sizeof(dle_cisla[0]), __sort_dle_poradi); printf("Ucet %s vytvoren.\n\n", cislo); } void uloz(char *cislo, float penize) { ucet *now = najdi_ucet(cislo); if (now) { now->bilance = now->bilance + penize; sum_penez += penize; printf("Ulozeno %.2f na ucet %s.\n\n", penize, cislo); } else { printf("Ucet %s neexistuje.\n\n", cislo); } } void vyber(char *cislo, float penize) { ucet *now = najdi_ucet(cislo); if (now) { if (now->bilance < penize) { printf("Nedostatek penez.\n\n"); return; } now->bilance -= penize; sum_penez -= penize; printf("Vybrano %.2f z uctu %s.\n\n", penize, cislo); } else { printf("Ucet %s neexistuje.\n\n", cislo); } } void preved(char *src, char *dst, float penize) { ucet *usrc = najdi_ucet(src); ucet *udst = najdi_ucet(dst); if (!usrc) { printf("Ucet %s neexistuje.\n", src); } else { if (usrc->bilance < penize) { printf ("Nedostatek penez.\n"); } else { if (udst) { usrc->bilance -= penize; udst->bilance += penize; printf("Prevedeno %.2f z uctu %s na ucet %s.\n", penize, src, dst); } } } if (!udst) { printf("Ucet %s neexistuje.\n", dst); } printf("\n"); } int main() { reset(1); while (1) { char prikaz[100], ughu[100]; float penize; if (scanf("%s", prikaz) != 1) break; if (strcmp(prikaz, "RESET") == 0) reset(); else if (strcmp(prikaz, "LIST") == 0) list(); else if (strcmp(prikaz, "STATISTIKA") == 0) statistika(); else if (strcmp(prikaz, "ZALOZ") == 0) { scanf("%s", prikaz); zaloz(prikaz); } else if (strcmp(prikaz, "ULOZ") == 0) { scanf("%s%f", prikaz, &penize); uloz(prikaz, penize); } else if (strcmp(prikaz, "VYBER") == 0) { scanf("%s%f", prikaz, &penize); vyber(prikaz, penize); } else if (strcmp(prikaz, "PREVED") == 0) { scanf("%s%s%f", prikaz, ughu, &penize); preved(prikaz, ughu, penize); } } printf("Konec.\n"); return 0; } /* vim: cindent */