Jump to content

Archived

This topic is now archived and is closed to further replies.

darktangram

Program w Pascalu

Recommended Posts

Witam, potrzebuję pomocy w pewnym zadaniu w Pascalu. Treść zadania brzmi: "Napisz program pobierający od użytkownika nieujemną liczbę całkowitą k, a

następnie pobierający tekst i zwracający ten tekst zaszyfrowany tzw.

szyfrem Cezara (literę stojącą w alfabecie na pewnej pozycji n zastępujemy

literą stojącą na pozycji n+k, przy czym jeśli n+k jest większe niż rozmiar

alfabetu, to zaczynamy "przeglądanie" alfabetu od początku - np. przy k=2

literę 'a' zastępujemy przez 'c', a literę 'z' - przez 'b'). Program po podaniu

k powinien pozwalać na wielokrotne wprowadzanie tekstu do zaszyfrowania." Dodam że programowanie to nie jest moja mocna strona. Jak mam to mniej więcej zrobic, jakie funkcje zastosować żeby ten program jakoś działał?

Link to comment
Share on other sites

Jeżeli chodzi o samo kodowanie, to potrzebujesz dwóch funkcji: ord zamieniająca literę na liczbę i chr zamieniająca liczbę na chr. Algorytm jest prosty. Bierzesz literę, zamieniasz ją na liczbę, dodajesz stałą k (tutaj musisz sprawdzić czy nie wyszedłeś poza alfabet) i wynik zamieniasz na literę.

Żeby pozwolić na wielokrotne wprowadzenie tekstu do zaszyfrowania musisz umieścić wszystko w pętli repeat ... until (warunek). Jako warunek przerwania możesz zrobić np. ciąg pusty wprowadzony przez użytkownika.

Link to comment
Share on other sites

Nie. Funkcja ord zwraca numer znaku w kodzie ASCII, dodajesz do niego k, a jeżeli ta wartość przekroczy wartość ostatniej litery w alfabecie to odejmujesz długość alfabetu (25).

Małe litery w kodzie ascii to 97-122, duże 65-90. Możesz uwzględnić małe i duże litery.

Po dodaniu k za pomocą funkcji chr zamieniasz wartość spowrotem na znak.

String zachowuje się jak tablica charów, po wprowadzeniu tekstu pobierz długość (funkcja length), puść fora od 1 do długości ciągu, no i dla każdego znaku wykonuj powyższe operacje (string).

Mam nadzieję że dobrze się wyraziłem

Link to comment
Share on other sites

Mój program wygląda tak:

program cezarek;

uses crt;

const k=2;

procedure szyfruj (tekst:string; c:integer);

var

i,j:integer;

begin

for i:=1 to c do

begin

if (ord(tekst)+k<=122) then tekst:=chr(ord(tekst)+k)

else

tekst:=chr(ord(tekst)+k-122+96);

end;

writeln(tekst);

end;

procedure deszyfruj(tekst:string; c:integer);

var

i,j,k:integer;

begin

for i:=1 to c do

begin

if (ord(tekst)-k>=97) then tekst:=chr(ord(tekst)-k)

else

tekst:=chr(ord(tekst)-k+26);

end;

writeln(tekst);

end;

var

tekst:string;

a,c:integer;

begin

clrscr;

writeln('Podaj tekst: ');

readln(tekst);

c:=length(tekst);

writeln('wcisnij 1 aby zaszyfrowac lub 2 aby odszyfrowac');

readln(a);

case a of

1:szyfruj(tekst,c);

2:deszyfruj(tekst,c);

end;

readln;

end.

Gdzie wstawić repeata i untila żeby można było zapętlić? Prosiłbym żeby ten repeat pojawił się od razu w kodzie.

Link to comment
Share on other sites

Możesz to zrobić np. tak, że jak podasz pusty tekst do zakodowania, to program kończy swoje działanie:

repeat
writeln('Podaj tekst: ');
readln(tekst);
c:=length(tekst);
writeln('wcisnij 1 aby zaszyfrowac lub 2 aby odszyfrowac');
readln(a);
case a of
1:szyfruj(tekst,c);
2:deszyfruj(tekst,c);
end;
until c>0;

Link to comment
Share on other sites

No właśnie na czymś takim by mi zależało, w ten repeat teraz właściwie nic nie robi.

EDIT: ok, udało mi się dobrze zapętlić. Mam prośbę innego typu. Jak wyglądały by do tego schematy blokowe? Mam takie zrobić wszystkich użytych procedur, funkcji oraz programu głównego.

Link to comment
Share on other sites



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...