#define LINE_SIZE 100 #define POCET_JEDAL 100000//macros pre velky vstupy a vystupy #include #include #include #include struct pizza///materialy z cvicenia { float prize; char name[LINE_SIZE]; }; struct pizza jedalny_listok[POCET_JEDAL]; struct pizza *prva = jedalny_listok; struct pizza *druha = jedalny_listok + 1; struct pizza *tretia = &jedalny_listok[2]; /// funkcia na prevratenie zakodovaneho znaku ane povodnyj char hacker_script(char c) { /// ked pismeno je vel'ke, tak vratim male if (isupper(c)) { return (char) tolower(c); } /// zoznamy specialnych znakov a povodnych znakov const char numbers[] = "0123456789"; const char letters[] = "oizeasbtbq"; // ked' znak patri do zonamu specialnych, vratime povodnu for (int i = 0; i < 10; i++) { if (c == numbers[i]) { return letters[i]; } } //nerobim nic, vratime znak return c; }/// funkcia pre nacitanie pizzy. Ma ako argument refeenciu v pamati na struct pizz int read_pizza(struct pizza *item) { /// pomozne pole pre nazov jedla char line[LINE_SIZE]; //pomozne pole pre cenu jedla; tak tiez pole pre scitanie floatu char line2[LINE_SIZE]; /// Podmienky ked nazov je neplatny: alebo ne ma nic, alebo nezmozeme nacitat' if (!fgets(line, sizeof(line), stdin)) return 0; if (strlen(line) == 0) return 0; /// ked' nemozeme nacitac cenu, vratime 0 if (!fgets(line2, sizeof(line2), stdin)) return 0; ///endpointer, pouzivaju a sa dostat' do znaku, ktory nemoze byt' pouzity pre pretvorenie pol'a na float ('\0' - null terminator za normal'nych podmienok') char *endptr; ///& je operator, ktory vrati adresu premenoj v pamati float value = strtof(line2, &endptr); if (value == 0.0F) return 0; /// strcpy prekopiruje jeden ret'azec v iny /// -> je smernikovy operator, ktory pozivame ked' mame referenciu na strukturu namiesto . strcpy(item->name, line); item->prize = value; return 1; } int search_string(const char* heap, const char* needle) { /// dlzky hl'adaneho a v ktorom hl'adame int heap_len = strlen(heap); int needle_len = strlen(needle); /// prvy cyklus pre zdvih hl'adaneho for (int i = 0; i <= heap_len - needle_len; i++) { int j; // cyklus aby porovnat' aktualny znaky for (j = 0; j < needle_len; j++) { /// dekodovanie pomocou hacker_script char perm_n = hacker_script(needle[j]); char perm_h = hacker_script(heap[i + j]); /// znamena, ze znaky su b, sa rovnaju a mozeme pokracovat' if ((perm_n == '6' && perm_h == '8') || (perm_n == '8' && perm_h == '6')) { continue; } // ked' nerovnaju, potom string sme nenajdeme if (perm_n != perm_h) { break; } } /// ked' j sa rovna dlzke, tak vratime i - zacatok patternu if (j == needle_len) { return i; } } /// vratime -1 ked' nenasli return -1; } int main() { printf("Zadaj hladanu surovinu:\n"); /// pole pre hl'adane char search[LINE_SIZE]; /// ked' nenacitame, ukoncime program if (!fgets(search, sizeof(search), stdin)) { return 1;} /// pre hl'adanie, potrebujeme najst', kde zanica novy riadok and premenit' ho na null terminator pre porovnanie search[strcspn(search, "\n")] = '\0'; printf("Zadaj jedalny listok:\n"); /// pocet nacitanych poloziek int loaded = 0; //pokial' pocet mensie ako macros a jedlo je platne, zvacseme pocet while (loaded < POCET_JEDAL && read_pizza(&jedalny_listok[loaded])) { loaded++; } /// ked' najdeme v stravotnom listku hl'adane - vypiseme nazov a cenu for(int i = 0; i