Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Napište program na šifrování a dešifrování textu tzv. Césarovou šifrou. Na prvním řádku dostane program buď řetězec 'sifrovat' nebo řetězec 'desifrovat', podle toho, zda bude program šifrovat nebo dešifrovat. Na druhém řádku bude klíč a na třetím bude samotný text k šifrování/dešifrování.
Text je šifrován posunem písmenek v abecedě podle klíče. Klíč je slovo tvořené písmeny 'A' - 'Z', 'A' znamená posun o 1 písmeno, 'B' znamená posun o 2 písmena, atd. až 'Z' znamená posun o 26 písmen. Posun je chápán cyklicky, čili po písmenu Z následuje opět písmeno A. Pokud je text delší než klíč, tak se po dosažení konce klíče pokračuje opět od začátku klíče.
Klíč je řetězec znaků tvořený pouze písmeny 'A' až 'Z' a vejde se do datového typu string.
Text je řetězec libovolně dlouhý (nemusí se tedy vejít do stringu) a obsahuje pouze znaky 'A' - 'Z' a ' ' (mezera). Mezery ponechte mezerami:-)
Výstupem programu je právě jeden řádek se zašifrovaným/dešifrovaným textem.
Příklad 1:
Vstup:
sifrovat
AAB
SIFRUJI SIFRU
Výstup:
TJHSVLJ TKGSW
Příklad 2:
Vstup:
desifrovat
AAB
TJHSVLJ TKGSW
Výstup:
SIFRUJI SIFRU
v Pascalu
Offline
ahoj ↑ misha2015:,
co myslíš tím podělením se o úlohu? Máš vyřešeno a dáváš to nám, anebo s tím potřebuješ pomoct?
Offline
↑ misha2015:
a už jsi něco zkoušel? Pokud ano, nějak to sem napiš.
Offline
↑ Eratosthenes:
procedure cc(var c:char; sh:integer);
const s='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz';
begin
if pos(c,s)<>0 then c:=upcase(s[(pos(c,s)-1+2*sh+length(s))mod length(s)+1]);
end;
procedure cs(var s:string; sh:integer);
var i:integer; begin for i:=1 to length(s) do cc(s[i],sh)
end;
var s:string; sh:integer;
begin
readln(sh);
readln(s);
cs(s,sh);
writeln(s);
end.
mám jenom takový kod, a nedokažu to udělat podle teto ulohy
Offline
↑ misha2015:ahoj
máme zrovna podobnou úlohu, sice jen prohazujeme písmenka, ale vypadá to podobně. Kryptogram const je řetězec písmen a vše se řeší posouváním v ASCII tabulce tímhle (mám to i celé, ale neodvažuji se):
begin
write('napiste zpravu: ');
readln(veta);
for i:=1 to length(veta) do
veta[i]:=kryptogram[ord(veta[i])-64];
end.
(*a pro desifrovani*)
begin
write(napiste zpravu);
readln(veta);
for i:=1 to length(veta) do
begin
j:=0;
repeat
j:=j+1;
until kryptogram[j]=veta[i]
veta[i]:=chr(j+64);
end;
zn
Offline
↑ misha2015:, ↑ zn:
zdravím, celý kód - není možné viz pravidla + doporučení pro odpověď
Děkuji.
Offline
ahoj ↑ misha2015:
abych se přiznal, tomu kódu vůbec nerozumím. Inspirativní je kód kolegy ↑ zn: a jeho upozornění na ASCII tabulku. Pro úplnost:
Pro náš případ jsou rozhodující hodnoty 65 - 90 resp. 97 - 122. Záleží na tom, zda se mají rozlišovat malá a velká písmena. Pokud ne, je lepší všechno převést na velká pomocí funkce UpCase. Pro posouvání jsou nejdůležitější funkce Chr - převádí ASCII hodnotu na znak (např. Chr(100) = 'd' ) a funkce Ord, která naopak převede znak na ASCII hodnotu - Ord('d')=100.
Offline
Stránky: 1