123 lines
4.0 KiB
C
123 lines
4.0 KiB
C
#define LINE_SIZE 100
|
|
#define POCET_JEDAL 100000//macros pre velky vstupy a vystupy
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
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 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 je 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<loaded; i++){
|
|
if(search_string(jedalny_listok[i].name , search) != -1){
|
|
printf("%s%.2f\n", jedalny_listok[i].name, jedalny_listok[i].prize);
|
|
}
|
|
}// pocet nacitanyc poloziek
|
|
printf("Nacitanych %d poloziek.\n", loaded);
|
|
return 0;
|
|
} |