#include #include #define MOD 20001 typedef struct ucet { char name[11]; double value; } ucet; typedef struct h_item { int index; h_item * next; } h_item; ucet * ucty[11000]; int uctu = 0; double penez = 0; h_item * lookup[MOD]; int hash(char * name) { int hash = 0; while(*name) hash = 1001*hash + *name++; return abs(hash) % MOD; } void init() { int i; for(i=0; i<11000; i++) { ucty[i] = NULL; } for(i=0; inext; free(act); act = next; } } uctu=0; penez=0; } ucet * getUcet(char * name) { //printf("getUcet(%s)\n", name); int h = hash(name); //printf("hash is %d\n", h); h_item * act = lookup[h]; //printf("act is %d\n", act); for( ;; ) { if(act == NULL) return NULL; ucet * u = ucty[act->index]; if(u == NULL) { printf("corruption!!!\n"); return NULL; } if( !strcmp(name, u->name) ) return u; act = act->next; } } ucet * createUcet(char * name) { //printf("createUcet(%s)\n", name); int h = hash(name); ucet * newUcet = (ucet *) malloc(sizeof(ucet)); newUcet->value = 0; strcpy(newUcet->name, name); h_item * newItem = (h_item *) malloc(sizeof(h_item)); newItem->index = uctu; newItem->next = lookup[h]; ucty[uctu++] = newUcet; lookup[h] = newItem; return newUcet; } int main() { char oper[20]; char name[12], name2[12]; double val1; int i,j; struct ucet * act, * from, * to; // double d; init(); /* d = 999999.99; printf( "val=%10.2f\n", d); d = 1000000.00; printf( "val=%10.2f\n", d); d = 1000000.01; printf( "val=%10.2f\n", d); d = 1000000.02; printf( "val=%10.2f\n", d); */ for(;;) { i = scanf("%s", oper); //printf("got command %s, i=%d\n", oper,i); if(i < 1) break; switch(oper[0]) { case 'Z': scanf("%s\n", name); if(getUcet(name)) { printf("Ucet %s uz existuje.\n\n", name); } else { createUcet(name); printf("Ucet %s vytvoren.\n\n", name); } break; case 'U': scanf("%s %lf\n", name, &val1); act = getUcet(name); if(!act) { printf("Ucet %s neexistuje.\n\n", name); } else { printf("Ulozeno %.2f na ucet %s.\n\n", val1, name); act->value += val1; penez += val1; } break; case 'V': scanf("%s %lf\n", name, &val1); act = getUcet(name); if(!act) { printf("Ucet %s neexistuje.\n\n", name); } else if (act->value < val1) { printf("Nedostatek penez.\n\n"); } else { printf("Vybrano %.2f z uctu %s.\n\n", val1, name); act->value -= val1; penez -= val1; } break; case 'P': scanf("%s %s %lf\n", name, name2, &val1); from = getUcet(name); to = getUcet(name2); if(!from) { printf("Ucet %s neexistuje.\n", name); } if(from && from->value < val1) { printf("Nedostatek penez.\n"); } if(!to) { printf("Ucet %s neexistuje.\n", name2); } if(from && to && from->value >= val1) { printf("Prevedeno %.2f z uctu %s na ucet %s.\n", val1, name, name2); from->value -= val1; to->value += val1; } printf("\n"); break; case 'S': printf("Pocet uctu: %d\nCelkem: %10.2f\n\n", uctu, penez); break; case 'L': printf("Pocet uctu: %d\n", uctu); for(j=0;jname, act->value); } printf("Celkem: %10.2f\n\n", penez); break; case 'R': cleanup(); printf("Reset systemu.\n\n"); } } printf("Konec.\n"); return 0; }