Mam taky dotaz, mam v premennej typu char nacitany urcity znak a akym sposobom mam zadat programu aby znak posunul o napr. 3 znaky dalej? Mam urobit program ktory mi zadane slovo zasifruje tak ze kazde pismenko posune o zadany pocet znakov.
Fórum › Pascal
Posun znaku
No v pascale som už nerobil nejaký ten rôčik, ale nejak takto snáď
String veta;
int i,p,posun;
Readln("Zadaj vetu",veta);
Readln("O kolko posunut?",posun);
for(i=0; i<veta.length; i++)
begin
p=ORD(veta[i]);
p+=posun;
write(CHAR(p));
end;
Nejaké chyby tam určite budú, knižnice doplň CRT tuším.
To Nosko: No tak takhle určitě ne. To cos napsal by mohlo možná fungovalo ale prvně by takovej jazyk musel existovat. Jelikož tvůj kód kombinuje c a pascal (možná i něco dalšího). Nic ve zlým. Bohužel i já sem už spíš navykl na c a c++ ale zkusím naspat něco méně inovativního.
uses crt;
var retezec:array[1..120] of char;
posun, i:integer;
begin
i := 1;
write('Zadej text: ');
repeat
read(retezec[i]);
inc(i);
until (ord(retezec[i]) = {ordinální číslo enteru})or(i = 120);
writeln;
write('Zadej posun: ');
readln(posun);
for i := 1 to 120 do
retezec[i] := char(ord(retezec[i]) + posun);
end.
Takhle by to mohlo fungovat. Psal sem to z hlavy tak nevím ale myslím, že by to mohlo bejt správně. Ten komentář je tam úmyslně jelikož už si z hlavy nepamatuju ordinální číslo enteru ale to už si sám jistě doplníš.
To pista: Je toho sem si nevšim ord(retezec[i]). Promiň toho sem si nějka nešim. Hned to opravím. Ještě by se to dalo vylepšit, že těch 120 by se dala jako konstanta a tím bys mohl ten řetězec zkrátit nebo prodloužit bez složitých změn zdrojáku.
PS: Možná by to šlo řešit i jinak ale tohle je první co mě napadlo.
To pista:ma tam byt miesto toho len inc(i);
program sifrovani;
const posun=3;
var retezec:string;
i:byte;
BEGIN
write('Zadej retezec: ');
readln(retezec);
for i:=1 to length(retezec) do retezec[i]:=chr(ord(retezec[i])+posun);
writeln('Vysledek je: ',retezec);
readln; {program skonci po stisknuti enteru}
END.
A to je cele ;-).
Misto funkce chr, ktera dela z cisla znak, se da pouzit rovnou pretypovani na znak: char(cislo).
Totez misto ord funguje pretypovani na byte: byte(znak) (char a byte jsou oboje 8bitove hodnoty).
Ten cyklus by sel jeste zjednodusit:
for i:=1 to length(retezec) do inc(retezec[i],posun);
protoze inc se da pouzit na libovolny ordinalni typ.
Moje stránka.
A kdybys to "inc(retezec[i], posun)" přepsal do assembleru, tak by ses vyhnul možnosti přetečení ordinální hodnoty pro ASCII kódy > 252 (pro posun=3)
Tedy:
const posun = 3;
var s:string;
i:integer;
begin
s:='ahoj';
writeln(s);
for i:=1 to Length(s) do
asm
lea si,s
add si,i
mov ax,posun
add ds:[si],al
end;
writeln(s);
readln;
end.
Tenhle kód vám samozřejmě přeloží jen Turbo pascal (Borland pascal). FPC ani TMT ne-e.
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
Ako na vyhladanie znaku/znakovresp.slov v nejakom value? + Ako na ma… — založil Lordest
Posun Jmen — založil Radek
Posun obrazku — založil Dan
Posun jmen — založil David
Plynulý posun — založil mikeek
Moderátoři diskuze