{"id":20665175,"url":"https://github.com/martan03/ijc-project","last_synced_at":"2026-04-24T07:33:45.918Z","repository":{"id":160439284,"uuid":"615650530","full_name":"Martan03/IJC-Project","owner":"Martan03","description":"First task for the IJC subject","archived":false,"fork":false,"pushed_at":"2023-03-21T21:28:18.000Z","size":610,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-17T11:27:26.784Z","etag":null,"topics":["school-assignment","school-project"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Martan03.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-18T09:17:46.000Z","updated_at":"2023-03-24T19:19:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"102040ea-53b7-435d-b874-fcc52a9af018","html_url":"https://github.com/Martan03/IJC-Project","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Martan03/IJC-Project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Martan03%2FIJC-Project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Martan03%2FIJC-Project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Martan03%2FIJC-Project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Martan03%2FIJC-Project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Martan03","download_url":"https://codeload.github.com/Martan03/IJC-Project/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Martan03%2FIJC-Project/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32214415,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T03:15:14.334Z","status":"ssl_error","status_checked_at":"2026-04-24T03:15:11.608Z","response_time":64,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["school-assignment","school-project"],"created_at":"2024-11-16T19:28:54.740Z","updated_at":"2026-04-24T07:33:45.895Z","avatar_url":"https://github.com/Martan03.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"Jazyk C                     DU1                        21.2.2023\n----------------------------------------------------------------\n\n\u003e Domácí úkol č.1\n\n\nTermín odevzdání:  21.3.2023\n Hodnocení celkem max. 15 bodů\n Čtěte pokyny na konci tohoto textu\n\nPříklady: (budou opravovány v prostředí Linux/GCC,\n           LC_ALL=cs_CZ.utf8\n           překlad: gcc -g -std=c11 -pedantic -Wall -Wextra \n           C11 je potřeba jen pro static_assert(test,\"zprava\"); )\n\nA) V rozhraní \"bitset.h\" definujte pro datovou strukturu typu pole bitů:\n\n   Typ:\n     typedef \u003cDOPLNIT\u003e bitset_t;\n       Typ bitového pole (pro předávání parametru do funkce odkazem).\n\n     typedef unsigned long bitset_index_t;\n        Typ indexu do bitového pole.\n\n   Makra:\n     bitset_create(jmeno_pole,velikost)\n       definuje a _nuluje_ proměnnou jmeno_pole\n       (POZOR: opravdu musí _INICIALIZOVAT_ pole bez ohledu na\n       to, zda je pole statické nebo automatické/lokální!\n       Vyzkoušejte obě varianty, v programu použijte lokální pole.)\n       Použijte  static_assert  pro kontrolu velikosti pole.\n       Př: static bitset_create(p,100); // p = pole 100 bitů, nulováno\n           bitset_create(q,100000L);    // q = pole 100000 bitů, nulováno\n           bitset_create(q,-100);       // chyba při překladu\n\n     bitset_alloc(jmeno_pole,velikost)\n       definuje proměnnou jmeno_pole tak, aby byla kompatibilní s polem\n       vytvořeným pomocí bitset_create, ale pole bude alokováno dynamicky.\n       Př: bitset_alloc(q,100000L); // q = pole 100000 bitů, nulováno\n       Použijte  assert  pro kontrolu maximální možné velikosti pole.\n       Pokud alokace selže, ukončete program s chybovým hlášením:\n       \"bitset_alloc: Chyba alokace paměti\"\n\n     bitset_free(jmeno_pole)\n       uvolní paměť dynamicky (bitset_alloc) alokovaného pole\n\n     bitset_size(jmeno_pole)\n       vrátí deklarovanou velikost pole v bitech (uloženou v poli)\n\n     bitset_setbit(jmeno_pole,index,výraz)\n       nastaví zadaný bit v poli na hodnotu zadanou výrazem\n       (nulový výraz == bit 0, nenulový výraz == bit 1)\n       Př: bitset_setbit(p,20,1);\n\n     bitset_getbit(jmeno_pole,index)\n       získá hodnotu zadaného bitu, vrací hodnotu 0 nebo 1\n       Př: if(bitset_getbit(p,i)==1) printf(\"1\");\n           if(!bitset_getbit(p,i))   printf(\"0\");\n\n   Kontrolujte meze polí. V případě chyby volejte funkci\n\n     error_exit(\"bitset_getbit: Index %lu mimo rozsah 0..%lu\",\n               (unsigned long)index, (unsigned long)mez).\n\n   (Použijte například modul error.c/error.h z příkladu b)\n\n   Programy musí fungovat na 32 (gcc -m32) i 64bitové platformě.\n\n   Podmíněným překladem zajistěte, aby se při definovaném symbolu\n   USE_INLINE místo těchto maker definovaly inline funkce stejného jména\n   všude kde je to možné (bez změn v následujícím testovacím příkladu!).\n   Pozor: USE_INLINE nesmí být definováno ve zdrojovém textu --\n          překládá se s argumentem -D (gcc -DUSE_INLINE ...).\n\n   Program musí fungovat s inline funkcemi i pro vypnuté optimalizace -O0\n   (ověřte si to - vyžaduje externí definice inline funkcí).\n\n   Pro vaši implementaci použijte pole typu  unsigned long [].\n   V tomto poli na indexu 0 bude velikost bitového pole v bitech.\n   Implementace musí efektivně využívat paměť (využít každý\n   bit pole až na posledních maximálně CHAR_BIT*sizeof(unsigned long)-1 bitů).\n\n   Jako testovací příklad implementujte funkci, která použije algoritmus známý\n   jako Eratostenovo síto (void Eratosthenes(bitset_t pole);) a použijte ji\n   pro výpočet posledních 10 prvočísel ze všech prvočísel od 2 do\n   N=230000000 (230 milionů). (Doporučuji program nejdříve odladit pro N=100.)\n   Funkci Eratosthenes napište do samostatného modulu \"eratosthenes.c\".\n\n   Každé prvočíslo tiskněte na zvláštní řádek v pořadí\n   vzestupném.  Netiskněte  nic  jiného  než  prvočísla (bude se\n   automaticky  kontrolovat!).  Pro kontrolu správnosti prvočísel\n   můžete použít program \"factor\" (./primes|factor).\n\n   Naprogramujte (s využitím funkce clock()) měření doby běhu programu v\n   sekundách a výsledek vypište na stderr následujícím příkazem:\n     fprintf(stderr, \"Time=%.3g\\n\", (double)(clock()-start)/CLOCKS_PER_SEC);\n   (Porovnejte vaše měření s výsledkem příkazu \"time ./primes\".)\n\n   Pro lokální pole budete potřebovat zvětšit limit velikosti zásobníku.\n   Na Unix-like systémech můžete použít příkaz \"ulimit -a\" pro zjištění velikosti\n   limitu a potom \"ulimit -s zadana_velikost_v_KiB\" před spuštěním programu.\n   (Toto názorně demonstruje nevhodnost používání velkých lokálních polí.)\n\n   Zdrojový text programu se musí jmenovat \"primes.c\" !\n   Napište Makefile tak, aby příkaz \"make\" vytvořil všechny varianty:\n     primes      používá makra\n     primes-i    používá inline funkce\n   a aby příkaz \"make run\" všechny varianty vytvořil a spustil (i s ulimit -s).\n\n   (Při nesplnění výše uvedených podmínek: až 0 bodů.)\n\n(7b)\n\nPoznámky:  Eratosthenovo síto (přibližná specifikace):\n   1) Nulujeme bitové pole  p  o rozměru N,\n      p[0]=1; p[1]=1; // 0 a 1 nejsou prvočísla\n      index i nastavit na 2\n   2) Vybereme nejmenší index i, takový, že p[i]==0.\n      Potom je i prvočíslo\n   3) Pro všechny násobky i nastavíme bit p[n*i] na 1\n      ('vyškrtneme' všechny násobky i - nejsou to prvočísla)\n   4) i++; dokud nejsme za sqrt(N), opakujeme bod 2 až 4\n      (POZOR: sestavit s matematickou knihovnou parametrem -lm)\n   5) Výsledek: v poli p jsou na prvočíselných indexech hodnoty 0\n\n   https://en.wikipedia.org/wiki/Prime_number\n\n   Efektivita výpočtu: cca 1.6s na Intel i5-4690@3.50GHz (gcc -O2)\n   Porovnejte efektivitu obou variant (makra vs. inline funkce).\n   Zamyslete se, jak by se ověřila efektivita pro (neinline) funkce.\n\n\n\nB) Napište modul \"error.c\" s rozhraním v \"error.h\", který definuje\n   funkci void warning(const char *fmt, ...) a\n   funkci void error_exit(const char *fmt, ...).\n   Tyto funkce mají stejné parametry jako printf(); tisknou\n   text \"Warning: \" nebo \"Error: \" a potom chybové hlášení podle\n   formátu fmt. Vše se tiskne do stderr (standardní funkcí vfprintf)\n   a potom pouze error_exit ukončí program voláním funkce exit(1).\n   Použijte definice ze stdarg.h.\n\n * Napište modul \"ppm.c\" s rozhraním \"ppm.h\",\n   ve kterém definujete typ:\n\n     struct ppm {\n        unsigned xsize;\n        unsigned ysize;\n        char data[];    // RGB bajty, celkem 3*xsize*ysize\n     };\n\n   a funkci:\n\n     struct ppm * ppm_read(const char * filename);\n        načte obsah PPM souboru do touto funkcí dynamicky\n        alokované struktury. Při chybě formátu použije funkci warning\n        a vrátí NULL.  Pozor na \"memory leaks\".\n\n     void ppm_free(struct ppm *p);\n        uvolní paměť dynamicky alokovanou v ppm_read\n\n    Můžete doplnit další funkce, ale pro DU1 to není nutné.\n    [Zamyslete se nad (ne)vhodností použití warning() a promyslete\n    alternativní způsoby hlášení různých chyb.]\n\n    Můžete omezit max. velikost XY souřadnic obrázku vhodným implementačním\n    limitem (např. 16000). Alokujte vždy jen minimální potřebný prostor pro\n    obrazová data.\n\n    Popis formátu PPM najdete na Internetu, implementujte pouze\n    binární variantu P6 s barvami 0..255 a bez komentářů:\n      \"P6\" \u003cws\u003e+\n      \u003cxsizetxt\u003e \u003cws\u003e+ \u003cysizetxt\u003e \u003cws\u003e+\n      \"255\" \u003cws\u003e\n      \u003cbinární data, 3*xsize*ysize bajtů RGB\u003e\n      \u003cEOF\u003e\n\n  * Napište testovací program \"steg-decode.c\", kde ve funkci main načtete ze\n    souboru zadaného jako jediný argument programu obrázek ve formátu PPM\n    a v něm najdete uloženou \"tajnou\" zprávu. Zprávu vytisknete na stdout.\n\n    Zpráva je řetězec znaků (char, včetně '\\0') uložený po jednotlivých bitech\n    (počínaje LSb) na nejnižších bitech (LSb) vybraných bajtů barevných složek\n    v datech obrázku. Dekódování ukončete po dosažení '\\0'.\n    Pro DU1 budou vybrané bajty určeny prvočísly (počínaje od START_PRIME) --\n    použijte Eratostenovo síto podobně jako v příkladu \"primes.c\" a začněte\n    prvočíslem START_PRIME=101. Velikost dynamicky alokovaného bitového pole\n    musí odpovídat velikosti obrazových dat RGB.\n\n    Program použije error_exit v případě chyby čtení souboru (chybný formát),\n    a v případě, že zpráva není korektně ukončena '\\0'. Předpokládejte\n    uložení textu zprávy ve formátu UTF-8 a zkontrolujte to\n    (použijte např. https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c).\n\n    Použijte program \"make\" pro překlad/sestavení programu.\n    Testovací příkaz:  ./steg-decode du1-obrazek.ppm\n\n    Zájemci si mohou vytvořit i program \"steg-encode.c\" (nehodnotí se).\n    Zamyslete se nad (ne)vhodností použití implementačních limitů.\n\n(8b)\n\n   Zařiďte, aby příkaz \"make\" bez parametrů vytvořil všechny spustitelné\n   soubory pro DU1.  Při změně kteréhokoli souboru musí přeložit jen změněný\n   soubor a závislosti. Pokud bude Makefile vypadat jako skript, odečtou se 3b.\n\n\nTestovací obrázek: du1-obrazek.ppm\n\n\n\nC) Obecné pokyny pro vypracování domácích úkolů (rev 21.2.2023)\n\n*  Pro úkoly v jazyce C používejte ISO C11 (soubory *.c)\n   Použití nepřenositelných konstrukcí není dovoleno.\n\n*  Úkoly zkontrolujte překladačem například takto:\n      gcc -g -std=c11 -pedantic -Wall -Wextra priklad1.c\n   místo gcc můžete použít i jiný překladač.\n   V  souvislosti s tím napište do poznámky na začátku\n   souboru jméno překladače, kterým byl program testován\n   (implicitní je verze GNU C instalovaná na serveru merlin).\n\n   Pro ověření správnosti paměťových operací zkuste extra parametry pro gcc\n   (Makefile: CFLAGS += -fsanitize=address, LDFLAGS += -fsanitize=address).\n\n*  Programy  pište, pokud je to možné, do jednoho zdrojového\n   souboru. Dodržujte předepsaná jména souborů.\n\n*  Na začátek každého souboru napište poznámku, která bude\n   obsahovat jméno, fakultu, označení příkladu a datum.\n\n   Příklad:\n   // primes.c\n   // Řešení IJC-DU1, příklad a), 20.3.2111\n   // Autor: John Unknown, FIT\n   // Přeloženo: gcc 10.2\n   // ...popis příkladu - poznámky, omezení, atd\n\n* Úkoly je nutné zabalit programem zip takto:\n       zip xunkno99.zip *.c *.h Makefile\n\n  Jméno xunkno99 nahradíte vlastním. ZIP neobsahuje adresáře.\n  Každý si zkontroluje obsah ZIP archivu jeho rozbalením v prázdném adresáři\n  a napsáním \"make run\".\n\n* Řešení se odevzdává elektronicky v ISVUT (velikost souboru je omezena)\n\n* Posílejte pouze nezbytně nutné soubory -- ne *.EXE !\n\n* Úkoly neodevzdané v termínu budou za 0 bodů.\n\n* Opsané úkoly budou hodnoceny 0 bodů pro všechny zůčastněné\n  a to bez výjimky (+bonus v podobě návštěvy u disciplinární komise).\n  ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartan03%2Fijc-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmartan03%2Fijc-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartan03%2Fijc-project/lists"}