{{indexmenu_n>10}}
====== HW 06 - Caesarova šifra ======
^ **Termín odevzdání** ^ 29.11.2025 7:00 |
^ **Bodový zisk** | 5b |
^ **Počet uploadů** | 15 |
^ Typ zadání | povinné |
===== Zadání =====
Naším úkolem je rozluštit zprávu zakódovanou [[https://en.wikipedia.org/wiki/Caesar_cipher|Caesarovou šifrou]], která funguje na principu záměny písmene z abecedy za písmeno posunuté o pevně určený počet míst. V našem případě máme k dispozici nejen zašifrovaný text, ale také nespolehlivě odposlechnuté originální znění zprávy, tj. některé znaky originální zprávy jsou chybně zapsány. Řešení tak můžeme založit na testování všech možností kódování Caesarovou šifrou a porovnání s odposlechnutým textem. Posun s největší shodou dekódovaného textu s odposlechnutou zprávu budeme považovat za správný a takto dekódovaný text je náš požadovaný výstup. Obecně nemusí tento postup vést na unikátní správné řešení, nicméně v testovaných případech vždy existuje unikátní řešení.
Tato úloha slouží k procvičení práce s polem variabilní délky. Proto je ve vstupním souboru uvedena délka zprávy, podle které je možné vhodně pole inicializovat.
Použitá abeceda se skládá pouze z malých a velkých písmen bez diakritiky, tj. znaky v rozsahu ''a-z'' a ''A-Z''.
==== Vstup ====
Na standardním vstupu očekávejte číslo, které reprezentuje délku zprávy, a dvě posloupnosti znaků (texty) na samostatných řádcích. První text je zakódovaná zpráva a druhý text je nespolehlivě odposlechnutý text.
* Pokud na prvním řádku není číslo nebo vstupní text neodpovídá abecedě ''a-z'' nebo ''A-Z''program vypíše na standardní chybový výstup ''Error: Chybny vstup!'' a skončí s návratovou hodnotou ''100''.
* Pokud je některý ze vstupních textů kratší, než uvádí číslo na prvním řádku souboru, program vypíše na ''stderr'': ''Error: Chybna delka vstupu!'' a skončí s návratovou hodnotou ''101''.
* Současný výskyt obou chyb není testován.
* Informace o chybě vypsaná na standardní chybový výstup není ukončena znakem konce řádku.
Jedním z cílů úlohy je volba vhodné strategie čtení standardního vstupu s ohledem na předpokládané vlastnosti vstupních dat. Před volbou strategie si zopakujte, jaké jsou limity načítání řetezce pomocí **scanf** a **%s**. Z tohoto doporučujeme používat **%c**
==== Výstup ====
Na standardní výstup vypište dekódovanou zprávu jako posloupnost znaků zakončenou znakem konce řádku. Program končí s návratovou hodnotou ''0''.
==== Implementance ====
Program vhodně dekomponujte na jednotlivé funkce, např. funkce pro dekódování textu o definovaný posun a výpočet vzdálenosti dvou textových řetězců:
void shift(const char *src, char *dst, int offset);
int compare(const char *str1, const char *str2);
Dále může být vhodné napsat funkci pro šifrování jednoho písmene, která bude respektovat zadanou abecedu ''a-z'' a ''A-Z''. Například:
char rotate(char original, int offset);
==== Příklad 1 - pub01 ====
V prvním příkladu je zašifrován text ''Helloworld''. Posun je zde o 42 písmen. (16 míst je mezi ''h'' a ''x''; 26 pak mezi malými a velkými písmeny). Zašifrovaný text je tedy ''xUbbemehbT''.
Odposlechnutý text může být například ''??lloworld'', kde písmena na místě otazníku špatně odposlechneme a dostaneme jiné náhodné písmeno, například ''XYlloworld''.
^ Standardní vstup ^ Očekávaný výstup ^ Očekávaný chybový výstup ^ Návratová hodnota ^
|
10
xUbbemehbT
XYlloworld
|
Helloworld
| žádný | 0 |
Příklad vyhodnocení. Největší počet shodných písmen (8/10) má posun o 10, proto jej vyhodnotíme jako správný výsledek.
''00: xUbbemehbT ~ XYlloworld > 0 correct letters. '' \\
''01: yVccfnficU ~ XYlloworld > 0 correct letters. '' \\
''02: zWddgogjdV ~ XYlloworld > 0 correct letters. '' \\
''03: AXeehphkeW ~ XYlloworld > 0 correct letters. '' \\
''04: BYffiqilfX ~ XYlloworld > 1 correct letters. '' \\
''05: CZggjrjmgY ~ XYlloworld > 0 correct letters. '' \\
''06: DahhksknhZ ~ XYlloworld > 0 correct letters. '' \\
''07: Ebiiltloia ~ XYlloworld > 0 correct letters. '' \\
''08: Fcjjmumpjb ~ XYlloworld > 0 correct letters. '' \\
''09: Gdkknvnqkc ~ XYlloworld > 0 correct letters. '' \\
''10: Helloworld ~ XYlloworld > 8 correct letters -- result'' \\
''11: Ifmmpxpsme ~ XYlloworld > 0 correct letters. '' \\
''12: Jgnnqyqtnf ~ XYlloworld > 0 correct letters. '' \\
... \\
''50: vSZZckcfZR ~ XYlloworld > 0 correct letters. '' \\
''51: wTaadldgaS ~ XYlloworld > 0 correct letters. '' \\
''52: xUbbemehbT ~ XYlloworld > 0 correct letters. '' \\
==== Příklad 2 - pub02 ====
^ Standardní vstup ^ Očekávaný výstup ^ Očekávaný chybový výstup ^ Návratová hodnota ^
|
10
mnoXYhnJLJ
JCudvgtXRi
|
studentPRP
| žádný | 0 |
==== Příklad 3 - pub03 ====
^ Standardní vstup ^ Očekávaný výstup ^ Očekávaný chybový výstup ^ Návratová hodnota ^
|
10
fghQRa-CEC
scbdeMKARZ
| žádný |
Error: Chybny vstup!
| 100 |
==== Příklad 4 - pub04 ====
^ Standardní vstup ^ Očekávaný výstup ^ Očekávaný chybový výstup ^ Návratová hodnota ^
|
10
fghQRa
scbdeMK
| žádný |
Error: Chybna delka vstupu!
| 101 |
===== Odevzdání =====
Veřejné příklady + Makefile: {{ :courses:b0b99prpa:hw:hw06_-_caesar.zip |}}
^ ^ **Povinné zadání** ^
^ **Název v BRUTE** | HW06 |
^ **Odevzdávané soubory** | main.c |
^ **Kompilace pomocí** | clang -pedantic -Wall -Werror -std=c99 |