#include #include #include #include #define MAX 10000 typedef char Ucet[11]; typedef int Castka; void Print(Castka x) { printf("%d.%02d", x / 100, x % 100); } void Read(char* s, Castka& x) { int a, b; sscanf(s, "%d.%d", &a, &b); x = a * 100 + b; } struct Node { Node *prev, *next; Ucet ucet; Castka v; }; struct Tree { Node* n; Tree* leaf[10]; Tree() : n(0) { memset(leaf, 0, sizeof(leaf)); } ~Tree(); }; Tree::~Tree() { for(int i = 0; i < 10; ++i) if(leaf[i] != 0) delete leaf[i]; } Tree* root; int pocet; Castka celkem; Node *head, *tail; int error; Tree* TreeAdd(char* u, Tree* n, Node* node) { if(u[0] == '\0') { if(n != 0) error = 1; else { n = new Tree(); n->n = node; } return n; } if(n == 0) n = new Tree(); n->leaf[u[0] - '0'] = TreeAdd(u + 1, n->leaf[u[0] - '0'], node); return n; } Node* Add(char* u, const Castka& c) { Node* n = new Node; n->prev = n->next = 0; strcpy(n->ucet, u); n->v = c; if(head == 0) { head = n; tail = head; } else { tail->next = n; n->prev = tail; tail = n; } return n; } void Remove(Node* n) { if(n->prev == 0) { head = n->next; head->prev = 0; } else { n->prev->next = n->next; } if(n->next == 0) { tail = n->prev; tail->next = 0; } else { n->next->prev = n->prev; } delete n; } void Destroy() { Node* n = head; while(n != 0) { Node* tmp = n->next; delete n; n = tmp; } head = tail = 0; if(root) delete root; root = 0; pocet = 0; celkem = 0; } void VytvorUcet(char* u) { Node* n = Add(u, 0); root = TreeAdd(u, root, n); if(!error) pocet++; else Remove(n); } Tree* SearchTree(char* u, Tree* n) { if(n->n != 0) return n; else { return SearchTree(u + 1, n->leaf[u[0] - '0']); } } Node* NajdiUcet(char* u) { if(pocet == 0) return 0; Tree* node = SearchTree(u, root); return node->n; } Castka Celkem() {/* Castka x = 0; Node* n = head; while(n != 0) { x += n->v; n = n->next; } return x;*/ return celkem; } void List() { Node* n = head; while(n != 0) { printf("%s %7d.%02d\n", n->ucet, n->v / 100, n->v % 100); n = n->next; } } bool OneTask() { char line[1000]; gets(line); if(feof(stdin)) return false; char* p = strtok(line, " "); if(strcmp(p, "ZALOZ") == 0) { error = 0; p = strtok(0, " "); VytvorUcet(p); if(!error) printf("Ucet %s vytvoren.\n", p); else printf("Ucet %s uz existuje.\n", p); } else if(strcmp(p, "ULOZ") == 0) { p = strtok(0, " "); Castka x; char* next = strtok(0, " "); Read(next, x); Node* n = NajdiUcet(p); if(n == 0) printf("Ucet %s neexistuje.\n", p); else { printf("Ulozeno %d.%02d na ucet %s.\n", x / 100, x % 100, p); n->v += x; celkem += x; } } else if(strcmp(p, "VYBER") == 0) { p = strtok(0, " "); Castka x; char* next = strtok(0, " "); Read(next, x); Node* n = NajdiUcet(p); if(n == 0) printf("Ucet %s neexistuje.\n", p); else if(x > n->v) printf("Nedostatek penez.\n"); else { printf("Vybrano %d.%02d z uctu %s.\n", x / 100, x % 100, p); n->v -= x; celkem -= x; } } else if(strcmp(p, "PREVED") == 0) { p = strtok(0, " "); Castka x; char* u2 = strtok(0, " "); char* next = strtok(0, " "); Read(next, x); Node* n1 = NajdiUcet(p); if(n1 == 0) printf("Ucet %s neexistuje.\n", p); else { Node* n2 = NajdiUcet(u2); if(n2 == 0) printf("Ucet %s neexistuje.\n", u2); else if(x > n1->v) printf("Nedostatek penez.\n"); else { printf("Prevedeno %d.%02d z uctu %s na ucet %s.\n", x / 100, x % 100, p, u2); n1->v -= x; n2->v += x; } } } else if(strcmp(p, "STATISTIKA") == 0) { printf("Pocet uctu: %d\n", pocet); Castka x = Celkem(); printf("Celkem: %7d.%02d\n", x / 100, x % 100); } else if(strcmp(p, "LIST") == 0) { printf("Pocet uctu: %d\n", pocet); List(); Castka x = Celkem(); printf("Celkem: %7d.%02d\n", x / 100, x % 100); } else if(strcmp(p, "RESET") == 0) { printf("Reset systemu.\n"); Destroy(); } printf("\n"); return true; } int main() { while(OneTask()) ; printf("Konec.\n"); return 0; }