Notice
This page is located in a preparation section till 22.09.2025.

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 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-Zprogram 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: hw06_-_caesar.zip

Povinné zadání
Název v BRUTE HW06
Odevzdávané soubory main.c
Kompilace pomocí clang -pedantic -Wall -Werror -std=c99
courses/b0b99prpa/hw/hw06.txt · Last modified: 2025/08/25 15:59 by nentvond