darktangram Posted January 4, 2011 Report Share Posted January 4, 2011 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 More sharing options...
gus Posted January 4, 2011 Report Share Posted January 4, 2011 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 More sharing options...
darktangram Posted January 7, 2011 Author Report Share Posted January 7, 2011 Te ordy i chr - muszę dla każdej liczby przypisać literę i na odwrót, czy jest jakis sposób by program zrobił to automatycznie? Jeśli tak, jak takie coś by wyglądało? Link to comment Share on other sites More sharing options...
kejwmen Posted January 7, 2011 Report Share Posted January 7, 2011 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 More sharing options...
darktangram Posted January 7, 2011 Author Report Share Posted January 7, 2011 Ok, zrozumiałem, pokombinuję, jak coś to się jeszcze odezwę. Link to comment Share on other sites More sharing options...
darktangram Posted January 12, 2011 Author Report Share Posted January 12, 2011 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 More sharing options...
gus Posted January 13, 2011 Report Share Posted January 13, 2011 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 More sharing options...
darktangram Posted January 13, 2011 Author Report Share Posted January 13, 2011 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.