Zdarec hoši, potřeboval bych s něčím pomoci. Mám zadanou práci: Je dán text a přirozené číslo k. Zašifrujte text, že každé písmeno ang. abecedy nahradíte písmenem o k znaků dále. Číslici nahradíte číslicí o k znaků dále. Ost. Znaky zůstavají.
Napsal jsem si program přes funkci ord, ale háček je v tom, že nevím jak udělat, aby šlo posunutí v ascii tabulce v cyklu. Když ord(text[i])+k přesáhne kód znaku Z popř. 9 , aby se zbytek posouvání(k) vrátil na znak A popř. 0.
Nejsem v programování příliš zběhlý, budu rád za vaši pomoc :)
Fórum › Pascal
Šifrování v pascalu
To nervak : Něměl bych tu podmínku spíš změnit na cyklus while c>b do c:=a+(c-b)-1; ??? Teď nevím jak to funguje, ale když se zadá větší číslo o které budeme posouvat např. 50, tak se podmínka provede pouze jednou a potom už ne, nebo snad ano ?
Tak jsem zesmolil tohle xD , prosím někdo na to mrkněte popř. poupravte a postněte, díky moc. jinak to háže chyby u podmínek:
Fatal: Syntax error, THEN expected but .. found
Program Rocnik;
var text:string[255];
i,k,n:integer;
z:char;
function sifra1:char;
begin
z:=text[i];
n:=ord(z)+k;
while n>ord('9') do n:=ord('0')+(n-ord('9'))-1;
sifra1:=chr(n);
end;
function sifra2:char;
begin
z:=text[i];
n:=ord(z)+k;
while n>ord('Z') do n:=ord('A')+(n-ord('Z'))-1;
sifra2:=chr(n);
end;
function sifra3:char;
begin
z:=text[i];
n:=ord(z)+k;
while n>ord('z') do n:=ord('a')+(n-ord('z'))-1;
sifra3:=chr(n);
end;
begin
write('Zadejte vetu: ');
readln(text);
write('Zadejte o kolik chcete danou vetu zasifrovat: ');
readln(k);
for i:=1 to length(text) do
begin
if text[i]=' ' then i:=i+1;
if text[i]='0'..'9' then text[i]:=sifra1;
if text[i]='A'..'Z' then text[i]:=sifra2;
if text[i]='a'..'z' then text[i]:=sifra3;
end;
writeln('Zasifrovany text: ',text);
readln;
end.
1) Zruš řádek "if text[i]=' ' then i:=i+1;". S řídicí proměnnou nesmíš takhle hýbat, cyklus si ji zvyšuje sám.
2) "if text[i]='0'..'9' then..." je syntaktický nesmysl, je potřeba buď "if text[i] in ['0'..'9'] then..." (čili "pokud je znak text[i] obsažen v množině obsahující znaky '0'..'9'"), nebo "case text[i] of '0'..'9':sifra1; 'a'..'z': ... atd. ... end;" (to mi připadá lepší). Tím se zbavíš té fatální chyby.
3) Funkce by měly vypadat nějak takhle:
function sifra1(z:char):char; {z je vstup - znak, který chceš zašifrovat}
var n:byte; {n není potřeba nikde jinde než tady, tak je lepší ji deklarovat lokálně}
begin
n:=ord(z)+k;
while n>ord('9') do n:=ord('0')+(n-ord('9'))-1;
sifra1:=chr(n); {tímhle se nastaví návratová hodnota funkce - tos tu neměl a proto se objevilo to varování}
end;
Použije se to potom takhle:
text[i]:=sifra1(text[i]);
V závorce předáš funkci znak, který se má zašifrovat, a jako funkční hodnota ti vypadne zašifrovaný znak. Je to stejný systém jako třeba u funkce sinus: výsledek:=sin(vstup).
Jinak to vypadá dobře.
Edit: koukám, že na ty funkce jsi přišel dřív, než jsem to stihnul dopsat :-)
Moje stránka.
To Mircosoft : Díky moc, že sis našel čas. No já to předělám na to case, měl jsem to v hlavě, ale nechtělo se mi to už editovat opět :D ,tak sem to tak nechal. ještě nevím co za typ je byte a proč to nemůže být klasika integer. Jinak teda dík a já to jdu tedy dodělat :)
Byte je celé číslo v rozsahu 0..255, čili přesně tolik, kolik je potřeba na indexování stringu, proto jsem zvyklý ho na tyhle účely používat. Ale klidně tam dej integer, s tím to půjde taky.
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Nápad na šifrování — založil Matěj Andrle
Šifrování souborů — založil Petr
Šifrování textového souboru — založil skodik.o
Moderátoři diskuze